alysis-code 0.14.3__tar.gz → 0.14.7__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.3 → alysis_code-0.14.7}/PKG-INFO +11 -1
  2. {alysis_code-0.14.3 → alysis_code-0.14.7}/README.md +10 -0
  3. {alysis_code-0.14.3 → alysis_code-0.14.7}/docs/CHANGELOG.md +55 -0
  4. {alysis_code-0.14.3 → alysis_code-0.14.7}/pyproject.toml +1 -1
  5. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/__init__.py +1 -1
  6. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/config.py +21 -0
  7. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/git_evidence.py +50 -2
  8. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/git_safe.py +23 -11
  9. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/activity_events.py +14 -2
  10. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/artifacts.py +3 -0
  11. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/change_ledger.py +51 -32
  12. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/context_blocks.py +23 -8
  13. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/event_stream.py +74 -21
  14. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/forge_protocol.py +37 -17
  15. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/health.py +3 -0
  16. alysis_code-0.14.7/src/alysis_code/ide/parent_watchdog.py +111 -0
  17. alysis_code-0.14.7/src/alysis_code/ide/provider_switch.py +65 -0
  18. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/stdio_bridge.py +631 -57
  19. {alysis_code-0.14.3 → alysis_code-0.14.7}/.gitignore +0 -0
  20. {alysis_code-0.14.3 → alysis_code-0.14.7}/LICENSE +0 -0
  21. {alysis_code-0.14.3 → alysis_code-0.14.7}/NOTICE +0 -0
  22. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/__main__.py +0 -0
  23. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/_build_info.py +0 -0
  24. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/account_login.py +0 -0
  25. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/README.md +0 -0
  26. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/__init__.py +0 -0
  27. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/acceptance_contract.py +0 -0
  28. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
  29. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/blast_radius.py +0 -0
  30. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/cache_keepalive.py +0 -0
  31. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/checkpoint_worker.py +0 -0
  32. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/completion_certificate.py +0 -0
  33. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/completion_gate.py +0 -0
  34. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/empty_response_stall.py +0 -0
  35. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/errors.py +0 -0
  36. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/llm_calls.py +0 -0
  37. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/mutation_classification.py +0 -0
  38. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/prompt_context.py +0 -0
  39. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/prompt_families.py +0 -0
  40. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/prompt_guidance.py +0 -0
  41. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/read_ledger.py +0 -0
  42. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/regression_baseline.py +0 -0
  43. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/reproduction_first.py +0 -0
  44. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/sensitive_output.py +0 -0
  45. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/session.py +0 -0
  46. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/steering.py +0 -0
  47. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/subagent_execution.py +0 -0
  48. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/subagent_workspace.py +0 -0
  49. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/task_evidence.py +0 -0
  50. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/task_state.py +0 -0
  51. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/tools_assembly.py +0 -0
  52. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/__init__.py +0 -0
  53. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/core.py +0 -0
  54. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/events.py +0 -0
  55. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/exploration.py +0 -0
  56. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/interventions.py +0 -0
  57. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/read_cache.py +0 -0
  58. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/snapshot.py +0 -0
  59. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
  60. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn_contract.py +0 -0
  61. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/turn_path.py +0 -0
  62. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/verification.py +0 -0
  63. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/verification_commands.py +0 -0
  64. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/verification_evidence.py +0 -0
  65. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent/verification_result.py +0 -0
  66. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_loop.py +0 -0
  67. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/__init__.py +0 -0
  68. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/base.py +0 -0
  69. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/builtins.py +0 -0
  70. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
  71. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/host.py +0 -0
  72. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/registry.py +0 -0
  73. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agent_runtimes/service.py +0 -0
  74. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agentbox_client.py +0 -0
  75. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/agentbox_integration.py +0 -0
  76. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/alysis_cloud.py +0 -0
  77. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/approval_scope.py +0 -0
  78. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/README.md +0 -0
  79. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/__init__.py +0 -0
  80. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/asset_read_core.py +0 -0
  81. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/budget_allocator.py +0 -0
  82. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/comprehender.py +0 -0
  83. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/index.py +0 -0
  84. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/ingestion.py +0 -0
  85. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/legacy_migration.py +0 -0
  86. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/local_tools.py +0 -0
  87. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/models.py +0 -0
  88. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/ocr.py +0 -0
  89. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
  90. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
  91. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
  92. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
  93. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
  94. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
  95. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
  96. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
  97. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
  98. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
  99. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
  100. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
  101. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
  102. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
  103. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
  104. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
  105. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
  106. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
  107. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
  108. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
  109. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
  110. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/index.html +0 -0
  111. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/owl/show-owl.sh +0 -0
  112. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/paths.py +0 -0
  113. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/plan_binding.py +0 -0
  114. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/planner_context.py +0 -0
  115. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/planner_tools.py +0 -0
  116. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/prompts.py +0 -0
  117. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/replanner_context.py +0 -0
  118. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/surface.py +0 -0
  119. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/untrusted_content.py +0 -0
  120. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/usage_logger.py +0 -0
  121. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/worker_mirror.py +0 -0
  122. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/worker_section.py +0 -0
  123. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/assets/worker_tools.py +0 -0
  124. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/atomic_io.py +0 -0
  125. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/auth_diagnostics.py +0 -0
  126. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/background_runner.py +0 -0
  127. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/branding.py +0 -0
  128. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/budget_policy.py +0 -0
  129. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/build_identity.py +0 -0
  130. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/builtin_hooks/__init__.py +0 -0
  131. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
  132. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/bwrap_etc.py +0 -0
  133. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cancellation.py +0 -0
  134. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/capabilities.py +0 -0
  135. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
  136. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/checkpoint_settings.py +0 -0
  137. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli.py +0 -0
  138. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/__init__.py +0 -0
  139. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/assets_cli.py +0 -0
  140. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/assets_modal.py +0 -0
  141. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
  142. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/commands.py +0 -0
  143. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
  144. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/loop.py +0 -0
  145. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
  146. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
  147. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat/state.py +0 -0
  148. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat_resume.py +0 -0
  149. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
  150. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
  151. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
  152. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/auth.py +0 -0
  153. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
  154. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
  155. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
  156. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
  157. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
  158. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
  159. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
  160. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/config.py +0 -0
  161. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
  162. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
  163. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
  164. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/forge.py +0 -0
  165. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
  166. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
  167. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
  168. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
  169. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
  170. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/profile.py +0 -0
  171. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
  172. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/report.py +0 -0
  173. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/root.py +0 -0
  174. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
  175. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/server.py +0 -0
  176. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
  177. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/skills.py +0 -0
  178. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/startup.py +0 -0
  179. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/tools.py +0 -0
  180. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/update.py +0 -0
  181. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
  182. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/config_menu.py +0 -0
  183. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/forge.py +0 -0
  184. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
  185. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
  186. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
  187. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/app.py +0 -0
  188. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
  189. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/composer.py +0 -0
  190. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/config.py +0 -0
  191. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/config_flow.py +0 -0
  192. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
  193. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/content.py +0 -0
  194. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/footer.py +0 -0
  195. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
  196. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/links.py +0 -0
  197. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
  198. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/owl.py +0 -0
  199. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
  200. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
  201. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
  202. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
  203. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/state.py +0 -0
  204. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
  205. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
  206. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/surface.py +0 -0
  207. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/tips.py +0 -0
  208. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
  209. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
  210. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
  211. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/clipboard.py +0 -0
  212. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/code_review.py +0 -0
  213. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/compaction/__init__.py +0 -0
  214. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/compaction/conversation_compactor.py +0 -0
  215. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/compaction/importance.py +0 -0
  216. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/compaction/settings.py +0 -0
  217. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/compaction/tool_output_offload.py +0 -0
  218. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/conflict_auto_resolver.py +0 -0
  219. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/consumer_verification.py +0 -0
  220. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/context/__init__.py +0 -0
  221. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
  222. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/crash_diagnostics.py +0 -0
  223. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/custom_tools/README.md +0 -0
  224. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/custom_tools/__init__.py +0 -0
  225. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/custom_tools/discovery.py +0 -0
  226. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/custom_tools/runtime.py +0 -0
  227. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/custom_tools/session.py +0 -0
  228. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/custom_tools/trust.py +0 -0
  229. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/diff_paths.py +0 -0
  230. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/direction_change.py +0 -0
  231. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/dispatch_timing.py +0 -0
  232. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/durable_service_manager.py +0 -0
  233. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/edit_discipline.py +0 -0
  234. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/error_text.py +0 -0
  235. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/execution_budget.py +0 -0
  236. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/execution_context.py +0 -0
  237. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/execution_deadline.py +0 -0
  238. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/execution_shared.py +0 -0
  239. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/README.md +0 -0
  240. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/__init__.py +0 -0
  241. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/activation.py +0 -0
  242. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/install.py +0 -0
  243. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/manifest.py +0 -0
  244. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/models.py +0 -0
  245. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/paths.py +0 -0
  246. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/registry.json +0 -0
  247. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/registry.py +0 -0
  248. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/state.py +0 -0
  249. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/extensions/workspace_trust.py +0 -0
  250. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/failed_task_evidence.py +0 -0
  251. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/failure_category.py +0 -0
  252. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/feedback_report.py +0 -0
  253. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/file_classification.py +0 -0
  254. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/forge.py +0 -0
  255. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/forge_completion.py +0 -0
  256. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/forge_events.py +0 -0
  257. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/frontmatter_utils.py +0 -0
  258. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/git_ops.py +0 -0
  259. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/git_worktrees.py +0 -0
  260. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/README.md +0 -0
  261. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/__init__.py +0 -0
  262. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/audit.py +0 -0
  263. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/config.py +0 -0
  264. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/dispatcher.py +0 -0
  265. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/models.py +0 -0
  266. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/hooks/trust.py +0 -0
  267. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/host_actions.py +0 -0
  268. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/host_browser.py +0 -0
  269. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/__init__.py +0 -0
  270. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/approvals.py +0 -0
  271. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
  272. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
  273. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/forge_request_ledger.py +0 -0
  274. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/managed_browser.py +0 -0
  275. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/management_protocol.py +0 -0
  276. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
  277. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
  278. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/prompt_queue.py +0 -0
  279. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/protocol.py +0 -0
  280. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/resumable_swarm.py +0 -0
  281. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/session_search.py +0 -0
  282. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/structured_state.py +0 -0
  283. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/ide/swarm_protocol.py +0 -0
  284. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/integration_gate.py +0 -0
  285. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/interactive_input_guard.py +0 -0
  286. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/internal_artifacts.py +0 -0
  287. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/knowledge_base.py +0 -0
  288. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/knowledge_capture.py +0 -0
  289. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/knowledge_librarian.py +0 -0
  290. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/language_policy.py +0 -0
  291. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/litellm_static_provider.py +0 -0
  292. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/__init__.py +0 -0
  293. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/anthropic_messages.py +0 -0
  294. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/base.py +0 -0
  295. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/cache_capabilities.py +0 -0
  296. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/cache_control_blocks.py +0 -0
  297. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/cache_policy.py +0 -0
  298. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/factory.py +0 -0
  299. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/gemini_generate_content.py +0 -0
  300. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/gemini_interactions.py +0 -0
  301. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/http_cancellation.py +0 -0
  302. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/metadata.py +0 -0
  303. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/openai_compat.py +0 -0
  304. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/openai_responses.py +0 -0
  305. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/protocols.py +0 -0
  306. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/provider_limits.py +0 -0
  307. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/request_plan.py +0 -0
  308. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/request_shape.py +0 -0
  309. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/streaming.py +0 -0
  310. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/temperature_compat.py +0 -0
  311. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/tool_call_markup.py +0 -0
  312. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/types.py +0 -0
  313. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm/usage_normalization.py +0 -0
  314. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/llm_error_display.py +0 -0
  315. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/logging_redaction.py +0 -0
  316. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/managed_host_deadline.py +0 -0
  317. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/README.md +0 -0
  318. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/__init__.py +0 -0
  319. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/client.py +0 -0
  320. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/config.py +0 -0
  321. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/errors.py +0 -0
  322. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/forge_scope.py +0 -0
  323. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/jsonrpc.py +0 -0
  324. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/manager.py +0 -0
  325. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/models.py +0 -0
  326. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/oauth.py +0 -0
  327. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/oauth_runtime.py +0 -0
  328. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/oauth_store.py +0 -0
  329. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/prompts.py +0 -0
  330. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/resources.py +0 -0
  331. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/roots.py +0 -0
  332. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/server_requests.py +0 -0
  333. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/token_store.py +0 -0
  334. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/transport_http.py +0 -0
  335. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/transport_stdio.py +0 -0
  336. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/mcp/untrusted_content.py +0 -0
  337. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/merge_conflict_reviewer.py +0 -0
  338. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_catalog/__init__.py +0 -0
  339. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
  340. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
  341. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
  342. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_metadata_policy.py +0 -0
  343. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_metadata_utils.py +0 -0
  344. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_registry.py +0 -0
  345. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/model_router.py +0 -0
  346. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/permission_policy.py +0 -0
  347. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/personas.py +0 -0
  348. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/pipeline_facts.py +0 -0
  349. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/plan_assistant.py +0 -0
  350. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/plan_reconciliation.py +0 -0
  351. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/plan_repair.py +0 -0
  352. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/plan_validation.py +0 -0
  353. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/planning_constraints.py +0 -0
  354. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/policy.py +0 -0
  355. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/preview_server.py +0 -0
  356. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/private_artifact_io.py +0 -0
  357. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/process_reaping.py +0 -0
  358. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/profile_presets.py +0 -0
  359. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/profiles.py +0 -0
  360. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/prompt_guidance_catalog.py +0 -0
  361. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_auth/__init__.py +0 -0
  362. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_auth/base.py +0 -0
  363. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_auth/openai_codex.py +0 -0
  364. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_auth/registry.py +0 -0
  365. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_auth/store.py +0 -0
  366. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_diagnostics.py +0 -0
  367. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_model_catalog.py +0 -0
  368. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_telemetry.py +0 -0
  369. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/provider_url.py +0 -0
  370. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/reasoning_contracts.py +0 -0
  371. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/remote_sync.py +0 -0
  372. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/replanning.py +0 -0
  373. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/repo_scan.py +0 -0
  374. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/request_estimation.py +0 -0
  375. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/review_gate.py +0 -0
  376. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/run_lock.py +0 -0
  377. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/run_outcome.py +0 -0
  378. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/run_provenance.py +0 -0
  379. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/run_state.py +0 -0
  380. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/runtime_artifacts.py +0 -0
  381. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/runtime_context_features.py +0 -0
  382. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/runtime_kind.py +0 -0
  383. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/safety/__init__.py +0 -0
  384. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/safety/mcp_sanitize.py +0 -0
  385. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/safety/safe_http.py +0 -0
  386. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/safety/subagent_report.py +0 -0
  387. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/sandbox_doctor.py +0 -0
  388. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/sandbox_runner.py +0 -0
  389. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/sandbox_settings.py +0 -0
  390. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/serialized_paths.py +0 -0
  391. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/__init__.py +0 -0
  392. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/app.py +0 -0
  393. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/auth.py +0 -0
  394. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/job_config.py +0 -0
  395. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/settings.py +0 -0
  396. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/store.py +0 -0
  397. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/server/worker_runner.py +0 -0
  398. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/service_persistence.py +0 -0
  399. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/session_artifacts.py +0 -0
  400. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/session_metrics.py +0 -0
  401. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/session_store.py +0 -0
  402. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/README.md +0 -0
  403. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/__init__.py +0 -0
  404. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
  405. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
  406. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
  407. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
  408. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
  409. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
  410. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
  411. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
  412. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/conventions.py +0 -0
  413. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/discovery.py +0 -0
  414. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/eval_models.py +0 -0
  415. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/eval_runner.py +0 -0
  416. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/evals.py +0 -0
  417. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/install.py +0 -0
  418. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/loader.py +0 -0
  419. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/matching.py +0 -0
  420. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/models.py +0 -0
  421. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/paths.py +0 -0
  422. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/prompting.py +0 -0
  423. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/scaffold.py +0 -0
  424. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/state.py +0 -0
  425. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/transactions.py +0 -0
  426. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/skills/validation.py +0 -0
  427. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/step_budget.py +0 -0
  428. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/subagent_labels.py +0 -0
  429. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/subagents.py +0 -0
  430. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/__init__.py +0 -0
  431. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/base.py +0 -0
  432. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/console.py +0 -0
  433. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/events.py +0 -0
  434. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/hidden_surface.py +0 -0
  435. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/noop_surface.py +0 -0
  436. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/rich_surface.py +0 -0
  437. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/styles.py +0 -0
  438. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/theme.py +0 -0
  439. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/surface/types.py +0 -0
  440. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/swarm_backend.py +0 -0
  441. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/swarm_orchestrator.py +0 -0
  442. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/swarm_scheduler.py +0 -0
  443. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/swarm_trace.py +0 -0
  444. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/swarm_worker.py +0 -0
  445. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/swarm_write_guard.py +0 -0
  446. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/task_dependencies.py +0 -0
  447. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/task_readiness.py +0 -0
  448. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/task_scope.py +0 -0
  449. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/terminal_manager.py +0 -0
  450. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/terminal_ownership.py +0 -0
  451. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/text_normalization.py +0 -0
  452. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/token_budget.py +0 -0
  453. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/README.md +0 -0
  454. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/__init__.py +0 -0
  455. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/artifacts.py +0 -0
  456. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/availability.py +0 -0
  457. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/capability_readiness.py +0 -0
  458. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/fs.py +0 -0
  459. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/git.py +0 -0
  460. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/history.py +0 -0
  461. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/http_timeout.py +0 -0
  462. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/image_generation.py +0 -0
  463. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/registry.py +0 -0
  464. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/repo_map.py +0 -0
  465. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/search.py +0 -0
  466. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/shell.py +0 -0
  467. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/symbols.py +0 -0
  468. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/test_discovery.py +0 -0
  469. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/web.py +0 -0
  470. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/web_search.py +0 -0
  471. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/web_search_dashscope.py +0 -0
  472. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/web_search_ddgs.py +0 -0
  473. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
  474. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/tools/web_search_tavily.py +0 -0
  475. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/transport_retry.py +0 -0
  476. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/updates.py +0 -0
  477. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/usage_tracker.py +0 -0
  478. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/verification_command_analysis.py +0 -0
  479. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/verification_contract.py +0 -0
  480. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/verification_failure_summary.py +0 -0
  481. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/verification_repair.py +0 -0
  482. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/verify_gate.py +0 -0
  483. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/web_research.py +0 -0
  484. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/web_search_adapters.py +0 -0
  485. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/web_search_policy.py +0 -0
  486. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/workspace_binding.py +0 -0
  487. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/workspace_binding_ui.py +0 -0
  488. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/workspace_context.py +0 -0
  489. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/workspace_isolation.py +0 -0
  490. {alysis_code-0.14.3 → alysis_code-0.14.7}/src/alysis_code/workspace_provisioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alysis-code
3
- Version: 0.14.3
3
+ Version: 0.14.7
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,5 +1,60 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.7 — VSIX dependency audit and sidebar rendering
4
+
5
+ - Update the VS Code extension's locked source-map-js dependency to 1.2.2,
6
+ resolving GHSA-68fv-2mgg-jv7q and restoring the release audit gate.
7
+ - Avoid repainting unchanged permission controls and settings filters during
8
+ conversation updates, reducing sidebar render cost on Intel macOS.
9
+ - Run extension CI on Intel macOS as well as Apple Silicon before tagging releases.
10
+ - Synchronize the queued-command overflow test with actual input receipt so
11
+ loaded CI runners exercise the intended full-inbox behavior reliably.
12
+
13
+ This replacement preserves the published 0.14.6 source tag and distributions.
14
+ The VS Code 0.3.0 beta still requires candidate installation, acceptance, and
15
+ promotion gates before Marketplace publication.
16
+
17
+ ## 0.14.6 — final VSIX attestation and startup validation
18
+
19
+ - Give each final VSIX dependency report an RFC 4122 document ID accepted by
20
+ GitHub's attestation parser. Derive it from the exact package bytes so promotion
21
+ can reproduce the signed report without changing its identity.
22
+ - Wait for startup runtime validation before reporting installed runtime evidence,
23
+ so a fresh installation does not report the bundled CLI as temporarily unavailable.
24
+
25
+ All six 0.14.5 native runtimes and their assembled manifest passed signing, but
26
+ final VSIX attestation failed before installation testing. This replacement
27
+ preserves the existing tags; Marketplace pre-release 0.3.0 still requires the
28
+ documented installation, acceptance, and promotion gates.
29
+
30
+ ## 0.14.5 — native managed-runtime packaging
31
+
32
+ - Pin the six bundled runtimes to checksum-verified CPython 3.12.15 distributions,
33
+ including their observed OpenSSL and Expat versions in each dependency SBOM.
34
+ - Build Linux executables with shared-library-capable Python on the existing
35
+ glibc 2.28 baseline, and build tested, static OpenSSL 3.5.9 for Windows ARM64
36
+ and Intel macOS cryptography.
37
+ - Sign embedded macOS libraries during packaging and verify notarization using
38
+ Apple's documented check for standalone code. Preserve Windows API paths in Git Bash.
39
+ - Add an unsigned native build and executable smoke check for all six targets.
40
+
41
+ This source version prepares a replacement candidate after the protected `v0.14.4`
42
+ native build failed. Marketplace pre-release 0.3.0 remains subject to the documented
43
+ signing, installation, acceptance, and promotion gates.
44
+
45
+ ## 0.14.4 — IDE integrations and release tooling
46
+
47
+ - Add the VS Code 0.3.0 integration with a shared sidebar, provider management, bounded editor
48
+ context, reviewed changes, recovery checkpoints, and native host actions.
49
+ - Add shared UI transport and a JetBrains development preview using the same Python IDE bridge.
50
+ - Isolate provider credentials, handle physical workspace paths, and keep unit tests portable.
51
+ - Add six-target managed-runtime packaging, Azure OIDC Windows signing verification, Apple
52
+ notarization/provenance contracts, and protected evidence and Marketplace promotion workflows.
53
+ - Update pinned sandbox build inputs; fresh image scans remain required.
54
+
55
+ This is a CLI/source release. Production signed VSIX packages and Marketplace publication remain
56
+ pending the [documented signing and acceptance gates](vscode-marketplace-launch.md).
57
+
3
58
  Notable user-facing changes to Alysis Code are recorded here. This project follows
4
59
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses
5
60
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html) while the public API remains pre-1.0.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "alysis-code"
7
- version = "0.14.3"
7
+ version = "0.14.7"
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.3"
3
+ __version__ = "0.14.7"
@@ -1511,6 +1511,9 @@ def resolve_profile_api_key(
1511
1511
  profile = get_profile(cfg, profile_name)
1512
1512
  if profile is None:
1513
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
1514
1517
  stored_profile_key = _resolve_stored_profile_api_key(cfg, profile_name)
1515
1518
  if stored_profile_key.key:
1516
1519
  return stored_profile_key
@@ -1531,6 +1534,21 @@ def resolve_profile_api_key(
1531
1534
  return ApiKeyResolution(key=None, source="missing")
1532
1535
 
1533
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
+
1534
1552
  def _resolve_stored_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
1535
1553
  from .profiles import get_profile
1536
1554
 
@@ -1552,6 +1570,9 @@ def resolve_api_key(
1552
1570
  if profile_name is None:
1553
1571
  profile_name = str((effective_cfg.extra_fields or {}).get("active_profile") or "").strip()
1554
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
1555
1576
  stored_profile_key = _resolve_stored_profile_api_key(effective_cfg, profile_name)
1556
1577
  if stored_profile_key.key:
1557
1578
  return stored_profile_key
@@ -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():
@@ -60,6 +60,27 @@ class StaleWorkspaceError(ChangeLedgerError):
60
60
  """The workspace no longer matches the state being reversed."""
61
61
 
62
62
 
63
+ def _checkpoint_storage_directory(workspace_root: Path, storage_root: Path | None = None) -> Path:
64
+ workspace = workspace_root.expanduser().resolve(strict=True)
65
+ workspace_key = hashlib.sha256(
66
+ os.path.normcase(os.fspath(workspace)).encode("utf-8")
67
+ ).hexdigest()[:24]
68
+ override = str(env_get("ALYSIS_DATA_DIR") or "").strip()
69
+ default_data_dir = Path(override).expanduser() if override else canonical_user_data_dir()
70
+ base = (storage_root or default_data_dir / "checkpoints").expanduser().resolve()
71
+ try:
72
+ base.relative_to(workspace)
73
+ except ValueError:
74
+ return base / workspace_key
75
+ raise ChangeLedgerError("Checkpoint storage must be outside the workspace.")
76
+
77
+
78
+ def checkpoint_storage_exists(workspace_root: Path) -> bool:
79
+ """Check for durable checkpoint state without initializing storage or launching Git."""
80
+ storage = _checkpoint_storage_directory(workspace_root)
81
+ return (storage / "ledger.sqlite3").exists() or (storage / "objects.git").exists()
82
+
83
+
63
84
  @dataclass(frozen=True)
64
85
  class ChangeRecord:
65
86
  status: str
@@ -119,19 +140,7 @@ class ChangeLedger:
119
140
  self.workspace_root = workspace_root.expanduser().resolve(strict=True)
120
141
  if not self.workspace_root.is_dir():
121
142
  raise ChangeLedgerError("Checkpoint workspace must be a directory.")
122
- workspace_key = hashlib.sha256(
123
- os.path.normcase(os.fspath(self.workspace_root)).encode("utf-8")
124
- ).hexdigest()[:24]
125
- override = str(env_get("ALYSIS_DATA_DIR") or "").strip()
126
- default_data_dir = Path(override).expanduser() if override else canonical_user_data_dir()
127
- base = (storage_root or default_data_dir / "checkpoints").expanduser().resolve()
128
- try:
129
- base.relative_to(self.workspace_root)
130
- except ValueError:
131
- pass
132
- else:
133
- raise ChangeLedgerError("Checkpoint storage must be outside the workspace.")
134
- self.storage_dir = base / workspace_key
143
+ self.storage_dir = _checkpoint_storage_directory(self.workspace_root, storage_root)
135
144
  self.git_dir = self.storage_dir / "objects.git"
136
145
  self.index_dir = self.storage_dir / "indexes"
137
146
  self.database_path = self.storage_dir / "ledger.sqlite3"
@@ -434,15 +443,25 @@ class ChangeLedger:
434
443
  self.storage_dir.mkdir(parents=True, exist_ok=True)
435
444
  self.index_dir.mkdir(parents=True, exist_ok=True)
436
445
  if not self.git_dir.exists():
437
- result = subprocess.run(
438
- ["git", "init", "--bare", "--quiet", os.fspath(self.git_dir)],
439
- capture_output=True,
440
- timeout=self.git_timeout_seconds,
441
- check=False,
442
- env=build_git_process_env(),
443
- )
446
+ try:
447
+ result = subprocess.run(
448
+ ["git", "init", "--bare", "--quiet", os.fspath(self.git_dir)],
449
+ capture_output=True,
450
+ timeout=self.git_timeout_seconds,
451
+ check=False,
452
+ env=build_git_process_env(),
453
+ )
454
+ except (OSError, subprocess.TimeoutExpired):
455
+ raise ChangeLedgerError(
456
+ "Checkpoint storage could not start Git. Install Git and check that it can run."
457
+ ) from None
444
458
  if result.returncode != 0:
445
459
  raise ChangeLedgerError("Unable to initialize external checkpoint storage.")
460
+ self._object_hash_name = (
461
+ self._git(["rev-parse", "--show-object-format"], check=True).stdout.decode().strip()
462
+ )
463
+ if self._object_hash_name not in {"sha1", "sha256"}:
464
+ raise ChangeLedgerError("Unsupported checkpoint Git object format.")
446
465
  info_dir = self.git_dir / "info"
447
466
  info_dir.mkdir(parents=True, exist_ok=True)
448
467
  exclude_path = info_dir / "exclude"
@@ -1397,6 +1416,16 @@ class ChangeLedger:
1397
1416
  path = _safe_workspace_path(self.workspace_root, rel_path)
1398
1417
  return self._path_identity(path)
1399
1418
 
1419
+ def _blob_oid(self, data: bytes) -> str:
1420
+ # Equivalent to `git hash-object --stdin` (no path or filters). Baseline
1421
+ # capture checks every file twice; spawning Git for each hash adds
1422
+ # thousands of process launches in a normal repository, especially costly
1423
+ # on Windows. Keep the existing before/after stat and content checks.
1424
+ digest = hashlib.new(self._object_hash_name, usedforsecurity=False)
1425
+ digest.update(f"blob {len(data)}\0".encode("ascii"))
1426
+ digest.update(data)
1427
+ return digest.hexdigest()
1428
+
1400
1429
  def _path_identity(self, path: Path) -> tuple[str, str] | None:
1401
1430
  if not os.path.lexists(path):
1402
1431
  return None
@@ -1406,12 +1435,7 @@ class ChangeLedger:
1406
1435
  after = path.lstat()
1407
1436
  if _stat_fingerprint(before) != _stat_fingerprint(after):
1408
1437
  return "unstable", "unstable"
1409
- oid = (
1410
- self._git(["hash-object", "--stdin"], input_bytes=data, check=True)
1411
- .stdout.decode()
1412
- .strip()
1413
- )
1414
- return "120000", oid
1438
+ return "120000", self._blob_oid(data)
1415
1439
  if not path.is_file():
1416
1440
  return "040000", "directory"
1417
1441
  try:
@@ -1423,13 +1447,8 @@ class ChangeLedger:
1423
1447
  return "unstable", "unstable"
1424
1448
  if _stat_fingerprint(before) != _stat_fingerprint(after):
1425
1449
  return "unstable", "unstable"
1426
- oid = (
1427
- self._git(["hash-object", "--stdin"], input_bytes=data, check=True)
1428
- .stdout.decode()
1429
- .strip()
1430
- )
1431
1450
  executable = bool(after.st_mode & stat.S_IXUSR) and os.name != "nt"
1432
- return ("100755" if executable else "100644"), oid
1451
+ return ("100755" if executable else "100644"), self._blob_oid(data)
1433
1452
 
1434
1453
  def _session_git_env(self, session_id: str) -> dict[str, str]:
1435
1454
  env = build_git_process_env()
@@ -271,6 +271,14 @@ def sanitize_context_blocks(
271
271
  kinds: list[ContextKind] = []
272
272
  any_truncated = bool(dropped)
273
273
 
274
+ # A single context block whose path is git-ignored, or that resolved outside the workspace, must
275
+ # not abort the whole turn: the IDE attaches whatever the user has open, and a git-ignored editor
276
+ # among many is the common case that used to fail the entire message. Such a block is DROPPED —
277
+ # its content is still excluded, which is the point of the ignore policy — and the rest proceed.
278
+ # A policy that *throws* (path_policy_failed) stays fail-closed and still raises, because an
279
+ # unevaluable policy is an internal fault, not ordinary user content; likewise a sensitive-path
280
+ # deny and every structural/format error still raise.
281
+ droppable_reasons = {"ignored_path", "path_outside_workspace"}
274
282
  for index, raw_block in enumerate(raw_blocks[:accepted_count]):
275
283
  if not isinstance(raw_block, Mapping):
276
284
  raise ContextValidationError(
@@ -278,14 +286,21 @@ def sanitize_context_blocks(
278
286
  "Each context block must be an object.",
279
287
  block_index=index,
280
288
  )
281
- block = _normalize_block(
282
- raw_block,
283
- roots=roots,
284
- limits=active_limits,
285
- is_ignored=is_ignored,
286
- path_policy=path_policy,
287
- block_index=index,
288
- )
289
+ try:
290
+ block = _normalize_block(
291
+ raw_block,
292
+ roots=roots,
293
+ limits=active_limits,
294
+ is_ignored=is_ignored,
295
+ path_policy=path_policy,
296
+ block_index=index,
297
+ )
298
+ except ContextValidationError as error:
299
+ if error.code in droppable_reasons:
300
+ dropped += 1
301
+ any_truncated = True
302
+ continue
303
+ raise
289
304
  fitted, did_truncate = _fit_block(block, active_limits.max_block_bytes)
290
305
  normalized.append(fitted)
291
306
  kinds.append(fitted["type"])