code-context-control 2.149.1__tar.gz → 2.153.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 (588) hide show
  1. {code_context_control-2.149.1 → code_context_control-2.153.0}/PKG-INFO +1 -1
  2. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/c3.py +1 -1
  3. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/tools.html +9 -2
  4. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/workflow.html +1 -1
  5. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/mcp_server.py +22 -12
  6. code_context_control-2.153.0/cli/tools/_edit_report.py +213 -0
  7. code_context_control-2.153.0/cli/tools/edit.py +997 -0
  8. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/edit_verify.py +12 -10
  9. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/edits.py +112 -2
  10. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/read.py +2 -1
  11. {code_context_control-2.149.1 → code_context_control-2.153.0}/code_context_control.egg-info/PKG-INFO +1 -1
  12. {code_context_control-2.149.1 → code_context_control-2.153.0}/code_context_control.egg-info/SOURCES.txt +8 -0
  13. {code_context_control-2.149.1 → code_context_control-2.153.0}/pyproject.toml +1 -1
  14. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/access_guard.py +1 -1
  15. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/agent_locks.py +30 -0
  16. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/atomic_json.py +25 -8
  17. code_context_control-2.153.0/services/edit_blobs.py +208 -0
  18. code_context_control-2.153.0/services/read_stamps.py +314 -0
  19. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_access_guard_meta.py +1 -0
  20. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_agent_locks.py +38 -0
  21. code_context_control-2.153.0/tests/test_edit_eol_atomic.py +236 -0
  22. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_edit_normalization.py +68 -75
  23. code_context_control-2.153.0/tests/test_edit_outcome.py +79 -0
  24. code_context_control-2.153.0/tests/test_edit_report.py +163 -0
  25. code_context_control-2.153.0/tests/test_edit_revert.py +232 -0
  26. code_context_control-2.153.0/tests/test_edit_stale.py +262 -0
  27. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_read_edit_parity.py +1 -1
  28. code_context_control-2.149.1/cli/tools/edit.py +0 -669
  29. {code_context_control-2.149.1 → code_context_control-2.153.0}/LICENSE +0 -0
  30. {code_context_control-2.149.1 → code_context_control-2.153.0}/README.md +0 -0
  31. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/__init__.py +0 -0
  32. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/_hook_utils.py +0 -0
  33. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/_shell_writes.py +0 -0
  34. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/commands/__init__.py +0 -0
  35. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/commands/common.py +0 -0
  36. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/commands/parser.py +0 -0
  37. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/docs.html +0 -0
  38. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/edits.html +0 -0
  39. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/access.html +0 -0
  40. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/bitbucket.html +0 -0
  41. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/ci.html +0 -0
  42. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/credentials.html +0 -0
  43. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/delegate.html +0 -0
  44. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/getting-started.html +0 -0
  45. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/index.html +0 -0
  46. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/jira.html +0 -0
  47. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/masking.html +0 -0
  48. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/oracle.html +0 -0
  49. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/sessions.html +0 -0
  50. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/guide/shared.css +0 -0
  51. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_access_guard.py +0 -0
  52. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_agent_model.py +0 -0
  53. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_artifact.py +0 -0
  54. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_auto_snapshot.py +0 -0
  55. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_c3_signal.py +0 -0
  56. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_c3read.py +0 -0
  57. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_codex_lifecycle.py +0 -0
  58. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_dispatch.py +0 -0
  59. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_edit_ledger.py +0 -0
  60. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_edit_unlock.py +0 -0
  61. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_filter.py +0 -0
  62. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_ghost_files.py +0 -0
  63. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_pretool_enforce.py +0 -0
  64. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_prompt_recall.py +0 -0
  65. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_read.py +0 -0
  66. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_session_end.py +0 -0
  67. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_session_open.py +0 -0
  68. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_session_stats.py +0 -0
  69. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hook_terse_advisor.py +0 -0
  70. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_server.py +0 -0
  71. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/app.js +0 -0
  72. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/add_project.js +0 -0
  73. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/config_editor.js +0 -0
  74. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  75. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/drill_health.js +0 -0
  76. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/drill_panel.js +0 -0
  77. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
  78. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  79. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/drill_views.js +0 -0
  80. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/global_search.js +0 -0
  81. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_access.js +0 -0
  82. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_ci.js +0 -0
  83. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
  84. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_credentials.js +0 -0
  85. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
  86. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_locks.js +0 -0
  87. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_sessions.js +0 -0
  88. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/hub_tokens.js +0 -0
  89. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  90. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/modals.js +0 -0
  91. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/project_card.js +0 -0
  92. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/project_tree.js +0 -0
  93. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/session_drawer.js +0 -0
  94. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/settings_modal.js +0 -0
  95. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/sidebar.js +0 -0
  96. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/summary_bar.js +0 -0
  97. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/task_board.js +0 -0
  98. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/toasts.js +0 -0
  99. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/components/topbar.js +0 -0
  100. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui/state.js +0 -0
  101. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/hub_ui.html +0 -0
  102. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/mcp_proxy.py +0 -0
  103. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/progress.py +0 -0
  104. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/server.py +0 -0
  105. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/__init__.py +0 -0
  106. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/_grants.py +0 -0
  107. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/_helpers.py +0 -0
  108. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/agent.py +0 -0
  109. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/artifacts.py +0 -0
  110. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/bitbucket.py +0 -0
  111. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/ci.py +0 -0
  112. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/compress.py +0 -0
  113. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/credentials.py +0 -0
  114. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/delegate.py +0 -0
  115. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/federate.py +0 -0
  116. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/filter.py +0 -0
  117. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/impact.py +0 -0
  118. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/jira.py +0 -0
  119. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/locks.py +0 -0
  120. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/memory.py +0 -0
  121. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/override.py +0 -0
  122. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/project.py +0 -0
  123. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/search.py +0 -0
  124. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/session.py +0 -0
  125. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/shell.py +0 -0
  126. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/shell_job.py +0 -0
  127. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/shell_nudge.py +0 -0
  128. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/shell_parsers.py +0 -0
  129. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/shell_render.py +0 -0
  130. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/status.py +0 -0
  131. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/tasks.py +0 -0
  132. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/tools/validate.py +0 -0
  133. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/api.js +0 -0
  134. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/app.js +0 -0
  135. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/access.js +0 -0
  136. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/bitbucket.js +0 -0
  137. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/chat.js +0 -0
  138. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/credentials.js +0 -0
  139. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/dashboard.js +0 -0
  140. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/edits.js +0 -0
  141. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/enforcement.js +0 -0
  142. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/instructions.js +0 -0
  143. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/jira.js +0 -0
  144. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/memory.js +0 -0
  145. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/sessions.js +0 -0
  146. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/settings.js +0 -0
  147. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/sidebar.js +0 -0
  148. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/components/tasks.js +0 -0
  149. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/icons.js +0 -0
  150. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/pm_shared.js +0 -0
  151. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/shared.js +0 -0
  152. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui/theme.js +0 -0
  153. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui.html +0 -0
  154. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui_legacy.html +0 -0
  155. {code_context_control-2.149.1 → code_context_control-2.153.0}/cli/ui_nano.html +0 -0
  156. {code_context_control-2.149.1 → code_context_control-2.153.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  157. {code_context_control-2.149.1 → code_context_control-2.153.0}/code_context_control.egg-info/entry_points.txt +0 -0
  158. {code_context_control-2.149.1 → code_context_control-2.153.0}/code_context_control.egg-info/requires.txt +0 -0
  159. {code_context_control-2.149.1 → code_context_control-2.153.0}/code_context_control.egg-info/top_level.txt +0 -0
  160. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/__init__.py +0 -0
  161. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/codex_patch.py +0 -0
  162. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/config.py +0 -0
  163. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/grok_payload.py +0 -0
  164. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/hook_command.py +0 -0
  165. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/host.py +0 -0
  166. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/ide.py +0 -0
  167. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/mcp_toml.py +0 -0
  168. {code_context_control-2.149.1 → code_context_control-2.153.0}/core/web_security.py +0 -0
  169. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/__init__.py +0 -0
  170. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/config.py +0 -0
  171. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/listeners.py +0 -0
  172. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/mcp_oracle.py +0 -0
  173. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/oracle_server.py +0 -0
  174. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/oracle_ui.html +0 -0
  175. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/__init__.py +0 -0
  176. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/activity_reporter.py +0 -0
  177. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/api_auth.py +0 -0
  178. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/c3_bridge.py +0 -0
  179. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/chat_engine.py +0 -0
  180. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/chat_poll.py +0 -0
  181. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/chat_store.py +0 -0
  182. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/client_tokens.py +0 -0
  183. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/cross_memory.py +0 -0
  184. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/discovery_audit.py +0 -0
  185. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/federated_graph.py +0 -0
  186. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/health_checker.py +0 -0
  187. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/insight_engine.py +0 -0
  188. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/local_session.py +0 -0
  189. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/memory_reader.py +0 -0
  190. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/memory_writer.py +0 -0
  191. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/mobile_api.py +0 -0
  192. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/project_scanner.py +0 -0
  193. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/review_agent.py +0 -0
  194. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/tool_executor.py +0 -0
  195. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/services/tool_registry.py +0 -0
  196. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/activity.js +0 -0
  197. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/agents.js +0 -0
  198. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/app.js +0 -0
  199. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/busy.js +0 -0
  200. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/chat/conversations.js +0 -0
  201. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/chat/input.js +0 -0
  202. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/chat/markdown.js +0 -0
  203. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/chat/send.js +0 -0
  204. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/chat/stream_renderer.js +0 -0
  205. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/chat/toolbar.js +0 -0
  206. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/core.js +0 -0
  207. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/crossgraph.js +0 -0
  208. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/header.js +0 -0
  209. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/insights.js +0 -0
  210. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/projects.js +0 -0
  211. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/qrcode.js +0 -0
  212. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/settings.js +0 -0
  213. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/suggestions.js +0 -0
  214. {code_context_control-2.149.1 → code_context_control-2.153.0}/oracle/ui/theme_tabs.js +0 -0
  215. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/__init__.py +0 -0
  216. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/access_telemetry.py +0 -0
  217. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/activity_log.py +0 -0
  218. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/agent_base.py +0 -0
  219. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/agent_downshift.py +0 -0
  220. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/agents.py +0 -0
  221. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/agents_workflow.py +0 -0
  222. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/artifact_defs.py +0 -0
  223. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/artifact_store.py +0 -0
  224. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/auto_memory.py +0 -0
  225. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/background_service.py +0 -0
  226. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/__init__.py +0 -0
  227. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/delegate_eval.py +0 -0
  228. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/delegate_write_eval.py +0 -0
  229. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/external/__init__.py +0 -0
  230. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/external/aider_polyglot.py +0 -0
  231. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/external/swe_bench.py +0 -0
  232. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/map_eval.py +0 -0
  233. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/search_eval.py +0 -0
  234. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bench/shell_eval.py +0 -0
  235. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/benchmark_dashboard.py +0 -0
  236. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bitbucket_client.py +0 -0
  237. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/bitbucket_credentials.py +0 -0
  238. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/builtin_leases.py +0 -0
  239. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_act.py +0 -0
  240. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_cache.py +0 -0
  241. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_expr.py +0 -0
  242. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_failures.py +0 -0
  243. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_github.py +0 -0
  244. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_impact.py +0 -0
  245. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_intel.py +0 -0
  246. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_runner.py +0 -0
  247. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ci_workflow.py +0 -0
  248. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/circuit_breaker.py +0 -0
  249. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/claude_md.py +0 -0
  250. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/codex_integration.py +0 -0
  251. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/codex_transcript.py +0 -0
  252. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/compressor.py +0 -0
  253. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/context_snapshot.py +0 -0
  254. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/conversation_store.py +0 -0
  255. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/cred_audit.py +0 -0
  256. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/cred_telemetry.py +0 -0
  257. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/credential_backup.py +0 -0
  258. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/credential_store.py +0 -0
  259. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/delegate_agents.py +0 -0
  260. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/delegate_hints.py +0 -0
  261. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/delegate_write.py +0 -0
  262. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/dir_map.py +0 -0
  263. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/doc_index.py +0 -0
  264. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/e2e_benchmark.py +0 -0
  265. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/e2e_evaluator.py +0 -0
  266. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/e2e_tasks.py +0 -0
  267. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/edit_ledger.py +0 -0
  268. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/embedding_index.py +0 -0
  269. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/enforcement_policy.py +0 -0
  270. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/error_reporting.py +0 -0
  271. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/file_map.py +0 -0
  272. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/file_memory.py +0 -0
  273. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/git_context.py +0 -0
  274. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/grok_integration.py +0 -0
  275. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/grok_transcript.py +0 -0
  276. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/host_sessions.py +0 -0
  277. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/hub_service.py +0 -0
  278. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/index_store.py +0 -0
  279. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/indexer.py +0 -0
  280. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/jira_client.py +0 -0
  281. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/jira_cloud.py +0 -0
  282. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/jira_credentials.py +0 -0
  283. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/jira_data_center.py +0 -0
  284. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/jira_links.py +0 -0
  285. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/lexical_index.py +0 -0
  286. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/mask_activation.py +0 -0
  287. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/mask_mirror.py +0 -0
  288. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/mask_presets.py +0 -0
  289. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory.py +0 -0
  290. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory_consolidator.py +0 -0
  291. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory_distiller.py +0 -0
  292. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory_graph.py +0 -0
  293. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory_grounder.py +0 -0
  294. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory_queue.py +0 -0
  295. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/memory_scorer.py +0 -0
  296. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/metrics.py +0 -0
  297. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/notifications.py +0 -0
  298. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ollama_bridge.py +0 -0
  299. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ollama_client.py +0 -0
  300. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/ollama_credentials.py +0 -0
  301. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/oracle_service.py +0 -0
  302. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/output_filter.py +0 -0
  303. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/override_costs.py +0 -0
  304. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/override_grants.py +0 -0
  305. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/override_policy.py +0 -0
  306. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/override_requests.py +0 -0
  307. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/override_wake.py +0 -0
  308. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/parser.py +0 -0
  309. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/project_manager.py +0 -0
  310. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/project_runtime.py +0 -0
  311. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/protocol.py +0 -0
  312. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/proxy_state.py +0 -0
  313. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/repo_map.py +0 -0
  314. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/repo_shape.py +0 -0
  315. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/reranker.py +0 -0
  316. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/retention.py +0 -0
  317. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/retrieval.py +0 -0
  318. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/retrieval_broker.py +0 -0
  319. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/router.py +0 -0
  320. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/runtime.py +0 -0
  321. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/scanner.py +0 -0
  322. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/session_benchmark.py +0 -0
  323. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/session_catalog.py +0 -0
  324. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/session_live.py +0 -0
  325. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/session_manager.py +0 -0
  326. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/session_preloader.py +0 -0
  327. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/shell_jobs.py +0 -0
  328. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/shell_output.py +0 -0
  329. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/subprojects.py +0 -0
  330. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/task_store.py +0 -0
  331. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/telemetry.py +0 -0
  332. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/terminal_launch.py +0 -0
  333. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/text_index.py +0 -0
  334. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/time_tracker.py +0 -0
  335. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/tool_classifier.py +0 -0
  336. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/transcript_index.py +0 -0
  337. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/validation_cache.py +0 -0
  338. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/vector_store.py +0 -0
  339. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/watcher.py +0 -0
  340. {code_context_control-2.149.1 → code_context_control-2.153.0}/services/win_subprocess.py +0 -0
  341. {code_context_control-2.149.1 → code_context_control-2.153.0}/setup.cfg +0 -0
  342. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_access_builtin_optout.py +0 -0
  343. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_access_guard.py +0 -0
  344. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_access_guard_shell_project.py +0 -0
  345. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_access_guard_surfaces.py +0 -0
  346. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_access_guard_wiring.py +0 -0
  347. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_activity_log_find_last.py +0 -0
  348. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_activity_reporter.py +0 -0
  349. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_aider_polyglot.py +0 -0
  350. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_antigravity_transition.py +0 -0
  351. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_artifact_store.py +0 -0
  352. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_artifact_tool.py +0 -0
  353. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_atomic_json.py +0 -0
  354. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_background_service.py +0 -0
  355. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  356. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_bitbucket_client.py +0 -0
  357. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_bitbucket_config_fallback.py +0 -0
  358. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_bitbucket_credentials.py +0 -0
  359. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_bitbucket_tool.py +0 -0
  360. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_builtin_leases.py +0 -0
  361. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_builtin_modes.py +0 -0
  362. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  363. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_c3_shell.py +0 -0
  364. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_chat_poll.py +0 -0
  365. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_act.py +0 -0
  366. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_cache.py +0 -0
  367. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_dag_ownership.py +0 -0
  368. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_expr.py +0 -0
  369. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_impact.py +0 -0
  370. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_intel.py +0 -0
  371. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_runner.py +0 -0
  372. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ci_workflow.py +0 -0
  373. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_circuit_breaker.py +0 -0
  374. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_claude_md_merge.py +0 -0
  375. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_claude_md_updater.py +0 -0
  376. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_cli_smoke.py +0 -0
  377. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_codex_mcp_transport.py +0 -0
  378. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_codex_native.py +0 -0
  379. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_compressor_large_file.py +0 -0
  380. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_confirm_guard.py +0 -0
  381. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_confirm_guard_wiring.py +0 -0
  382. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_cooccurrence_bounds.py +0 -0
  383. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_cred_audit.py +0 -0
  384. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_cred_telemetry.py +0 -0
  385. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_credential_backup.py +0 -0
  386. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_credential_login_kind.py +0 -0
  387. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_credential_store.py +0 -0
  388. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_credential_ui_parity.py +0 -0
  389. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_credentials_routes.py +0 -0
  390. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_credentials_tool.py +0 -0
  391. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_creds_cli_smoke.py +0 -0
  392. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_adoption_d4.py +0 -0
  393. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_auto.py +0 -0
  394. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_cascade.py +0 -0
  395. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_claude_d1.py +0 -0
  396. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_eval.py +0 -0
  397. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_grok.py +0 -0
  398. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_host_d2.py +0 -0
  399. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_scout_d3.py +0 -0
  400. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_telemetry_d0.py +0 -0
  401. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_thinking_cap.py +0 -0
  402. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_tuning.py +0 -0
  403. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_version_probe.py +0 -0
  404. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_write.py +0 -0
  405. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_delegate_write_eval.py +0 -0
  406. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_dir_map_c3.py +0 -0
  407. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_e2e_benchmark.py +0 -0
  408. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_edit_ledger_deadline.py +0 -0
  409. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_edit_ledger_hook.py +0 -0
  410. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_edit_locking.py +0 -0
  411. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_edit_verify.py +0 -0
  412. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_embedding_index_corrupt_store.py +0 -0
  413. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_embedding_index_deadlock.py +0 -0
  414. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_enforcement_flip.py +0 -0
  415. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_enforcement_policy.py +0 -0
  416. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_enforcement_routes.py +0 -0
  417. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_env_parser.py +0 -0
  418. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
  419. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_federated_graph.py +0 -0
  420. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_file_map_c1.py +0 -0
  421. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_filter_backoff.py +0 -0
  422. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ghost_files.py +0 -0
  423. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ghost_generation.py +0 -0
  424. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_git_branch_awareness.py +0 -0
  425. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_grok_native.py +0 -0
  426. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_access_guard.py +0 -0
  427. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_codex_compat.py +0 -0
  428. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_dispatch.py +0 -0
  429. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_grok_compat.py +0 -0
  430. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_pretool_enforce.py +0 -0
  431. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_prompt_recall.py +0 -0
  432. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_session_end.py +0 -0
  433. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_smoke.py +0 -0
  434. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_state.py +0 -0
  435. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hook_utf8_stdio.py +0 -0
  436. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_access_routes.py +0 -0
  437. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_builtin_routes.py +0 -0
  438. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_credentials_route.py +0 -0
  439. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_credentials_routes_write.py +0 -0
  440. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_enforcement_routes.py +0 -0
  441. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_hook_migration.py +0 -0
  442. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_ide_cmd.py +0 -0
  443. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_inspect_api.py +0 -0
  444. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_locks_routes.py +0 -0
  445. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_oracle_service_routes.py +0 -0
  446. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_override_policy_routes.py +0 -0
  447. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_override_routes.py +0 -0
  448. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_rules_routes.py +0 -0
  449. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_server_smoke.py +0 -0
  450. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_sessions_routes.py +0 -0
  451. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_hub_subproject_links.py +0 -0
  452. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ide_workflow_adaptation.py +0 -0
  453. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_index_cap_not_hardcoded.py +0 -0
  454. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_init_clear_preserves_user_content.py +0 -0
  455. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_init_scan.py +0 -0
  456. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_install_mcp_entrypoint.py +0 -0
  457. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_cli_smoke.py +0 -0
  458. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_client.py +0 -0
  459. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_config_fallback.py +0 -0
  460. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_credentials.py +0 -0
  461. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_links.py +0 -0
  462. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_routes.py +0 -0
  463. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_jira_tool.py +0 -0
  464. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_large_files_c4.py +0 -0
  465. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_lazy_store_init.py +0 -0
  466. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_map_eval.py +0 -0
  467. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_map_telemetry_c0.py +0 -0
  468. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mask_guard.py +0 -0
  469. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mask_routes.py +0 -0
  470. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mask_surfaces.py +0 -0
  471. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mcp_host_guard.py +0 -0
  472. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mcp_memory_timeout.py +0 -0
  473. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mcp_server_smoke.py +0 -0
  474. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mcp_toml.py +0 -0
  475. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_memory_distiller.py +0 -0
  476. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_memory_graph_api.py +0 -0
  477. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_memory_queue.py +0 -0
  478. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_memory_system.py +0 -0
  479. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_api.py +0 -0
  480. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_clients.py +0 -0
  481. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_extras.py +0 -0
  482. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_jobs_ci.py +0 -0
  483. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_override_costs.py +0 -0
  484. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_override_routes.py +0 -0
  485. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_mobile_security_api.py +0 -0
  486. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_no_stale_model_pins.py +0 -0
  487. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_notification_dedup.py +0 -0
  488. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_notification_discipline.py +0 -0
  489. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_notification_kinds.py +0 -0
  490. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ollama_credentials.py +0 -0
  491. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_api_auth.py +0 -0
  492. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_apikey_api.py +0 -0
  493. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_c3_bridge.py +0 -0
  494. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_chat_engine.py +0 -0
  495. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_chat_store.py +0 -0
  496. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_discovery_api.py +0 -0
  497. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_discovery_audit.py +0 -0
  498. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_health_probe.py +0 -0
  499. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_local_auth.py +0 -0
  500. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_loopback.py +0 -0
  501. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_ollama_bridge.py +0 -0
  502. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_scanner_cache.py +0 -0
  503. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_security_fixes.py +0 -0
  504. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_session_bootstrap.py +0 -0
  505. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_subproject_awareness.py +0 -0
  506. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_oracle_ui_bundle.py +0 -0
  507. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_output_filter.py +0 -0
  508. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_override_costs.py +0 -0
  509. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_override_grants.py +0 -0
  510. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_override_grants_mcp.py +0 -0
  511. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_override_requests.py +0 -0
  512. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_override_wake.py +0 -0
  513. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_permissions.py +0 -0
  514. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_pm_api.py +0 -0
  515. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_project_manager.py +0 -0
  516. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_project_manager_merge.py +0 -0
  517. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_project_tool.py +0 -0
  518. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_read_coercion.py +0 -0
  519. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_read_outside_root.py +0 -0
  520. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_related_facts.py +0 -0
  521. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_repo_map.py +0 -0
  522. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_repo_shape.py +0 -0
  523. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_response_boilerplate.py +0 -0
  524. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_retention.py +0 -0
  525. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_review_digest.py +0 -0
  526. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_eval.py +0 -0
  527. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_p1.py +0 -0
  528. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_p2.py +0 -0
  529. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_p2b.py +0 -0
  530. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_p3.py +0 -0
  531. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_p4.py +0 -0
  532. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_search_p5.py +0 -0
  533. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_service_durability.py +0 -0
  534. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_session_benchmark.py +0 -0
  535. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_session_budget.py +0 -0
  536. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_session_catalog.py +0 -0
  537. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_session_live.py +0 -0
  538. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_session_tool.py +0 -0
  539. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_budget_s1.py +0 -0
  540. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_creds.py +0 -0
  541. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_eval.py +0 -0
  542. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_jobs_s3.py +0 -0
  543. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_nudge_s4.py +0 -0
  544. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_output.py +0 -0
  545. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_parsers_s2.py +0 -0
  546. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_robustness.py +0 -0
  547. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_telemetry_s0.py +0 -0
  548. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_write_ledger.py +0 -0
  549. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_shell_writes.py +0 -0
  550. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_subproject_clear_scope.py +0 -0
  551. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_subproject_depth_consumers.py +0 -0
  552. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_subproject_exclusion.py +0 -0
  553. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_subproject_federation.py +0 -0
  554. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_subproject_linkage_api.py +0 -0
  555. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_subprojects.py +0 -0
  556. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_swe_bench.py +0 -0
  557. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_task_store.py +0 -0
  558. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_task_tool.py +0 -0
  559. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_time_tracker.py +0 -0
  560. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_token_telemetry.py +0 -0
  561. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_token_tracking.py +0 -0
  562. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_tool_registry.py +0 -0
  563. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_ui_jsx_syntax.py +0 -0
  564. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_upgrade_and_version.py +0 -0
  565. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_validate.py +0 -0
  566. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_vault_write_guard.py +0 -0
  567. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_version_sync.py +0 -0
  568. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_watcher_pruning.py +0 -0
  569. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_web_security.py +0 -0
  570. {code_context_control-2.149.1 → code_context_control-2.153.0}/tests/test_windows_reliability.py +0 -0
  571. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/__init__.py +0 -0
  572. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/backend.py +0 -0
  573. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/main.py +0 -0
  574. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/__init__.py +0 -0
  575. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/benchmark_view.py +0 -0
  576. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/claudemd_view.py +0 -0
  577. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/compress_view.py +0 -0
  578. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/index_view.py +0 -0
  579. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/init_view.py +0 -0
  580. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/mcp_view.py +0 -0
  581. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/optimize_view.py +0 -0
  582. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/pipe_view.py +0 -0
  583. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/projects_view.py +0 -0
  584. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/search_view.py +0 -0
  585. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/session_view.py +0 -0
  586. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/stats.py +0 -0
  587. {code_context_control-2.149.1 → code_context_control-2.153.0}/tui/screens/ui_view.py +0 -0
  588. {code_context_control-2.149.1 → code_context_control-2.153.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.149.1
3
+ Version: 2.153.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.149.1"
94
+ __version__ = "2.153.0"
95
95
 
96
96
  # The PreToolUse matcher for native subagent calls (installer and hub migration).
97
97
  AGENT_MATCHER = "Agent|Task"
@@ -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>
@@ -1507,6 +1513,7 @@ c3_agent(workflow=<span class="str">'investigate'</span>, context=<span class="s
1507
1513
  <tr><td class="param-name">stats</td><td class="param-desc">Aggregate stats: most-edited files, change frequency</td></tr>
1508
1514
  <tr><td class="param-name">tag</td><td class="param-desc">Tag an edit entry with a label</td></tr>
1509
1515
  <tr><td class="param-name">verify</td><td class="param-desc"><strong>v2.75.0</strong> — did an edit land? Pass the SAME <code>file</code>/<code>old_string</code>/<code>new_string</code> (or <code>edits</code>) a failed or timed-out <code>c3_edit</code> call took. Answers APPLIED (do not retry) / NOT_APPLIED (safe to retry) / INCONCLUSIVE (read the file)</td></tr>
1516
+ <tr><td class="param-name">revert</td><td class="param-desc">Put a file back to the bytes it had before <code>edit_id</code>, from the pre-image <code>c3_edit</code> stored in <code>.c3/edit_blobs/</code>. Refuses if the file changed since (lists the later edit ids to revert first) or if no pre-image was kept (native Edit/shell rows, files over 5 MB, read-denied or masked paths, evicted blobs). Logs its own <code>reverted</code> row, which can itself be reverted.</td></tr>
1510
1517
  </tbody>
1511
1518
  </table>
1512
1519
 
@@ -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 = "",
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: JSON list 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
 
@@ -930,10 +937,13 @@ async def c3_edits(action: str, file: str = "", change_type: str = "modified",
930
937
  summary: str = "", lines_changed: str = "", tags: str = "",
931
938
  limit: int = 50, since: str = "", edit_id: str = "",
932
939
  tag: str = "", branch: str = "", old_string: str = "",
933
- new_string: str = "", edits: str = "", ctx: Context = None) -> str:
940
+ new_string: str = "", edits: str | list[dict] = "",
941
+ ctx: Context = None) -> str:
934
942
  """EDIT HISTORY — inspect the ledger. Different from c3_edit (which writes); this one reads.
935
943
  actions: log (append entry), history (recent edits), versions (per-file), stats, tag (mark edit_id),
936
- verify (did an edit land?).
944
+ verify (did an edit land?), revert (edit_id: put the file back to that c3_edit's pre-image).
945
+ revert refuses when the file changed since that edit (revert the later edit_ids it lists first)
946
+ or when no pre-image was kept (native Edit/shell rows, big or read-denied files, evicted).
937
947
  branch: filter history to edits stamped with a given git branch.
938
948
  verify: pass the SAME file/old_string/new_string (or edits) you gave the c3_edit that errored or
939
949
  timed out. Answers APPLIED (do not retry) / NOT_APPLIED (safe to retry) / INCONCLUSIVE (read the
@@ -0,0 +1,213 @@
1
+ """What c3_edit says about an edit besides the ✓ line: where it landed, what changed.
2
+
3
+ Two concerns, both read-only:
4
+ - ``locate``: a RELATIVE file_path resolves against the project root, which is
5
+ the main checkout. When the repo has other git worktrees, the caller may have
6
+ meant one of them, so the response names the resolved path and any 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.
10
+ - ``diff_block``: a compact unified diff of the whole file, before → after.
11
+ """
12
+ import difflib
13
+ import json
14
+ import subprocess
15
+ import sys
16
+ import threading
17
+ import time
18
+ from pathlib import Path
19
+
20
+ _WORKTREE_TTL_S = 60.0
21
+ _GIT_TIMEOUT_S = 3.0
22
+ _worktree_cache: dict[str, tuple[float, list[Path]]] = {}
23
+ _last_tree: dict[str, Path] = {}
24
+ _cache_lock = threading.Lock()
25
+
26
+ DIFF_MAX_LINES = 24
27
+ DIFF_MAX_CHARS = 1500
28
+ _LINE_MAX_CHARS = 200
29
+
30
+
31
+ def _git_worktree_roots(cwd: Path) -> list[Path]:
32
+ """Every non-bare worktree root of the repo containing ``cwd``, main first.
33
+
34
+ Returns [] when git is missing, times out, or ``cwd`` is not in a repo.
35
+ """
36
+ kwargs = {}
37
+ if sys.platform == "win32":
38
+ kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
39
+ try:
40
+ proc = subprocess.Popen(
41
+ ["git", "worktree", "list", "--porcelain"], cwd=str(cwd),
42
+ stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,
43
+ stdin=subprocess.DEVNULL, text=True, encoding="utf-8",
44
+ errors="replace", **kwargs)
45
+ except OSError:
46
+ return []
47
+ try:
48
+ out, _ = proc.communicate(timeout=_GIT_TIMEOUT_S)
49
+ except subprocess.TimeoutExpired:
50
+ if sys.platform == "win32":
51
+ subprocess.run(["taskkill", "/F", "/T", "/PID", str(proc.pid)],
52
+ capture_output=True, stdin=subprocess.DEVNULL, **kwargs)
53
+ else:
54
+ proc.kill()
55
+ proc.communicate()
56
+ return []
57
+ if proc.returncode != 0:
58
+ return []
59
+ roots, current, bare = [], None, False
60
+ for line in (out or "").splitlines() + [""]:
61
+ if line.startswith("worktree "):
62
+ current, bare = line[len("worktree "):].strip(), False
63
+ elif line == "bare":
64
+ bare = True
65
+ elif not line and current:
66
+ if not bare:
67
+ roots.append(Path(current).resolve())
68
+ current = None
69
+ return roots
70
+
71
+
72
+ def worktree_roots(project_path: str) -> list[Path]:
73
+ """Cached ``_git_worktree_roots`` for a project, refreshed every 60s."""
74
+ key = str(Path(project_path).resolve())
75
+ now = time.monotonic()
76
+ with _cache_lock:
77
+ hit = _worktree_cache.get(key)
78
+ if hit and now - hit[0] < _WORKTREE_TTL_S:
79
+ return hit[1]
80
+ roots = _git_worktree_roots(Path(key))
81
+ with _cache_lock:
82
+ _worktree_cache[key] = (now, roots)
83
+ return roots
84
+
85
+
86
+ def _other_trees(project_root: Path, roots: list[Path]) -> list[tuple[Path, Path]]:
87
+ """(worktree root, project dir inside it) for every worktree but our own.
88
+
89
+ A project that is a subdirectory of its repo maps to the same subdirectory
90
+ in each worktree.
91
+ """
92
+ own = None
93
+ for root in roots:
94
+ if (project_root == root or root in project_root.parents) and (
95
+ own is None or len(root.parts) > len(own.parts)):
96
+ own = root
97
+ if own is None:
98
+ return []
99
+ prefix = project_root.relative_to(own)
100
+ return [(root, root / prefix) for root in roots if root != own]
101
+
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
+
114
+ def locate(file_path: str, path: Path, project_path: str) -> tuple[str, str]:
115
+ """Check a resolved edit target against the repo's other worktrees.
116
+
117
+ Returns ``(refusal, note)``, at most one non-empty. ``refusal`` is set when a
118
+ relative ``file_path`` does not exist in this checkout but does in another
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
+ ``("", "")``.
123
+ """
124
+ if Path(file_path).is_absolute():
125
+ return "", ""
126
+ project_root = Path(project_path).resolve()
127
+ others = _other_trees(project_root, worktree_roots(project_path))
128
+ if not others:
129
+ return "", ""
130
+ try:
131
+ rel = path.relative_to(project_root)
132
+ except ValueError:
133
+ return "", ""
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."), ""
147
+ if not path.exists() and hits:
148
+ listed = "\n".join(f" {h}" for h in hits)
149
+ return (f"[c3_edit:wrong-tree] {file_path} does not exist in this checkout "
150
+ f"({project_root}) but does in another git worktree:\n{listed}\n"
151
+ f" Nothing was written. Pass the absolute path of the copy you mean; "
152
+ f"to create a new file here, pass its absolute path in this checkout."), ""
153
+ if not path.exists():
154
+ return "", (f"\n ⚠ created in the MAIN checkout: {path} — this repo has "
155
+ f"{len(others)} other worktree(s). If you meant one of them, "
156
+ f"delete this file and pass an absolute path.")
157
+ note = f"\n → {path}"
158
+ if hits:
159
+ note += (f"\n ⚠ relative path edited this checkout; the same path also exists "
160
+ f"in: {', '.join(str(h) for h in hits)}. Pass an absolute path to "
161
+ f"edit a worktree.")
162
+ return "", note
163
+
164
+
165
+ def show_diff(project_path: str) -> bool:
166
+ """``.c3/config.json`` key ``edit.show_diff``; true unless set to false."""
167
+ cfg = Path(project_path) / ".c3" / "config.json"
168
+ if not cfg.is_file():
169
+ return True
170
+ try:
171
+ section = (json.loads(cfg.read_text(encoding="utf-8")) or {}).get("edit")
172
+ except (OSError, ValueError, AttributeError):
173
+ return True
174
+ if isinstance(section, dict) and isinstance(section.get("show_diff"), bool):
175
+ return section["show_diff"]
176
+ return True
177
+
178
+
179
+ def _lines(text: str) -> list[str]:
180
+ lines = text.split("\n")
181
+ if lines[-1] == "":
182
+ lines.pop()
183
+ return [ln[:-1] if ln.endswith("\r") else ln for ln in lines]
184
+
185
+
186
+ def _clip(line: str) -> str:
187
+ return line if len(line) <= _LINE_MAX_CHARS else line[:_LINE_MAX_CHARS] + "…"
188
+
189
+
190
+ def diff_block(before: str, after: str, project_path: str) -> str:
191
+ """Response text for a whole-file before → after diff, or "" when disabled/unchanged.
192
+
193
+ Unified diff, 2 context lines, ``@@`` hunk headers with real line numbers,
194
+ no file headers, EOL-stripped lines, capped at DIFF_MAX_LINES lines and
195
+ DIFF_MAX_CHARS characters with a trailing count of what was cut.
196
+ """
197
+ if not show_diff(project_path):
198
+ return ""
199
+ body = list(difflib.unified_diff(_lines(before), _lines(after), n=2,
200
+ lineterm=""))[2:]
201
+ if not body:
202
+ return ""
203
+ shown, used = [], 0
204
+ for line in body:
205
+ line = _clip(line)
206
+ if len(shown) >= DIFF_MAX_LINES or used + len(line) + 3 > DIFF_MAX_CHARS:
207
+ break
208
+ shown.append(" " + line)
209
+ used += len(line) + 3
210
+ out = "\n" + "\n".join(shown)
211
+ if len(shown) < len(body):
212
+ out += f"\n … {len(body) - len(shown)} more diff lines"
213
+ return out