code-context-control 2.152.0__tar.gz → 2.154.0__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 (589) hide show
  1. {code_context_control-2.152.0 → code_context_control-2.154.0}/PKG-INFO +1 -1
  2. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/c3.py +63 -1
  3. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/commands/parser.py +11 -0
  4. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/index.html +4 -0
  5. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/tools.html +8 -2
  6. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/workflow.html +1 -1
  7. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/mcp_server.py +17 -10
  8. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/_edit_report.py +31 -4
  9. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/edit.py +358 -108
  10. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/edit_verify.py +5 -6
  11. {code_context_control-2.152.0 → code_context_control-2.154.0}/code_context_control.egg-info/PKG-INFO +1 -1
  12. {code_context_control-2.152.0 → code_context_control-2.154.0}/code_context_control.egg-info/SOURCES.txt +3 -0
  13. {code_context_control-2.152.0 → code_context_control-2.154.0}/pyproject.toml +1 -1
  14. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/agent_locks.py +30 -0
  15. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/edit_blobs.py +16 -0
  16. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/embedding_index.py +434 -4
  17. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/read_stamps.py +27 -0
  18. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_agent_locks.py +38 -0
  19. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_eol_atomic.py +15 -2
  20. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_normalization.py +68 -75
  21. code_context_control-2.154.0/tests/test_edit_outcome.py +79 -0
  22. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_report.py +21 -0
  23. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_revert.py +28 -0
  24. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_stale.py +48 -0
  25. code_context_control-2.154.0/tests/test_embedding_store_safety.py +228 -0
  26. code_context_control-2.154.0/tests/test_quarantine_sweep.py +178 -0
  27. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_read_edit_parity.py +1 -1
  28. {code_context_control-2.152.0 → code_context_control-2.154.0}/LICENSE +0 -0
  29. {code_context_control-2.152.0 → code_context_control-2.154.0}/README.md +0 -0
  30. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/__init__.py +0 -0
  31. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/_hook_utils.py +0 -0
  32. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/_shell_writes.py +0 -0
  33. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/commands/__init__.py +0 -0
  34. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/commands/common.py +0 -0
  35. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/docs.html +0 -0
  36. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/edits.html +0 -0
  37. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/access.html +0 -0
  38. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/bitbucket.html +0 -0
  39. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/ci.html +0 -0
  40. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/credentials.html +0 -0
  41. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/delegate.html +0 -0
  42. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/getting-started.html +0 -0
  43. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/jira.html +0 -0
  44. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/masking.html +0 -0
  45. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/oracle.html +0 -0
  46. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/sessions.html +0 -0
  47. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/guide/shared.css +0 -0
  48. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_access_guard.py +0 -0
  49. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_agent_model.py +0 -0
  50. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_artifact.py +0 -0
  51. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_auto_snapshot.py +0 -0
  52. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_c3_signal.py +0 -0
  53. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_c3read.py +0 -0
  54. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_codex_lifecycle.py +0 -0
  55. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_dispatch.py +0 -0
  56. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_edit_ledger.py +0 -0
  57. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_edit_unlock.py +0 -0
  58. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_filter.py +0 -0
  59. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_ghost_files.py +0 -0
  60. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_pretool_enforce.py +0 -0
  61. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_prompt_recall.py +0 -0
  62. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_read.py +0 -0
  63. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_session_end.py +0 -0
  64. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_session_open.py +0 -0
  65. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_session_stats.py +0 -0
  66. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hook_terse_advisor.py +0 -0
  67. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_server.py +0 -0
  68. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/app.js +0 -0
  69. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/add_project.js +0 -0
  70. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/config_editor.js +0 -0
  71. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  72. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/drill_health.js +0 -0
  73. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/drill_panel.js +0 -0
  74. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
  75. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  76. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/drill_views.js +0 -0
  77. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/global_search.js +0 -0
  78. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_access.js +0 -0
  79. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_ci.js +0 -0
  80. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
  81. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_credentials.js +0 -0
  82. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
  83. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_locks.js +0 -0
  84. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_sessions.js +0 -0
  85. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/hub_tokens.js +0 -0
  86. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  87. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/modals.js +0 -0
  88. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/project_card.js +0 -0
  89. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/project_tree.js +0 -0
  90. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/session_drawer.js +0 -0
  91. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/settings_modal.js +0 -0
  92. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/sidebar.js +0 -0
  93. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/summary_bar.js +0 -0
  94. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/task_board.js +0 -0
  95. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/toasts.js +0 -0
  96. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/components/topbar.js +0 -0
  97. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui/state.js +0 -0
  98. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/hub_ui.html +0 -0
  99. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/mcp_proxy.py +0 -0
  100. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/progress.py +0 -0
  101. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/server.py +0 -0
  102. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/__init__.py +0 -0
  103. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/_grants.py +0 -0
  104. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/_helpers.py +0 -0
  105. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/agent.py +0 -0
  106. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/artifacts.py +0 -0
  107. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/bitbucket.py +0 -0
  108. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/ci.py +0 -0
  109. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/compress.py +0 -0
  110. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/credentials.py +0 -0
  111. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/delegate.py +0 -0
  112. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/edits.py +0 -0
  113. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/federate.py +0 -0
  114. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/filter.py +0 -0
  115. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/impact.py +0 -0
  116. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/jira.py +0 -0
  117. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/locks.py +0 -0
  118. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/memory.py +0 -0
  119. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/override.py +0 -0
  120. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/project.py +0 -0
  121. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/read.py +0 -0
  122. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/search.py +0 -0
  123. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/session.py +0 -0
  124. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/shell.py +0 -0
  125. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/shell_job.py +0 -0
  126. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/shell_nudge.py +0 -0
  127. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/shell_parsers.py +0 -0
  128. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/shell_render.py +0 -0
  129. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/status.py +0 -0
  130. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/tasks.py +0 -0
  131. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/tools/validate.py +0 -0
  132. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/api.js +0 -0
  133. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/app.js +0 -0
  134. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/access.js +0 -0
  135. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/bitbucket.js +0 -0
  136. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/chat.js +0 -0
  137. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/credentials.js +0 -0
  138. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/dashboard.js +0 -0
  139. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/edits.js +0 -0
  140. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/enforcement.js +0 -0
  141. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/instructions.js +0 -0
  142. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/jira.js +0 -0
  143. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/memory.js +0 -0
  144. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/sessions.js +0 -0
  145. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/settings.js +0 -0
  146. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/sidebar.js +0 -0
  147. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/components/tasks.js +0 -0
  148. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/icons.js +0 -0
  149. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/pm_shared.js +0 -0
  150. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/shared.js +0 -0
  151. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui/theme.js +0 -0
  152. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui.html +0 -0
  153. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui_legacy.html +0 -0
  154. {code_context_control-2.152.0 → code_context_control-2.154.0}/cli/ui_nano.html +0 -0
  155. {code_context_control-2.152.0 → code_context_control-2.154.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  156. {code_context_control-2.152.0 → code_context_control-2.154.0}/code_context_control.egg-info/entry_points.txt +0 -0
  157. {code_context_control-2.152.0 → code_context_control-2.154.0}/code_context_control.egg-info/requires.txt +0 -0
  158. {code_context_control-2.152.0 → code_context_control-2.154.0}/code_context_control.egg-info/top_level.txt +0 -0
  159. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/__init__.py +0 -0
  160. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/codex_patch.py +0 -0
  161. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/config.py +0 -0
  162. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/grok_payload.py +0 -0
  163. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/hook_command.py +0 -0
  164. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/host.py +0 -0
  165. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/ide.py +0 -0
  166. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/mcp_toml.py +0 -0
  167. {code_context_control-2.152.0 → code_context_control-2.154.0}/core/web_security.py +0 -0
  168. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/__init__.py +0 -0
  169. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/config.py +0 -0
  170. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/listeners.py +0 -0
  171. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/mcp_oracle.py +0 -0
  172. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/oracle_server.py +0 -0
  173. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/oracle_ui.html +0 -0
  174. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/__init__.py +0 -0
  175. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/activity_reporter.py +0 -0
  176. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/api_auth.py +0 -0
  177. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/c3_bridge.py +0 -0
  178. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/chat_engine.py +0 -0
  179. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/chat_poll.py +0 -0
  180. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/chat_store.py +0 -0
  181. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/client_tokens.py +0 -0
  182. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/cross_memory.py +0 -0
  183. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/discovery_audit.py +0 -0
  184. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/federated_graph.py +0 -0
  185. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/health_checker.py +0 -0
  186. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/insight_engine.py +0 -0
  187. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/local_session.py +0 -0
  188. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/memory_reader.py +0 -0
  189. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/memory_writer.py +0 -0
  190. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/mobile_api.py +0 -0
  191. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/project_scanner.py +0 -0
  192. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/review_agent.py +0 -0
  193. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/tool_executor.py +0 -0
  194. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/services/tool_registry.py +0 -0
  195. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/activity.js +0 -0
  196. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/agents.js +0 -0
  197. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/app.js +0 -0
  198. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/busy.js +0 -0
  199. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/chat/conversations.js +0 -0
  200. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/chat/input.js +0 -0
  201. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/chat/markdown.js +0 -0
  202. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/chat/send.js +0 -0
  203. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/chat/stream_renderer.js +0 -0
  204. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/chat/toolbar.js +0 -0
  205. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/core.js +0 -0
  206. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/crossgraph.js +0 -0
  207. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/header.js +0 -0
  208. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/insights.js +0 -0
  209. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/projects.js +0 -0
  210. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/qrcode.js +0 -0
  211. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/settings.js +0 -0
  212. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/suggestions.js +0 -0
  213. {code_context_control-2.152.0 → code_context_control-2.154.0}/oracle/ui/theme_tabs.js +0 -0
  214. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/__init__.py +0 -0
  215. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/access_guard.py +0 -0
  216. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/access_telemetry.py +0 -0
  217. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/activity_log.py +0 -0
  218. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/agent_base.py +0 -0
  219. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/agent_downshift.py +0 -0
  220. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/agents.py +0 -0
  221. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/agents_workflow.py +0 -0
  222. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/artifact_defs.py +0 -0
  223. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/artifact_store.py +0 -0
  224. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/atomic_json.py +0 -0
  225. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/auto_memory.py +0 -0
  226. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/background_service.py +0 -0
  227. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/__init__.py +0 -0
  228. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/delegate_eval.py +0 -0
  229. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/delegate_write_eval.py +0 -0
  230. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/external/__init__.py +0 -0
  231. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/external/aider_polyglot.py +0 -0
  232. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/external/swe_bench.py +0 -0
  233. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/map_eval.py +0 -0
  234. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/search_eval.py +0 -0
  235. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bench/shell_eval.py +0 -0
  236. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/benchmark_dashboard.py +0 -0
  237. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bitbucket_client.py +0 -0
  238. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/bitbucket_credentials.py +0 -0
  239. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/builtin_leases.py +0 -0
  240. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_act.py +0 -0
  241. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_cache.py +0 -0
  242. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_expr.py +0 -0
  243. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_failures.py +0 -0
  244. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_github.py +0 -0
  245. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_impact.py +0 -0
  246. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_intel.py +0 -0
  247. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_runner.py +0 -0
  248. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ci_workflow.py +0 -0
  249. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/circuit_breaker.py +0 -0
  250. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/claude_md.py +0 -0
  251. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/codex_integration.py +0 -0
  252. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/codex_transcript.py +0 -0
  253. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/compressor.py +0 -0
  254. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/context_snapshot.py +0 -0
  255. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/conversation_store.py +0 -0
  256. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/cred_audit.py +0 -0
  257. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/cred_telemetry.py +0 -0
  258. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/credential_backup.py +0 -0
  259. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/credential_store.py +0 -0
  260. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/delegate_agents.py +0 -0
  261. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/delegate_hints.py +0 -0
  262. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/delegate_write.py +0 -0
  263. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/dir_map.py +0 -0
  264. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/doc_index.py +0 -0
  265. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/e2e_benchmark.py +0 -0
  266. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/e2e_evaluator.py +0 -0
  267. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/e2e_tasks.py +0 -0
  268. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/edit_ledger.py +0 -0
  269. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/enforcement_policy.py +0 -0
  270. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/error_reporting.py +0 -0
  271. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/file_map.py +0 -0
  272. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/file_memory.py +0 -0
  273. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/git_context.py +0 -0
  274. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/grok_integration.py +0 -0
  275. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/grok_transcript.py +0 -0
  276. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/host_sessions.py +0 -0
  277. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/hub_service.py +0 -0
  278. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/index_store.py +0 -0
  279. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/indexer.py +0 -0
  280. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/jira_client.py +0 -0
  281. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/jira_cloud.py +0 -0
  282. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/jira_credentials.py +0 -0
  283. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/jira_data_center.py +0 -0
  284. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/jira_links.py +0 -0
  285. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/lexical_index.py +0 -0
  286. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/mask_activation.py +0 -0
  287. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/mask_mirror.py +0 -0
  288. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/mask_presets.py +0 -0
  289. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory.py +0 -0
  290. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory_consolidator.py +0 -0
  291. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory_distiller.py +0 -0
  292. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory_graph.py +0 -0
  293. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory_grounder.py +0 -0
  294. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory_queue.py +0 -0
  295. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/memory_scorer.py +0 -0
  296. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/metrics.py +0 -0
  297. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/notifications.py +0 -0
  298. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ollama_bridge.py +0 -0
  299. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ollama_client.py +0 -0
  300. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/ollama_credentials.py +0 -0
  301. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/oracle_service.py +0 -0
  302. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/output_filter.py +0 -0
  303. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/override_costs.py +0 -0
  304. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/override_grants.py +0 -0
  305. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/override_policy.py +0 -0
  306. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/override_requests.py +0 -0
  307. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/override_wake.py +0 -0
  308. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/parser.py +0 -0
  309. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/project_manager.py +0 -0
  310. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/project_runtime.py +0 -0
  311. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/protocol.py +0 -0
  312. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/proxy_state.py +0 -0
  313. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/repo_map.py +0 -0
  314. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/repo_shape.py +0 -0
  315. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/reranker.py +0 -0
  316. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/retention.py +0 -0
  317. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/retrieval.py +0 -0
  318. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/retrieval_broker.py +0 -0
  319. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/router.py +0 -0
  320. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/runtime.py +0 -0
  321. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/scanner.py +0 -0
  322. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/session_benchmark.py +0 -0
  323. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/session_catalog.py +0 -0
  324. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/session_live.py +0 -0
  325. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/session_manager.py +0 -0
  326. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/session_preloader.py +0 -0
  327. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/shell_jobs.py +0 -0
  328. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/shell_output.py +0 -0
  329. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/subprojects.py +0 -0
  330. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/task_store.py +0 -0
  331. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/telemetry.py +0 -0
  332. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/terminal_launch.py +0 -0
  333. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/text_index.py +0 -0
  334. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/time_tracker.py +0 -0
  335. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/tool_classifier.py +0 -0
  336. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/transcript_index.py +0 -0
  337. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/validation_cache.py +0 -0
  338. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/vector_store.py +0 -0
  339. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/watcher.py +0 -0
  340. {code_context_control-2.152.0 → code_context_control-2.154.0}/services/win_subprocess.py +0 -0
  341. {code_context_control-2.152.0 → code_context_control-2.154.0}/setup.cfg +0 -0
  342. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_access_builtin_optout.py +0 -0
  343. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_access_guard.py +0 -0
  344. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_access_guard_meta.py +0 -0
  345. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_access_guard_shell_project.py +0 -0
  346. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_access_guard_surfaces.py +0 -0
  347. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_access_guard_wiring.py +0 -0
  348. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_activity_log_find_last.py +0 -0
  349. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_activity_reporter.py +0 -0
  350. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_aider_polyglot.py +0 -0
  351. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_antigravity_transition.py +0 -0
  352. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_artifact_store.py +0 -0
  353. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_artifact_tool.py +0 -0
  354. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_atomic_json.py +0 -0
  355. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_background_service.py +0 -0
  356. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  357. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_bitbucket_client.py +0 -0
  358. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_bitbucket_config_fallback.py +0 -0
  359. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_bitbucket_credentials.py +0 -0
  360. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_bitbucket_tool.py +0 -0
  361. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_builtin_leases.py +0 -0
  362. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_builtin_modes.py +0 -0
  363. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  364. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_c3_shell.py +0 -0
  365. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_chat_poll.py +0 -0
  366. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_act.py +0 -0
  367. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_cache.py +0 -0
  368. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_dag_ownership.py +0 -0
  369. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_expr.py +0 -0
  370. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_impact.py +0 -0
  371. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_intel.py +0 -0
  372. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_runner.py +0 -0
  373. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ci_workflow.py +0 -0
  374. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_circuit_breaker.py +0 -0
  375. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_claude_md_merge.py +0 -0
  376. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_claude_md_updater.py +0 -0
  377. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_cli_smoke.py +0 -0
  378. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_codex_mcp_transport.py +0 -0
  379. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_codex_native.py +0 -0
  380. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_compressor_large_file.py +0 -0
  381. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_confirm_guard.py +0 -0
  382. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_confirm_guard_wiring.py +0 -0
  383. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_cooccurrence_bounds.py +0 -0
  384. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_cred_audit.py +0 -0
  385. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_cred_telemetry.py +0 -0
  386. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_credential_backup.py +0 -0
  387. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_credential_login_kind.py +0 -0
  388. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_credential_store.py +0 -0
  389. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_credential_ui_parity.py +0 -0
  390. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_credentials_routes.py +0 -0
  391. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_credentials_tool.py +0 -0
  392. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_creds_cli_smoke.py +0 -0
  393. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_adoption_d4.py +0 -0
  394. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_auto.py +0 -0
  395. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_cascade.py +0 -0
  396. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_claude_d1.py +0 -0
  397. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_eval.py +0 -0
  398. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_grok.py +0 -0
  399. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_host_d2.py +0 -0
  400. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_scout_d3.py +0 -0
  401. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_telemetry_d0.py +0 -0
  402. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_thinking_cap.py +0 -0
  403. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_tuning.py +0 -0
  404. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_version_probe.py +0 -0
  405. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_write.py +0 -0
  406. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_delegate_write_eval.py +0 -0
  407. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_dir_map_c3.py +0 -0
  408. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_e2e_benchmark.py +0 -0
  409. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_ledger_deadline.py +0 -0
  410. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_ledger_hook.py +0 -0
  411. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_locking.py +0 -0
  412. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_edit_verify.py +0 -0
  413. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_embedding_index_corrupt_store.py +0 -0
  414. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_embedding_index_deadlock.py +0 -0
  415. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_enforcement_flip.py +0 -0
  416. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_enforcement_policy.py +0 -0
  417. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_enforcement_routes.py +0 -0
  418. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_env_parser.py +0 -0
  419. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
  420. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_federated_graph.py +0 -0
  421. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_file_map_c1.py +0 -0
  422. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_filter_backoff.py +0 -0
  423. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ghost_files.py +0 -0
  424. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ghost_generation.py +0 -0
  425. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_git_branch_awareness.py +0 -0
  426. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_grok_native.py +0 -0
  427. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_access_guard.py +0 -0
  428. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_codex_compat.py +0 -0
  429. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_dispatch.py +0 -0
  430. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_grok_compat.py +0 -0
  431. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_pretool_enforce.py +0 -0
  432. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_prompt_recall.py +0 -0
  433. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_session_end.py +0 -0
  434. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_smoke.py +0 -0
  435. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_state.py +0 -0
  436. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hook_utf8_stdio.py +0 -0
  437. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_access_routes.py +0 -0
  438. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_builtin_routes.py +0 -0
  439. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_credentials_route.py +0 -0
  440. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_credentials_routes_write.py +0 -0
  441. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_enforcement_routes.py +0 -0
  442. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_hook_migration.py +0 -0
  443. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_ide_cmd.py +0 -0
  444. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_inspect_api.py +0 -0
  445. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_locks_routes.py +0 -0
  446. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_oracle_service_routes.py +0 -0
  447. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_override_policy_routes.py +0 -0
  448. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_override_routes.py +0 -0
  449. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_rules_routes.py +0 -0
  450. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_server_smoke.py +0 -0
  451. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_sessions_routes.py +0 -0
  452. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_hub_subproject_links.py +0 -0
  453. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ide_workflow_adaptation.py +0 -0
  454. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_index_cap_not_hardcoded.py +0 -0
  455. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_init_clear_preserves_user_content.py +0 -0
  456. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_init_scan.py +0 -0
  457. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_install_mcp_entrypoint.py +0 -0
  458. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_cli_smoke.py +0 -0
  459. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_client.py +0 -0
  460. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_config_fallback.py +0 -0
  461. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_credentials.py +0 -0
  462. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_links.py +0 -0
  463. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_routes.py +0 -0
  464. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_jira_tool.py +0 -0
  465. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_large_files_c4.py +0 -0
  466. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_lazy_store_init.py +0 -0
  467. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_map_eval.py +0 -0
  468. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_map_telemetry_c0.py +0 -0
  469. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mask_guard.py +0 -0
  470. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mask_routes.py +0 -0
  471. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mask_surfaces.py +0 -0
  472. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mcp_host_guard.py +0 -0
  473. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mcp_memory_timeout.py +0 -0
  474. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mcp_server_smoke.py +0 -0
  475. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mcp_toml.py +0 -0
  476. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_memory_distiller.py +0 -0
  477. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_memory_graph_api.py +0 -0
  478. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_memory_queue.py +0 -0
  479. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_memory_system.py +0 -0
  480. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_api.py +0 -0
  481. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_clients.py +0 -0
  482. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_extras.py +0 -0
  483. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_jobs_ci.py +0 -0
  484. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_override_costs.py +0 -0
  485. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_override_routes.py +0 -0
  486. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_mobile_security_api.py +0 -0
  487. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_no_stale_model_pins.py +0 -0
  488. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_notification_dedup.py +0 -0
  489. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_notification_discipline.py +0 -0
  490. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_notification_kinds.py +0 -0
  491. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ollama_credentials.py +0 -0
  492. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_api_auth.py +0 -0
  493. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_apikey_api.py +0 -0
  494. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_c3_bridge.py +0 -0
  495. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_chat_engine.py +0 -0
  496. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_chat_store.py +0 -0
  497. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_discovery_api.py +0 -0
  498. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_discovery_audit.py +0 -0
  499. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_health_probe.py +0 -0
  500. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_local_auth.py +0 -0
  501. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_loopback.py +0 -0
  502. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_ollama_bridge.py +0 -0
  503. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_scanner_cache.py +0 -0
  504. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_security_fixes.py +0 -0
  505. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_session_bootstrap.py +0 -0
  506. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_subproject_awareness.py +0 -0
  507. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_oracle_ui_bundle.py +0 -0
  508. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_output_filter.py +0 -0
  509. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_override_costs.py +0 -0
  510. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_override_grants.py +0 -0
  511. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_override_grants_mcp.py +0 -0
  512. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_override_requests.py +0 -0
  513. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_override_wake.py +0 -0
  514. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_permissions.py +0 -0
  515. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_pm_api.py +0 -0
  516. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_project_manager.py +0 -0
  517. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_project_manager_merge.py +0 -0
  518. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_project_tool.py +0 -0
  519. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_read_coercion.py +0 -0
  520. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_read_outside_root.py +0 -0
  521. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_related_facts.py +0 -0
  522. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_repo_map.py +0 -0
  523. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_repo_shape.py +0 -0
  524. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_response_boilerplate.py +0 -0
  525. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_retention.py +0 -0
  526. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_review_digest.py +0 -0
  527. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_eval.py +0 -0
  528. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_p1.py +0 -0
  529. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_p2.py +0 -0
  530. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_p2b.py +0 -0
  531. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_p3.py +0 -0
  532. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_p4.py +0 -0
  533. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_search_p5.py +0 -0
  534. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_service_durability.py +0 -0
  535. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_session_benchmark.py +0 -0
  536. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_session_budget.py +0 -0
  537. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_session_catalog.py +0 -0
  538. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_session_live.py +0 -0
  539. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_session_tool.py +0 -0
  540. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_budget_s1.py +0 -0
  541. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_creds.py +0 -0
  542. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_eval.py +0 -0
  543. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_jobs_s3.py +0 -0
  544. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_nudge_s4.py +0 -0
  545. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_output.py +0 -0
  546. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_parsers_s2.py +0 -0
  547. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_robustness.py +0 -0
  548. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_telemetry_s0.py +0 -0
  549. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_write_ledger.py +0 -0
  550. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_shell_writes.py +0 -0
  551. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_subproject_clear_scope.py +0 -0
  552. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_subproject_depth_consumers.py +0 -0
  553. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_subproject_exclusion.py +0 -0
  554. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_subproject_federation.py +0 -0
  555. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_subproject_linkage_api.py +0 -0
  556. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_subprojects.py +0 -0
  557. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_swe_bench.py +0 -0
  558. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_task_store.py +0 -0
  559. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_task_tool.py +0 -0
  560. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_time_tracker.py +0 -0
  561. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_token_telemetry.py +0 -0
  562. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_token_tracking.py +0 -0
  563. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_tool_registry.py +0 -0
  564. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_ui_jsx_syntax.py +0 -0
  565. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_upgrade_and_version.py +0 -0
  566. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_validate.py +0 -0
  567. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_vault_write_guard.py +0 -0
  568. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_version_sync.py +0 -0
  569. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_watcher_pruning.py +0 -0
  570. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_web_security.py +0 -0
  571. {code_context_control-2.152.0 → code_context_control-2.154.0}/tests/test_windows_reliability.py +0 -0
  572. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/__init__.py +0 -0
  573. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/backend.py +0 -0
  574. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/main.py +0 -0
  575. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/__init__.py +0 -0
  576. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/benchmark_view.py +0 -0
  577. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/claudemd_view.py +0 -0
  578. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/compress_view.py +0 -0
  579. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/index_view.py +0 -0
  580. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/init_view.py +0 -0
  581. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/mcp_view.py +0 -0
  582. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/optimize_view.py +0 -0
  583. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/pipe_view.py +0 -0
  584. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/projects_view.py +0 -0
  585. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/search_view.py +0 -0
  586. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/session_view.py +0 -0
  587. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/stats.py +0 -0
  588. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/screens/ui_view.py +0 -0
  589. {code_context_control-2.152.0 → code_context_control-2.154.0}/tui/theme.tcss +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.152.0
3
+ Version: 2.154.0
4
4
  Summary: Local MCP code-intelligence for AI coding tools: surgical search/read/edit, agent-config version history, path-level access + masking guards, and a multi-project hub.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -91,7 +91,7 @@ console = Console() if HAS_RICH else None
91
91
  # Config
92
92
  CONFIG_DIR = ".c3"
93
93
  CONFIG_FILE = ".c3/config.json"
94
- __version__ = "2.152.0"
94
+ __version__ = "2.154.0"
95
95
 
96
96
  # The PreToolUse matcher for native subagent calls (installer and hub migration).
97
97
  AGENT_MATCHER = "Agent|Task"
@@ -1288,6 +1288,14 @@ def cmd_init(args):
1288
1288
  except Exception:
1289
1289
  pass
1290
1290
 
1291
+ swept = _prune_project_quarantines(project_path)
1292
+ if swept["pruned"]:
1293
+ print(f" Fixed : freed {_format_bytes(swept['bytes'])} from "
1294
+ f"{len(swept['pruned'])} old embedding quarantine dir(s)")
1295
+ for name in swept["failed"]:
1296
+ print(f" [warn] {name} could not be fully removed (in use?); "
1297
+ "run 'c3 prune-quarantine' later")
1298
+
1291
1299
  # Delegate backends
1292
1300
  try:
1293
1301
  from services.ollama_client import OllamaClient as _OC
@@ -1463,6 +1471,59 @@ def cmd_index(args):
1463
1471
  return common_cmd_index(args, _command_deps())
1464
1472
 
1465
1473
 
1474
+ def _format_bytes(n: float) -> str:
1475
+ for unit in ("B", "KB", "MB", "GB"):
1476
+ if n < 1024:
1477
+ return f"{n:.0f} {unit}" if unit == "B" else f"{n:.1f} {unit}"
1478
+ n /= 1024
1479
+ return f"{n:.1f} TB"
1480
+
1481
+
1482
+ def _prune_project_quarantines(project_path: str, keep=None, dry_run: bool = False) -> dict:
1483
+ """Prune one project's ``.c3/embeddings/quarantine_corrupt_*`` dirs; returns the sweep result."""
1484
+ from cli.progress import ProgressLine
1485
+ from services.embedding_index import prune_quarantines
1486
+
1487
+ prog = ProgressLine()
1488
+ try:
1489
+ return prune_quarantines(
1490
+ Path(project_path) / CONFIG_DIR / "embeddings", keep=keep, dry_run=dry_run,
1491
+ on_progress=lambda done, total: prog.update(
1492
+ f" removing quarantine copies {done}/{total}"))
1493
+ finally:
1494
+ prog.done()
1495
+
1496
+
1497
+ def cmd_prune_quarantine(args):
1498
+ """Delete old corrupt-embedding-store quarantine copies, keeping the newest few."""
1499
+ if args.all:
1500
+ from services.project_manager import ProjectManager
1501
+ projects = [p["path"] for p in ProjectManager().list_registered()]
1502
+ else:
1503
+ projects = [str(Path(args.project_path or ".").resolve())]
1504
+
1505
+ verb = "would remove" if args.dry_run else "removed"
1506
+ pruned = failed = freed = 0
1507
+ for project in projects:
1508
+ res = _prune_project_quarantines(project, keep=args.keep, dry_run=args.dry_run)
1509
+ if not (res["pruned"] or res["failed"]):
1510
+ continue
1511
+ pruned += len(res["pruned"])
1512
+ failed += len(res["failed"])
1513
+ freed += res["bytes"]
1514
+ print(f"{project}: {verb} {len(res['pruned'])} quarantine dir(s), "
1515
+ f"{_format_bytes(res['bytes'])}; kept {len(res['kept'])}")
1516
+ for name in res["failed"]:
1517
+ print(f" [warn] {name} could not be fully removed (in use?); run again later")
1518
+
1519
+ if not (pruned or failed):
1520
+ print(f"Nothing to prune in {len(projects)} project(s).")
1521
+ return
1522
+ print(f"\n{verb.capitalize()} {pruned} quarantine dir(s), {_format_bytes(freed)}.")
1523
+ if failed:
1524
+ sys.exit(1)
1525
+
1526
+
1466
1527
  def cmd_compress(args):
1467
1528
  """Compress a file and show results."""
1468
1529
  return common_cmd_compress(args, _command_deps())
@@ -9603,6 +9664,7 @@ def main():
9603
9664
  "enforce": cmd_enforce,
9604
9665
  "override": cmd_override,
9605
9666
  "locks": cmd_locks,
9667
+ "prune-quarantine": cmd_prune_quarantine,
9606
9668
  "ci": cmd_ci,
9607
9669
  "oracle": cmd_oracle,
9608
9670
  "upgrade": cmd_upgrade,
@@ -37,6 +37,17 @@ def build_parser(version: str, parse_cli_ide_arg):
37
37
  p_upgrade.add_argument("--check", action="store_true",
38
38
  help="Only report whether a newer version exists; don't install")
39
39
 
40
+ p_prune = subparsers.add_parser(
41
+ "prune-quarantine",
42
+ help="Delete old corrupt-embedding-store quarantine copies (frees disk)")
43
+ p_prune.add_argument("project_path", nargs="?", default=".")
44
+ p_prune.add_argument("--all", action="store_true",
45
+ help="Every project registered with the hub, not just this one")
46
+ p_prune.add_argument("--keep", type=int, default=None,
47
+ help="Newest quarantine dirs to keep per project (default 2)")
48
+ p_prune.add_argument("--dry-run", action="store_true",
49
+ help="Report what would be removed without deleting")
50
+
40
51
  p_index = subparsers.add_parser("index", help="Rebuild code index")
41
52
  p_index.add_argument("--max-files", type=int, default=None,
42
53
  help="Cap files indexed this run. Unset reads "
@@ -663,6 +663,10 @@
663
663
  <code>c3 map {status|ensure|refresh}</code>
664
664
  <span>Inspect or rebuild the live repo map at .c3/MAP.md</span>
665
665
  </div>
666
+ <div class="quick-item">
667
+ <code>c3 prune-quarantine [--all] [--dry-run]</code>
668
+ <span>Free disk held by old corrupt-embedding-store copies in .c3/embeddings (<code>c3 init</code> runs it too)</span>
669
+ </div>
666
670
  <div class="quick-item">
667
671
  <code>c3 hub</code>
668
672
  <span>Launch the Project Hub web dashboard (localhost:3330)</span>
@@ -481,7 +481,13 @@ c3_filter(text=<span class="str">"&lt;webpack build output&gt;"</span>, pattern=
481
481
  <td class="param-name">edits</td>
482
482
  <td class="param-type">array</td>
483
483
  <td class="param-default">null</td>
484
- <td class="param-desc">List of <code>{old_string, new_string}</code> objects for batch edits to the same file</td>
484
+ <td class="param-desc">List of <code>{old_string, new_string}</code> objects for batch edits to the same file. Applied in order, all or none: if one patch cannot be placed, nothing is written</td>
485
+ </tr>
486
+ <tr>
487
+ <td class="param-name">overwrite</td>
488
+ <td class="param-type">bool</td>
489
+ <td class="param-default">false</td>
490
+ <td class="param-desc">Replace all of an existing file with <code>new_string</code>. Refused unless this session has read the file with c3_read and the file has not changed since. Keeps the file's line endings and BOM, stores a pre-image, and can be reverted</td>
485
491
  </tr>
486
492
  </tbody>
487
493
  </table>
@@ -514,7 +520,7 @@ c3_filter(text=<span class="str">"&lt;webpack build output&gt;"</span>, pattern=
514
520
  <div class="callout callout-info">
515
521
  <span class="callout-icon">💡</span>
516
522
  <div class="callout-body">
517
- <strong>Unicode lookalikes are matched automatically.</strong> If <code>old_string</code> uses straight quotes but the file has curly quotes (or vice versa), or the two differ only by ASCII vs. unicode dashes (<code>-</code>/<code>–</code>/<code>—</code>) or non-breaking spaces, c3_edit retries with a normalized match and splices your <code>new_string</code> in at the matched offsets; unrelated lookalikes elsewhere are left intact. The response is tagged <code>[unicode-normalized]</code> when the fallback was used.
523
+ <strong>Unicode lookalikes are reported, not applied.</strong> If <code>old_string</code> uses straight quotes but the file has curly quotes (or vice versa), or the two differ only by ASCII vs. unicode dashes (<code>-</code>/<code>–</code>/<code>—</code>) or non-breaking spaces, c3_edit writes nothing and answers <code>[c3_edit:lookalike]</code> with the file's exact text for that region, so the retry can copy it. Applying such a match would replace the file's characters with the retyped ones.
518
524
  </div>
519
525
  </div>
520
526
  </div>
@@ -623,7 +623,7 @@ c3_impact(target=<span class="str">'MemoryStore'</span>, mode=<span class="str">
623
623
  </div>
624
624
  <div class="workflow-step-body">
625
625
 
626
- <p><code>c3_edit</code> does read + patch + write + edit ledger log in one step. It also validates the old_string match before writing. If the literal match fails but the strings differ only by unicode lookalikes (curly quotes, em/en-dashes, NBSP), c3_edit retries with a 1:1 normalized match and tags the response <code>[unicode-normalized]</code>.</p>
626
+ <p><code>c3_edit</code> does read + patch + write + edit ledger log in one step. It also validates the old_string match before writing. If the literal match fails but the strings differ only by unicode lookalikes (curly quotes, em/en-dashes, NBSP), c3_edit writes nothing and returns the file's exact text under <code>[c3_edit:lookalike]</code>.</p>
627
627
 
628
628
  <pre><code>c3_edit(
629
629
  file_path=<span class="str">'services/auth.py'</span>,
@@ -543,7 +543,9 @@ def _with_hint(resp, make_hint) -> str:
543
543
 
544
544
  def _finalize_response(ctx: Context, tool_name: str, args: dict,
545
545
  response: str, summary: str = "",
546
- response_tokens: int = 0) -> str:
546
+ response_tokens: int = 0,
547
+ ok: bool | None = None) -> str:
548
+ """ok: the tool's own verdict on the call; None reads it off the response text."""
547
549
  global _last_tool_call_time, _last_badge_count
548
550
 
549
551
  deferred_snapshot = False
@@ -586,11 +588,14 @@ def _finalize_response(ctx: Context, tool_name: str, args: dict,
586
588
  svc.session_mgr.log_tool_call(tool_name, args, summary)
587
589
  # ok=False lets hook_pretool_enforce's activity scan skip a failed call
588
590
  # (ISSUE-3: "Error: File not found" used to count as "c3 was used").
589
- try:
590
- from cli._hook_utils import response_text_failed as _failed
591
- call_ok = not _failed(response)
592
- except Exception:
593
- call_ok = True
591
+ if ok is not None:
592
+ call_ok = ok
593
+ else:
594
+ try:
595
+ from cli._hook_utils import response_text_failed as _failed
596
+ call_ok = not _failed(response)
597
+ except Exception:
598
+ call_ok = True
594
599
  # Both session ids on every tool_call row (D0b): C3's own id joins the
595
600
  # row to session_start / the saved session file, the host id joins it to
596
601
  # the hooks' session_open / session_end rows. Either may be absent.
@@ -903,12 +908,13 @@ async def c3_agent(workflow: str, scope: str = "", context: str = "",
903
908
  @mcp.tool()
904
909
  async def c3_edit(file_path: str, old_string: str = "", new_string: str = "",
905
910
  summary: str = "", tags: str = "", replace_all: bool = False,
906
- edits: str | list[dict] = "",
911
+ edits: str | list[dict] = "", overwrite: bool = False,
907
912
  ctx: Context = None) -> str:
908
913
  """EDIT — read+patch+write+log in one step. Primary code-change tool; always prefer over native Edit.
909
914
  old_string: text to replace. new_string: replacement. summary: ledger description.
910
- edits: list (or JSON string) of {old_string, new_string, summary?} for multi-hunk batch on one file.
911
- Parallel across files. Create new file: non-existent file_path + old_string='' + new_string=<content>.
915
+ edits: list (or JSON string) of {old_string, new_string, summary?} for multi-hunk batch on one file,
916
+ applied all or none. Parallel across files. Create new file: non-existent file_path + old_string='' + new_string=<content>.
917
+ Rewrite a whole existing file: overwrite=true + new_string=<content>, after a c3_read of it.
912
918
  If this call ERRORS OR TIMES OUT, do not retry blind — a failed c3_edit may still have
913
919
  written the file. Re-send the same args to c3_edits(action='verify') for a verdict."""
914
920
  path_err = validate_file_path(file_path)
@@ -920,7 +926,8 @@ async def c3_edit(file_path: str, old_string: str = "", new_string: str = "",
920
926
  return _finalize_response(ctx, name, args, resp, summ, **kw)
921
927
 
922
928
  resp = await asyncio.to_thread(handle_edit, file_path, old_string, new_string,
923
- summary, tags, replace_all, svc, finalize, edits)
929
+ summary, tags, replace_all, svc, finalize, edits,
930
+ overwrite)
924
931
  return _with_hint(resp, lambda: delegate_hints.after_edit(
925
932
  svc, file_path, delegate_hints.edit_chars(new_string, edits)))
926
933
 
@@ -4,8 +4,9 @@ Two concerns, both read-only:
4
4
  - ``locate``: a RELATIVE file_path resolves against the project root, which is
5
5
  the main checkout. When the repo has other git worktrees, the caller may have
6
6
  meant one of them, so the response names the resolved path and any worktree
7
- holding the same relative path, and refuses outright when the path exists only
8
- in a worktree.
7
+ holding the same relative path. It refuses outright when the path exists only
8
+ in a worktree, or when this process last wrote to a worktree that the path
9
+ could equally mean.
9
10
  - ``diff_block``: a compact unified diff of the whole file, before → after.
10
11
  """
11
12
  import difflib
@@ -19,6 +20,7 @@ from pathlib import Path
19
20
  _WORKTREE_TTL_S = 60.0
20
21
  _GIT_TIMEOUT_S = 3.0
21
22
  _worktree_cache: dict[str, tuple[float, list[Path]]] = {}
23
+ _last_tree: dict[str, Path] = {}
22
24
  _cache_lock = threading.Lock()
23
25
 
24
26
  DIFF_MAX_LINES = 24
@@ -98,13 +100,26 @@ def _other_trees(project_root: Path, roots: list[Path]) -> list[tuple[Path, Path
98
100
  return [(root, root / prefix) for root in roots if root != own]
99
101
 
100
102
 
103
+ def note_write(path: Path, project_path: str) -> None:
104
+ """Record the worktree a write landed in, for ``locate`` to compare the
105
+ next relative path against."""
106
+ holding = [r for r in worktree_roots(project_path)
107
+ if r == path or r in path.parents]
108
+ if holding:
109
+ with _cache_lock:
110
+ _last_tree[str(Path(project_path).resolve())] = max(
111
+ holding, key=lambda r: len(r.parts))
112
+
113
+
101
114
  def locate(file_path: str, path: Path, project_path: str) -> tuple[str, str]:
102
115
  """Check a resolved edit target against the repo's other worktrees.
103
116
 
104
117
  Returns ``(refusal, note)``, at most one non-empty. ``refusal`` is set when a
105
118
  relative ``file_path`` does not exist in this checkout but does in another
106
- worktree. ``note`` is extra response text for a relative path in a repo
107
- with other worktrees. Absolute paths always return ``("", "")``.
119
+ worktree, or when the last write went to another worktree where the path
120
+ exists or would be created. ``note`` is extra response text for a relative
121
+ path in a repo with other worktrees. Absolute paths always return
122
+ ``("", "")``.
108
123
  """
109
124
  if Path(file_path).is_absolute():
110
125
  return "", ""
@@ -117,6 +132,18 @@ def locate(file_path: str, path: Path, project_path: str) -> tuple[str, str]:
117
132
  except ValueError:
118
133
  return "", ""
119
134
  hits = [proj / rel for _, proj in others if (proj / rel).exists()]
135
+ with _cache_lock:
136
+ last = _last_tree.get(str(project_root))
137
+ recent = next((proj / rel for root, proj in others if root == last), None)
138
+ if recent is not None and (recent.exists() or not path.exists()):
139
+ there = ("where the same path is" if recent.exists()
140
+ else "where this path would be")
141
+ return (f"[c3_edit:wrong-tree] {file_path} is relative, so it means "
142
+ f"{path} in this checkout, but this session's last edit went "
143
+ f"to another git worktree, {there}:\n"
144
+ f" {recent}\n"
145
+ f" Nothing was written. Pass the absolute path of the one "
146
+ f"you mean."), ""
120
147
  if not path.exists() and hits:
121
148
  listed = "\n".join(f" {h}" for h in hits)
122
149
  return (f"[c3_edit:wrong-tree] {file_path} does not exist in this checkout "