code-context-control 2.145.1__tar.gz → 2.145.2__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.145.1 → code_context_control-2.145.2}/PKG-INFO +1 -1
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/c3.py +1 -1
- {code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/PKG-INFO +1 -1
- {code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/SOURCES.txt +1 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/pyproject.toml +1 -1
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/embedding_index.py +76 -13
- code_context_control-2.145.2/tests/test_embedding_index_corrupt_store.py +187 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/LICENSE +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/README.md +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/_hook_utils.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/_shell_writes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/commands/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/commands/common.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/commands/parser.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/docs.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/edits.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/access.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/ci.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/credentials.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/delegate.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/index.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/jira.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/masking.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/oracle.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/sessions.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/shared.css +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/tools.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/workflow.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_agent_model.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_artifact.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_c3read.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_codex_lifecycle.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_filter.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_read.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_session_end.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_session_open.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_server.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_sessions.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/mcp_server.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/progress.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/server.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/_grants.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/agent.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/ci.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/compress.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/delegate.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/edit.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/edit_verify.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/edits.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/federate.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/filter.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/impact.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/jira.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/locks.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/memory.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/override.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/project.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/read.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/search.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/session.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/shell.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/shell_job.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/shell_nudge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/shell_parsers.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/shell_render.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/status.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/tasks.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/tools/validate.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/api.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/app.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/access.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/icons.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/shared.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui/theme.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui_legacy.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/cli/ui_nano.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/codex_patch.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/config.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/grok_payload.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/hook_command.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/host.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/ide.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/mcp_toml.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/core/web_security.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/config.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/listeners.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/oracle_server.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/client_tokens.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/local_session.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/activity.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/agents.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/app.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/busy.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/core.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/header.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/insights.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/projects.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/settings.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/access_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/access_telemetry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/activity_log.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/agent_base.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/agent_downshift.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/agent_locks.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/agents.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/agents_workflow.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/artifact_defs.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/artifact_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/atomic_json.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/auto_memory.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/background_service.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/delegate_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/delegate_write_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/map_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/search_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bitbucket_client.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_act.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_cache.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_expr.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_failures.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_github.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_impact.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_intel.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_runner.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ci_workflow.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/circuit_breaker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/claude_md.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/codex_integration.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/codex_transcript.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/compressor.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/context_snapshot.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/conversation_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/cred_audit.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/cred_telemetry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/credential_backup.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/credential_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/delegate_agents.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/delegate_hints.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/delegate_write.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/dir_map.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/doc_index.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/e2e_tasks.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/edit_ledger.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/enforcement_policy.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/error_reporting.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/file_map.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/file_memory.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/git_context.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/grok_integration.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/grok_transcript.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/host_sessions.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/hub_service.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/index_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/indexer.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/jira_client.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/jira_cloud.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/jira_credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/jira_data_center.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/jira_links.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/lexical_index.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/mask_activation.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/mask_mirror.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/mask_presets.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory_consolidator.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory_distiller.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory_graph.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory_grounder.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory_queue.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/memory_scorer.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/metrics.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/notifications.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ollama_bridge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ollama_client.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/ollama_credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/oracle_service.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/output_filter.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/override_costs.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/override_grants.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/override_policy.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/override_requests.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/override_wake.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/parser.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/project_manager.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/project_runtime.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/protocol.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/proxy_state.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/repo_map.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/repo_shape.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/reranker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/retention.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/retrieval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/retrieval_broker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/router.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/runtime.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/scanner.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/session_benchmark.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/session_catalog.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/session_live.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/session_manager.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/session_preloader.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/shell_jobs.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/shell_output.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/subprojects.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/task_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/telemetry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/terminal_launch.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/text_index.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/time_tracker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/tool_classifier.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/transcript_index.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/validation_cache.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/vector_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/watcher.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/services/win_subprocess.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/setup.cfg +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_access_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_activity_log_find_last.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_atomic_json.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_background_service.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_act.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_dag_ownership.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_codex_mcp_transport.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_codex_native.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_credential_backup.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_credential_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_adoption_d4.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_auto.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_claude_d1.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_grok.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_host_d2.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_scout_d3.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_telemetry_d0.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_thinking_cap.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_tuning.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_write.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_delegate_write_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_dir_map_c3.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_env_parser.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_file_map_c1.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_grok_native.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_grok_compat.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_session_end.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_state.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_access_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_hook_migration.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_override_policy_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_rules_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_sessions_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_init_scan.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_client.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_links.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_large_files_c4.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_map_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_map_telemetry_c0.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_memory_system.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_clients.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_jobs_ci.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_override_costs.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_notification_kinds.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_loopback.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_output_filter.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_override_costs.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_override_grants.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_override_requests.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_override_wake.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_permissions.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_pm_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_project_manager.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_project_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_read_outside_root.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_related_facts.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_repo_map.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_retention.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_review_digest.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_p1.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_p2.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_p3.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_p4.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_search_p5.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_service_durability.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_session_budget.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_session_catalog.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_session_live.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_session_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_budget_s1.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_eval.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_jobs_s3.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_nudge_s4.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_output.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_parsers_s2.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_telemetry_s0.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_subprojects.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_task_store.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_task_tool.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_validate.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_version_sync.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_watcher_pruning.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_web_security.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/backend.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/main.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/__init__.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/index_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/init_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/search_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/session_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/stats.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.145.1 → code_context_control-2.145.2}/tui/theme.tcss +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.145.
|
|
3
|
+
Version: 2.145.2
|
|
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.145.
|
|
94
|
+
__version__ = "2.145.2"
|
|
95
95
|
|
|
96
96
|
# The PreToolUse matcher for native subagent calls (installer and hub migration).
|
|
97
97
|
AGENT_MATCHER = "Agent|Task"
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/code_context_control.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.145.
|
|
3
|
+
Version: 2.145.2
|
|
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
|
|
@@ -395,6 +395,7 @@ tests/test_edit_ledger_hook.py
|
|
|
395
395
|
tests/test_edit_locking.py
|
|
396
396
|
tests/test_edit_normalization.py
|
|
397
397
|
tests/test_edit_verify.py
|
|
398
|
+
tests/test_embedding_index_corrupt_store.py
|
|
398
399
|
tests/test_embedding_index_deadlock.py
|
|
399
400
|
tests/test_enforcement_flip.py
|
|
400
401
|
tests/test_enforcement_policy.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-context-control"
|
|
7
|
-
version = "2.145.
|
|
7
|
+
version = "2.145.2"
|
|
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"
|
|
@@ -6,10 +6,13 @@ embeddings. Tracks file content hashes to only re-embed changed files.
|
|
|
6
6
|
Falls back gracefully when Ollama or chromadb are unavailable.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
import gc
|
|
9
10
|
import hashlib
|
|
10
11
|
import json
|
|
11
12
|
import logging
|
|
13
|
+
import shutil
|
|
12
14
|
import threading
|
|
15
|
+
from datetime import datetime
|
|
13
16
|
from pathlib import Path
|
|
14
17
|
|
|
15
18
|
log = logging.getLogger("c3.embedding_index")
|
|
@@ -106,19 +109,7 @@ class EmbeddingIndex:
|
|
|
106
109
|
def _init_backends(self):
|
|
107
110
|
"""Initialize chromadb collection and check Ollama."""
|
|
108
111
|
try:
|
|
109
|
-
|
|
110
|
-
from chromadb.config import Settings
|
|
111
|
-
|
|
112
|
-
persist_dir = str(self._index_dir / "chromadb")
|
|
113
|
-
Path(persist_dir).mkdir(parents=True, exist_ok=True)
|
|
114
|
-
self._chroma_client = chromadb.PersistentClient(
|
|
115
|
-
path=persist_dir,
|
|
116
|
-
settings=Settings(anonymized_telemetry=False),
|
|
117
|
-
)
|
|
118
|
-
self._collection = self._chroma_client.get_or_create_collection(
|
|
119
|
-
name=COLLECTION_NAME,
|
|
120
|
-
metadata={"hnsw:space": "cosine"},
|
|
121
|
-
)
|
|
112
|
+
self._open_chroma()
|
|
122
113
|
self._available = True
|
|
123
114
|
self._drop_legacy_collection()
|
|
124
115
|
except Exception as e:
|
|
@@ -135,6 +126,78 @@ class EmbeddingIndex:
|
|
|
135
126
|
self._model_ok = False
|
|
136
127
|
self._ollama_ok = self._ollama_up and self._model_ok
|
|
137
128
|
|
|
129
|
+
def _open_chroma(self, _retried: bool = False) -> None:
|
|
130
|
+
"""Open the persistent collection, quarantining a corrupt store once.
|
|
131
|
+
|
|
132
|
+
A damaged HNSW segment does not surface at open time: the Rust backend
|
|
133
|
+
accepts the client and the collection handle, then faults on the first
|
|
134
|
+
real read. When that read happens on the background index thread it has
|
|
135
|
+
taken the whole MCP process down with an access violation, which the
|
|
136
|
+
host reports only as a dead server (seen 2026-07-17, 2026-09-06).
|
|
137
|
+
|
|
138
|
+
So probe here, on the init path, where the failure is still a catchable
|
|
139
|
+
Python exception, and treat a failed probe as a corrupt store: close the
|
|
140
|
+
client, move the directory aside, and reopen empty. The store is a
|
|
141
|
+
rebuildable cache, so the cost is one re-embed, not lost data.
|
|
142
|
+
"""
|
|
143
|
+
import chromadb
|
|
144
|
+
from chromadb.config import Settings
|
|
145
|
+
|
|
146
|
+
persist_dir = self._index_dir / "chromadb"
|
|
147
|
+
persist_dir.mkdir(parents=True, exist_ok=True)
|
|
148
|
+
self._chroma_client = chromadb.PersistentClient(
|
|
149
|
+
path=str(persist_dir),
|
|
150
|
+
settings=Settings(anonymized_telemetry=False),
|
|
151
|
+
)
|
|
152
|
+
self._collection = self._chroma_client.get_or_create_collection(
|
|
153
|
+
name=COLLECTION_NAME,
|
|
154
|
+
metadata={"hnsw:space": "cosine"},
|
|
155
|
+
)
|
|
156
|
+
try:
|
|
157
|
+
self._collection.count()
|
|
158
|
+
except Exception as e:
|
|
159
|
+
if _retried:
|
|
160
|
+
raise
|
|
161
|
+
log.warning(
|
|
162
|
+
"embedding store failed its health probe (%s); "
|
|
163
|
+
"quarantining and rebuilding",
|
|
164
|
+
e,
|
|
165
|
+
)
|
|
166
|
+
self._quarantine_store(persist_dir)
|
|
167
|
+
self._open_chroma(_retried=True)
|
|
168
|
+
|
|
169
|
+
def _close_chroma(self) -> None:
|
|
170
|
+
"""Drop the client so Windows releases its handle on chroma.sqlite3."""
|
|
171
|
+
client = self._chroma_client
|
|
172
|
+
self._collection = None
|
|
173
|
+
self._chroma_client = None
|
|
174
|
+
try:
|
|
175
|
+
close = getattr(client, "close", None)
|
|
176
|
+
if callable(close):
|
|
177
|
+
close()
|
|
178
|
+
except Exception:
|
|
179
|
+
pass
|
|
180
|
+
gc.collect()
|
|
181
|
+
|
|
182
|
+
def _quarantine_store(self, persist_dir: Path) -> None:
|
|
183
|
+
"""Move a corrupt store and its hash file aside for post-mortem.
|
|
184
|
+
|
|
185
|
+
The hashes go with it: they claim vectors that the fresh store does not
|
|
186
|
+
have, so leaving them behind would suppress the very rebuild this is
|
|
187
|
+
meant to trigger.
|
|
188
|
+
"""
|
|
189
|
+
self._close_chroma()
|
|
190
|
+
dest = self._index_dir / f"quarantine_corrupt_{datetime.now():%Y%m%d_%H%M%S}"
|
|
191
|
+
dest.mkdir(parents=True, exist_ok=True)
|
|
192
|
+
shutil.move(str(persist_dir), str(dest / persist_dir.name))
|
|
193
|
+
try:
|
|
194
|
+
if self._hash_file.exists():
|
|
195
|
+
shutil.move(str(self._hash_file), str(dest / self._hash_file.name))
|
|
196
|
+
except OSError:
|
|
197
|
+
self._hash_file.unlink(missing_ok=True)
|
|
198
|
+
self._file_hashes = {}
|
|
199
|
+
log.warning("quarantined corrupt embedding store to %s", dest)
|
|
200
|
+
|
|
138
201
|
def _drop_legacy_collection(self) -> None:
|
|
139
202
|
"""Best-effort removal of the pre-2.108.0 collection and hash file.
|
|
140
203
|
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""Regression tests for corrupt-store recovery in services/embedding_index.py.
|
|
2
|
+
|
|
3
|
+
A damaged HNSW segment does not announce itself at open time. chromadb hands
|
|
4
|
+
back a client and a collection handle, then faults on the first real read --
|
|
5
|
+
and when that read lands on the background index thread, the fault is a native
|
|
6
|
+
access violation that kills the whole MCP process. The host sees only a server
|
|
7
|
+
that connected, listed tools and died (observed 2026-07-17 and 2026-09-06).
|
|
8
|
+
|
|
9
|
+
The fix probes the store on the init path, where the failure is still a
|
|
10
|
+
catchable Python exception, and treats a failed probe as corruption: close the
|
|
11
|
+
client, move the store aside, reopen empty. These tests pin that contract.
|
|
12
|
+
"""
|
|
13
|
+
import json
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
|
|
17
|
+
from services import embedding_index as ei_mod
|
|
18
|
+
from services.embedding_index import COLLECTION_NAME, EmbeddingIndex
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class _FakeCollection:
|
|
22
|
+
"""A collection whose health probe can be made to fail."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, count_error=None):
|
|
25
|
+
self._count_error = count_error
|
|
26
|
+
self.count_calls = 0
|
|
27
|
+
|
|
28
|
+
def count(self):
|
|
29
|
+
self.count_calls += 1
|
|
30
|
+
if self._count_error is not None:
|
|
31
|
+
raise self._count_error
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class _FakeClient:
|
|
35
|
+
def __init__(self, path, collection, on_close=None):
|
|
36
|
+
self.path = path
|
|
37
|
+
self._collection = collection
|
|
38
|
+
self._on_close = on_close
|
|
39
|
+
self.closed = False
|
|
40
|
+
|
|
41
|
+
def get_or_create_collection(self, name=None, metadata=None, **kwargs):
|
|
42
|
+
assert name == COLLECTION_NAME
|
|
43
|
+
return self._collection
|
|
44
|
+
|
|
45
|
+
def close(self):
|
|
46
|
+
self.closed = True
|
|
47
|
+
if self._on_close is not None:
|
|
48
|
+
self._on_close()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _install_fake_chromadb(monkeypatch, collections):
|
|
52
|
+
"""Patch chromadb.PersistentClient to hand out *collections* in order."""
|
|
53
|
+
made = []
|
|
54
|
+
remaining = list(collections)
|
|
55
|
+
|
|
56
|
+
class _FakeChromadb:
|
|
57
|
+
@staticmethod
|
|
58
|
+
def PersistentClient(path=None, settings=None):
|
|
59
|
+
client = _FakeClient(path, remaining.pop(0))
|
|
60
|
+
made.append(client)
|
|
61
|
+
return client
|
|
62
|
+
|
|
63
|
+
class _FakeConfig:
|
|
64
|
+
@staticmethod
|
|
65
|
+
def Settings(**kwargs):
|
|
66
|
+
return object()
|
|
67
|
+
|
|
68
|
+
import sys
|
|
69
|
+
import types
|
|
70
|
+
|
|
71
|
+
mod = types.ModuleType("chromadb")
|
|
72
|
+
mod.PersistentClient = _FakeChromadb.PersistentClient
|
|
73
|
+
cfg = types.ModuleType("chromadb.config")
|
|
74
|
+
cfg.Settings = _FakeConfig.Settings
|
|
75
|
+
mod.config = cfg
|
|
76
|
+
monkeypatch.setitem(sys.modules, "chromadb", mod)
|
|
77
|
+
monkeypatch.setitem(sys.modules, "chromadb.config", cfg)
|
|
78
|
+
return made
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _make_index(tmp_path) -> EmbeddingIndex:
|
|
82
|
+
return EmbeddingIndex(str(tmp_path), ollama_client=None)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_healthy_store_is_not_quarantined(tmp_path, monkeypatch):
|
|
86
|
+
"""A store that answers count() is left exactly where it is."""
|
|
87
|
+
healthy = _FakeCollection()
|
|
88
|
+
made = _install_fake_chromadb(monkeypatch, [healthy])
|
|
89
|
+
idx = _make_index(tmp_path)
|
|
90
|
+
|
|
91
|
+
idx._open_chroma()
|
|
92
|
+
|
|
93
|
+
assert healthy.count_calls == 1, "the health probe must actually run"
|
|
94
|
+
assert len(made) == 1, "a healthy store must not be reopened"
|
|
95
|
+
assert not made[0].closed
|
|
96
|
+
assert (tmp_path / ".c3" / "embeddings" / "chromadb").is_dir()
|
|
97
|
+
assert not list((tmp_path / ".c3" / "embeddings").glob("quarantine_corrupt_*"))
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_corrupt_store_is_quarantined_and_reopened_empty(tmp_path, monkeypatch):
|
|
101
|
+
"""A failed probe moves the store aside and reopens, rather than raising."""
|
|
102
|
+
store = tmp_path / ".c3" / "embeddings" / "chromadb"
|
|
103
|
+
store.mkdir(parents=True, exist_ok=True)
|
|
104
|
+
(store / "chroma.sqlite3").write_text("damaged", encoding="utf-8")
|
|
105
|
+
|
|
106
|
+
boom = RuntimeError(
|
|
107
|
+
"Error executing plan: Error sending backfill request to compactor: "
|
|
108
|
+
"Failed to apply logs to the hnsw segment writer"
|
|
109
|
+
)
|
|
110
|
+
corrupt, fresh = _FakeCollection(count_error=boom), _FakeCollection()
|
|
111
|
+
made = _install_fake_chromadb(monkeypatch, [corrupt, fresh])
|
|
112
|
+
idx = _make_index(tmp_path)
|
|
113
|
+
|
|
114
|
+
idx._open_chroma()
|
|
115
|
+
|
|
116
|
+
# It recovered onto the second client rather than propagating the error.
|
|
117
|
+
assert len(made) == 2
|
|
118
|
+
assert made[0].closed, "the corrupt client must be closed before the move"
|
|
119
|
+
assert idx._collection is fresh
|
|
120
|
+
assert fresh.count_calls == 1, "the replacement store is probed too"
|
|
121
|
+
|
|
122
|
+
# The damaged bytes were preserved for post-mortem, not deleted.
|
|
123
|
+
quarantines = list((tmp_path / ".c3" / "embeddings").glob("quarantine_corrupt_*"))
|
|
124
|
+
assert len(quarantines) == 1
|
|
125
|
+
moved = quarantines[0] / "chromadb" / "chroma.sqlite3"
|
|
126
|
+
assert moved.read_text(encoding="utf-8") == "damaged"
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def test_quarantine_takes_the_hash_file_with_it(tmp_path, monkeypatch):
|
|
130
|
+
"""Stale hashes would suppress the rebuild the quarantine exists to force."""
|
|
131
|
+
embeddings = tmp_path / ".c3" / "embeddings"
|
|
132
|
+
embeddings.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
(embeddings / "chromadb").mkdir(exist_ok=True)
|
|
134
|
+
hash_file = embeddings / "file_hashes_v2.json"
|
|
135
|
+
hash_file.write_text(json.dumps({"cli/mcp_server.py": "deadbeef"}), encoding="utf-8")
|
|
136
|
+
|
|
137
|
+
boom = RuntimeError("Failed to apply logs to the hnsw segment writer")
|
|
138
|
+
_install_fake_chromadb(monkeypatch, [_FakeCollection(count_error=boom), _FakeCollection()])
|
|
139
|
+
idx = _make_index(tmp_path)
|
|
140
|
+
idx._file_hashes = {"cli/mcp_server.py": "deadbeef"}
|
|
141
|
+
|
|
142
|
+
idx._open_chroma()
|
|
143
|
+
|
|
144
|
+
assert not hash_file.exists(), "stale hashes must not survive the quarantine"
|
|
145
|
+
assert idx._file_hashes == {}, "in-memory hashes must be dropped too"
|
|
146
|
+
quarantined = next(embeddings.glob("quarantine_corrupt_*")) / "file_hashes_v2.json"
|
|
147
|
+
assert json.loads(quarantined.read_text(encoding="utf-8")) == {
|
|
148
|
+
"cli/mcp_server.py": "deadbeef"
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def test_second_failure_raises_instead_of_looping(tmp_path, monkeypatch):
|
|
153
|
+
"""One quarantine, then give up: a rebuild loop is worse than degrading."""
|
|
154
|
+
boom = RuntimeError("Failed to apply logs to the hnsw segment writer")
|
|
155
|
+
made = _install_fake_chromadb(
|
|
156
|
+
monkeypatch,
|
|
157
|
+
[_FakeCollection(count_error=boom), _FakeCollection(count_error=boom)],
|
|
158
|
+
)
|
|
159
|
+
idx = _make_index(tmp_path)
|
|
160
|
+
|
|
161
|
+
with pytest.raises(RuntimeError):
|
|
162
|
+
idx._open_chroma()
|
|
163
|
+
|
|
164
|
+
assert len(made) == 2, "exactly one retry, not an unbounded loop"
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def test_init_backends_degrades_instead_of_killing_the_server(tmp_path, monkeypatch):
|
|
168
|
+
"""Unrecoverable corruption marks the index unavailable; it never raises."""
|
|
169
|
+
boom = RuntimeError("Failed to apply logs to the hnsw segment writer")
|
|
170
|
+
_install_fake_chromadb(
|
|
171
|
+
monkeypatch,
|
|
172
|
+
[_FakeCollection(count_error=boom), _FakeCollection(count_error=boom)],
|
|
173
|
+
)
|
|
174
|
+
idx = _make_index(tmp_path)
|
|
175
|
+
|
|
176
|
+
class _DeadOllama:
|
|
177
|
+
def is_available(self, timeout=None):
|
|
178
|
+
return False
|
|
179
|
+
|
|
180
|
+
def has_model(self, model):
|
|
181
|
+
return False
|
|
182
|
+
|
|
183
|
+
idx.ollama = _DeadOllama()
|
|
184
|
+
|
|
185
|
+
idx._init_backends() # must not raise
|
|
186
|
+
|
|
187
|
+
assert idx._available is False
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/guide/getting-started.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/add_project.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/config_editor.js
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_health.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_panel.js
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_tasks.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/drill_views.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/global_search.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_access.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_ci.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_locks.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_sessions.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/hub_tokens.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/mcp_manager.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/modals.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/project_card.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/project_tree.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/sidebar.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/summary_bar.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/task_board.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/toasts.js
RENAMED
|
File without changes
|
{code_context_control-2.145.1 → code_context_control-2.145.2}/cli/hub_ui/components/topbar.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|