code-context-control 2.118.2__tar.gz → 2.120.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 (508) hide show
  1. {code_context_control-2.118.2/code_context_control.egg-info → code_context_control-2.120.0}/PKG-INFO +8 -1
  2. {code_context_control-2.118.2 → code_context_control-2.120.0}/README.md +6 -0
  3. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/_hook_utils.py +9 -19
  4. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/c3.py +85 -124
  5. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/commands/parser.py +19 -0
  6. code_context_control-2.120.0/cli/hook_codex_lifecycle.py +60 -0
  7. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_dispatch.py +60 -5
  8. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_edit_ledger.py +3 -3
  9. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_session_stats.py +26 -0
  10. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/mcp_proxy.py +7 -6
  11. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/mcp_server.py +30 -45
  12. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/compress.py +51 -3
  13. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/delegate.py +104 -64
  14. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/read.py +19 -3
  15. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/status.py +16 -6
  16. {code_context_control-2.118.2 → code_context_control-2.120.0/code_context_control.egg-info}/PKG-INFO +8 -1
  17. {code_context_control-2.118.2 → code_context_control-2.120.0}/code_context_control.egg-info/SOURCES.txt +10 -0
  18. {code_context_control-2.118.2 → code_context_control-2.120.0}/code_context_control.egg-info/requires.txt +1 -0
  19. code_context_control-2.120.0/core/codex_patch.py +46 -0
  20. code_context_control-2.120.0/core/host.py +37 -0
  21. {code_context_control-2.118.2 → code_context_control-2.120.0}/core/ide.py +7 -7
  22. {code_context_control-2.118.2 → code_context_control-2.120.0}/core/mcp_toml.py +39 -0
  23. {code_context_control-2.118.2 → code_context_control-2.120.0}/pyproject.toml +4 -1
  24. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/access_guard.py +1 -0
  25. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/artifact_defs.py +1 -0
  26. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/atomic_json.py +9 -4
  27. code_context_control-2.120.0/services/bench/map_eval.py +999 -0
  28. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/claude_md.py +4 -0
  29. code_context_control-2.120.0/services/codex_integration.py +143 -0
  30. code_context_control-2.120.0/services/codex_transcript.py +78 -0
  31. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/compressor.py +4 -1
  32. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/conversation_store.py +38 -0
  33. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/file_memory.py +25 -5
  34. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/runtime.py +2 -0
  35. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/session_manager.py +8 -5
  36. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/telemetry.py +147 -8
  37. code_context_control-2.120.0/tests/test_codex_mcp_transport.py +92 -0
  38. code_context_control-2.120.0/tests/test_codex_native.py +397 -0
  39. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_install_mcp_entrypoint.py +2 -2
  40. code_context_control-2.120.0/tests/test_map_eval.py +475 -0
  41. code_context_control-2.120.0/tests/test_map_telemetry_c0.py +272 -0
  42. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_windows_reliability.py +4 -1
  43. {code_context_control-2.118.2 → code_context_control-2.120.0}/LICENSE +0 -0
  44. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/__init__.py +0 -0
  45. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/_shell_writes.py +0 -0
  46. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/commands/__init__.py +0 -0
  47. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/commands/common.py +0 -0
  48. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/docs.html +0 -0
  49. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/edits.html +0 -0
  50. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/access.html +0 -0
  51. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/bitbucket.html +0 -0
  52. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/credentials.html +0 -0
  53. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/getting-started.html +0 -0
  54. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/index.html +0 -0
  55. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/masking.html +0 -0
  56. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/oracle.html +0 -0
  57. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/shared.css +0 -0
  58. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/tools.html +0 -0
  59. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/guide/workflow.html +0 -0
  60. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_access_guard.py +0 -0
  61. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_artifact.py +0 -0
  62. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_auto_snapshot.py +0 -0
  63. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_c3_signal.py +0 -0
  64. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_c3read.py +0 -0
  65. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_edit_unlock.py +0 -0
  66. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_filter.py +0 -0
  67. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_ghost_files.py +0 -0
  68. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_pretool_enforce.py +0 -0
  69. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_prompt_recall.py +0 -0
  70. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_read.py +0 -0
  71. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hook_terse_advisor.py +0 -0
  72. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_server.py +0 -0
  73. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/app.js +0 -0
  74. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/add_project.js +0 -0
  75. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/config_editor.js +0 -0
  76. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  77. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/drill_health.js +0 -0
  78. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/drill_panel.js +0 -0
  79. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
  80. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  81. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/drill_views.js +0 -0
  82. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/global_search.js +0 -0
  83. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_access.js +0 -0
  84. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_ci.js +0 -0
  85. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
  86. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_credentials.js +0 -0
  87. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
  88. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_locks.js +0 -0
  89. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/hub_tokens.js +0 -0
  90. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  91. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/modals.js +0 -0
  92. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/project_card.js +0 -0
  93. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/project_tree.js +0 -0
  94. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/session_drawer.js +0 -0
  95. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/settings_modal.js +0 -0
  96. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/sidebar.js +0 -0
  97. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/summary_bar.js +0 -0
  98. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/task_board.js +0 -0
  99. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/toasts.js +0 -0
  100. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/components/topbar.js +0 -0
  101. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui/state.js +0 -0
  102. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/hub_ui.html +0 -0
  103. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/progress.py +0 -0
  104. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/server.py +0 -0
  105. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/__init__.py +0 -0
  106. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/_grants.py +0 -0
  107. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/_helpers.py +0 -0
  108. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/agent.py +0 -0
  109. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/artifacts.py +0 -0
  110. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/bitbucket.py +0 -0
  111. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/ci.py +0 -0
  112. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/credentials.py +0 -0
  113. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/edit.py +0 -0
  114. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/edit_verify.py +0 -0
  115. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/edits.py +0 -0
  116. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/federate.py +0 -0
  117. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/filter.py +0 -0
  118. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/impact.py +0 -0
  119. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/jira.py +0 -0
  120. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/locks.py +0 -0
  121. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/memory.py +0 -0
  122. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/override.py +0 -0
  123. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/project.py +0 -0
  124. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/search.py +0 -0
  125. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/session.py +0 -0
  126. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/shell.py +0 -0
  127. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/shell_job.py +0 -0
  128. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/shell_nudge.py +0 -0
  129. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/shell_parsers.py +0 -0
  130. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/shell_render.py +0 -0
  131. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/tasks.py +0 -0
  132. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/tools/validate.py +0 -0
  133. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/api.js +0 -0
  134. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/app.js +0 -0
  135. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/access.js +0 -0
  136. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/bitbucket.js +0 -0
  137. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/chat.js +0 -0
  138. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/credentials.js +0 -0
  139. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/dashboard.js +0 -0
  140. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/edits.js +0 -0
  141. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/enforcement.js +0 -0
  142. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/instructions.js +0 -0
  143. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/jira.js +0 -0
  144. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/memory.js +0 -0
  145. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/sessions.js +0 -0
  146. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/settings.js +0 -0
  147. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/sidebar.js +0 -0
  148. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/components/tasks.js +0 -0
  149. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/icons.js +0 -0
  150. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/pm_shared.js +0 -0
  151. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/shared.js +0 -0
  152. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui/theme.js +0 -0
  153. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui.html +0 -0
  154. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui_legacy.html +0 -0
  155. {code_context_control-2.118.2 → code_context_control-2.120.0}/cli/ui_nano.html +0 -0
  156. {code_context_control-2.118.2 → code_context_control-2.120.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  157. {code_context_control-2.118.2 → code_context_control-2.120.0}/code_context_control.egg-info/entry_points.txt +0 -0
  158. {code_context_control-2.118.2 → code_context_control-2.120.0}/code_context_control.egg-info/top_level.txt +0 -0
  159. {code_context_control-2.118.2 → code_context_control-2.120.0}/core/__init__.py +0 -0
  160. {code_context_control-2.118.2 → code_context_control-2.120.0}/core/config.py +0 -0
  161. {code_context_control-2.118.2 → code_context_control-2.120.0}/core/web_security.py +0 -0
  162. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/__init__.py +0 -0
  163. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/config.py +0 -0
  164. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/mcp_oracle.py +0 -0
  165. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/oracle_server.py +0 -0
  166. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/oracle_ui.html +0 -0
  167. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/__init__.py +0 -0
  168. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/activity_reporter.py +0 -0
  169. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/api_auth.py +0 -0
  170. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/c3_bridge.py +0 -0
  171. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/chat_engine.py +0 -0
  172. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/chat_poll.py +0 -0
  173. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/chat_store.py +0 -0
  174. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/cross_memory.py +0 -0
  175. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/discovery_audit.py +0 -0
  176. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/federated_graph.py +0 -0
  177. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/health_checker.py +0 -0
  178. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/insight_engine.py +0 -0
  179. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/local_session.py +0 -0
  180. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/memory_reader.py +0 -0
  181. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/memory_writer.py +0 -0
  182. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/mobile_api.py +0 -0
  183. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/project_scanner.py +0 -0
  184. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/review_agent.py +0 -0
  185. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/tool_executor.py +0 -0
  186. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/services/tool_registry.py +0 -0
  187. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/activity.js +0 -0
  188. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/agents.js +0 -0
  189. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/app.js +0 -0
  190. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/busy.js +0 -0
  191. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/chat/conversations.js +0 -0
  192. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/chat/input.js +0 -0
  193. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/chat/markdown.js +0 -0
  194. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/chat/send.js +0 -0
  195. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/chat/stream_renderer.js +0 -0
  196. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/chat/toolbar.js +0 -0
  197. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/core.js +0 -0
  198. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/crossgraph.js +0 -0
  199. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/header.js +0 -0
  200. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/insights.js +0 -0
  201. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/projects.js +0 -0
  202. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/qrcode.js +0 -0
  203. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/settings.js +0 -0
  204. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/suggestions.js +0 -0
  205. {code_context_control-2.118.2 → code_context_control-2.120.0}/oracle/ui/theme_tabs.js +0 -0
  206. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/__init__.py +0 -0
  207. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/access_telemetry.py +0 -0
  208. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/activity_log.py +0 -0
  209. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/agent_base.py +0 -0
  210. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/agent_locks.py +0 -0
  211. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/agents.py +0 -0
  212. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/artifact_store.py +0 -0
  213. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/auto_memory.py +0 -0
  214. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/background_service.py +0 -0
  215. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bench/__init__.py +0 -0
  216. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bench/external/__init__.py +0 -0
  217. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bench/external/aider_polyglot.py +0 -0
  218. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bench/external/swe_bench.py +0 -0
  219. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bench/search_eval.py +0 -0
  220. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bench/shell_eval.py +0 -0
  221. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/benchmark_dashboard.py +0 -0
  222. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bitbucket_client.py +0 -0
  223. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/bitbucket_credentials.py +0 -0
  224. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_act.py +0 -0
  225. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_cache.py +0 -0
  226. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_expr.py +0 -0
  227. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_failures.py +0 -0
  228. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_github.py +0 -0
  229. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_impact.py +0 -0
  230. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_intel.py +0 -0
  231. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_runner.py +0 -0
  232. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ci_workflow.py +0 -0
  233. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/circuit_breaker.py +0 -0
  234. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/context_snapshot.py +0 -0
  235. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/cred_audit.py +0 -0
  236. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/cred_telemetry.py +0 -0
  237. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/credential_store.py +0 -0
  238. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/doc_index.py +0 -0
  239. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/e2e_benchmark.py +0 -0
  240. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/e2e_evaluator.py +0 -0
  241. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/e2e_tasks.py +0 -0
  242. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/edit_ledger.py +0 -0
  243. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/embedding_index.py +0 -0
  244. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/enforcement_policy.py +0 -0
  245. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/error_reporting.py +0 -0
  246. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/git_context.py +0 -0
  247. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/hub_service.py +0 -0
  248. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/index_store.py +0 -0
  249. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/indexer.py +0 -0
  250. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/jira_client.py +0 -0
  251. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/jira_cloud.py +0 -0
  252. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/jira_credentials.py +0 -0
  253. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/jira_data_center.py +0 -0
  254. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/jira_links.py +0 -0
  255. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/lexical_index.py +0 -0
  256. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/mask_activation.py +0 -0
  257. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/mask_mirror.py +0 -0
  258. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/mask_presets.py +0 -0
  259. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory.py +0 -0
  260. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory_consolidator.py +0 -0
  261. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory_distiller.py +0 -0
  262. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory_graph.py +0 -0
  263. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory_grounder.py +0 -0
  264. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory_queue.py +0 -0
  265. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/memory_scorer.py +0 -0
  266. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/metrics.py +0 -0
  267. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/notifications.py +0 -0
  268. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ollama_bridge.py +0 -0
  269. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ollama_client.py +0 -0
  270. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/ollama_credentials.py +0 -0
  271. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/oracle_service.py +0 -0
  272. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/output_filter.py +0 -0
  273. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/override_grants.py +0 -0
  274. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/override_policy.py +0 -0
  275. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/override_requests.py +0 -0
  276. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/override_wake.py +0 -0
  277. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/parser.py +0 -0
  278. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/project_manager.py +0 -0
  279. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/project_runtime.py +0 -0
  280. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/protocol.py +0 -0
  281. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/proxy_state.py +0 -0
  282. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/repo_map.py +0 -0
  283. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/repo_shape.py +0 -0
  284. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/reranker.py +0 -0
  285. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/retention.py +0 -0
  286. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/retrieval.py +0 -0
  287. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/retrieval_broker.py +0 -0
  288. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/router.py +0 -0
  289. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/scanner.py +0 -0
  290. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/session_benchmark.py +0 -0
  291. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/session_preloader.py +0 -0
  292. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/shell_jobs.py +0 -0
  293. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/shell_output.py +0 -0
  294. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/subprojects.py +0 -0
  295. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/task_store.py +0 -0
  296. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/text_index.py +0 -0
  297. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/time_tracker.py +0 -0
  298. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/tool_classifier.py +0 -0
  299. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/transcript_index.py +0 -0
  300. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/validation_cache.py +0 -0
  301. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/vector_store.py +0 -0
  302. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/watcher.py +0 -0
  303. {code_context_control-2.118.2 → code_context_control-2.120.0}/services/win_subprocess.py +0 -0
  304. {code_context_control-2.118.2 → code_context_control-2.120.0}/setup.cfg +0 -0
  305. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_access_builtin_optout.py +0 -0
  306. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_access_guard.py +0 -0
  307. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_access_guard_meta.py +0 -0
  308. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_access_guard_shell_project.py +0 -0
  309. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_access_guard_surfaces.py +0 -0
  310. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_access_guard_wiring.py +0 -0
  311. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_activity_reporter.py +0 -0
  312. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_agent_locks.py +0 -0
  313. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_aider_polyglot.py +0 -0
  314. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_antigravity_transition.py +0 -0
  315. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_artifact_store.py +0 -0
  316. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_artifact_tool.py +0 -0
  317. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_atomic_json.py +0 -0
  318. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_background_service.py +0 -0
  319. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  320. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_bitbucket_client.py +0 -0
  321. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_bitbucket_config_fallback.py +0 -0
  322. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_bitbucket_credentials.py +0 -0
  323. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_bitbucket_tool.py +0 -0
  324. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_builtin_modes.py +0 -0
  325. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  326. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_c3_shell.py +0 -0
  327. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_chat_poll.py +0 -0
  328. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_act.py +0 -0
  329. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_cache.py +0 -0
  330. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_expr.py +0 -0
  331. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_impact.py +0 -0
  332. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_intel.py +0 -0
  333. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_runner.py +0 -0
  334. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ci_workflow.py +0 -0
  335. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_circuit_breaker.py +0 -0
  336. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_claude_md_merge.py +0 -0
  337. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_claude_md_updater.py +0 -0
  338. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_cli_smoke.py +0 -0
  339. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_compressor_large_file.py +0 -0
  340. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_confirm_guard.py +0 -0
  341. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_confirm_guard_wiring.py +0 -0
  342. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_cooccurrence_bounds.py +0 -0
  343. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_cred_audit.py +0 -0
  344. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_cred_telemetry.py +0 -0
  345. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_credential_login_kind.py +0 -0
  346. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_credential_store.py +0 -0
  347. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_credential_ui_parity.py +0 -0
  348. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_credentials_routes.py +0 -0
  349. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_credentials_tool.py +0 -0
  350. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_creds_cli_smoke.py +0 -0
  351. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_delegate_cascade.py +0 -0
  352. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_delegate_version_probe.py +0 -0
  353. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_e2e_benchmark.py +0 -0
  354. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_edit_ledger_deadline.py +0 -0
  355. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_edit_ledger_hook.py +0 -0
  356. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_edit_locking.py +0 -0
  357. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_edit_normalization.py +0 -0
  358. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_edit_verify.py +0 -0
  359. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_embedding_index_deadlock.py +0 -0
  360. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_enforcement_flip.py +0 -0
  361. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_enforcement_policy.py +0 -0
  362. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_enforcement_routes.py +0 -0
  363. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_env_parser.py +0 -0
  364. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
  365. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_federated_graph.py +0 -0
  366. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_filter_backoff.py +0 -0
  367. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ghost_files.py +0 -0
  368. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ghost_generation.py +0 -0
  369. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_git_branch_awareness.py +0 -0
  370. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_access_guard.py +0 -0
  371. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_codex_compat.py +0 -0
  372. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_dispatch.py +0 -0
  373. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_pretool_enforce.py +0 -0
  374. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_prompt_recall.py +0 -0
  375. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_smoke.py +0 -0
  376. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_state.py +0 -0
  377. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hook_utf8_stdio.py +0 -0
  378. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_credentials_route.py +0 -0
  379. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_credentials_routes_write.py +0 -0
  380. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_enforcement_routes.py +0 -0
  381. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_inspect_api.py +0 -0
  382. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_locks_routes.py +0 -0
  383. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_oracle_service_routes.py +0 -0
  384. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_override_routes.py +0 -0
  385. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_server_smoke.py +0 -0
  386. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_hub_subproject_links.py +0 -0
  387. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ide_workflow_adaptation.py +0 -0
  388. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_index_cap_not_hardcoded.py +0 -0
  389. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_init_clear_preserves_user_content.py +0 -0
  390. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_init_scan.py +0 -0
  391. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_cli_smoke.py +0 -0
  392. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_client.py +0 -0
  393. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_config_fallback.py +0 -0
  394. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_credentials.py +0 -0
  395. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_links.py +0 -0
  396. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_routes.py +0 -0
  397. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_jira_tool.py +0 -0
  398. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_lazy_store_init.py +0 -0
  399. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mask_guard.py +0 -0
  400. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mask_routes.py +0 -0
  401. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mask_surfaces.py +0 -0
  402. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mcp_host_guard.py +0 -0
  403. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mcp_memory_timeout.py +0 -0
  404. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mcp_server_smoke.py +0 -0
  405. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mcp_toml.py +0 -0
  406. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_memory_distiller.py +0 -0
  407. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_memory_graph_api.py +0 -0
  408. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_memory_queue.py +0 -0
  409. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_memory_system.py +0 -0
  410. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mobile_api.py +0 -0
  411. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mobile_extras.py +0 -0
  412. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mobile_override_routes.py +0 -0
  413. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_mobile_security_api.py +0 -0
  414. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_no_stale_model_pins.py +0 -0
  415. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_notification_dedup.py +0 -0
  416. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_notification_discipline.py +0 -0
  417. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ollama_credentials.py +0 -0
  418. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_api_auth.py +0 -0
  419. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_apikey_api.py +0 -0
  420. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_c3_bridge.py +0 -0
  421. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_chat_engine.py +0 -0
  422. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_chat_store.py +0 -0
  423. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_discovery_api.py +0 -0
  424. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_discovery_audit.py +0 -0
  425. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_health_probe.py +0 -0
  426. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_local_auth.py +0 -0
  427. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_ollama_bridge.py +0 -0
  428. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_scanner_cache.py +0 -0
  429. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_security_fixes.py +0 -0
  430. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_session_bootstrap.py +0 -0
  431. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_subproject_awareness.py +0 -0
  432. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_oracle_ui_bundle.py +0 -0
  433. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_output_filter.py +0 -0
  434. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_override_grants.py +0 -0
  435. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_override_grants_mcp.py +0 -0
  436. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_override_requests.py +0 -0
  437. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_override_wake.py +0 -0
  438. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_permissions.py +0 -0
  439. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_pm_api.py +0 -0
  440. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_project_manager.py +0 -0
  441. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_project_manager_merge.py +0 -0
  442. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_project_tool.py +0 -0
  443. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_read_coercion.py +0 -0
  444. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_read_edit_parity.py +0 -0
  445. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_related_facts.py +0 -0
  446. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_repo_map.py +0 -0
  447. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_repo_shape.py +0 -0
  448. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_response_boilerplate.py +0 -0
  449. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_retention.py +0 -0
  450. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_review_digest.py +0 -0
  451. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_eval.py +0 -0
  452. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_p1.py +0 -0
  453. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_p2.py +0 -0
  454. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_p2b.py +0 -0
  455. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_p3.py +0 -0
  456. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_p4.py +0 -0
  457. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_search_p5.py +0 -0
  458. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_service_durability.py +0 -0
  459. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_session_benchmark.py +0 -0
  460. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_session_budget.py +0 -0
  461. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_budget_s1.py +0 -0
  462. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_creds.py +0 -0
  463. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_eval.py +0 -0
  464. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_jobs_s3.py +0 -0
  465. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_nudge_s4.py +0 -0
  466. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_output.py +0 -0
  467. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_parsers_s2.py +0 -0
  468. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_robustness.py +0 -0
  469. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_telemetry_s0.py +0 -0
  470. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_write_ledger.py +0 -0
  471. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_shell_writes.py +0 -0
  472. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_subproject_clear_scope.py +0 -0
  473. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_subproject_depth_consumers.py +0 -0
  474. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_subproject_exclusion.py +0 -0
  475. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_subproject_federation.py +0 -0
  476. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_subproject_linkage_api.py +0 -0
  477. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_subprojects.py +0 -0
  478. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_swe_bench.py +0 -0
  479. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_task_store.py +0 -0
  480. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_task_tool.py +0 -0
  481. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_time_tracker.py +0 -0
  482. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_token_telemetry.py +0 -0
  483. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_token_tracking.py +0 -0
  484. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_tool_registry.py +0 -0
  485. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_ui_jsx_syntax.py +0 -0
  486. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_upgrade_and_version.py +0 -0
  487. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_validate.py +0 -0
  488. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_vault_write_guard.py +0 -0
  489. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_version_sync.py +0 -0
  490. {code_context_control-2.118.2 → code_context_control-2.120.0}/tests/test_web_security.py +0 -0
  491. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/__init__.py +0 -0
  492. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/backend.py +0 -0
  493. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/main.py +0 -0
  494. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/__init__.py +0 -0
  495. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/benchmark_view.py +0 -0
  496. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/claudemd_view.py +0 -0
  497. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/compress_view.py +0 -0
  498. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/index_view.py +0 -0
  499. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/init_view.py +0 -0
  500. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/mcp_view.py +0 -0
  501. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/optimize_view.py +0 -0
  502. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/pipe_view.py +0 -0
  503. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/projects_view.py +0 -0
  504. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/search_view.py +0 -0
  505. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/session_view.py +0 -0
  506. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/stats.py +0 -0
  507. {code_context_control-2.118.2 → code_context_control-2.120.0}/tui/screens/ui_view.py +0 -0
  508. {code_context_control-2.118.2 → code_context_control-2.120.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.118.2
3
+ Version: 2.120.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
@@ -26,6 +26,7 @@ Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
27
  Requires-Dist: tiktoken>=0.7.0
28
28
  Requires-Dist: fastmcp>=2.0.0
29
+ Requires-Dist: tomlkit>=0.13.2
29
30
  Requires-Dist: watchdog>=4.0.0
30
31
  Requires-Dist: tree-sitter>=0.22.0
31
32
  Requires-Dist: tree-sitter-python>=0.21.0
@@ -131,6 +132,12 @@ c3 init /path/to/huge-repo --force --no-embed # skip the embedding index on
131
132
 
132
133
  Upgrade with `c3 upgrade` (or `pipx upgrade code-context-control`). MCP is wired through the `c3-mcp` entry point, so upgrading needs no per-project reconfiguration.
133
134
 
135
+ For native Codex hooks, thread continuity, and additive installation alongside
136
+ Claude Code, see the [Codex integration guide](docs/codex-native.md). Run
137
+ `c3 install-mcp --ide codex`, review hook trust in Codex, then check
138
+ `c3 doctor --ide codex`. Existing installations need this reinstall to receive
139
+ the new host arguments and hooks.
140
+
134
141
  > **Upgrading from before v2.60.1 on Windows:** existing projects are *not* repaired by upgrading — re-run `c3 init` once per project to fix hook registration.
135
142
 
136
143
  Full notes: [Upgrading](https://github.com/drknowhow/code-context-control/blob/main/docs/upgrading.md) · [Contributing](https://github.com/drknowhow/code-context-control/blob/main/docs/upgrading.md#from-source-contributors)
@@ -66,6 +66,12 @@ c3 init /path/to/huge-repo --force --no-embed # skip the embedding index on
66
66
 
67
67
  Upgrade with `c3 upgrade` (or `pipx upgrade code-context-control`). MCP is wired through the `c3-mcp` entry point, so upgrading needs no per-project reconfiguration.
68
68
 
69
+ For native Codex hooks, thread continuity, and additive installation alongside
70
+ Claude Code, see the [Codex integration guide](docs/codex-native.md). Run
71
+ `c3 install-mcp --ide codex`, review hook trust in Codex, then check
72
+ `c3 doctor --ide codex`. Existing installations need this reinstall to receive
73
+ the new host arguments and hooks.
74
+
69
75
  > **Upgrading from before v2.60.1 on Windows:** existing projects are *not* repaired by upgrading — re-run `c3 init` once per project to fix hook registration.
70
76
 
71
77
  Full notes: [Upgrading](https://github.com/drknowhow/code-context-control/blob/main/docs/upgrading.md) · [Contributing](https://github.com/drknowhow/code-context-control/blob/main/docs/upgrading.md#from-source-contributors)
@@ -375,30 +375,20 @@ HOST_GEMINI = "gemini"
375
375
  HOST_CODEX = "codex"
376
376
 
377
377
 
378
- def detect_host(data: dict) -> str:
379
- """Identify which agent runtime sent this hook payload.
380
-
381
- Codex is detected by `turn_id`, which its wire schema marks required on
382
- every turn-scoped event C3 hooks (pre/post tool use, user prompt submit,
383
- stop) and documents as "Codex extension". Claude Code never sends it.
384
-
385
- Codex MUST be checked before Gemini: Codex declares `tool_response` as
386
- free-form, so an MCP tool that returns an object would otherwise trip the
387
- isinstance-dict test and be mistaken for Gemini.
388
-
389
- The CODEX_* env fallback covers a future Codex that drops `turn_id`. A
390
- false positive there degrades gracefully — Claude Code also accepts
391
- hookSpecificOutput.additionalContext — so guessing "codex" is the safe
392
- direction to be wrong in.
393
- """
378
+ def detect_host(data: dict, explicit_host: str | None = None) -> str:
379
+ """Use the hook's explicit host or wire identity, never its parent's env."""
380
+ named = explicit_host or (data.get("_c3_host") if isinstance(data, dict) else None)
381
+ aliases = {"claude-code": HOST_CLAUDE, "claude": HOST_CLAUDE,
382
+ "codex": HOST_CODEX, "gemini": HOST_GEMINI, "antigravity": HOST_GEMINI}
383
+ if named in aliases:
384
+ return aliases[named]
394
385
  if not isinstance(data, dict):
395
386
  return HOST_CLAUDE
396
387
  if data.get("turn_id"):
397
388
  return HOST_CODEX
398
- if isinstance(data.get("tool_response"), dict):
389
+ response = data.get("tool_response")
390
+ if isinstance(response, dict) and ("llmContent" in response or "returnDisplay" in response):
399
391
  return HOST_GEMINI
400
- if os.environ.get("CODEX_THREAD_ID") or os.environ.get("CODEX_MANAGED_BY_NPM"):
401
- return HOST_CODEX
402
392
  return HOST_CLAUDE
403
393
 
404
394
 
@@ -92,7 +92,7 @@ console = Console() if HAS_RICH else None
92
92
  # Config
93
93
  CONFIG_DIR = ".c3"
94
94
  CONFIG_FILE = ".c3/config.json"
95
- __version__ = "2.118.2"
95
+ __version__ = "2.120.0"
96
96
 
97
97
 
98
98
  def _compress_file_cli(compressor, path, mode="smart", **kw):
@@ -1570,6 +1570,42 @@ def cmd_shell_eval(args):
1570
1570
  sys.exit(1)
1571
1571
 
1572
1572
 
1573
+ def cmd_map_eval(args):
1574
+ """Run the file-map gold suite and compare it to its baseline.
1575
+
1576
+ Renders the hand-annotated fixtures through the renderer the MCP tool
1577
+ uses and grades symbol recall, signatures, ranges and determinism. Exit
1578
+ status 1 when the baseline is violated (a must_pass case failed, an
1579
+ aggregate fell under its floor or rose over its ceiling, a complete map
1580
+ grew). See docs/map-eval.md.
1581
+ """
1582
+ from services.bench import map_eval as me
1583
+
1584
+ try:
1585
+ report = me.run_suite(args.suite, baseline=args.baseline)
1586
+ except FileNotFoundError as e:
1587
+ raise RuntimeError(str(e))
1588
+
1589
+ if args.update_baseline:
1590
+ path = args.baseline or me.BUNDLED_BASELINES.get(report.suite)
1591
+ if not path:
1592
+ raise RuntimeError(
1593
+ f"suite {report.suite!r} has no bundled baseline; pass --baseline PATH")
1594
+ floors = json.loads(args.floors) if args.floors else None
1595
+ ceilings = json.loads(args.ceilings) if args.ceilings else None
1596
+ me.write_baseline(report, path, floors=floors, ceilings=ceilings)
1597
+ report.baseline_violations, report.baseline_warnings = me.compare_to_baseline(
1598
+ report, me.load_baseline(path))
1599
+ print(f"baseline written: {path}")
1600
+
1601
+ if args.json:
1602
+ print(json.dumps(report.to_dict(), indent=2))
1603
+ else:
1604
+ print(report.render())
1605
+ if report.baseline_violations:
1606
+ sys.exit(1)
1607
+
1608
+
1573
1609
  def _benchmark_extract_preview(full_path: Path, compressor: CodeCompressor, pattern: str = "", max_lines: int = 50) -> str:
1574
1610
  """Approximate c3_filter behavior for local benchmarking without MCP startup."""
1575
1611
  import re as _re
@@ -4298,17 +4334,9 @@ _C3_HOOKLESS_WORKFLOW = _adapt_workflow_for_ide(
4298
4334
 
4299
4335
  _COPILOT_INSTRUCTIONS_CONTENT = _VSCODE_SESSION_INIT + "\n\n" + _C3_HOOKLESS_WORKFLOW
4300
4336
 
4301
- _AGENTS_MD_CONTENT = _C3_HOOKLESS_WORKFLOW + """
4337
+ from services.codex_integration import CODEX_WORKFLOW
4302
4338
 
4303
- ## IDE Configuration (Codex)
4304
- This project uses project-scoped MCP servers. Ensure your `.codex/config.toml` includes:
4305
- ```toml
4306
- [mcp_servers.c3]
4307
- command = "c3-mcp"
4308
- args = ["--project", "."]
4309
- enabled = true
4310
- ```
4311
- """
4339
+ _AGENTS_MD_CONTENT = CODEX_WORKFLOW
4312
4340
 
4313
4341
  _TERSE_SKILL_CONTENT = """\
4314
4342
  # /terse — Terse Output Mode
@@ -4426,50 +4454,13 @@ def _toml_escape_str(value: str) -> str:
4426
4454
 
4427
4455
 
4428
4456
  def _upsert_toml_section(toml_path: Path, section: str, entries: dict) -> None:
4429
- """Add or replace a dotted TOML section (e.g. 'mcp_servers.c3') in-place.
4430
-
4431
- Reads the existing file, removes the old section if present, and appends
4432
- the new section at the end. Handles simple scalar and list values only.
4433
- """
4434
- content = toml_path.read_text(encoding="utf-8") if toml_path.exists() else ""
4435
- header = f"[{section}]"
4436
-
4437
- # Strip existing section (header + its key=value lines). Also strip any
4438
- # dotted child subtables (e.g. "[mcp_servers.c3.env]" under
4439
- # "[mcp_servers.c3]") so they are not orphaned beneath the re-appended
4440
- # section, which would corrupt the file on re-run.
4441
- child_prefix = f"{header[:-1]}." # "[mcp_servers.c3]" -> "[mcp_servers.c3."
4442
- lines = content.splitlines()
4443
- new_lines: list[str] = []
4444
- skip = False
4445
- for line in lines:
4446
- stripped = line.strip()
4447
- if stripped == header:
4448
- skip = True
4449
- continue
4450
- if skip and stripped.startswith("["):
4451
- if not stripped.startswith(child_prefix):
4452
- skip = False
4453
- if not skip:
4454
- new_lines.append(line)
4455
-
4456
- content = "\n".join(new_lines).rstrip()
4457
-
4458
- # Build new section
4459
- section_lines = [f"\n\n{header}"]
4460
- for k, v in entries.items():
4461
- if isinstance(v, list):
4462
- # Escape each list item individually
4463
- items = ", ".join(f'"{_toml_escape_str(x)}"' for x in v)
4464
- section_lines.append(f'"{k}" = [{items}]')
4465
- elif isinstance(v, bool):
4466
- section_lines.append(f'"{k}" = {"true" if v else "false"}')
4467
- else:
4468
- section_lines.append(f'"{k}" = "{_toml_escape_str(v)}"')
4469
- section_lines.append("")
4470
-
4471
- toml_path.parent.mkdir(parents=True, exist_ok=True)
4472
- toml_path.write_text(content + "\n".join(section_lines), encoding="utf-8")
4457
+ from core.mcp_toml import merge_toml_section
4458
+ owned = dict(entries)
4459
+ defaults = {}
4460
+ for key in ("enabled", "startup_timeout_sec", "tool_timeout_sec"):
4461
+ if key in owned:
4462
+ defaults[key] = owned.pop(key)
4463
+ merge_toml_section(toml_path, section, owned, defaults)
4473
4464
 
4474
4465
 
4475
4466
  def _toml_section_bool_value(toml_path: Path, section: str, key: str) -> bool | None:
@@ -4555,20 +4546,10 @@ def _ensure_instruction_workflow(instructions_path: Path, template: str,
4555
4546
  def _ensure_codex_agents_workflow(agents_md_path: Path,
4556
4547
  project_path: str = "") -> str:
4557
4548
  """Ensure AGENTS.md contains the mandatory C3 workflow for Codex sessions."""
4558
- required_markers = [
4559
- "C3 Tools",
4560
- "MANDATORY",
4561
- "SEARCH FIRST",
4562
- "Anti-patterns",
4563
- "c3_search",
4564
- "c3_read",
4565
- "c3_validate",
4566
- "c3_edit",
4567
- "c3_memory",
4568
- "c3_filter",
4569
- ]
4570
- return _ensure_instruction_workflow(agents_md_path, _AGENTS_MD_CONTENT,
4571
- required_markers, project_path)
4549
+ from services.claude_md import write_c3_instruction_doc
4550
+ existing = agents_md_path.read_text(encoding="utf-8") if agents_md_path.exists() else None
4551
+ rendered = write_c3_instruction_doc(agents_md_path, _AGENTS_MD_CONTENT, project_path or None)
4552
+ return "written" if existing is None else ("kept" if rendered == existing else "updated")
4572
4553
 
4573
4554
 
4574
4555
  def _ensure_vscode_instructions_workflow(instructions_path: Path,
@@ -4654,6 +4635,7 @@ def _ensure_project_session_configs(target: Path, server_script: str, primary_pr
4654
4635
  else:
4655
4636
  mcp_command = "python"
4656
4637
  server_args = [server_script_posix, "--project", target.as_posix()]
4638
+ server_args += ["--host", "codex"]
4657
4639
 
4658
4640
  if primary_profile != "codex":
4659
4641
  codex_path = target / ".codex" / "config.toml"
@@ -4674,18 +4656,20 @@ def _ensure_project_session_configs(target: Path, server_script: str, primary_pr
4674
4656
 
4675
4657
  def _ensure_global_session_fallbacks(server_script: str, c3_mcp_exe: str | None = None,
4676
4658
  primary_profile: str | None = None) -> None:
4677
- """Keep user-global Codex/Antigravity MCP configs pointing at C3.
4659
+ """Install an explicitly requested user-global Codex fallback.
4678
4660
 
4679
4661
  These fallback entries omit `--project` so the MCP server can resolve the
4680
4662
  active working directory dynamically when a session starts in a project that
4681
4663
  does not yet have a project-local Codex config file.
4682
4664
  """
4665
+ if primary_profile not in (None, "codex"):
4666
+ return
4683
4667
  server_script_posix = Path(server_script).as_posix()
4684
4668
  # With the installed entry point, no script path is needed; --project stays
4685
4669
  # omitted so the server resolves the working directory at session start.
4686
- fallback_args = [] if c3_mcp_exe else [server_script_posix]
4670
+ fallback_args = (["--host", "codex"] if c3_mcp_exe else [server_script_posix, "--host", "codex"])
4687
4671
 
4688
- codex_path = Path.home() / ".codex" / "config.toml"
4672
+ codex_path = Path(os.environ.get("CODEX_HOME") or Path.home() / ".codex") / "config.toml"
4689
4673
  try:
4690
4674
  codex_state = "updated" if codex_path.exists() else "written"
4691
4675
  _upsert_toml_section(
@@ -4701,27 +4685,6 @@ def _ensure_global_session_fallbacks(server_script: str, c3_mcp_exe: str | None
4701
4685
  except PermissionError:
4702
4686
  print(f"Warning: Could not update {codex_path} (global fallback skipped)")
4703
4687
 
4704
- # Antigravity shares the ~/.gemini home dir but reads its own MCP config.
4705
- # When Antigravity is the primary profile, the main install flow already
4706
- # wrote this file — here we only keep it fresh for codex installs
4707
- # on machines that have Antigravity (its config dir exists).
4708
- antigravity_path = Path.home() / ".gemini" / "antigravity" / "mcp_config.json"
4709
- if primary_profile != "antigravity" and antigravity_path.parent.is_dir():
4710
- try:
4711
- ag_state = _upsert_json_mcp_server(
4712
- antigravity_path,
4713
- "mcpServers",
4714
- "c3",
4715
- {
4716
- "command": c3_mcp_exe or sys.executable,
4717
- "args": fallback_args,
4718
- },
4719
- )
4720
- print(f"{ag_state.capitalize()} {antigravity_path} (global fallback)")
4721
- except PermissionError:
4722
- print(f"Warning: Could not update {antigravity_path} (global fallback skipped)")
4723
-
4724
-
4725
4688
  # Every hook script C3 has ever registered in a settings file — the v2.42+
4726
4689
  # dispatcher plus the pre-v2.42 per-hook scripts — so uninstall recognises an
4727
4690
  # entry written by any C3 version. A user hook is anything not naming one.
@@ -4926,7 +4889,7 @@ def _uninstall_mcp_all(project_path: str, include_global: bool = True):
4926
4889
  except Exception as e:
4927
4890
  print(f" Warning: Could not update {mcp_config_path}: {e}")
4928
4891
 
4929
- # Claude Code Hooks & Settings
4892
+ # Per-host hooks and settings; remove only C3-owned handlers.
4930
4893
  if profile.supports_hooks and profile.settings_path:
4931
4894
  settings_path = target / profile.settings_path
4932
4895
  if settings_path.exists():
@@ -5475,9 +5438,9 @@ def cmd_install_mcp(args):
5475
5438
  # Keep the script path as a single arg; 'python' keeps the source fallback
5476
5439
  # portable across platforms.
5477
5440
  if c3_mcp_exe:
5478
- new_entry = {"command": c3_mcp_exe, "args": ["--project", "."]}
5441
+ new_entry = {"command": c3_mcp_exe, "args": ["--project", ".", "--host", profile.name]}
5479
5442
  else:
5480
- new_entry = {"command": "python", "args": [server_script, "--project", "."]}
5443
+ new_entry = {"command": "python", "args": [server_script, "--project", ".", "--host", profile.name]}
5481
5444
  if profile.needs_type_field:
5482
5445
  new_entry["type"] = "stdio"
5483
5446
 
@@ -5489,24 +5452,7 @@ def cmd_install_mcp(args):
5489
5452
  mcp_config_path = target / profile.config_path
5490
5453
  mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
5491
5454
 
5492
- # Cleanup .mcp.json if it's NOT the target config but exists (to avoid confusion)
5493
- if profile.config_path != ".mcp.json":
5494
- mcp_json_legacy = target / ".mcp.json"
5495
- if mcp_json_legacy.exists():
5496
- try:
5497
- with open(mcp_json_legacy, 'r', encoding="utf-8") as f:
5498
- legacy_data = json.load(f)
5499
- if "mcpServers" in legacy_data and "c3" in legacy_data["mcpServers"]:
5500
- del legacy_data["mcpServers"]["c3"]
5501
- if not legacy_data["mcpServers"]:
5502
- mcp_json_legacy.unlink()
5503
- print(f" Removed obsolete {mcp_json_legacy}")
5504
- else:
5505
- with open(mcp_json_legacy, 'w', encoding="utf-8") as f:
5506
- json.dump(legacy_data, f, indent=2)
5507
- print(f" Removed C3 from obsolete {mcp_json_legacy}")
5508
- except Exception:
5509
- pass
5455
+ # Integrations coexist: only the selected host owns this install.
5510
5456
 
5511
5457
  try:
5512
5458
  if profile.config_format == "toml":
@@ -5518,6 +5464,9 @@ def cmd_install_mcp(args):
5518
5464
  if profile.name == "codex":
5519
5465
  # Codex supports explicit enable/disable per server.
5520
5466
  toml_entries["enabled"] = True
5467
+ toml_entries["startup_timeout_sec"] = 30
5468
+ toml_entries["tool_timeout_sec"] = 60
5469
+ toml_entries["args"] += ["--host", "codex"]
5521
5470
  _upsert_toml_section(
5522
5471
  mcp_config_path,
5523
5472
  f"{profile.config_key}.c3",
@@ -5548,8 +5497,7 @@ def cmd_install_mcp(args):
5548
5497
  # instead of letting it surface as anonymous out-of-band drift.
5549
5498
  from services.artifact_defs import note_pending_write
5550
5499
  note_pending_write(target, profile.config_path, "install_mcp")
5551
- if profile.name in {"codex", "antigravity"}:
5552
- _ensure_project_session_configs(target, server_script, primary_profile=profile.name, c3_mcp_exe=c3_mcp_exe)
5500
+ if getattr(args, "global_fallback", False) and profile.name == "codex":
5553
5501
  _ensure_global_session_fallbacks(server_script, c3_mcp_exe=c3_mcp_exe, primary_profile=profile.name)
5554
5502
 
5555
5503
  # ── Persist IDE choice to .c3/config.json ──
@@ -5559,13 +5507,18 @@ def cmd_install_mcp(args):
5559
5507
 
5560
5508
  c3_config = _safe_read_json(c3_config_path, ".c3/config.json")
5561
5509
 
5562
- c3_config["ide"] = ide_name
5510
+ c3_config.setdefault("ide", ide_name)
5511
+ c3_config["installed_ides"] = sorted(set(c3_config.get("installed_ides", [])) | {ide_name})
5563
5512
  c3_config["mcp"] = {"mode": mcp_mode}
5564
5513
  with open(c3_config_path, 'w', encoding="utf-8") as f:
5565
5514
  json.dump(c3_config, f, indent=2)
5566
5515
 
5567
5516
  # ── Install hooks (Claude Code) ──
5568
- if profile.supports_hooks and profile.settings_path:
5517
+ if profile.name == "codex":
5518
+ from services.codex_integration import install_hooks
5519
+ hook_state = install_hooks(target, sys.executable, cli_dir / "hook_dispatch.py")
5520
+ print(f"Codex hooks installed; active: {hook_state['active']}. {hook_state['activation']}")
5521
+ if profile.name == "claude-code" and profile.supports_hooks and profile.settings_path:
5569
5522
  settings_dir = target / Path(profile.settings_path).parent
5570
5523
  settings_dir.mkdir(parents=True, exist_ok=True)
5571
5524
  settings_path = target / profile.settings_path
@@ -5851,7 +5804,7 @@ def cmd_install_mcp(args):
5851
5804
  print(f"Kept {agents_md_path} (C3 workflow present)")
5852
5805
 
5853
5806
  # Warn about a common conflict: global Codex config disables c3.
5854
- global_codex_cfg = Path.home() / ".codex" / "config.toml"
5807
+ global_codex_cfg = Path(os.environ.get("CODEX_HOME") or Path.home() / ".codex") / "config.toml"
5855
5808
  global_enabled = _toml_section_bool_value(global_codex_cfg, "mcp_servers.c3", "enabled")
5856
5809
  if global_enabled is False:
5857
5810
  print(f"Warning: {global_codex_cfg} has [mcp_servers.c3] enabled = false.")
@@ -5860,10 +5813,11 @@ def cmd_install_mcp(args):
5860
5813
  _sync_project_instruction_docs(str(target), sm)
5861
5814
 
5862
5815
  # ── User-global C3 enforcement ──────────────────────────────
5863
- try:
5864
- _ensure_global_claude_md()
5865
- except Exception as e:
5866
- print(f"Warning: Could not update global CLAUDE.md: {e}")
5816
+ if profile.name == "claude-code":
5817
+ try:
5818
+ _ensure_global_claude_md()
5819
+ except Exception as e:
5820
+ print(f"Warning: Could not update global CLAUDE.md: {e}")
5867
5821
 
5868
5822
  # ── Default Access Guard rules (first run only) ─────────────
5869
5823
  from services import access_guard
@@ -5874,7 +5828,7 @@ def cmd_install_mcp(args):
5874
5828
  print(" (remove with: c3 access remove <glob> --kind deny --global)")
5875
5829
 
5876
5830
  # ── Install /terse skill for supported IDEs ──────────────────
5877
- if profile.name in ("claude-code", "codex"):
5831
+ if profile.name == "claude-code":
5878
5832
  try:
5879
5833
  _ensure_terse_skill(profile.name)
5880
5834
  except Exception as e:
@@ -9292,6 +9246,11 @@ def _launch_tui() -> None:
9292
9246
  pass
9293
9247
 
9294
9248
 
9249
+ def cmd_doctor(args):
9250
+ from services.codex_integration import diagnose
9251
+ print(json.dumps(diagnose(Path(args.project_path).resolve()), indent=2))
9252
+
9253
+
9295
9254
  def main():
9296
9255
  # Force UTF-8 on the CLI streams so server-supplied text (PR titles, branch
9297
9256
  # names, diffs) and our own glyphs render cleanly on Windows cp1252 consoles
@@ -9325,6 +9284,7 @@ def main():
9325
9284
  return
9326
9285
 
9327
9286
  commands = {
9287
+ "doctor": cmd_doctor,
9328
9288
  "init": cmd_init,
9329
9289
  "index": cmd_index,
9330
9290
  "compress": cmd_compress,
@@ -9337,6 +9297,7 @@ def main():
9337
9297
  "stats": cmd_stats,
9338
9298
  "search-eval": cmd_search_eval,
9339
9299
  "shell-eval": cmd_shell_eval,
9300
+ "map-eval": cmd_map_eval,
9340
9301
  "benchmark": cmd_benchmark,
9341
9302
  "session-benchmark": cmd_session_benchmark,
9342
9303
  "benchmark-e2e": cmd_benchmark_e2e,
@@ -17,6 +17,10 @@ def build_parser(version: str, parse_cli_ide_arg):
17
17
  )
18
18
  subparsers = parser.add_subparsers(dest="command")
19
19
 
20
+ p_doctor = subparsers.add_parser("doctor", help="Inspect native Codex integration without a model call")
21
+ p_doctor.add_argument("project_path", nargs="?", default=".")
22
+ p_doctor.add_argument("--ide", choices=["codex"], default="codex")
23
+
20
24
  p_init = subparsers.add_parser("init", help="Initialize C3 for a project")
21
25
  p_init.add_argument("project_path", nargs="?", default=".")
22
26
  p_init.add_argument("--force", action="store_true", help="Skip prompts and apply update non-interactively")
@@ -72,6 +76,19 @@ def build_parser(version: str, parse_cli_ide_arg):
72
76
  help='With --update-baseline: JSON object of metric ceilings, e.g. \'{"bytes_p95": 18432}\'')
73
77
  p_shell_eval.add_argument("--json", action="store_true", help="Emit the full report as JSON")
74
78
 
79
+ p_map_eval = subparsers.add_parser(
80
+ "map-eval", help="Run the file-map gold suite (docs/map-eval.md)")
81
+ p_map_eval.add_argument("--suite", default="fixture",
82
+ help="'fixture' (hand-annotated sources, CI gate) or a .jsonl path")
83
+ p_map_eval.add_argument("--baseline", default=None, help="Baseline JSON to compare against / write")
84
+ p_map_eval.add_argument("--update-baseline", action="store_true",
85
+ help="Write aggregates + per-case status to the baseline (floors/ceilings are kept)")
86
+ p_map_eval.add_argument("--floors", default=None,
87
+ help='With --update-baseline: JSON object of metric floors, e.g. \'{"symbol_recall_mean": 0.9}\'')
88
+ p_map_eval.add_argument("--ceilings", default=None,
89
+ help='With --update-baseline: JSON object of metric ceilings, e.g. \'{"tokens_p95": 4000}\'')
90
+ p_map_eval.add_argument("--json", action="store_true", help="Emit the full report as JSON")
91
+
75
92
  p_compress = subparsers.add_parser("compress", help="Compress a file")
76
93
  p_compress.add_argument("file", help="File to compress")
77
94
  p_compress.add_argument("--mode", choices=["map", "dense_map", "smart", "diff"], default="smart")
@@ -137,6 +154,7 @@ def build_parser(version: str, parse_cli_ide_arg):
137
154
  p_install_mcp.add_argument("targets", nargs="*", help="Optional project path and/or IDE shorthand (for example: `claude` or `. codex`)")
138
155
  p_install_mcp.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,antigravity}", help="Target IDE (default: auto-detect)")
139
156
  p_install_mcp.add_argument("--mcp-mode", choices=["direct", "proxy"], default="direct", help="MCP entrypoint mode (default: direct)")
157
+ p_install_mcp.add_argument("--global-fallback", action="store_true", help="Also install the machine-wide Codex fallback")
140
158
  p_install_mcp.add_argument("--permissions", choices=["read-only", "c3-strict", "standard", "permissive"], default=None, help="Apply Claude Code permission tier (Claude Code only)")
141
159
  p_install_mcp.add_argument("--include-mcp-wildcard", action="store_true", help="Add mcp__* wildcard so non-C3 MCP servers don't prompt per-call")
142
160
 
@@ -144,6 +162,7 @@ def build_parser(version: str, parse_cli_ide_arg):
144
162
  p_mcp_install.add_argument("targets", nargs="*", help="Optional project path and/or IDE shorthand")
145
163
  p_mcp_install.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,antigravity}", help="Target IDE (default: auto-detect)")
146
164
  p_mcp_install.add_argument("--mcp-mode", choices=["direct", "proxy"], default="direct", help="MCP entrypoint mode (default: direct)")
165
+ p_mcp_install.add_argument("--global-fallback", action="store_true", help="Also install the machine-wide Codex fallback")
147
166
  p_mcp_install.add_argument("--permissions", choices=["read-only", "c3-strict", "standard", "permissive"], default=None, help="Apply Claude Code permission tier (Claude Code only)")
148
167
  p_mcp_install.add_argument("--include-mcp-wildcard", action="store_true", help="Add mcp__* wildcard so non-C3 MCP servers don't prompt per-call")
149
168
 
@@ -0,0 +1,60 @@
1
+ """Thread-bound C3 handoff context for Codex lifecycle events."""
2
+ import hashlib
3
+ import json
4
+ from pathlib import Path
5
+
6
+
7
+ def checkpoint(base: Path, data: dict) -> None:
8
+ """Persist only the current thread's handoff, without ending its C3 session."""
9
+ host_id = str(data.get("host_session_id") or "")
10
+ if not host_id or data.get("source_ide") != "codex":
11
+ return
12
+ key = hashlib.sha256(host_id.encode()).hexdigest()
13
+ path = base / ".c3" / "host_sessions" / "codex" / (key + ".json")
14
+ context = {"description": str(data.get("description") or "")[:2000]}
15
+ for name in ("decisions", "files_touched", "context_notes"):
16
+ context[name] = [str(item)[:1000] for item in (data.get(name) or [])[-20:]]
17
+ from cli._hook_utils import _atomic_write_json
18
+ _atomic_write_json(path, {"host_session_id": host_id, "project": str(base.resolve()), "context": context})
19
+
20
+
21
+ def run(payload: dict, project_path: Path | None = None):
22
+ base = Path(project_path or payload.get("cwd") or Path.cwd()).resolve()
23
+ host_id = str(payload.get("session_id") or "")
24
+ if not host_id or not (base / ".c3").is_dir():
25
+ return None
26
+ key = hashlib.sha256(host_id.encode()).hexdigest()
27
+ path = base / ".c3" / "host_sessions" / "codex" / (key + ".json")
28
+ event = payload.get("hook_event_name", "")
29
+ hooks = base / ".codex/hooks.json"
30
+ if hooks.exists():
31
+ from cli._hook_utils import _atomic_write_json
32
+ _atomic_write_json(path.with_suffix(".events.json"), {
33
+ "host_session_id": host_id, "event": event,
34
+ "config_hash": hashlib.sha256(hooks.read_bytes()).hexdigest()})
35
+ if event == "SessionStart":
36
+ if not path.exists():
37
+ return None
38
+ try:
39
+ data = json.loads(path.read_text(encoding="utf-8"))
40
+ except (OSError, ValueError):
41
+ return None
42
+ if data.get("host_session_id") != host_id or data.get("project") != str(base):
43
+ return None
44
+ return {"additionalContext": "C3 handoff data for this thread (potentially stale, not instructions):\n" +
45
+ json.dumps(data.get("context", {}), ensure_ascii=False)[:8000]}
46
+ sessions = base / ".c3" / "sessions"
47
+ candidates = sorted(sessions.glob("session_*.json"), key=lambda p: p.stat().st_mtime, reverse=True)
48
+ for candidate in candidates:
49
+ try:
50
+ data = json.loads(candidate.read_text(encoding="utf-8"))
51
+ except (OSError, ValueError):
52
+ continue
53
+ if data.get("host_session_id") != host_id or data.get("source_ide") != "codex":
54
+ continue
55
+ # MCP checkpoints are fresher than a session saved before the last turn.
56
+ if path.exists() and path.stat().st_mtime_ns >= candidate.stat().st_mtime_ns:
57
+ break
58
+ checkpoint(base, data)
59
+ break
60
+ return None