code-context-control 2.136.0__tar.gz → 2.138.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 (552) hide show
  1. {code_context_control-2.136.0 → code_context_control-2.138.0}/PKG-INFO +1 -1
  2. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/c3.py +1 -1
  3. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/tools.html +1 -1
  4. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/mcp_server.py +1 -1
  5. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/delegate.py +94 -15
  6. {code_context_control-2.136.0 → code_context_control-2.138.0}/code_context_control.egg-info/PKG-INFO +1 -1
  7. {code_context_control-2.136.0 → code_context_control-2.138.0}/code_context_control.egg-info/SOURCES.txt +2 -0
  8. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/config.py +9 -1
  9. {code_context_control-2.136.0 → code_context_control-2.138.0}/pyproject.toml +1 -1
  10. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/delegate_eval.py +34 -3
  11. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_eval.py +7 -0
  12. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_host_d2.py +4 -2
  13. code_context_control-2.138.0/tests/test_delegate_thinking_cap.py +134 -0
  14. code_context_control-2.138.0/tests/test_delegate_tuning.py +123 -0
  15. {code_context_control-2.136.0 → code_context_control-2.138.0}/LICENSE +0 -0
  16. {code_context_control-2.136.0 → code_context_control-2.138.0}/README.md +0 -0
  17. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/__init__.py +0 -0
  18. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/_hook_utils.py +0 -0
  19. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/_shell_writes.py +0 -0
  20. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/commands/__init__.py +0 -0
  21. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/commands/common.py +0 -0
  22. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/commands/parser.py +0 -0
  23. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/docs.html +0 -0
  24. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/edits.html +0 -0
  25. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/access.html +0 -0
  26. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/bitbucket.html +0 -0
  27. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/credentials.html +0 -0
  28. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/getting-started.html +0 -0
  29. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/index.html +0 -0
  30. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/masking.html +0 -0
  31. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/oracle.html +0 -0
  32. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/shared.css +0 -0
  33. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/guide/workflow.html +0 -0
  34. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_access_guard.py +0 -0
  35. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_artifact.py +0 -0
  36. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_auto_snapshot.py +0 -0
  37. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_c3_signal.py +0 -0
  38. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_c3read.py +0 -0
  39. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_codex_lifecycle.py +0 -0
  40. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_dispatch.py +0 -0
  41. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_edit_ledger.py +0 -0
  42. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_edit_unlock.py +0 -0
  43. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_filter.py +0 -0
  44. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_ghost_files.py +0 -0
  45. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_pretool_enforce.py +0 -0
  46. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_prompt_recall.py +0 -0
  47. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_read.py +0 -0
  48. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_session_end.py +0 -0
  49. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_session_open.py +0 -0
  50. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_session_stats.py +0 -0
  51. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hook_terse_advisor.py +0 -0
  52. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_server.py +0 -0
  53. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/app.js +0 -0
  54. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/add_project.js +0 -0
  55. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/config_editor.js +0 -0
  56. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  57. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/drill_health.js +0 -0
  58. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/drill_panel.js +0 -0
  59. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
  60. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  61. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/drill_views.js +0 -0
  62. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/global_search.js +0 -0
  63. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_access.js +0 -0
  64. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_ci.js +0 -0
  65. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
  66. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_credentials.js +0 -0
  67. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
  68. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_locks.js +0 -0
  69. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/hub_tokens.js +0 -0
  70. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  71. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/modals.js +0 -0
  72. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/project_card.js +0 -0
  73. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/project_tree.js +0 -0
  74. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/session_drawer.js +0 -0
  75. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/settings_modal.js +0 -0
  76. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/sidebar.js +0 -0
  77. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/summary_bar.js +0 -0
  78. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/task_board.js +0 -0
  79. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/toasts.js +0 -0
  80. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/components/topbar.js +0 -0
  81. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui/state.js +0 -0
  82. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/hub_ui.html +0 -0
  83. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/mcp_proxy.py +0 -0
  84. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/progress.py +0 -0
  85. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/server.py +0 -0
  86. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/__init__.py +0 -0
  87. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/_grants.py +0 -0
  88. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/_helpers.py +0 -0
  89. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/agent.py +0 -0
  90. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/artifacts.py +0 -0
  91. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/bitbucket.py +0 -0
  92. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/ci.py +0 -0
  93. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/compress.py +0 -0
  94. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/credentials.py +0 -0
  95. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/edit.py +0 -0
  96. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/edit_verify.py +0 -0
  97. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/edits.py +0 -0
  98. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/federate.py +0 -0
  99. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/filter.py +0 -0
  100. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/impact.py +0 -0
  101. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/jira.py +0 -0
  102. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/locks.py +0 -0
  103. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/memory.py +0 -0
  104. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/override.py +0 -0
  105. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/project.py +0 -0
  106. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/read.py +0 -0
  107. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/search.py +0 -0
  108. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/session.py +0 -0
  109. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/shell.py +0 -0
  110. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/shell_job.py +0 -0
  111. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/shell_nudge.py +0 -0
  112. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/shell_parsers.py +0 -0
  113. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/shell_render.py +0 -0
  114. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/status.py +0 -0
  115. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/tasks.py +0 -0
  116. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/tools/validate.py +0 -0
  117. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/api.js +0 -0
  118. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/app.js +0 -0
  119. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/access.js +0 -0
  120. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/bitbucket.js +0 -0
  121. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/chat.js +0 -0
  122. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/credentials.js +0 -0
  123. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/dashboard.js +0 -0
  124. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/edits.js +0 -0
  125. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/enforcement.js +0 -0
  126. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/instructions.js +0 -0
  127. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/jira.js +0 -0
  128. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/memory.js +0 -0
  129. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/sessions.js +0 -0
  130. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/settings.js +0 -0
  131. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/sidebar.js +0 -0
  132. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/components/tasks.js +0 -0
  133. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/icons.js +0 -0
  134. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/pm_shared.js +0 -0
  135. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/shared.js +0 -0
  136. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui/theme.js +0 -0
  137. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui.html +0 -0
  138. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui_legacy.html +0 -0
  139. {code_context_control-2.136.0 → code_context_control-2.138.0}/cli/ui_nano.html +0 -0
  140. {code_context_control-2.136.0 → code_context_control-2.138.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  141. {code_context_control-2.136.0 → code_context_control-2.138.0}/code_context_control.egg-info/entry_points.txt +0 -0
  142. {code_context_control-2.136.0 → code_context_control-2.138.0}/code_context_control.egg-info/requires.txt +0 -0
  143. {code_context_control-2.136.0 → code_context_control-2.138.0}/code_context_control.egg-info/top_level.txt +0 -0
  144. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/__init__.py +0 -0
  145. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/codex_patch.py +0 -0
  146. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/grok_payload.py +0 -0
  147. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/hook_command.py +0 -0
  148. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/host.py +0 -0
  149. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/ide.py +0 -0
  150. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/mcp_toml.py +0 -0
  151. {code_context_control-2.136.0 → code_context_control-2.138.0}/core/web_security.py +0 -0
  152. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/__init__.py +0 -0
  153. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/config.py +0 -0
  154. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/listeners.py +0 -0
  155. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/mcp_oracle.py +0 -0
  156. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/oracle_server.py +0 -0
  157. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/oracle_ui.html +0 -0
  158. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/__init__.py +0 -0
  159. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/activity_reporter.py +0 -0
  160. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/api_auth.py +0 -0
  161. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/c3_bridge.py +0 -0
  162. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/chat_engine.py +0 -0
  163. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/chat_poll.py +0 -0
  164. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/chat_store.py +0 -0
  165. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/client_tokens.py +0 -0
  166. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/cross_memory.py +0 -0
  167. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/discovery_audit.py +0 -0
  168. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/federated_graph.py +0 -0
  169. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/health_checker.py +0 -0
  170. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/insight_engine.py +0 -0
  171. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/local_session.py +0 -0
  172. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/memory_reader.py +0 -0
  173. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/memory_writer.py +0 -0
  174. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/mobile_api.py +0 -0
  175. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/project_scanner.py +0 -0
  176. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/review_agent.py +0 -0
  177. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/tool_executor.py +0 -0
  178. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/services/tool_registry.py +0 -0
  179. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/activity.js +0 -0
  180. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/agents.js +0 -0
  181. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/app.js +0 -0
  182. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/busy.js +0 -0
  183. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/chat/conversations.js +0 -0
  184. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/chat/input.js +0 -0
  185. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/chat/markdown.js +0 -0
  186. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/chat/send.js +0 -0
  187. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/chat/stream_renderer.js +0 -0
  188. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/chat/toolbar.js +0 -0
  189. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/core.js +0 -0
  190. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/crossgraph.js +0 -0
  191. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/header.js +0 -0
  192. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/insights.js +0 -0
  193. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/projects.js +0 -0
  194. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/qrcode.js +0 -0
  195. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/settings.js +0 -0
  196. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/suggestions.js +0 -0
  197. {code_context_control-2.136.0 → code_context_control-2.138.0}/oracle/ui/theme_tabs.js +0 -0
  198. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/__init__.py +0 -0
  199. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/access_guard.py +0 -0
  200. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/access_telemetry.py +0 -0
  201. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/activity_log.py +0 -0
  202. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/agent_base.py +0 -0
  203. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/agent_locks.py +0 -0
  204. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/agents.py +0 -0
  205. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/agents_workflow.py +0 -0
  206. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/artifact_defs.py +0 -0
  207. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/artifact_store.py +0 -0
  208. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/atomic_json.py +0 -0
  209. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/auto_memory.py +0 -0
  210. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/background_service.py +0 -0
  211. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/__init__.py +0 -0
  212. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/external/__init__.py +0 -0
  213. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/external/aider_polyglot.py +0 -0
  214. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/external/swe_bench.py +0 -0
  215. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/map_eval.py +0 -0
  216. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/search_eval.py +0 -0
  217. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bench/shell_eval.py +0 -0
  218. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/benchmark_dashboard.py +0 -0
  219. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bitbucket_client.py +0 -0
  220. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/bitbucket_credentials.py +0 -0
  221. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_act.py +0 -0
  222. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_cache.py +0 -0
  223. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_expr.py +0 -0
  224. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_failures.py +0 -0
  225. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_github.py +0 -0
  226. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_impact.py +0 -0
  227. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_intel.py +0 -0
  228. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_runner.py +0 -0
  229. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ci_workflow.py +0 -0
  230. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/circuit_breaker.py +0 -0
  231. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/claude_md.py +0 -0
  232. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/codex_integration.py +0 -0
  233. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/codex_transcript.py +0 -0
  234. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/compressor.py +0 -0
  235. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/context_snapshot.py +0 -0
  236. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/conversation_store.py +0 -0
  237. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/cred_audit.py +0 -0
  238. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/cred_telemetry.py +0 -0
  239. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/credential_store.py +0 -0
  240. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/delegate_agents.py +0 -0
  241. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/dir_map.py +0 -0
  242. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/doc_index.py +0 -0
  243. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/e2e_benchmark.py +0 -0
  244. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/e2e_evaluator.py +0 -0
  245. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/e2e_tasks.py +0 -0
  246. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/edit_ledger.py +0 -0
  247. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/embedding_index.py +0 -0
  248. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/enforcement_policy.py +0 -0
  249. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/error_reporting.py +0 -0
  250. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/file_map.py +0 -0
  251. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/file_memory.py +0 -0
  252. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/git_context.py +0 -0
  253. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/grok_integration.py +0 -0
  254. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/grok_transcript.py +0 -0
  255. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/host_sessions.py +0 -0
  256. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/hub_service.py +0 -0
  257. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/index_store.py +0 -0
  258. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/indexer.py +0 -0
  259. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/jira_client.py +0 -0
  260. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/jira_cloud.py +0 -0
  261. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/jira_credentials.py +0 -0
  262. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/jira_data_center.py +0 -0
  263. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/jira_links.py +0 -0
  264. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/lexical_index.py +0 -0
  265. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/mask_activation.py +0 -0
  266. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/mask_mirror.py +0 -0
  267. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/mask_presets.py +0 -0
  268. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory.py +0 -0
  269. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory_consolidator.py +0 -0
  270. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory_distiller.py +0 -0
  271. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory_graph.py +0 -0
  272. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory_grounder.py +0 -0
  273. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory_queue.py +0 -0
  274. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/memory_scorer.py +0 -0
  275. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/metrics.py +0 -0
  276. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/notifications.py +0 -0
  277. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ollama_bridge.py +0 -0
  278. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ollama_client.py +0 -0
  279. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/ollama_credentials.py +0 -0
  280. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/oracle_service.py +0 -0
  281. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/output_filter.py +0 -0
  282. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/override_costs.py +0 -0
  283. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/override_grants.py +0 -0
  284. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/override_policy.py +0 -0
  285. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/override_requests.py +0 -0
  286. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/override_wake.py +0 -0
  287. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/parser.py +0 -0
  288. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/project_manager.py +0 -0
  289. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/project_runtime.py +0 -0
  290. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/protocol.py +0 -0
  291. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/proxy_state.py +0 -0
  292. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/repo_map.py +0 -0
  293. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/repo_shape.py +0 -0
  294. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/reranker.py +0 -0
  295. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/retention.py +0 -0
  296. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/retrieval.py +0 -0
  297. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/retrieval_broker.py +0 -0
  298. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/router.py +0 -0
  299. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/runtime.py +0 -0
  300. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/scanner.py +0 -0
  301. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/session_benchmark.py +0 -0
  302. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/session_live.py +0 -0
  303. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/session_manager.py +0 -0
  304. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/session_preloader.py +0 -0
  305. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/shell_jobs.py +0 -0
  306. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/shell_output.py +0 -0
  307. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/subprojects.py +0 -0
  308. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/task_store.py +0 -0
  309. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/telemetry.py +0 -0
  310. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/text_index.py +0 -0
  311. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/time_tracker.py +0 -0
  312. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/tool_classifier.py +0 -0
  313. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/transcript_index.py +0 -0
  314. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/validation_cache.py +0 -0
  315. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/vector_store.py +0 -0
  316. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/watcher.py +0 -0
  317. {code_context_control-2.136.0 → code_context_control-2.138.0}/services/win_subprocess.py +0 -0
  318. {code_context_control-2.136.0 → code_context_control-2.138.0}/setup.cfg +0 -0
  319. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_access_builtin_optout.py +0 -0
  320. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_access_guard.py +0 -0
  321. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_access_guard_meta.py +0 -0
  322. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_access_guard_shell_project.py +0 -0
  323. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_access_guard_surfaces.py +0 -0
  324. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_access_guard_wiring.py +0 -0
  325. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_activity_log_find_last.py +0 -0
  326. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_activity_reporter.py +0 -0
  327. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_agent_locks.py +0 -0
  328. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_aider_polyglot.py +0 -0
  329. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_antigravity_transition.py +0 -0
  330. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_artifact_store.py +0 -0
  331. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_artifact_tool.py +0 -0
  332. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_atomic_json.py +0 -0
  333. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_background_service.py +0 -0
  334. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  335. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_bitbucket_client.py +0 -0
  336. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_bitbucket_config_fallback.py +0 -0
  337. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_bitbucket_credentials.py +0 -0
  338. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_bitbucket_tool.py +0 -0
  339. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_builtin_modes.py +0 -0
  340. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  341. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_c3_shell.py +0 -0
  342. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_chat_poll.py +0 -0
  343. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_act.py +0 -0
  344. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_cache.py +0 -0
  345. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_dag_ownership.py +0 -0
  346. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_expr.py +0 -0
  347. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_impact.py +0 -0
  348. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_intel.py +0 -0
  349. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_runner.py +0 -0
  350. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ci_workflow.py +0 -0
  351. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_circuit_breaker.py +0 -0
  352. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_claude_md_merge.py +0 -0
  353. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_claude_md_updater.py +0 -0
  354. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_cli_smoke.py +0 -0
  355. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_codex_mcp_transport.py +0 -0
  356. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_codex_native.py +0 -0
  357. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_compressor_large_file.py +0 -0
  358. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_confirm_guard.py +0 -0
  359. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_confirm_guard_wiring.py +0 -0
  360. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_cooccurrence_bounds.py +0 -0
  361. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_cred_audit.py +0 -0
  362. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_cred_telemetry.py +0 -0
  363. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_credential_login_kind.py +0 -0
  364. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_credential_store.py +0 -0
  365. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_credential_ui_parity.py +0 -0
  366. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_credentials_routes.py +0 -0
  367. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_credentials_tool.py +0 -0
  368. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_creds_cli_smoke.py +0 -0
  369. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_adoption_d4.py +0 -0
  370. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_cascade.py +0 -0
  371. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_claude_d1.py +0 -0
  372. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_grok.py +0 -0
  373. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_scout_d3.py +0 -0
  374. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_telemetry_d0.py +0 -0
  375. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_delegate_version_probe.py +0 -0
  376. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_dir_map_c3.py +0 -0
  377. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_e2e_benchmark.py +0 -0
  378. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_edit_ledger_deadline.py +0 -0
  379. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_edit_ledger_hook.py +0 -0
  380. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_edit_locking.py +0 -0
  381. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_edit_normalization.py +0 -0
  382. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_edit_verify.py +0 -0
  383. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_embedding_index_deadlock.py +0 -0
  384. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_enforcement_flip.py +0 -0
  385. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_enforcement_policy.py +0 -0
  386. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_enforcement_routes.py +0 -0
  387. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_env_parser.py +0 -0
  388. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
  389. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_federated_graph.py +0 -0
  390. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_file_map_c1.py +0 -0
  391. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_filter_backoff.py +0 -0
  392. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ghost_files.py +0 -0
  393. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ghost_generation.py +0 -0
  394. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_git_branch_awareness.py +0 -0
  395. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_grok_native.py +0 -0
  396. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_access_guard.py +0 -0
  397. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_codex_compat.py +0 -0
  398. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_dispatch.py +0 -0
  399. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_grok_compat.py +0 -0
  400. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_pretool_enforce.py +0 -0
  401. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_prompt_recall.py +0 -0
  402. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_session_end.py +0 -0
  403. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_smoke.py +0 -0
  404. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_state.py +0 -0
  405. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hook_utf8_stdio.py +0 -0
  406. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_credentials_route.py +0 -0
  407. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_credentials_routes_write.py +0 -0
  408. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_enforcement_routes.py +0 -0
  409. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_hook_migration.py +0 -0
  410. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_inspect_api.py +0 -0
  411. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_locks_routes.py +0 -0
  412. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_oracle_service_routes.py +0 -0
  413. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_override_policy_routes.py +0 -0
  414. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_override_routes.py +0 -0
  415. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_server_smoke.py +0 -0
  416. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_hub_subproject_links.py +0 -0
  417. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ide_workflow_adaptation.py +0 -0
  418. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_index_cap_not_hardcoded.py +0 -0
  419. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_init_clear_preserves_user_content.py +0 -0
  420. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_init_scan.py +0 -0
  421. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_install_mcp_entrypoint.py +0 -0
  422. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_cli_smoke.py +0 -0
  423. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_client.py +0 -0
  424. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_config_fallback.py +0 -0
  425. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_credentials.py +0 -0
  426. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_links.py +0 -0
  427. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_routes.py +0 -0
  428. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_jira_tool.py +0 -0
  429. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_large_files_c4.py +0 -0
  430. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_lazy_store_init.py +0 -0
  431. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_map_eval.py +0 -0
  432. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_map_telemetry_c0.py +0 -0
  433. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mask_guard.py +0 -0
  434. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mask_routes.py +0 -0
  435. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mask_surfaces.py +0 -0
  436. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mcp_host_guard.py +0 -0
  437. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mcp_memory_timeout.py +0 -0
  438. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mcp_server_smoke.py +0 -0
  439. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mcp_toml.py +0 -0
  440. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_memory_distiller.py +0 -0
  441. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_memory_graph_api.py +0 -0
  442. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_memory_queue.py +0 -0
  443. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_memory_system.py +0 -0
  444. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_api.py +0 -0
  445. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_clients.py +0 -0
  446. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_extras.py +0 -0
  447. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_jobs_ci.py +0 -0
  448. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_override_costs.py +0 -0
  449. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_override_routes.py +0 -0
  450. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_mobile_security_api.py +0 -0
  451. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_no_stale_model_pins.py +0 -0
  452. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_notification_dedup.py +0 -0
  453. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_notification_discipline.py +0 -0
  454. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_notification_kinds.py +0 -0
  455. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ollama_credentials.py +0 -0
  456. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_api_auth.py +0 -0
  457. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_apikey_api.py +0 -0
  458. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_c3_bridge.py +0 -0
  459. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_chat_engine.py +0 -0
  460. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_chat_store.py +0 -0
  461. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_discovery_api.py +0 -0
  462. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_discovery_audit.py +0 -0
  463. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_health_probe.py +0 -0
  464. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_local_auth.py +0 -0
  465. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_loopback.py +0 -0
  466. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_ollama_bridge.py +0 -0
  467. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_scanner_cache.py +0 -0
  468. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_security_fixes.py +0 -0
  469. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_session_bootstrap.py +0 -0
  470. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_subproject_awareness.py +0 -0
  471. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_oracle_ui_bundle.py +0 -0
  472. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_output_filter.py +0 -0
  473. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_override_costs.py +0 -0
  474. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_override_grants.py +0 -0
  475. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_override_grants_mcp.py +0 -0
  476. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_override_requests.py +0 -0
  477. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_override_wake.py +0 -0
  478. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_permissions.py +0 -0
  479. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_pm_api.py +0 -0
  480. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_project_manager.py +0 -0
  481. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_project_manager_merge.py +0 -0
  482. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_project_tool.py +0 -0
  483. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_read_coercion.py +0 -0
  484. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_read_edit_parity.py +0 -0
  485. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_read_outside_root.py +0 -0
  486. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_related_facts.py +0 -0
  487. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_repo_map.py +0 -0
  488. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_repo_shape.py +0 -0
  489. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_response_boilerplate.py +0 -0
  490. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_retention.py +0 -0
  491. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_review_digest.py +0 -0
  492. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_eval.py +0 -0
  493. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_p1.py +0 -0
  494. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_p2.py +0 -0
  495. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_p2b.py +0 -0
  496. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_p3.py +0 -0
  497. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_p4.py +0 -0
  498. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_search_p5.py +0 -0
  499. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_service_durability.py +0 -0
  500. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_session_benchmark.py +0 -0
  501. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_session_budget.py +0 -0
  502. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_session_live.py +0 -0
  503. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_budget_s1.py +0 -0
  504. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_creds.py +0 -0
  505. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_eval.py +0 -0
  506. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_jobs_s3.py +0 -0
  507. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_nudge_s4.py +0 -0
  508. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_output.py +0 -0
  509. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_parsers_s2.py +0 -0
  510. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_robustness.py +0 -0
  511. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_telemetry_s0.py +0 -0
  512. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_write_ledger.py +0 -0
  513. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_shell_writes.py +0 -0
  514. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_subproject_clear_scope.py +0 -0
  515. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_subproject_depth_consumers.py +0 -0
  516. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_subproject_exclusion.py +0 -0
  517. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_subproject_federation.py +0 -0
  518. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_subproject_linkage_api.py +0 -0
  519. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_subprojects.py +0 -0
  520. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_swe_bench.py +0 -0
  521. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_task_store.py +0 -0
  522. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_task_tool.py +0 -0
  523. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_time_tracker.py +0 -0
  524. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_token_telemetry.py +0 -0
  525. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_token_tracking.py +0 -0
  526. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_tool_registry.py +0 -0
  527. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_ui_jsx_syntax.py +0 -0
  528. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_upgrade_and_version.py +0 -0
  529. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_validate.py +0 -0
  530. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_vault_write_guard.py +0 -0
  531. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_version_sync.py +0 -0
  532. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_watcher_pruning.py +0 -0
  533. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_web_security.py +0 -0
  534. {code_context_control-2.136.0 → code_context_control-2.138.0}/tests/test_windows_reliability.py +0 -0
  535. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/__init__.py +0 -0
  536. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/backend.py +0 -0
  537. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/main.py +0 -0
  538. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/__init__.py +0 -0
  539. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/benchmark_view.py +0 -0
  540. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/claudemd_view.py +0 -0
  541. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/compress_view.py +0 -0
  542. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/index_view.py +0 -0
  543. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/init_view.py +0 -0
  544. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/mcp_view.py +0 -0
  545. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/optimize_view.py +0 -0
  546. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/pipe_view.py +0 -0
  547. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/projects_view.py +0 -0
  548. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/search_view.py +0 -0
  549. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/session_view.py +0 -0
  550. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/stats.py +0 -0
  551. {code_context_control-2.136.0 → code_context_control-2.138.0}/tui/screens/ui_view.py +0 -0
  552. {code_context_control-2.136.0 → code_context_control-2.138.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.136.0
3
+ Version: 2.138.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.136.0"
94
+ __version__ = "2.138.0"
95
95
 
96
96
 
97
97
  def _compress_file_cli(compressor, path, mode="smart", **kw):
@@ -940,7 +940,7 @@ c3_status(view=<span class="str">'sessions'</span>) <span class="com">#
940
940
  <td class="param-name">tier</td>
941
941
  <td class="param-type">string</td>
942
942
  <td class="param-default">"small"</td>
943
- <td class="param-desc"><code>small</code> · <code>medium</code> · <code>large</code> · <code>default</code>. Claude: Haiku / Sonnet / Opus. Codex and Grok: reasoning effort low / medium / high on the account's model. Gemini: flash-lite / flash / pro.</td>
943
+ <td class="param-desc"><code>small</code> · <code>medium</code> · <code>large</code> · <code>default</code>. Claude: Haiku (thinking capped at 1024 tokens) / Sonnet / Opus; a scout defaults to Sonnet, which finds things in far fewer turns. Codex and Grok: reasoning effort low / medium / high on the account's model. Gemini: flash-lite / flash / pro.</td>
944
944
  </tr>
945
945
  <tr>
946
946
  <td class="param-name">model</td>
@@ -809,7 +809,7 @@ async def c3_delegate(task: str, task_type: str = "ask", context: str = "",
809
809
  ctx: Context = None) -> str:
810
810
  """OFFLOAD to another model — use when the subtask is local-model-sized or needs a different perspective.
811
811
  backend: host (default: your own provider, one tier down — Claude Code->claude, Codex->codex, Grok->grok, Antigravity->gemini) | claude|codex|gemini|grok|ollama|auto. task_type: auto, summarize, explain, review, ask, test, diagnose, ping (live auth check), available, codex_check, gemini_check, grok_check, codex_resume.
812
- tier: small (default) | medium | large | default. claude: haiku/sonnet/opus; codex/grok: reasoning effort; gemini: flash-lite/flash/pro. model overrides the tier. Context + file_path are packed by C3 under Access Guard; a file over 8k tokens goes as its map, so for line-level questions on a big file paste the excerpt or use scout=true.
812
+ tier: small (default; scout=true defaults to medium) | medium | large | default. claude: haiku/sonnet/opus; codex/grok: reasoning effort; gemini: flash-lite/flash/pro. model overrides the tier. Context + file_path are packed by C3 under Access Guard; a file over 8k tokens goes as its map, so for line-level questions on a big file paste the excerpt or use scout=true.
813
813
  scout=true: the delegate may Read/Grep/Glob the project itself (claude: read-only, guard-denied paths refused; codex: its read-only sandbox) — for lookups when you cannot name the files.
814
814
  grok runs read-only in a temp dir unless delegate.grok_allow_write=true (then --yolo in the project, loading its trusted .grok MCP servers and hooks).
815
815
  allow_write_delegation: explicit user opt-in for write-capable backends (gemini/grok write mode/codex_resume) while Access Guard rules are active; codex is pinned read-only instead."""
@@ -431,7 +431,56 @@ def scout_settings(project_path) -> dict:
431
431
  }
432
432
 
433
433
 
434
- def resolve_claude_tier(tier: str, model: str, dcfg: dict) -> tuple[str, str, str]:
434
+ _EFFORT_LEVELS = frozenset({"low", "medium", "high", "xhigh", "max"})
435
+
436
+
437
+ def claude_effort_for(tier: str, dcfg: dict) -> str:
438
+ """``--effort`` for a resolved tier: ``claude_effort`` overrides every
439
+ tier, else ``claude_tier_effort[tier]``, else none (the CLI's default).
440
+ An unknown level is ignored rather than passed to argv."""
441
+ value = str(dcfg.get("claude_effort") or "").strip().lower()
442
+ if not value:
443
+ table = dcfg.get("claude_tier_effort") or {}
444
+ value = str(table.get(tier) or "").strip().lower() if isinstance(table, dict) else ""
445
+ return value if value in _EFFORT_LEVELS else ""
446
+
447
+
448
+ def claude_thinking_cap_for(tier: str, dcfg: dict) -> int | None:
449
+ """``MAX_THINKING_TOKENS`` for a resolved tier, or None (no cap).
450
+
451
+ ``claude_thinking_tokens`` overrides every tier, else
452
+ ``claude_tier_thinking_tokens[tier]``. 0 turns thinking off. Unlike
453
+ ``--effort`` (no measurable effect on Haiku 4.5), this is what moves a
454
+ delegate's cost: one Haiku review went from 4,831 output tokens and 54 s
455
+ uncapped to 1,186 and 12 s at 1024. A negative or non-integer value is
456
+ ignored.
457
+ """
458
+ value = dcfg.get("claude_thinking_tokens")
459
+ if value is None or value == "":
460
+ table = dcfg.get("claude_tier_thinking_tokens") or {}
461
+ value = table.get(tier) if isinstance(table, dict) else None
462
+ if value is None or value == "" or isinstance(value, bool):
463
+ return None
464
+ try:
465
+ cap = int(value)
466
+ except (TypeError, ValueError):
467
+ return None
468
+ return cap if cap >= 0 else None
469
+
470
+
471
+ def claude_default_tier_key(scout: bool) -> str:
472
+ """Which config key names the default Claude tier.
473
+
474
+ A scout defaults to its own key (medium): measured 2026-09-14, a Haiku
475
+ scout took 28 turns and $0.24 to find one function that Sonnet found in
476
+ 8 turns for $0.046; the eval's canary case showed the same (15 turns
477
+ against 2).
478
+ """
479
+ return "claude_scout_default_tier" if scout else "claude_default_tier"
480
+
481
+
482
+ def resolve_claude_tier(tier: str, model: str, dcfg: dict,
483
+ scout: bool = False) -> tuple[str, str, str]:
435
484
  """(tier, model_arg, error). An explicit ``model`` wins over the tier.
436
485
 
437
486
  ``model_arg`` empty means omit --model. ``error`` is non-empty when the
@@ -441,7 +490,7 @@ def resolve_claude_tier(tier: str, model: str, dcfg: dict) -> tuple[str, str, st
441
490
  if not _MODEL_NAME_RE.match(model):
442
491
  return "", "", f"model name {model!r} is not a Claude model alias or id"
443
492
  return "custom", model, ""
444
- resolved = normalize_tier(tier, dcfg, "claude_default_tier")
493
+ resolved = normalize_tier(tier, dcfg, claude_default_tier_key(scout))
445
494
  if not resolved:
446
495
  return "", "", f"unknown tier {tier!r} (use one of {', '.join(CLAUDE_TIERS)})"
447
496
  table = {**CLAUDE_TIER_MODELS, **(dcfg.get("claude_tier_models") or {})}
@@ -483,10 +532,15 @@ def _claude_cmd(exe: str, model: str, system_prompt: str, *, effort: str = "",
483
532
  return cmd
484
533
 
485
534
 
486
- def _claude_env() -> dict:
535
+ def _claude_env(thinking_cap: int | None = None) -> dict:
487
536
  env = _child_host_env("claude-code")
488
537
  for name in _CLAUDE_NESTING_VARS:
489
538
  env.pop(name, None)
539
+ # The caller's own MAX_THINKING_TOKENS must not leak into a delegate: the
540
+ # cap is decided per tier here, or not set at all.
541
+ env.pop("MAX_THINKING_TOKENS", None)
542
+ if thinking_cap is not None:
543
+ env["MAX_THINKING_TOKENS"] = str(int(thinking_cap))
490
544
  return env
491
545
 
492
546
 
@@ -559,7 +613,8 @@ def parse_claude_json(stdout: str, requested_model: str = "") -> tuple[str, bool
559
613
  def _run_claude(prompt: str, system_prompt: str, model: str = "", *,
560
614
  timeout: int = 120, effort: str = "",
561
615
  max_budget_usd: float = 0.0, scout_project: str | None = None,
562
- settings: dict | None = None) -> tuple[str, bool, dict]:
616
+ settings: dict | None = None,
617
+ thinking_cap: int | None = None) -> tuple[str, bool, dict]:
563
618
  """Run the locked-down ``claude -p``.
564
619
 
565
620
  Tool-less (default): in a throwaway directory. Scout (``scout_project``
@@ -580,7 +635,7 @@ def _run_claude(prompt: str, system_prompt: str, model: str = "", *,
580
635
  harden_win_argv(cmd),
581
636
  stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE,
582
637
  text=True, encoding="utf-8", errors="replace", cwd=workdir,
583
- env=_claude_env(), **_popen_kwargs(),
638
+ env=_claude_env(thinking_cap), **_popen_kwargs(),
584
639
  )
585
640
  stdout, stderr, status = _communicate_with_heartbeat(
586
641
  proc, timeout=timeout, idle_timeout=0, stdin_text=prompt)
@@ -671,7 +726,7 @@ def _handle_claude_delegate(task: str, task_type: str, context: str,
671
726
  return finalize("c3_delegate", base,
672
727
  "[delegate:error] Claude not enabled. Set delegate.claude_enabled=true "
673
728
  "in .c3/config.json", "disabled")
674
- resolved_tier, model_arg, problem = resolve_claude_tier(tier, model, dcfg)
729
+ resolved_tier, model_arg, problem = resolve_claude_tier(tier, model, dcfg, scout=scout)
675
730
  if problem:
676
731
  return finalize("c3_delegate", base, f"[delegate:error] {problem}", "error")
677
732
  base["tier"] = resolved_tier
@@ -709,14 +764,19 @@ def _handle_claude_delegate(task: str, task_type: str, context: str,
709
764
  rules = _CLAUDE_SCOUT_RULES if scout else _CLAUDE_DELEGATE_RULES
710
765
  system_prompt = f"{tdef['system']} {rules}"
711
766
  prompt = tdef["prompt_template"].format(context=enriched or "(none)", task=task)
712
- effort = str(dcfg.get("claude_effort") or "")
767
+ effort = claude_effort_for(resolved_tier, dcfg)
768
+ if effort:
769
+ base["effort"] = effort
770
+ thinking_cap = claude_thinking_cap_for(resolved_tier, dcfg)
771
+ if thinking_cap is not None:
772
+ base["thinking_cap"] = thinking_cap
713
773
  try:
714
774
  budget = float(dcfg.get("claude_max_budget_usd") or 0.0)
715
775
  except (TypeError, ValueError):
716
776
  budget = 0.0
717
777
 
718
778
  ckey = hashlib.md5(
719
- f"claude|{resolved_tier}|{model_arg}|{effort}|{system_prompt}|{prompt}".encode()
779
+ f"claude|{resolved_tier}|{model_arg}|{effort}|{thinking_cap}|{system_prompt}|{prompt}".encode()
720
780
  ).hexdigest()
721
781
  if not scout and ckey in _delegate_cache:
722
782
  cached_resp, _ = _delegate_cache[ckey]
@@ -733,7 +793,7 @@ def _handle_claude_delegate(task: str, task_type: str, context: str,
733
793
  output, ok, stats = _run_claude(prompt, system_prompt, model_arg, timeout=timeout,
734
794
  effort=effort, max_budget_usd=budget,
735
795
  scout_project=str(svc.project_path) if scout else None,
736
- settings=settings)
796
+ settings=settings, thinking_cap=thinking_cap)
737
797
  elapsed = round(time.monotonic() - t0, 1)
738
798
  meta = {**base, "model": stats.pop("model", "") or model_arg or "cli-default",
739
799
  "elapsed": f"{elapsed}s", **stats}
@@ -2096,6 +2156,11 @@ def delegate_telemetry_detail(meta: dict | None, status, *, requested_backend: s
2096
2156
  for key in ("tier", "model", "mode", "effort"):
2097
2157
  if meta.get(key):
2098
2158
  detail[key] = str(meta[key])
2159
+ if meta.get("thinking_cap") is not None and not isinstance(meta.get("thinking_cap"), bool):
2160
+ try:
2161
+ detail["thinking_cap"] = int(meta["thinking_cap"])
2162
+ except (TypeError, ValueError):
2163
+ pass
2099
2164
  if raw_status in _CONFIDENCE:
2100
2165
  detail["confidence"] = raw_status
2101
2166
  if meta.get("cached"):
@@ -2167,20 +2232,25 @@ def handle_delegate(task: str, task_type: str, context: str, file_path: str,
2167
2232
  tier: str = "", model: str = "", scout: bool = False) -> str:
2168
2233
  finalize = _telemetry_finalize(finalize, svc, requested_backend=backend,
2169
2234
  task_type=task_type)
2235
+ route = {"backend": backend}
2170
2236
  try:
2171
2237
  return _route_delegate(task, task_type, context, file_path, svc, finalize, backend,
2172
- allow_write_delegation, tier, model, scout)
2238
+ allow_write_delegation, tier, model, scout, route)
2173
2239
  except access_guard.AccessDenied as exc:
2174
2240
  # A guard refusal while packing file_path is the answer, not a crash:
2175
2241
  # the refusal text goes back as the response (the agent reads the
2176
- # same S1 line c3_read would give) and telemetry counts it as blocked.
2177
- return finalize("c3_delegate", {"task_type": task_type, "backend": backend},
2178
- exc.message, "blocked")
2242
+ # same S1 line c3_read would give) and telemetry counts it as blocked,
2243
+ # under the backend routing had chosen (not 'host' or 'auto').
2244
+ meta = {"task_type": task_type, "backend": route["backend"]}
2245
+ if route.get("tier"):
2246
+ meta["tier"] = route["tier"]
2247
+ return finalize("c3_delegate", meta, exc.message, "blocked")
2179
2248
 
2180
2249
 
2181
2250
  def _route_delegate(task: str, task_type: str, context: str, file_path: str,
2182
2251
  svc, finalize, backend: str, allow_write_delegation: bool,
2183
- tier: str, model: str, scout: bool) -> str:
2252
+ tier: str, model: str, scout: bool, route: dict | None = None) -> str:
2253
+ route = route if route is not None else {}
2184
2254
  if task_type == "ping":
2185
2255
  finalize = _ping_finalize(finalize)
2186
2256
  task, context, file_path, task_type = PING_TASK, "", "", "ask"
@@ -2264,6 +2334,8 @@ def _route_delegate(task: str, task_type: str, context: str, file_path: str,
2264
2334
  provider, mapped = host_backend(svc)
2265
2335
  if mapped:
2266
2336
  host_tier = normalize_tier("", dcfg, "claude_default_tier" if mapped == "claude" else "")
2337
+ if mapped == "claude":
2338
+ host_tier += f", scout {normalize_tier('', dcfg, claude_default_tier_key(True))}"
2267
2339
  lines.append(f" host={provider} -> {mapped} (default tier {host_tier}); "
2268
2340
  "task_type='ping' makes a live call")
2269
2341
  else:
@@ -2337,7 +2409,8 @@ def _route_delegate(task: str, task_type: str, context: str, file_path: str,
2337
2409
  if mapped and not blocked:
2338
2410
  backend = mapped
2339
2411
  if not tier and not model:
2340
- route_tier = normalize_tier("", dcfg, "claude_default_tier" if mapped == "claude" else "")
2412
+ route_tier = normalize_tier(
2413
+ "", dcfg, claude_default_tier_key(scout) if mapped == "claude" else "")
2341
2414
  else:
2342
2415
  why = (f"host {provider} -> {mapped} blocked by Access Guard (write-capable)" if blocked
2343
2416
  else f"host {provider or 'unknown'} has no same-provider backend")
@@ -2394,6 +2467,12 @@ def _route_delegate(task: str, task_type: str, context: str, file_path: str,
2394
2467
  f"or run {backend} directly.",
2395
2468
  "blocked")
2396
2469
 
2470
+ route["backend"] = backend
2471
+ if backend == "claude" and not model:
2472
+ route["tier"] = normalize_tier(route_tier, dcfg, claude_default_tier_key(scout))
2473
+ elif route_tier:
2474
+ route["tier"] = route_tier
2475
+
2397
2476
  # Tier/model reach a handler only when asked for (or set by host routing),
2398
2477
  # so an explicit backend with neither keeps its configured behaviour.
2399
2478
  tier_kw = {k: v for k, v in (("tier", route_tier), ("model", model)) if v}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.136.0
3
+ Version: 2.138.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
@@ -368,6 +368,8 @@ tests/test_delegate_grok.py
368
368
  tests/test_delegate_host_d2.py
369
369
  tests/test_delegate_scout_d3.py
370
370
  tests/test_delegate_telemetry_d0.py
371
+ tests/test_delegate_thinking_cap.py
372
+ tests/test_delegate_tuning.py
371
373
  tests/test_delegate_version_probe.py
372
374
  tests/test_dir_map_c3.py
373
375
  tests/test_e2e_benchmark.py
@@ -297,12 +297,20 @@ DELEGATE_DEFAULTS = {
297
297
  # Claude Code CLI (same-provider tier downshift; locked-down, tool-less `claude -p`)
298
298
  "claude_enabled": True, # Master switch — enable Claude as delegate backend
299
299
  "claude_default_tier": "", # Empty = default_tier
300
+ "claude_scout_default_tier": "medium", # scout=true without tier/model: Sonnet (Haiku scouts flail: 28 turns vs 8)
300
301
  "claude_tier_models": {"small": "haiku", "medium": "sonnet", "large": "opus"}, # CLI aliases, not ids
301
302
  "claude_timeout": 120, # Subprocess timeout in seconds (no idle kill: JSON arrives at the end)
302
303
  "claude_scout_timeout": 240, # scout=true runs look files up first, so they get longer
303
304
  "claude_max_context_tokens": 24000, # Context cap after file packing
304
305
  "claude_file_max_tokens": 8000, # A file_path entry over this is sent as its file map
305
- "claude_effort": "", # --effort low|medium|high|xhigh|max; empty = CLI default
306
+ "claude_effort": "", # --effort for every tier (overrides claude_tier_effort); empty = per tier
307
+ "claude_thinking_tokens": None, # MAX_THINKING_TOKENS for every tier (overrides the table); 0 = off
308
+ "claude_tier_thinking_tokens": {"small": 1024}, # MAX_THINKING_TOKENS per tier; unlisted = no cap.
309
+ # Haiku at 1024: real-file reviews ~55% cheaper, 2.6x faster, no
310
+ # accuracy loss seen. Sonnet 5 ignored nonzero caps, and 0 cost it depth.
311
+ "claude_tier_effort": {}, # --effort per tier, e.g. {"medium": "low"}; unlisted = CLI default
312
+ # (2026-09-14: --effort low changed nothing on Haiku 4.5 — same
313
+ # cost and output tokens over 22 eval cases — so no default)
306
314
  "claude_max_budget_usd": 0, # --max-budget-usd per call; 0 = no cap
307
315
  }
308
316
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-context-control"
7
- version = "2.136.0"
7
+ version = "2.138.0"
8
8
  description = "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."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -154,7 +154,8 @@ def resolve_suite(name_or_path: str) -> Path:
154
154
 
155
155
 
156
156
  def parse_target(spec: str) -> tuple[str, str]:
157
- """``backend``, ``backend:tier`` or either with ``+scout`` -> (backend, tier)."""
157
+ """``backend`` or ``backend:tier``, optionally with ``+scout`` / ``+think=N``
158
+ / ``+effort=X`` flags -> (backend, tier)."""
158
159
  head = str(spec).strip().split("+", 1)[0]
159
160
  backend, _, tier = head.partition(":")
160
161
  if not backend:
@@ -165,10 +166,18 @@ def parse_target(spec: str) -> tuple[str, str]:
165
166
  # ── Checks ──────────────────────────────────────────────────────────────────
166
167
 
167
168
 
169
+ _EMPHASIS_RE = re.compile(r"\*\*|__")
170
+
171
+
168
172
  def grade(case: DelegateCase, answer: str) -> list[str]:
169
- """Failed checks for ``answer`` (empty list = pass)."""
173
+ """Failed checks for ``answer`` (empty list = pass).
174
+
175
+ Bold markers are removed before matching: "does **not** match" is the
176
+ same answer as "does not match" (a correct Haiku answer failed on
177
+ exactly that). Backticks stay — some checks are about code spans.
178
+ """
170
179
  failures: list[str] = []
171
- text = answer or ""
180
+ text = _EMPHASIS_RE.sub("", answer or "")
172
181
  flags = re.IGNORECASE | re.MULTILINE
173
182
  for pattern in case.checks.get("must_match", []):
174
183
  if not re.search(pattern, text, flags):
@@ -280,12 +289,34 @@ def build_eval_svc(project_path: str | Path, delegate_overrides: dict | None = N
280
289
  )
281
290
 
282
291
 
292
+ _TARGET_OVERRIDES = {"think": "claude_thinking_tokens", "effort": "claude_effort"}
293
+
294
+
295
+ def target_overrides(target: str) -> dict:
296
+ """Delegate-config overrides named in a target: ``+think=N`` sets
297
+ ``claude_thinking_tokens``, ``+effort=low`` sets ``claude_effort``. So one
298
+ run can compare ``claude:small``, ``claude:small+think=1024`` and
299
+ ``claude:small+think=0`` side by side."""
300
+ out: dict = {}
301
+ for flag in str(target).split("+")[1:]:
302
+ key, sep, value = flag.partition("=")
303
+ key = key.strip().lower()
304
+ if not sep or key not in _TARGET_OVERRIDES:
305
+ continue
306
+ value = value.strip()
307
+ out[_TARGET_OVERRIDES[key]] = int(value) if key == "think" and value.isdigit() else value
308
+ return out
309
+
310
+
283
311
  def run_live_case(case: DelegateCase, target: str, svc, *,
284
312
  allow_write_delegation: bool = False) -> tuple[CaseResult, dict]:
285
313
  """Send one case through handle_delegate. Returns (result, recording)."""
286
314
  from cli.tools.delegate import handle_delegate
287
315
 
288
316
  backend, tier = parse_target(target)
317
+ overrides = target_overrides(target)
318
+ if overrides:
319
+ svc = types.SimpleNamespace(**{**vars(svc), "delegate_config": {**svc.delegate_config, **overrides}})
289
320
  captured: dict = {}
290
321
 
291
322
  def finalize(tool, meta, output, status, **kw):
@@ -78,6 +78,13 @@ def test_every_reference_answer_passes_and_every_wrong_answer_fails():
78
78
  assert report.aggregates["wrong"]["pass_rate_core"] == 0.0
79
79
 
80
80
 
81
+ def test_grade_ignores_bold_but_not_code_spans():
82
+ case = _case(checks={"any_match": ["does not"], "must_not_match": ["`FOO"]})
83
+ assert de.grade(case, "This does **not** match the docstring.") == []
84
+ assert de.grade(case, "It does __not__ match.") == []
85
+ assert de.grade(case, "does not; see `FOO=1`") != []
86
+
87
+
81
88
  def test_grade_checks():
82
89
  case = _case(checks={"must_match": [r"\b7\b"], "any_match": ["retr", "attempt"],
83
90
  "must_not_match": ["maybe"], "max_words": 5})
@@ -309,8 +309,10 @@ def test_available_names_the_host(monkeypatch):
309
309
  for name in ("codex", "gemini", "claude", "grok"):
310
310
  monkeypatch.setattr(delegate, f"check_{name}", lambda n=name: {"status": "ok", "version": n})
311
311
  store = {}
312
- delegate.handle_delegate("", "available", "", "", _svc(ollama=_FakeOllama(["llama3.2:3b"])), _capture(store))
313
- assert " host=claude-code -> claude (default tier small)" in store["resp"]
312
+ delegate.handle_delegate("", "available", "", "",
313
+ _svc(ollama=_FakeOllama(["llama3.2:3b"]), claude_scout_default_tier="medium"),
314
+ _capture(store))
315
+ assert " host=claude-code -> claude (default tier small, scout medium)" in store["resp"]
314
316
  assert "(--version only)" in store["resp"]
315
317
 
316
318
 
@@ -0,0 +1,134 @@
1
+ """Per-tier thinking cap (MAX_THINKING_TOKENS) for the claude delegate.
2
+
3
+ --effort low had no measurable effect on Haiku 4.5 (2.137.0). A thinking cap
4
+ did: one Haiku review went from 4,831 output tokens / 54 s uncapped to 1,186 /
5
+ 12 s at 1024 and 308 / 6 s at 0. These tests pin the plumbing; the defaults
6
+ come from the eval recorded in the CHANGELOG.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from types import SimpleNamespace
11
+
12
+ import pytest
13
+
14
+ from cli.tools import delegate
15
+ from core.config import DELEGATE_DEFAULTS
16
+ from services.bench import delegate_eval as de
17
+
18
+
19
+ def _svc(tmp, **cfg):
20
+ return SimpleNamespace(project_path=str(tmp), delegate_config={**DELEGATE_DEFAULTS, **cfg},
21
+ notifications=None, compressor=None, ollama_client=None, session_mgr=None,
22
+ _agent_progress_cb=None)
23
+
24
+
25
+ @pytest.fixture(autouse=True)
26
+ def _clean(monkeypatch):
27
+ delegate._backend_breakers.clear()
28
+ delegate._delegate_cache.clear()
29
+ monkeypatch.setattr(delegate.access_guard, "has_active_rules", lambda _p: False)
30
+ yield
31
+ delegate._delegate_cache.clear()
32
+
33
+
34
+ @pytest.fixture
35
+ def runs(monkeypatch):
36
+ calls = []
37
+
38
+ def fake_run(prompt, system_prompt, model="", **kw):
39
+ calls.append({"model": model, **kw})
40
+ return "answer", True, {"model": model}
41
+
42
+ monkeypatch.setattr(delegate, "_run_claude", fake_run)
43
+ return calls
44
+
45
+
46
+ def test_defaults_cap_haiku_only(runs, tmp_path):
47
+ assert DELEGATE_DEFAULTS["claude_thinking_tokens"] is None
48
+ assert DELEGATE_DEFAULTS["claude_tier_thinking_tokens"] == {"small": 1024}
49
+ finalize = lambda tool, meta, resp, status, **kw: resp # noqa: E731
50
+ delegate.handle_delegate("a", "ask", "ctx", "", _svc(tmp_path), finalize, backend="claude")
51
+ delegate.handle_delegate("b", "ask", "ctx", "", _svc(tmp_path), finalize, backend="claude", tier="medium")
52
+ delegate.handle_delegate("c", "ask", "", "", _svc(tmp_path), finalize, backend="claude", scout=True)
53
+ assert [(r["model"], r["thinking_cap"]) for r in runs] == [("haiku", 1024), ("sonnet", None), ("sonnet", None)]
54
+
55
+
56
+ @pytest.mark.parametrize("cfg, tier, expected", [
57
+ ({}, "small", None),
58
+ ({"claude_tier_thinking_tokens": {"small": 1024}}, "small", 1024),
59
+ ({"claude_tier_thinking_tokens": {"small": 1024}}, "medium", None),
60
+ ({"claude_tier_thinking_tokens": {"small": 0}}, "small", 0), # 0 = thinking off, not "unset"
61
+ ({"claude_thinking_tokens": 4096, "claude_tier_thinking_tokens": {"small": 0}}, "small", 4096),
62
+ ({"claude_thinking_tokens": 0}, "large", 0),
63
+ ({"claude_tier_thinking_tokens": {"small": "2048"}}, "small", 2048),
64
+ ({"claude_tier_thinking_tokens": {"small": -5}}, "small", None),
65
+ ({"claude_tier_thinking_tokens": {"small": "lots"}}, "small", None),
66
+ ({"claude_tier_thinking_tokens": {"small": True}}, "small", None),
67
+ ({"claude_tier_thinking_tokens": [1024]}, "small", None),
68
+ ])
69
+ def test_cap_resolution(cfg, tier, expected):
70
+ assert delegate.claude_thinking_cap_for(tier, cfg) == expected
71
+
72
+
73
+ def test_env_sets_the_cap_and_never_inherits_one(monkeypatch):
74
+ monkeypatch.setenv("MAX_THINKING_TOKENS", "99999")
75
+ assert "MAX_THINKING_TOKENS" not in delegate._claude_env()
76
+ assert delegate._claude_env(0)["MAX_THINKING_TOKENS"] == "0"
77
+ assert delegate._claude_env(1024)["MAX_THINKING_TOKENS"] == "1024"
78
+
79
+
80
+ def test_handler_passes_the_cap_and_records_it(runs, tmp_path):
81
+ store = {}
82
+
83
+ def finalize(tool, meta, resp, status, **kw):
84
+ store.update(meta=meta)
85
+ return resp
86
+
87
+ cfg = {"claude_tier_thinking_tokens": {"small": 512}}
88
+ delegate.handle_delegate("q", "ask", "ctx", "", _svc(tmp_path, **cfg), finalize, backend="claude")
89
+ assert runs[-1]["thinking_cap"] == 512 and store["meta"]["thinking_cap"] == 512
90
+ delegate.handle_delegate("q2", "ask", "ctx", "", _svc(tmp_path, **cfg), finalize, backend="claude",
91
+ tier="large")
92
+ assert runs[-1]["thinking_cap"] is None and "thinking_cap" not in store["meta"]
93
+
94
+
95
+ def test_cap_changes_the_cache_key(runs, tmp_path):
96
+ finalize = lambda tool, meta, resp, status, **kw: resp # noqa: E731
97
+ delegate.handle_delegate("same", "ask", "ctx", "", _svc(tmp_path, claude_thinking_tokens=0), finalize,
98
+ backend="claude")
99
+ delegate.handle_delegate("same", "ask", "ctx", "", _svc(tmp_path, claude_thinking_tokens=1024), finalize,
100
+ backend="claude")
101
+ assert len(runs) == 2
102
+
103
+
104
+ def test_telemetry_detail_keeps_a_zero_cap():
105
+ d = delegate.delegate_telemetry_detail({"backend": "claude", "tier": "small", "thinking_cap": 0}, "ok",
106
+ requested_backend="host", task_type="ask", host="", wall_ms=1)
107
+ assert d["thinking_cap"] == 0
108
+
109
+
110
+ def test_eval_target_flags():
111
+ assert de.target_overrides("claude:small") == {}
112
+ assert de.target_overrides("claude:small+think=1024") == {"claude_thinking_tokens": 1024}
113
+ assert de.target_overrides("claude:medium+scout+think=0+effort=low") == {
114
+ "claude_thinking_tokens": 0, "claude_effort": "low"}
115
+ assert de.target_overrides("claude:small+colour=red") == {}
116
+ assert de.parse_target("claude:small+think=0") == ("claude", "small")
117
+
118
+
119
+ def test_eval_live_case_applies_target_overrides_to_a_copy(monkeypatch):
120
+ seen = []
121
+
122
+ def fake_handle(task, task_type, context, file_path, svc, finalize, backend, **kw):
123
+ seen.append(dict(svc.delegate_config))
124
+ return finalize("c3_delegate", {"backend": backend}, "x", "ok")
125
+
126
+ monkeypatch.setattr("cli.tools.delegate.handle_delegate", fake_handle)
127
+ svc = SimpleNamespace(project_path=".", delegate_config={"claude_thinking_tokens": None})
128
+ case = de.DelegateCase.from_dict({"id": "c", "task_type": "ask", "task": "t",
129
+ "checks": {"must_match": ["x"]}})
130
+ de.run_live_case(case, "claude:small+think=0", svc)
131
+ de.run_live_case(case, "claude:small", svc)
132
+ assert seen[0]["claude_thinking_tokens"] == 0
133
+ assert seen[1]["claude_thinking_tokens"] is None
134
+ assert svc.delegate_config == {"claude_thinking_tokens": None} # the shared svc is untouched