code-context-control 2.152.0__tar.gz → 2.153.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_context_control-2.152.0 → code_context_control-2.153.0}/PKG-INFO +1 -1
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/c3.py +1 -1
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/tools.html +8 -2
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/workflow.html +1 -1
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/mcp_server.py +17 -10
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/_edit_report.py +31 -4
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/edit.py +358 -108
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/edit_verify.py +5 -6
- {code_context_control-2.152.0 → code_context_control-2.153.0}/code_context_control.egg-info/PKG-INFO +1 -1
- {code_context_control-2.152.0 → code_context_control-2.153.0}/code_context_control.egg-info/SOURCES.txt +1 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/pyproject.toml +1 -1
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/agent_locks.py +30 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/edit_blobs.py +16 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/read_stamps.py +27 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_agent_locks.py +38 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_eol_atomic.py +15 -2
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_normalization.py +68 -75
- code_context_control-2.153.0/tests/test_edit_outcome.py +79 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_report.py +21 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_revert.py +28 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_stale.py +48 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_read_edit_parity.py +1 -1
- {code_context_control-2.152.0 → code_context_control-2.153.0}/LICENSE +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/README.md +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/_shell_writes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/commands/common.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/commands/parser.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/docs.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/edits.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/access.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/ci.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/credentials.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/delegate.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/index.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/jira.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/masking.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/sessions.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_agent_model.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_codex_lifecycle.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_read.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_session_end.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_session_open.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_server.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_sessions.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/progress.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/server.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/_grants.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/ci.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/jira.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/locks.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/override.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/project.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/read.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/search.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/session.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/shell.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/shell_job.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/shell_nudge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/shell_parsers.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/shell_render.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/status.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/api.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/app.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/access.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/codex_patch.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/config.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/grok_payload.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/hook_command.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/host.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/ide.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/core/web_security.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/config.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/listeners.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/client_tokens.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/access_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/access_telemetry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/activity_log.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/agent_base.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/agent_downshift.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/agents.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/agents_workflow.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/artifact_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/atomic_json.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/auto_memory.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/background_service.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/delegate_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/delegate_write_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/map_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/search_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/builtin_leases.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_act.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_cache.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_expr.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_failures.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_github.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_impact.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_intel.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_runner.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ci_workflow.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/claude_md.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/codex_integration.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/codex_transcript.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/compressor.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/conversation_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/cred_audit.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/cred_telemetry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/credential_backup.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/credential_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/delegate_agents.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/delegate_hints.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/delegate_write.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/dir_map.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/doc_index.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/embedding_index.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/enforcement_policy.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/error_reporting.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/file_map.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/file_memory.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/git_context.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/grok_integration.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/grok_transcript.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/host_sessions.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/hub_service.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/index_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/indexer.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/jira_client.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/jira_cloud.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/jira_credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/jira_data_center.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/jira_links.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/lexical_index.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/mask_activation.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/mask_mirror.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/mask_presets.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory_graph.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory_queue.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/metrics.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/notifications.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ollama_client.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/oracle_service.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/output_filter.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/override_costs.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/override_grants.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/override_policy.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/override_requests.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/override_wake.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/parser.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/project_manager.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/project_runtime.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/protocol.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/proxy_state.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/repo_map.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/repo_shape.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/reranker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/retention.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/retrieval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/router.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/runtime.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/scanner.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/session_catalog.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/session_live.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/session_manager.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/session_preloader.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/shell_jobs.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/shell_output.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/subprojects.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/task_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/telemetry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/terminal_launch.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/text_index.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/time_tracker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/transcript_index.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/validation_cache.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/vector_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/watcher.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/setup.cfg +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_access_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_activity_log_find_last.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_atomic_json.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_background_service.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_builtin_leases.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_act.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_dag_ownership.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_codex_mcp_transport.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_codex_native.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_credential_backup.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_credential_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_adoption_d4.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_auto.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_claude_d1.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_grok.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_host_d2.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_scout_d3.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_telemetry_d0.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_thinking_cap.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_tuning.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_write.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_delegate_write_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_dir_map_c3.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_embedding_index_corrupt_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_env_parser.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_file_map_c1.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_grok_native.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_grok_compat.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_session_end.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_access_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_builtin_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_hook_migration.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_ide_cmd.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_override_policy_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_rules_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_sessions_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_client.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_links.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_large_files_c4.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_map_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_map_telemetry_c0.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_clients.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_jobs_ci.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_override_costs.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_notification_kinds.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_loopback.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_override_costs.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_override_grants.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_override_requests.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_override_wake.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_read_outside_root.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_repo_map.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_retention.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_p1.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_p2.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_p3.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_p4.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_search_p5.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_session_catalog.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_session_live.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_session_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_budget_s1.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_eval.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_jobs_s3.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_nudge_s4.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_output.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_parsers_s2.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_telemetry_s0.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_validate.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_version_sync.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_watcher_pruning.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/backend.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/main.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.152.0 → code_context_control-2.153.0}/tui/theme.tcss +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.153.0
|
|
4
4
|
Summary: Local MCP code-intelligence for AI coding tools: surgical search/read/edit, agent-config version history, path-level access + masking guards, and a multi-project hub.
|
|
5
5
|
Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -91,7 +91,7 @@ console = Console() if HAS_RICH else None
|
|
|
91
91
|
# Config
|
|
92
92
|
CONFIG_DIR = ".c3"
|
|
93
93
|
CONFIG_FILE = ".c3/config.json"
|
|
94
|
-
__version__ = "2.
|
|
94
|
+
__version__ = "2.153.0"
|
|
95
95
|
|
|
96
96
|
# The PreToolUse matcher for native subagent calls (installer and hub migration).
|
|
97
97
|
AGENT_MATCHER = "Agent|Task"
|
|
@@ -481,7 +481,13 @@ c3_filter(text=<span class="str">"<webpack build output>"</span>, pattern=
|
|
|
481
481
|
<td class="param-name">edits</td>
|
|
482
482
|
<td class="param-type">array</td>
|
|
483
483
|
<td class="param-default">null</td>
|
|
484
|
-
<td class="param-desc">List of <code>{old_string, new_string}</code> objects for batch edits to the same file</td>
|
|
484
|
+
<td class="param-desc">List of <code>{old_string, new_string}</code> objects for batch edits to the same file. Applied in order, all or none: if one patch cannot be placed, nothing is written</td>
|
|
485
|
+
</tr>
|
|
486
|
+
<tr>
|
|
487
|
+
<td class="param-name">overwrite</td>
|
|
488
|
+
<td class="param-type">bool</td>
|
|
489
|
+
<td class="param-default">false</td>
|
|
490
|
+
<td class="param-desc">Replace all of an existing file with <code>new_string</code>. Refused unless this session has read the file with c3_read and the file has not changed since. Keeps the file's line endings and BOM, stores a pre-image, and can be reverted</td>
|
|
485
491
|
</tr>
|
|
486
492
|
</tbody>
|
|
487
493
|
</table>
|
|
@@ -514,7 +520,7 @@ c3_filter(text=<span class="str">"<webpack build output>"</span>, pattern=
|
|
|
514
520
|
<div class="callout callout-info">
|
|
515
521
|
<span class="callout-icon">💡</span>
|
|
516
522
|
<div class="callout-body">
|
|
517
|
-
<strong>Unicode lookalikes are
|
|
523
|
+
<strong>Unicode lookalikes are reported, not applied.</strong> If <code>old_string</code> uses straight quotes but the file has curly quotes (or vice versa), or the two differ only by ASCII vs. unicode dashes (<code>-</code>/<code>–</code>/<code>—</code>) or non-breaking spaces, c3_edit writes nothing and answers <code>[c3_edit:lookalike]</code> with the file's exact text for that region, so the retry can copy it. Applying such a match would replace the file's characters with the retyped ones.
|
|
518
524
|
</div>
|
|
519
525
|
</div>
|
|
520
526
|
</div>
|
|
@@ -623,7 +623,7 @@ c3_impact(target=<span class="str">'MemoryStore'</span>, mode=<span class="str">
|
|
|
623
623
|
</div>
|
|
624
624
|
<div class="workflow-step-body">
|
|
625
625
|
|
|
626
|
-
<p><code>c3_edit</code> does read + patch + write + edit ledger log in one step. It also validates the old_string match before writing. If the literal match fails but the strings differ only by unicode lookalikes (curly quotes, em/en-dashes, NBSP), c3_edit
|
|
626
|
+
<p><code>c3_edit</code> does read + patch + write + edit ledger log in one step. It also validates the old_string match before writing. If the literal match fails but the strings differ only by unicode lookalikes (curly quotes, em/en-dashes, NBSP), c3_edit writes nothing and returns the file's exact text under <code>[c3_edit:lookalike]</code>.</p>
|
|
627
627
|
|
|
628
628
|
<pre><code>c3_edit(
|
|
629
629
|
file_path=<span class="str">'services/auth.py'</span>,
|
|
@@ -543,7 +543,9 @@ def _with_hint(resp, make_hint) -> str:
|
|
|
543
543
|
|
|
544
544
|
def _finalize_response(ctx: Context, tool_name: str, args: dict,
|
|
545
545
|
response: str, summary: str = "",
|
|
546
|
-
response_tokens: int = 0
|
|
546
|
+
response_tokens: int = 0,
|
|
547
|
+
ok: bool | None = None) -> str:
|
|
548
|
+
"""ok: the tool's own verdict on the call; None reads it off the response text."""
|
|
547
549
|
global _last_tool_call_time, _last_badge_count
|
|
548
550
|
|
|
549
551
|
deferred_snapshot = False
|
|
@@ -586,11 +588,14 @@ def _finalize_response(ctx: Context, tool_name: str, args: dict,
|
|
|
586
588
|
svc.session_mgr.log_tool_call(tool_name, args, summary)
|
|
587
589
|
# ok=False lets hook_pretool_enforce's activity scan skip a failed call
|
|
588
590
|
# (ISSUE-3: "Error: File not found" used to count as "c3 was used").
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
591
|
+
if ok is not None:
|
|
592
|
+
call_ok = ok
|
|
593
|
+
else:
|
|
594
|
+
try:
|
|
595
|
+
from cli._hook_utils import response_text_failed as _failed
|
|
596
|
+
call_ok = not _failed(response)
|
|
597
|
+
except Exception:
|
|
598
|
+
call_ok = True
|
|
594
599
|
# Both session ids on every tool_call row (D0b): C3's own id joins the
|
|
595
600
|
# row to session_start / the saved session file, the host id joins it to
|
|
596
601
|
# the hooks' session_open / session_end rows. Either may be absent.
|
|
@@ -903,12 +908,13 @@ async def c3_agent(workflow: str, scope: str = "", context: str = "",
|
|
|
903
908
|
@mcp.tool()
|
|
904
909
|
async def c3_edit(file_path: str, old_string: str = "", new_string: str = "",
|
|
905
910
|
summary: str = "", tags: str = "", replace_all: bool = False,
|
|
906
|
-
edits: str | list[dict] = "",
|
|
911
|
+
edits: str | list[dict] = "", overwrite: bool = False,
|
|
907
912
|
ctx: Context = None) -> str:
|
|
908
913
|
"""EDIT — read+patch+write+log in one step. Primary code-change tool; always prefer over native Edit.
|
|
909
914
|
old_string: text to replace. new_string: replacement. summary: ledger description.
|
|
910
|
-
edits: list (or JSON string) of {old_string, new_string, summary?} for multi-hunk batch on one file
|
|
911
|
-
Parallel across files. Create new file: non-existent file_path + old_string='' + new_string=<content>.
|
|
915
|
+
edits: list (or JSON string) of {old_string, new_string, summary?} for multi-hunk batch on one file,
|
|
916
|
+
applied all or none. Parallel across files. Create new file: non-existent file_path + old_string='' + new_string=<content>.
|
|
917
|
+
Rewrite a whole existing file: overwrite=true + new_string=<content>, after a c3_read of it.
|
|
912
918
|
If this call ERRORS OR TIMES OUT, do not retry blind — a failed c3_edit may still have
|
|
913
919
|
written the file. Re-send the same args to c3_edits(action='verify') for a verdict."""
|
|
914
920
|
path_err = validate_file_path(file_path)
|
|
@@ -920,7 +926,8 @@ async def c3_edit(file_path: str, old_string: str = "", new_string: str = "",
|
|
|
920
926
|
return _finalize_response(ctx, name, args, resp, summ, **kw)
|
|
921
927
|
|
|
922
928
|
resp = await asyncio.to_thread(handle_edit, file_path, old_string, new_string,
|
|
923
|
-
summary, tags, replace_all, svc, finalize, edits
|
|
929
|
+
summary, tags, replace_all, svc, finalize, edits,
|
|
930
|
+
overwrite)
|
|
924
931
|
return _with_hint(resp, lambda: delegate_hints.after_edit(
|
|
925
932
|
svc, file_path, delegate_hints.edit_chars(new_string, edits)))
|
|
926
933
|
|
|
@@ -4,8 +4,9 @@ Two concerns, both read-only:
|
|
|
4
4
|
- ``locate``: a RELATIVE file_path resolves against the project root, which is
|
|
5
5
|
the main checkout. When the repo has other git worktrees, the caller may have
|
|
6
6
|
meant one of them, so the response names the resolved path and any worktree
|
|
7
|
-
holding the same relative path
|
|
8
|
-
in a worktree
|
|
7
|
+
holding the same relative path. It refuses outright when the path exists only
|
|
8
|
+
in a worktree, or when this process last wrote to a worktree that the path
|
|
9
|
+
could equally mean.
|
|
9
10
|
- ``diff_block``: a compact unified diff of the whole file, before → after.
|
|
10
11
|
"""
|
|
11
12
|
import difflib
|
|
@@ -19,6 +20,7 @@ from pathlib import Path
|
|
|
19
20
|
_WORKTREE_TTL_S = 60.0
|
|
20
21
|
_GIT_TIMEOUT_S = 3.0
|
|
21
22
|
_worktree_cache: dict[str, tuple[float, list[Path]]] = {}
|
|
23
|
+
_last_tree: dict[str, Path] = {}
|
|
22
24
|
_cache_lock = threading.Lock()
|
|
23
25
|
|
|
24
26
|
DIFF_MAX_LINES = 24
|
|
@@ -98,13 +100,26 @@ def _other_trees(project_root: Path, roots: list[Path]) -> list[tuple[Path, Path
|
|
|
98
100
|
return [(root, root / prefix) for root in roots if root != own]
|
|
99
101
|
|
|
100
102
|
|
|
103
|
+
def note_write(path: Path, project_path: str) -> None:
|
|
104
|
+
"""Record the worktree a write landed in, for ``locate`` to compare the
|
|
105
|
+
next relative path against."""
|
|
106
|
+
holding = [r for r in worktree_roots(project_path)
|
|
107
|
+
if r == path or r in path.parents]
|
|
108
|
+
if holding:
|
|
109
|
+
with _cache_lock:
|
|
110
|
+
_last_tree[str(Path(project_path).resolve())] = max(
|
|
111
|
+
holding, key=lambda r: len(r.parts))
|
|
112
|
+
|
|
113
|
+
|
|
101
114
|
def locate(file_path: str, path: Path, project_path: str) -> tuple[str, str]:
|
|
102
115
|
"""Check a resolved edit target against the repo's other worktrees.
|
|
103
116
|
|
|
104
117
|
Returns ``(refusal, note)``, at most one non-empty. ``refusal`` is set when a
|
|
105
118
|
relative ``file_path`` does not exist in this checkout but does in another
|
|
106
|
-
worktree
|
|
107
|
-
|
|
119
|
+
worktree, or when the last write went to another worktree where the path
|
|
120
|
+
exists or would be created. ``note`` is extra response text for a relative
|
|
121
|
+
path in a repo with other worktrees. Absolute paths always return
|
|
122
|
+
``("", "")``.
|
|
108
123
|
"""
|
|
109
124
|
if Path(file_path).is_absolute():
|
|
110
125
|
return "", ""
|
|
@@ -117,6 +132,18 @@ def locate(file_path: str, path: Path, project_path: str) -> tuple[str, str]:
|
|
|
117
132
|
except ValueError:
|
|
118
133
|
return "", ""
|
|
119
134
|
hits = [proj / rel for _, proj in others if (proj / rel).exists()]
|
|
135
|
+
with _cache_lock:
|
|
136
|
+
last = _last_tree.get(str(project_root))
|
|
137
|
+
recent = next((proj / rel for root, proj in others if root == last), None)
|
|
138
|
+
if recent is not None and (recent.exists() or not path.exists()):
|
|
139
|
+
there = ("where the same path is" if recent.exists()
|
|
140
|
+
else "where this path would be")
|
|
141
|
+
return (f"[c3_edit:wrong-tree] {file_path} is relative, so it means "
|
|
142
|
+
f"{path} in this checkout, but this session's last edit went "
|
|
143
|
+
f"to another git worktree, {there}:\n"
|
|
144
|
+
f" {recent}\n"
|
|
145
|
+
f" Nothing was written. Pass the absolute path of the one "
|
|
146
|
+
f"you mean."), ""
|
|
120
147
|
if not path.exists() and hits:
|
|
121
148
|
listed = "\n".join(f" {h}" for h in hits)
|
|
122
149
|
return (f"[c3_edit:wrong-tree] {file_path} does not exist in this checkout "
|