code-context-control 2.122.0__tar.gz → 2.124.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.122.0/code_context_control.egg-info → code_context_control-2.124.0}/PKG-INFO +1 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/c3.py +4 -4
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/index.html +1 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/workflow.html +1 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_pretool_enforce.py +1 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/mcp_server.py +5 -18
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/compress.py +3 -2
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/read.py +20 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0/code_context_control.egg-info}/PKG-INFO +1 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/code_context_control.egg-info/SOURCES.txt +3 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/pyproject.toml +1 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/claude_md.py +4 -4
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/codex_integration.py +1 -1
- code_context_control-2.124.0/services/dir_map.py +176 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/file_map.py +61 -2
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/file_memory.py +107 -10
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/parser.py +41 -19
- code_context_control-2.124.0/tests/test_dir_map_c3.py +176 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_file_map_c1.py +4 -2
- code_context_control-2.124.0/tests/test_large_files_c4.py +154 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_map_eval.py +2 -1
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mcp_server_smoke.py +4 -2
- {code_context_control-2.122.0 → code_context_control-2.124.0}/LICENSE +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/README.md +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/_shell_writes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/commands/common.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/commands/parser.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/docs.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/edits.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/access.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/credentials.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/masking.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/guide/tools.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_codex_lifecycle.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_read.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_server.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/progress.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/server.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/_grants.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/ci.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/edit.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/edit_verify.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/jira.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/locks.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/override.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/project.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/search.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/session.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/shell.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/shell_job.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/shell_nudge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/shell_parsers.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/shell_render.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/status.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/api.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/app.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/access.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/codex_patch.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/config.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/host.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/ide.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/core/web_security.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/config.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/access_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/access_telemetry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/activity_log.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/agent_base.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/agent_locks.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/agents.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/artifact_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/atomic_json.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/auto_memory.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/background_service.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/map_eval.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/search_eval.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_act.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_cache.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_expr.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_failures.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_github.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_impact.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_intel.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_runner.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ci_workflow.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/codex_transcript.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/compressor.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/conversation_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/cred_audit.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/cred_telemetry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/credential_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/doc_index.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/embedding_index.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/enforcement_policy.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/error_reporting.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/git_context.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/hub_service.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/index_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/indexer.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/jira_client.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/jira_cloud.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/jira_credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/jira_data_center.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/jira_links.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/lexical_index.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/mask_activation.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/mask_mirror.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/mask_presets.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory_graph.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory_queue.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/metrics.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/notifications.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ollama_client.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/oracle_service.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/output_filter.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/override_grants.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/override_policy.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/override_requests.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/override_wake.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/project_manager.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/project_runtime.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/protocol.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/proxy_state.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/repo_map.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/repo_shape.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/reranker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/retention.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/retrieval.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/router.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/runtime.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/scanner.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/session_manager.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/session_preloader.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/shell_jobs.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/shell_output.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/subprojects.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/task_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/telemetry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/text_index.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/time_tracker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/transcript_index.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/validation_cache.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/vector_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/watcher.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/setup.cfg +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_access_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_atomic_json.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_background_service.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_act.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_codex_mcp_transport.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_codex_native.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_credential_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_env_parser.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_client.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_links.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_map_telemetry_c0.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_override_grants.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_override_requests.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_override_wake.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_repo_map.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_retention.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_eval.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_p1.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_p2.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_p3.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_p4.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_search_p5.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_budget_s1.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_eval.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_jobs_s3.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_nudge_s4.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_output.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_parsers_s2.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_telemetry_s0.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_validate.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_version_sync.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/backend.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/main.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.122.0 → code_context_control-2.124.0}/tui/theme.tcss +0 -0
{code_context_control-2.122.0/code_context_control.egg-info → code_context_control-2.124.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.124.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
|
|
@@ -92,7 +92,7 @@ console = Console() if HAS_RICH else None
|
|
|
92
92
|
# Config
|
|
93
93
|
CONFIG_DIR = ".c3"
|
|
94
94
|
CONFIG_FILE = ".c3/config.json"
|
|
95
|
-
__version__ = "2.
|
|
95
|
+
__version__ = "2.124.0"
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
def _compress_file_cli(compressor, path, mode="smart", **kw):
|
|
@@ -271,7 +271,7 @@ _STALE_MCP_TOOLS = {
|
|
|
271
271
|
"mcp__c3__c3_remember", # → c3_memory(action='add')
|
|
272
272
|
"mcp__c3__c3_recall", # → c3_memory(action='recall')
|
|
273
273
|
"mcp__c3__c3_sltm_add", # → c3_memory(action='add')
|
|
274
|
-
"mcp__c3__c3_file_map", # →
|
|
274
|
+
"mcp__c3__c3_file_map", # → c3_read(file_path) map
|
|
275
275
|
"mcp__c3__c3_extract", # → c3_read
|
|
276
276
|
"mcp__c3__c3_transcript_search", # → c3_search(action='transcript')
|
|
277
277
|
"mcp__c3__c3_session_log", # → c3_session(action='log')
|
|
@@ -3971,7 +3971,7 @@ def cmd_benchmark(args):
|
|
|
3971
3971
|
"prompt_budget_multiplier": round(_prompt_gain(comp_comp, comp_orig), 2),
|
|
3972
3972
|
},
|
|
3973
3973
|
"file_navigation": {
|
|
3974
|
-
"description": "Use
|
|
3974
|
+
"description": "Use the c3_read file map to choose targeted reads instead of opening whole files blindly.",
|
|
3975
3975
|
"performance_metric": "map success rate",
|
|
3976
3976
|
"with_c3": {"tool": "c3_compress(mode='map')", "total_tokens": file_map_comp, "avg_latency_ms": round(_avg(file_map_c3_latencies), 2), "performance": round((file_map_successes / len(file_map_sample) * 100), 1) if file_map_sample else 0.0},
|
|
3977
3977
|
"without_c3": {"approach": "read full files into context", "total_tokens": file_map_orig, "avg_latency_ms": round(_avg(file_map_baseline_latencies), 2), "performance": 100.0},
|
|
@@ -5005,7 +5005,7 @@ back to native tools as the task progresses.
|
|
|
5005
5005
|
|
|
5006
5006
|
## Quick Reference
|
|
5007
5007
|
- **Search**: `c3_search(query=..., action='code|files|semantic')` — before Grep/Glob
|
|
5008
|
-
- **Read**: `
|
|
5008
|
+
- **Read**: `c3_read(file_path)` maps a file (or directory), then `c3_read(symbols=['Class.method'])` — before native Read
|
|
5009
5009
|
- **Impact**: `c3_impact(target='symbol')` — blast-radius check before editing shared symbols
|
|
5010
5010
|
- **Edit**: `c3_edit(file_path=..., old_string=..., new_string=...)` — before Edit/Write
|
|
5011
5011
|
- **Validate**: `c3_validate(file_path=...)` — after every edit (pyright/tsc type check if installed)
|
|
@@ -636,7 +636,7 @@
|
|
|
636
636
|
<span>Discover files / content — never start with Grep/Glob</span>
|
|
637
637
|
</div>
|
|
638
638
|
<div class="quick-item">
|
|
639
|
-
<code>3.
|
|
639
|
+
<code>3. c3_read(file_path) + c3_read(symbols=…)</code>
|
|
640
640
|
<span>Map then surgically read — never start with native Read</span>
|
|
641
641
|
</div>
|
|
642
642
|
<div class="quick-item">
|
|
@@ -315,7 +315,7 @@
|
|
|
315
315
|
<tr>
|
|
316
316
|
<td><span class="badge badge-blue">3</span></td>
|
|
317
317
|
<td><strong>Map + Read</strong></td>
|
|
318
|
-
<td><code>
|
|
318
|
+
<td><code>c3_read(file_path)</code> (map) → <code>c3_read(symbols=…)</code></td>
|
|
319
319
|
<td>Before reading any file content</td>
|
|
320
320
|
</tr>
|
|
321
321
|
<tr>
|
|
@@ -130,7 +130,7 @@ _VAULT_FILES = frozenset({"config.json", "secrets.enc", "cred_state.json",
|
|
|
130
130
|
# Redirect messages per native tool
|
|
131
131
|
_REDIRECTS = {
|
|
132
132
|
"Read": (
|
|
133
|
-
"Use
|
|
133
|
+
"Use c3_read(file_path='...') to map the file first (one line per symbol), "
|
|
134
134
|
"then c3_read(file_path='...', symbols=['...']) for surgical extraction."
|
|
135
135
|
),
|
|
136
136
|
"Grep": (
|
|
@@ -47,7 +47,6 @@ C3_VERSION = _read_version()
|
|
|
47
47
|
# Tool handlers
|
|
48
48
|
from cli.tools._helpers import maybe_related_facts, validate_file_path
|
|
49
49
|
from cli.tools.agent import handle_agent
|
|
50
|
-
from cli.tools.compress import handle_compress
|
|
51
50
|
from cli.tools.delegate import handle_delegate
|
|
52
51
|
from cli.tools.edit import handle_edit
|
|
53
52
|
from cli.tools.filter import handle_filter
|
|
@@ -85,7 +84,7 @@ def _build_instructions(ide_name: str) -> str:
|
|
|
85
84
|
return (
|
|
86
85
|
"C3 — local code intelligence. Route by goal:\n"
|
|
87
86
|
" FIND candidates → c3_search\n"
|
|
88
|
-
" MAP a file → c3_read(file_path) with no symbols, then READ → c3_read(symbols=…)
|
|
87
|
+
" MAP a file/dir → c3_read(file_path) with no symbols (comma paths batch), then READ → c3_read(symbols=…)\n"
|
|
89
88
|
" EDIT code → c3_edit (always; it logs to the ledger automatically)\n"
|
|
90
89
|
" VALIDATE after every edit → c3_validate\n"
|
|
91
90
|
" BLAST RADIUS before shared-symbol edits → c3_impact\n"
|
|
@@ -598,22 +597,10 @@ async def c3_read(file_path: str, symbols: Any = None, lines: Any = None,
|
|
|
598
597
|
return await asyncio.to_thread(handle_read, file_path, symbols, lines, include_docstrings, svc, finalize)
|
|
599
598
|
|
|
600
599
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
use this form for a comma-separated batch (up to 10). mode: map (default); other modes
|
|
606
|
-
are legacy."""
|
|
607
|
-
path_err = validate_file_path(file_path)
|
|
608
|
-
if path_err:
|
|
609
|
-
return f"[c3_compress:error] {path_err}"
|
|
610
|
-
svc = _svc(ctx)
|
|
611
|
-
|
|
612
|
-
def finalize(name, args, resp, summ, **kw):
|
|
613
|
-
return _finalize_response(ctx, name, args, resp, summ, **kw)
|
|
614
|
-
|
|
615
|
-
return await asyncio.to_thread(handle_compress, file_path, mode, svc, finalize, maybe_related_facts)
|
|
616
|
-
|
|
600
|
+
# c3_compress left the MCP surface in 2.124.0: c3_read(file_path) serves the
|
|
601
|
+
# same map, c3_read('a.py,b.py') the same batch, c3_read('<dir>') a directory.
|
|
602
|
+
# handle_compress stays importable for c3_project, the Oracle bridge and the
|
|
603
|
+
# CLI (docs/file-map.md § Retired modes).
|
|
617
604
|
|
|
618
605
|
@mcp.tool()
|
|
619
606
|
async def c3_validate(file_path: str, ctx: Context = None) -> str:
|
|
@@ -102,7 +102,7 @@ def _build_map(svc, rel: str) -> str:
|
|
|
102
102
|
svc.file_memory.complete_updates(completed)
|
|
103
103
|
if failed:
|
|
104
104
|
svc.file_memory.complete_updates(failed, failed=True)
|
|
105
|
-
return svc.file_memory.get_or_build_map(rel)
|
|
105
|
+
return svc.file_memory.get_or_build_map(rel, max_tokens=svc.file_memory.MAP_TOKEN_BUDGET)
|
|
106
106
|
|
|
107
107
|
|
|
108
108
|
def _compress_single(file_path: str, requested: str, note: str, svc, finalize) -> str:
|
|
@@ -197,7 +197,8 @@ def _compress_batch(paths: list, requested: str, note: str, svc, finalize) -> st
|
|
|
197
197
|
return fp, None, None, None, "not found"
|
|
198
198
|
rel = str(full.resolve().relative_to(
|
|
199
199
|
Path(svc.project_path).resolve())).replace("\\", "/")
|
|
200
|
-
res = svc.file_memory.get_or_build_map(
|
|
200
|
+
res = svc.file_memory.get_or_build_map(
|
|
201
|
+
rel, max_tokens=svc.file_memory.MAP_TOKEN_BUDGET)
|
|
201
202
|
try:
|
|
202
203
|
raw_tok = count_tokens(full.read_text(encoding="utf-8", errors="replace"))
|
|
203
204
|
map_tok = count_tokens(res)
|
|
@@ -177,6 +177,22 @@ def handle_read(file_path: str, symbols: Any = None, lines: Any = None,
|
|
|
177
177
|
|
|
178
178
|
rel_path = str(full.resolve().relative_to(Path(svc.project_path).resolve())).replace("\\", "/")
|
|
179
179
|
|
|
180
|
+
if full.is_dir():
|
|
181
|
+
# A directory maps to one line per file, budgeted
|
|
182
|
+
# (docs/file-map.md § Directories). `lines=<int>` sets the budget.
|
|
183
|
+
from services.dir_map import DEFAULT_MAX_TOKENS, render_directory_map
|
|
184
|
+
budget = DEFAULT_MAX_TOKENS
|
|
185
|
+
if isinstance(lines, int) and not isinstance(lines, bool) and lines > 0:
|
|
186
|
+
budget = lines
|
|
187
|
+
text, dir_detail = render_directory_map(svc, rel_path, max_tokens=budget)
|
|
188
|
+
tok = count_tokens(text)
|
|
189
|
+
if finalize is None:
|
|
190
|
+
return text
|
|
191
|
+
return finalize_with_tokens(
|
|
192
|
+
finalize, svc, "c3_read", {"file": file_path}, text,
|
|
193
|
+
f"dir:{dir_detail['files']}files->{tok}tok",
|
|
194
|
+
optimized_tokens=tok, response_tokens=tok, detail=dir_detail)
|
|
195
|
+
|
|
180
196
|
# Resolve ranges
|
|
181
197
|
ranges = []
|
|
182
198
|
|
|
@@ -315,7 +331,8 @@ def handle_read(file_path: str, symbols: Any = None, lines: Any = None,
|
|
|
315
331
|
|
|
316
332
|
if not ranges:
|
|
317
333
|
map_cached = not svc.file_memory.needs_update(rel_path)
|
|
318
|
-
file_map = svc.file_memory.get_or_build_map(
|
|
334
|
+
file_map = svc.file_memory.get_or_build_map(
|
|
335
|
+
rel_path, max_tokens=svc.file_memory.MAP_TOKEN_BUDGET)
|
|
319
336
|
if count_tokens(file_map) >= full_file_tokens():
|
|
320
337
|
# A map that costs more than the file is worth nothing: serve the
|
|
321
338
|
# file (docs/file-map.md § Small files).
|
|
@@ -325,6 +342,8 @@ def handle_read(file_path: str, symbols: Any = None, lines: Any = None,
|
|
|
325
342
|
+ "\n[map only — pass lines=[start,end] or symbols=[...] for exact source]"
|
|
326
343
|
+ maybe_related_facts(svc, rel_path, top_k=3, context="read"))
|
|
327
344
|
map_tok = count_tokens(resp)
|
|
345
|
+
if finalize is None:
|
|
346
|
+
return resp
|
|
328
347
|
return finalize_with_tokens(
|
|
329
348
|
finalize, svc, "c3_read", {"file": file_path},
|
|
330
349
|
resp, f"{full_file_tokens()}->{map_tok}tok",
|
{code_context_control-2.122.0 → code_context_control-2.124.0/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.
|
|
3
|
+
Version: 2.124.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
|
|
@@ -217,6 +217,7 @@ services/conversation_store.py
|
|
|
217
217
|
services/cred_audit.py
|
|
218
218
|
services/cred_telemetry.py
|
|
219
219
|
services/credential_store.py
|
|
220
|
+
services/dir_map.py
|
|
220
221
|
services/doc_index.py
|
|
221
222
|
services/e2e_benchmark.py
|
|
222
223
|
services/e2e_evaluator.py
|
|
@@ -345,6 +346,7 @@ tests/test_credentials_tool.py
|
|
|
345
346
|
tests/test_creds_cli_smoke.py
|
|
346
347
|
tests/test_delegate_cascade.py
|
|
347
348
|
tests/test_delegate_version_probe.py
|
|
349
|
+
tests/test_dir_map_c3.py
|
|
348
350
|
tests/test_e2e_benchmark.py
|
|
349
351
|
tests/test_edit_ledger_deadline.py
|
|
350
352
|
tests/test_edit_ledger_hook.py
|
|
@@ -392,6 +394,7 @@ tests/test_jira_credentials.py
|
|
|
392
394
|
tests/test_jira_links.py
|
|
393
395
|
tests/test_jira_routes.py
|
|
394
396
|
tests/test_jira_tool.py
|
|
397
|
+
tests/test_large_files_c4.py
|
|
395
398
|
tests/test_lazy_store_init.py
|
|
396
399
|
tests/test_map_eval.py
|
|
397
400
|
tests/test_map_telemetry_c0.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-context-control"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.124.0"
|
|
8
8
|
description = "Local MCP code-intelligence for AI coding tools: surgical search/read/edit, agent-config version history, path-level access + masking guards, and a multi-project hub."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -32,7 +32,7 @@ When falling back, state which c3_* tool was attempted and why it was insufficie
|
|
|
32
32
|
## Workflow (follow this order — do not skip steps)
|
|
33
33
|
1. **RECALL**: `c3_memory(action='recall')` — before any multi-step or context-dependent task. Large memory stores: use `index` first (compact list), then `fetch` for specific IDs
|
|
34
34
|
2. **SEARCH FIRST**: `c3_search(action='code|files|semantic')` — before ANY file discovery or content search. Never start with Grep/Glob
|
|
35
|
-
3. **MAP before READ**: `
|
|
35
|
+
3. **MAP before READ**: `c3_read(file_path)` with no symbols/lines returns the file map (one line per symbol with signature and `[La-Lb]` range, ~10% of the file's tokens; a directory path maps its files), then `c3_read(symbols=['Class.method']|lines=[a,b])` for the source you need. Never start with native Read. `c3_compress` is the same map for a comma-separated batch (legacy; removed in 2.124.0)
|
|
36
36
|
4. **IMPACT** (shared symbols): `c3_impact(target='symbol')` — blast-radius check before editing any function/class used across files
|
|
37
37
|
5. **EDIT via C3**: `c3_edit(file_path, old_string, new_string, summary)` — for ALL edits. Parallel across files; `edits=[]` batch for same file
|
|
38
38
|
6. **FILTER**: `c3_filter(text=...)` — for terminal output >10 lines or log files
|
|
@@ -55,7 +55,7 @@ In plan mode, all c3_* read tools (search, read, compress, filter, validate, sta
|
|
|
55
55
|
## Anti-patterns (DO NOT do these)
|
|
56
56
|
- Starting with native file search/read/grep without a prior c3_* call
|
|
57
57
|
- Using native Edit when c3_edit is available
|
|
58
|
-
- Reading entire files when
|
|
58
|
+
- Reading entire files when a c3_read map + a symbol read would be more surgical
|
|
59
59
|
- Skipping c3_validate after making edits"""
|
|
60
60
|
|
|
61
61
|
# Pointer that replaces the embedded Project Context tree (v2.60.0).
|
|
@@ -73,14 +73,14 @@ C3_NANO_WORKFLOW = """\
|
|
|
73
73
|
## C3 Tools — MANDATORY
|
|
74
74
|
Native tools BLOCKED unless c3_* called first. State reason when falling back.
|
|
75
75
|
1. c3_search(action='code|files|semantic') — BEFORE any search/grep/glob
|
|
76
|
-
2.
|
|
76
|
+
2. c3_read(file_path) maps a file (or directory); then c3_read(symbols=['Class.method']|lines=[a,b]) — BEFORE any file read
|
|
77
77
|
3. c3_edit(file_path, old_string, new_string, summary) — for ALL edits; edits=[{...}] batch
|
|
78
78
|
4. c3_filter(text='...') — output >10 lines
|
|
79
79
|
5. c3_validate(file_path) — after edits
|
|
80
80
|
6. c3_session(action='log'|'snapshot') — decisions / before /clear
|
|
81
81
|
7. `[c3-access:confirm]` = PAUSE, not block: a human approves this exact write (agent-config files — .mcp.json, instruction docs, .claude bodies — hold by default). Read the S8 tail: wait on the request it names (c3_override(action='wait', request_id='...', timeout_s=180)), then retry once. Never retry early, never route around it.
|
|
82
82
|
Plan mode: all c3_* read tools work normally — skip edit/delegate steps.
|
|
83
|
-
DO NOT: start with native Read/Grep/Glob/Edit, skip c3_validate, read full files without
|
|
83
|
+
DO NOT: start with native Read/Grep/Glob/Edit, skip c3_validate, read full files without mapping them first."""
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
# --- Per-IDE workflow adaptation ----------------------------------------------
|
|
@@ -8,7 +8,7 @@ CODEX_WORKFLOW = """# C3 — Codex workflow
|
|
|
8
8
|
|
|
9
9
|
Use C3 for repository intelligence and audited changes:
|
|
10
10
|
1. Recall relevant project facts with c3_memory; inspect .c3/MAP.md.
|
|
11
|
-
2. Find candidates with c3_search; map with
|
|
11
|
+
2. Find candidates with c3_search; map with c3_read(file_path) (no symbols), then
|
|
12
12
|
read exact symbols or lines with c3_read. Check shared changes with c3_impact.
|
|
13
13
|
3. Edit with c3_edit, validate with c3_validate, and record decisions with
|
|
14
14
|
c3_session(action='log'). Preserve unrelated work.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"""Directory maps — one line per file, budgeted, for `c3_read('<dir>')`.
|
|
2
|
+
|
|
3
|
+
# services/ (58 files, 41,203L)
|
|
4
|
+
compressor.py (809L python) — CodeCompressor; compress_file; STRUCTURE_PATTERNS
|
|
5
|
+
file_map.py (280L python) — render_map; parse_signature; parse_map; KINDS
|
|
6
|
+
…
|
|
7
|
+
… 12 more files
|
|
8
|
+
|
|
9
|
+
Files are ranked the way a reader would want them: recently edited first
|
|
10
|
+
(the edit ledger), then by how much structure they hold (symbol count),
|
|
11
|
+
then by path. The map is filled to a token budget and closes with how
|
|
12
|
+
many files it left out. Traversal is bounded — the scanner's SKIP_DIRS
|
|
13
|
+
and .gitignore pruning, never following symlinks, a hard file cap — and
|
|
14
|
+
structure comes from file_memory records, extracting on the fly only
|
|
15
|
+
for a bounded number of code files (docs/file-map.md § Directories).
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import time
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Optional
|
|
22
|
+
|
|
23
|
+
from core import count_tokens
|
|
24
|
+
from services.file_memory import CODE_EXTENSIONS, LANG_MAP
|
|
25
|
+
from services.scanner import iter_files
|
|
26
|
+
|
|
27
|
+
DEFAULT_MAX_TOKENS = 1500
|
|
28
|
+
MAX_FILES = 400 # hard traversal cap
|
|
29
|
+
MAX_EXTRACT_FILES = 120 # code files parsed on the fly, per call
|
|
30
|
+
EXTRACT_DEADLINE_S = 3.0 # then the rest show line counts only
|
|
31
|
+
MAX_EXTRACT_BYTES = 200 * 1024
|
|
32
|
+
SYMBOLS_PER_FILE = 6
|
|
33
|
+
LEDGER_LOOKBACK = 300 # recent ledger entries consulted for ranking
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _recent_edit_ranks(svc) -> dict:
|
|
37
|
+
"""path -> recency rank (0 = most recent) from the edit ledger."""
|
|
38
|
+
ledger = getattr(svc, "edit_ledger", None)
|
|
39
|
+
if ledger is None:
|
|
40
|
+
return {}
|
|
41
|
+
try:
|
|
42
|
+
entries = ledger.get_history(limit=LEDGER_LOOKBACK)
|
|
43
|
+
except Exception:
|
|
44
|
+
return {}
|
|
45
|
+
ranks: dict = {}
|
|
46
|
+
for entry in entries or []:
|
|
47
|
+
f = str((entry or {}).get("file") or "").replace("\\", "/")
|
|
48
|
+
if f and f not in ranks:
|
|
49
|
+
ranks[f] = len(ranks)
|
|
50
|
+
return ranks
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#: What a reader wants to see first on a one-line summary of a file.
|
|
54
|
+
_SYMBOL_PRIORITY = {"class": 0, "interface": 0, "struct": 0, "trait": 0, "enum": 0,
|
|
55
|
+
"function": 1, "method": 1, "type": 2, "heading": 2, "section": 2,
|
|
56
|
+
"constant": 3, "variable": 3}
|
|
57
|
+
_SKIP_SYMBOL_TYPES = {"import", "decorator", "comment", "content", "property", "impl"}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _structural_sections(record: Optional[dict]) -> list:
|
|
61
|
+
return [s for s in (record or {}).get("sections") or []
|
|
62
|
+
if s.get("type") not in _SKIP_SYMBOL_TYPES
|
|
63
|
+
and str(s.get("name") or "").strip() not in ("", "(full file)")]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _top_symbols(record: Optional[dict]) -> list:
|
|
67
|
+
"""Up to SYMBOLS_PER_FILE names: classes first, then functions, then the
|
|
68
|
+
rest, constants last — each group in source order."""
|
|
69
|
+
picked = sorted(enumerate(_structural_sections(record)),
|
|
70
|
+
key=lambda iv: (_SYMBOL_PRIORITY.get(iv[1].get("type"), 2),
|
|
71
|
+
str(iv[1].get("name") or "").startswith("_"),
|
|
72
|
+
iv[0]))
|
|
73
|
+
names = []
|
|
74
|
+
for _, s in picked[:SYMBOLS_PER_FILE]:
|
|
75
|
+
name = str(s.get("name") or "").strip()
|
|
76
|
+
if s.get("type") == "heading":
|
|
77
|
+
name = name.split(":", 1)[-1].strip()
|
|
78
|
+
names.append(name)
|
|
79
|
+
return names
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _line_count(path: Path) -> int:
|
|
83
|
+
try:
|
|
84
|
+
with open(path, "rb") as fh:
|
|
85
|
+
return sum(1 for _ in fh)
|
|
86
|
+
except OSError:
|
|
87
|
+
return 0
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def render_directory_map(svc, rel_dir: str, *, max_tokens: int = DEFAULT_MAX_TOKENS) -> tuple:
|
|
91
|
+
"""Return (text, detail) for the directory `rel_dir` (project-relative, posix)."""
|
|
92
|
+
root = Path(svc.project_path).resolve()
|
|
93
|
+
rel_dir = str(rel_dir).replace("\\", "/").strip("/")
|
|
94
|
+
target = (root / rel_dir).resolve() if rel_dir else root
|
|
95
|
+
label = (rel_dir + "/") if rel_dir else "./"
|
|
96
|
+
|
|
97
|
+
files = []
|
|
98
|
+
capped = False
|
|
99
|
+
for fp in iter_files(target, max_files=MAX_FILES + 1):
|
|
100
|
+
if len(files) >= MAX_FILES:
|
|
101
|
+
capped = True
|
|
102
|
+
break
|
|
103
|
+
try:
|
|
104
|
+
files.append(fp.resolve().relative_to(root).as_posix())
|
|
105
|
+
except ValueError:
|
|
106
|
+
continue
|
|
107
|
+
|
|
108
|
+
store = getattr(svc, "file_memory", None)
|
|
109
|
+
recent = _recent_edit_ranks(svc)
|
|
110
|
+
started = time.monotonic()
|
|
111
|
+
extracted = 0
|
|
112
|
+
rows = []
|
|
113
|
+
total_lines = 0
|
|
114
|
+
for rel in files:
|
|
115
|
+
record = None
|
|
116
|
+
if store is not None:
|
|
117
|
+
try:
|
|
118
|
+
record = store.get(rel)
|
|
119
|
+
except Exception:
|
|
120
|
+
record = None
|
|
121
|
+
ext = Path(rel).suffix.lower()
|
|
122
|
+
if (record is None and ext in CODE_EXTENSIONS
|
|
123
|
+
and extracted < MAX_EXTRACT_FILES
|
|
124
|
+
and time.monotonic() - started < EXTRACT_DEADLINE_S):
|
|
125
|
+
try:
|
|
126
|
+
if (root / rel).stat().st_size <= MAX_EXTRACT_BYTES:
|
|
127
|
+
record = store.update(rel)
|
|
128
|
+
extracted += 1
|
|
129
|
+
except Exception:
|
|
130
|
+
record = None
|
|
131
|
+
lines = int((record or {}).get("lines") or 0) or _line_count(root / rel)
|
|
132
|
+
total_lines += lines
|
|
133
|
+
ext = Path(rel).suffix.lower()
|
|
134
|
+
lang = str((record or {}).get("language") or LANG_MAP.get(ext) or ext.lstrip(".") or "")
|
|
135
|
+
symbols = _top_symbols(record)
|
|
136
|
+
rows.append({
|
|
137
|
+
"rel": rel,
|
|
138
|
+
"name": rel[len(rel_dir) + 1:] if rel_dir and rel.startswith(rel_dir + "/") else rel,
|
|
139
|
+
"lines": lines,
|
|
140
|
+
"lang": lang,
|
|
141
|
+
"symbols": symbols,
|
|
142
|
+
"recent": recent.get(rel, 10 ** 6),
|
|
143
|
+
"nsym": len(_structural_sections(record)),
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
rows.sort(key=lambda r: (r["recent"], -r["nsym"], r["rel"]))
|
|
147
|
+
|
|
148
|
+
header = f"# {label} ({len(files)}{'+' if capped else ''} files, {total_lines:,}L)"
|
|
149
|
+
body = []
|
|
150
|
+
for r in rows:
|
|
151
|
+
line = f"{r['name']} ({r['lines']}L {r['lang']})".rstrip()
|
|
152
|
+
if r["symbols"]:
|
|
153
|
+
line += " — " + "; ".join(r["symbols"])
|
|
154
|
+
body.append(line)
|
|
155
|
+
|
|
156
|
+
kept = list(body)
|
|
157
|
+
while kept and count_tokens("\n".join([header] + kept)) > max_tokens:
|
|
158
|
+
kept.pop()
|
|
159
|
+
dropped = len(body) - len(kept)
|
|
160
|
+
parts = [header] + kept
|
|
161
|
+
if dropped:
|
|
162
|
+
parts.append(f"… {dropped} more files")
|
|
163
|
+
if capped:
|
|
164
|
+
parts.append(f"[dir_map] traversal capped at {MAX_FILES} files; map a subdirectory")
|
|
165
|
+
# In source order the reader gets recency first; say so once.
|
|
166
|
+
parts.append("[dir_map] recently edited first, then by structure; "
|
|
167
|
+
"c3_read('<file>') maps one file")
|
|
168
|
+
text = "\n".join(parts)
|
|
169
|
+
detail = {
|
|
170
|
+
"backend": "directory",
|
|
171
|
+
"files": len(files),
|
|
172
|
+
"listed": len(kept),
|
|
173
|
+
"extracted": extracted,
|
|
174
|
+
"capped": capped,
|
|
175
|
+
}
|
|
176
|
+
return text, detail
|
|
@@ -56,7 +56,7 @@ _PY_DEF = re.compile(r"^(?:async\s+)?def\s+[\w.]+\s*\((?P<params>.*)\)\s*(?:->\s
|
|
|
56
56
|
_PY_CLASS = re.compile(r"^class\s+\w+\s*(?:\((?P<bases>.*)\))?\s*:?$")
|
|
57
57
|
_GO_FUNC = re.compile(r"^func\s+(?:\((?P<recv>[^)]*)\)\s*)?\w+\s*\((?P<params>.*?)\)\s*(?P<ret>[^{]*?)\s*\{?$")
|
|
58
58
|
_RS_FN = re.compile(r"^(?:pub(?:\([^)]*\))?\s+)?(?:async\s+|const\s+|unsafe\s+)*fn\s+\w+(?:<[^>]*>)?\s*\((?P<params>.*)\)\s*(?:->\s*(?P<ret>[^{]+?))?\s*(?:where\b.*)?\{?$")
|
|
59
|
-
_JS_FUNC = re.compile(r"^(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s
|
|
59
|
+
_JS_FUNC = re.compile(r"^(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s*[\w$]*\s*(?:<[^>]*>)?\s*\((?P<params>.*)\)\s*(?::\s*(?P<ret>[^{]+?))?\s*\{?\s*$")
|
|
60
60
|
_JS_ARROW = re.compile(r"^(?:export\s+)?(?:const|let|var)\s+\w+\s*(?::[^=]+)?=\s*(?:async\s+)?\((?P<params>.*)\)\s*(?::\s*(?P<ret>[^=]+?))?\s*=>")
|
|
61
61
|
_JS_ARROW1 = re.compile(r"^(?:export\s+)?(?:const|let|var)\s+\w+\s*=\s*(?:async\s+)?(?P<params>\w+)\s*=>")
|
|
62
62
|
_JS_CLASS = re.compile(r"^(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+\w+(?:<[^>]*>)?\s*(?:extends\s+(?P<base>[\w.<>, ]+?))?\s*(?:implements\s+(?P<impl>[\w.<>, ]+?))?\s*\{?$")
|
|
@@ -67,6 +67,40 @@ def _norm(text: str) -> str:
|
|
|
67
67
|
return _WS.sub(" ", str(text or "")).strip()
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
def _declaration_head(sig: str) -> str:
|
|
71
|
+
"""Cut a brace-language signature after its parameter list and return
|
|
72
|
+
type: the text up to the body's `{`, an arrow, or a `;`. Parentheses
|
|
73
|
+
are depth-matched, so a 400-char minified chunk holding several
|
|
74
|
+
declarations yields only the first one's head."""
|
|
75
|
+
i = sig.find("(")
|
|
76
|
+
if i < 0:
|
|
77
|
+
j = sig.find("{")
|
|
78
|
+
return sig if j < 0 else sig[:j].rstrip()
|
|
79
|
+
depth = 0
|
|
80
|
+
close = -1
|
|
81
|
+
for k in range(i, len(sig)):
|
|
82
|
+
ch = sig[k]
|
|
83
|
+
if ch == "(":
|
|
84
|
+
depth += 1
|
|
85
|
+
elif ch == ")":
|
|
86
|
+
depth -= 1
|
|
87
|
+
if depth == 0:
|
|
88
|
+
close = k
|
|
89
|
+
break
|
|
90
|
+
if close < 0:
|
|
91
|
+
return sig
|
|
92
|
+
rest = sig[close + 1:]
|
|
93
|
+
cut = len(rest)
|
|
94
|
+
for stop in ("{", ";"):
|
|
95
|
+
j = rest.find(stop)
|
|
96
|
+
if 0 <= j < cut:
|
|
97
|
+
cut = j
|
|
98
|
+
j = rest.find("=>")
|
|
99
|
+
if 0 <= j < cut:
|
|
100
|
+
cut = j + 2 # keep the arrow: the arrow-function grammar needs it
|
|
101
|
+
return (sig[:close + 1] + rest[:cut]).rstrip()
|
|
102
|
+
|
|
103
|
+
|
|
70
104
|
def parse_signature(signature: str, language: str) -> dict:
|
|
71
105
|
"""Split a raw signature into params / ret / receiver / bases.
|
|
72
106
|
|
|
@@ -78,6 +112,10 @@ def parse_signature(signature: str, language: str) -> dict:
|
|
|
78
112
|
if not sig:
|
|
79
113
|
return {}
|
|
80
114
|
lang = (language or "").lower()
|
|
115
|
+
if lang in ("javascript", "typescript", "go", "rust") and not sig.lstrip().startswith(
|
|
116
|
+
("class ", "export class", "export default class", "abstract class",
|
|
117
|
+
"struct ", "pub struct", "enum ", "pub enum", "trait ", "pub trait", "impl ", "type ")):
|
|
118
|
+
sig = _declaration_head(sig)
|
|
81
119
|
out: dict = {}
|
|
82
120
|
if lang == "python":
|
|
83
121
|
m = _PY_DEF.match(sig)
|
|
@@ -290,6 +328,25 @@ def render_map(record: dict, *, include_docs: bool = False,
|
|
|
290
328
|
header = f"# {path} ({total_lines}L {language})".rstrip()
|
|
291
329
|
body: list = []
|
|
292
330
|
|
|
331
|
+
shape = record.get("shape") or {}
|
|
332
|
+
parser = str(record.get("parser") or "")
|
|
333
|
+
minified = bool(shape.get("minified"))
|
|
334
|
+
if parser == "skipped" or shape.get("oversized"):
|
|
335
|
+
body.append(f"[map:not mapped] {shape.get('bytes', 0):,} bytes on {total_lines} lines, "
|
|
336
|
+
f"longest line {shape.get('longest_line', 0):,} chars — read with lines=[a,b]")
|
|
337
|
+
return "\n".join([header] + body)
|
|
338
|
+
if parser == "lexical":
|
|
339
|
+
body.append("[map:lexical-fallback] the parse overran its deadline; "
|
|
340
|
+
"symbols come from a line scan and may be incomplete")
|
|
341
|
+
if minified:
|
|
342
|
+
# A minified bundle's `var` soup is not structure; named declarations are.
|
|
343
|
+
soup = [s for s in sections if s.get("type") in ("variable", "constant")]
|
|
344
|
+
sections = [s for s in sections if s.get("type") not in ("variable", "constant")]
|
|
345
|
+
body.append(f"[map:minified] longest line {shape.get('longest_line', 0):,} chars; "
|
|
346
|
+
f"{len(soup)} var bindings omitted")
|
|
347
|
+
elif shape.get("generated"):
|
|
348
|
+
body.append("[map:generated] the file says it is generated")
|
|
349
|
+
|
|
293
350
|
imports = [s for s in sections if s.get("type") == "import"]
|
|
294
351
|
others = [s for s in sections if s.get("type") != "import"]
|
|
295
352
|
if imports:
|
|
@@ -329,7 +386,9 @@ def render_map(record: dict, *, include_docs: bool = False,
|
|
|
329
386
|
while kept and count_tokens("\n".join([header] + kept)) > max_tokens:
|
|
330
387
|
kept.pop()
|
|
331
388
|
dropped = len(body) - len(kept)
|
|
332
|
-
text = "\n".join([header] + kept + [
|
|
389
|
+
text = "\n".join([header] + kept + [
|
|
390
|
+
f"… {dropped} more symbols (map budget {max_tokens} tokens; "
|
|
391
|
+
f"pass symbols=[…] or lines=[a,b] for the part you need)"])
|
|
333
392
|
return text
|
|
334
393
|
|
|
335
394
|
|