code-context-control 2.112.0__tar.gz → 2.113.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.112.0 → code_context_control-2.113.0}/PKG-INFO +1 -1
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/c3.py +1 -1
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/mcp_server.py +10 -2
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/shell.py +140 -46
- code_context_control-2.113.0/cli/tools/shell_parsers.py +683 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/shell_render.py +198 -68
- {code_context_control-2.112.0 → code_context_control-2.113.0}/code_context_control.egg-info/PKG-INFO +1 -1
- {code_context_control-2.112.0 → code_context_control-2.113.0}/code_context_control.egg-info/SOURCES.txt +2 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/pyproject.toml +1 -1
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_c3_shell.py +23 -11
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_budget_s1.py +23 -6
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_eval.py +18 -10
- code_context_control-2.113.0/tests/test_shell_parsers_s2.py +566 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_telemetry_s0.py +12 -5
- {code_context_control-2.112.0 → code_context_control-2.113.0}/LICENSE +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/README.md +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/_shell_writes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/commands/common.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/commands/parser.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/docs.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/edits.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/access.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/credentials.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/index.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/masking.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/tools.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/guide/workflow.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_read.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_server.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/progress.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/server.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/_grants.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/ci.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/edit.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/edit_verify.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/jira.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/locks.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/override.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/project.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/read.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/search.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/session.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/status.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/api.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/app.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/access.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/core/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/core/config.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/core/ide.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/core/web_security.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/config.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/access_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/access_telemetry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/activity_log.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/agent_base.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/agent_locks.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/agents.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/artifact_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/auto_memory.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/background_service.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bench/search_eval.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_act.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_cache.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_expr.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_failures.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_github.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_impact.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_intel.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_runner.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ci_workflow.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/claude_md.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/compressor.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/conversation_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/cred_audit.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/cred_telemetry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/credential_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/doc_index.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/embedding_index.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/enforcement_policy.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/error_reporting.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/file_memory.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/git_context.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/hub_service.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/index_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/indexer.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/jira_client.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/jira_cloud.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/jira_credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/jira_data_center.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/jira_links.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/lexical_index.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/mask_activation.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/mask_mirror.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/mask_presets.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory_graph.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory_queue.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/metrics.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/notifications.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ollama_client.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/oracle_service.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/output_filter.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/override_grants.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/override_policy.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/override_requests.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/override_wake.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/parser.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/project_manager.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/project_runtime.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/protocol.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/proxy_state.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/repo_map.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/repo_shape.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/reranker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/retention.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/retrieval.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/router.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/runtime.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/scanner.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/session_manager.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/session_preloader.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/shell_output.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/subprojects.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/task_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/telemetry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/text_index.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/time_tracker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/transcript_index.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/validation_cache.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/vector_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/watcher.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/setup.cfg +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_access_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_background_service.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_act.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_credential_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_env_parser.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_client.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_links.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_override_grants.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_override_requests.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_override_wake.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_repo_map.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_retention.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_eval.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_p1.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_p2.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_p3.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_p4.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_search_p5.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_output.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_validate.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_version_sync.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/backend.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/main.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.112.0 → code_context_control-2.113.0}/tui/theme.tcss +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.113.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
|
|
@@ -899,8 +899,16 @@ async def c3_shell(cmd: str = "", cwd: str = "", timeout: int = 60,
|
|
|
899
899
|
(pattern=regex), 'tail' (lines='80') or 'delete', stream='stdout'|'stderr'; an id
|
|
900
900
|
resolves only for this project and this session under the current access rules.
|
|
901
901
|
The echoed command is its first line; a multi-line command shows (N lines, M chars,
|
|
902
|
-
sha256).
|
|
903
|
-
|
|
902
|
+
sha256). Under budget the output is complete: ANSI/control sequences stripped, each
|
|
903
|
+
line's \\r progress rewrites reduced to their final state, runs of 3+ identical
|
|
904
|
+
consecutive lines folded to one plus ` [x N]` (the header says `[collapsed …]` and the
|
|
905
|
+
raw streams are kept by id). Over budget, pytest/unittest/cargo/tsc/jest/vitest
|
|
906
|
+
failure blocks, error lines and totals are kept first (each announced by `[La-b: why]`),
|
|
907
|
+
then a bounded head/tail; a recognised runner past 30 lines gets a `--- summary ---`
|
|
908
|
+
(totals + one line per failing test). filter_output=False skips the two collapses so
|
|
909
|
+
every line comes through as written — escapes are still stripped, summaries and
|
|
910
|
+
priority regions still apply, and the cap is never lifted. Auto-logs git mutations
|
|
911
|
+
to the edit ledger.
|
|
904
912
|
Credentials: env_creds='NAME1,NAME2' injects vault entries as env vars, and
|
|
905
913
|
{{cred:NAME}} inside cmd expands server-side — decoded values never enter
|
|
906
914
|
model context (see c3_credentials; echoed values are auto-redacted, in the
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Wraps subprocess.Popen with the Windows-safe pattern from
|
|
4
4
|
services/edit_ledger.py::_git_combined (Popen + taskkill /F /T + stdin=DEVNULL).
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
Budgets and shapes the response (cli/tools/shell_render.py + shell_parsers.py:
|
|
6
|
+
normalised streams, runner-aware priority regions, omission only over budget),
|
|
7
|
+
auto-logs git mutations to the edit ledger, and accounts stdout tokens against
|
|
8
|
+
session budget.
|
|
7
9
|
|
|
8
10
|
Shell selection: on Windows, commands are run through Git Bash (bash.exe) when
|
|
9
11
|
it is available, so c3_shell speaks the same POSIX dialect as the native Bash
|
|
@@ -28,7 +30,13 @@ from pathlib import Path
|
|
|
28
30
|
from cli._shell_writes import shell_write_targets
|
|
29
31
|
from cli.tools import _grants
|
|
30
32
|
from cli.tools._helpers import finalize_with_tokens
|
|
31
|
-
from cli.tools.
|
|
33
|
+
from cli.tools.shell_parsers import (
|
|
34
|
+
SUMMARY_MIN_LINES,
|
|
35
|
+
detect_runner,
|
|
36
|
+
normalize_stream,
|
|
37
|
+
priority_regions,
|
|
38
|
+
structured_tail,
|
|
39
|
+
)
|
|
32
40
|
from cli.tools.shell_render import (
|
|
33
41
|
allocate,
|
|
34
42
|
cmd_display,
|
|
@@ -36,6 +44,8 @@ from cli.tools.shell_render import (
|
|
|
36
44
|
grep_pattern,
|
|
37
45
|
human_bytes,
|
|
38
46
|
shape_stream,
|
|
47
|
+
split_lines,
|
|
48
|
+
split_preview,
|
|
39
49
|
)
|
|
40
50
|
from core import count_tokens
|
|
41
51
|
from services import access_guard
|
|
@@ -477,6 +487,39 @@ def _stream_facts(result: dict, stream: str) -> dict:
|
|
|
477
487
|
"longest": _longest_line(text)}
|
|
478
488
|
|
|
479
489
|
|
|
490
|
+
_ZERO_NORM = {"ansi_stripped": 0, "cr_collapsed": 0, "dup_collapsed": 0}
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def _normalised(facts: dict, *, collapse: bool, fuzzy: bool) -> dict:
|
|
494
|
+
"""One stream after ``normalize_stream``: the text (or previews), its
|
|
495
|
+
logical lines in the index space ``shape_stream`` uses, the raw line
|
|
496
|
+
numbers of those lines when folding shifted them, and the counters."""
|
|
497
|
+
info = dict(_ZERO_NORM)
|
|
498
|
+
if facts["text"] is not None:
|
|
499
|
+
text, ni = normalize_stream(facts["text"], collapse=collapse, fuzzy_dups=fuzzy)
|
|
500
|
+
for k in _ZERO_NORM:
|
|
501
|
+
info[k] = ni[k]
|
|
502
|
+
return {"text": text, "head": "", "tail": "", "lines": split_lines(text),
|
|
503
|
+
"bytes": len(text.encode("utf-8", errors="replace")),
|
|
504
|
+
"total_lines": facts["lines"], "numbers": ni["line_numbers"],
|
|
505
|
+
"tail_numbers": None, "info": info}
|
|
506
|
+
head, hi = normalize_stream(facts["head"], collapse=collapse, fuzzy_dups=fuzzy)
|
|
507
|
+
tail, ti = normalize_stream(facts["tail"], collapse=collapse, fuzzy_dups=fuzzy)
|
|
508
|
+
for k in _ZERO_NORM:
|
|
509
|
+
info[k] = hi[k] + ti[k]
|
|
510
|
+
h_lines, t_lines, _torn = split_preview(head, tail)
|
|
511
|
+
return {"text": None, "head": head, "tail": tail, "lines": h_lines + t_lines,
|
|
512
|
+
"bytes": facts["bytes"], "total_lines": facts["lines"],
|
|
513
|
+
"numbers": hi["line_numbers"], "tail_numbers": ti["line_numbers"], "info": info}
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
def _region_line_count(regions) -> int:
|
|
517
|
+
seen: set[int] = set()
|
|
518
|
+
for a, b, _why in regions:
|
|
519
|
+
seen.update(range(a, b + 1))
|
|
520
|
+
return len(seen)
|
|
521
|
+
|
|
522
|
+
|
|
480
523
|
def render_shell_response(cmd: str, result: dict, svc, *,
|
|
481
524
|
filter_output: bool = True, warn: str = "",
|
|
482
525
|
capped_note: str = "", touched_files=(),
|
|
@@ -494,21 +537,46 @@ def render_shell_response(cmd: str, result: dict, svc, *,
|
|
|
494
537
|
Budget (2.112.0, cli/tools/shell_render.py): the rendered body never
|
|
495
538
|
exceeds ``effective_budget()`` bytes — 18 KiB by default, 22 KiB ceiling,
|
|
496
539
|
``max_bytes`` and ``hybrid.shell_budget_bytes`` may only lower it,
|
|
497
|
-
``filter_output=False`` never lifts it.
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
streams are
|
|
504
|
-
|
|
540
|
+
``filter_output=False`` never lifts it.
|
|
541
|
+
|
|
542
|
+
Shaping (2.113.0, S2, cli/tools/shell_parsers.py) — the Cod rule: strip
|
|
543
|
+
ANSI and collapse ``\\r`` rewrites always, otherwise preserve complete
|
|
544
|
+
under-budget output, run the parsers always but omit only over budget:
|
|
545
|
+
|
|
546
|
+
1. Both streams are normalised: ``\\r\\n`` → ``\\n``, ANSI escape and
|
|
547
|
+
control sequences stripped (not a loss), each line's ``\\r``
|
|
548
|
+
progress rewrites collapsed to the final state, runs of three or
|
|
549
|
+
more identical consecutive lines folded to the first plus
|
|
550
|
+
`` [x N]``. The last two are a loss: the header says
|
|
551
|
+
``[collapsed …]``, ``stats["filtered"]`` is set and the raw streams
|
|
552
|
+
are spilled. ``filter_output=False`` skips the two collapses (ANSI
|
|
553
|
+
is always stripped) and, as before, never lifts the byte cap.
|
|
554
|
+
2. The runner is detected (pytest, unittest, cargo/rustc, tsc, jest,
|
|
555
|
+
vitest) and its priority regions computed on every call; a stream
|
|
556
|
+
that fits its allocation passes through whole regardless. A stream
|
|
557
|
+
that does not is re-normalised with the duplicate test widened to
|
|
558
|
+
lines differing only in digits / hex / timestamps, then shaped:
|
|
559
|
+
priority regions first (each announced by ``[La-b: why]`` when not
|
|
560
|
+
contiguous), head/tail with the rest, one omission note naming the
|
|
561
|
+
output id. Unrecognised output uses generic error anchors, capped at
|
|
562
|
+
60% of the allocation so head and tail always keep something.
|
|
563
|
+
3. For a recognised runner with more than SUMMARY_MIN_LINES lines a
|
|
564
|
+
``--- summary ---`` section (totals + one line per failing test,
|
|
565
|
+
cap 20) is appended and counted inside the budget.
|
|
566
|
+
|
|
567
|
+
The legacy ``>30 newlines → handle_filter`` path is gone from this
|
|
568
|
+
function (``c3_filter`` the tool is untouched). Whenever anything was
|
|
569
|
+
dropped — collapsed, clipped or windowed — ``stats["needs_spill"]``
|
|
570
|
+
tells handle_shell to keep the raw streams.
|
|
505
571
|
|
|
506
572
|
``stats`` is what telemetry records about the call (see
|
|
507
573
|
SessionManager.record_tool_tokens ``detail``): stdout_bytes and
|
|
508
|
-
stderr_bytes are measured
|
|
509
|
-
the single-line monsters (minified bundles, JSONL) that a
|
|
510
|
-
trigger never sees; filtered
|
|
511
|
-
|
|
574
|
+
stderr_bytes are measured on the RAW streams; longest_line is the tell
|
|
575
|
+
for the single-line monsters (minified bundles, JSONL) that a
|
|
576
|
+
newline-count trigger never sees; filtered (a lossy collapse happened),
|
|
577
|
+
spilled, output_id, runner, ansi_stripped, cr_collapsed, dup_collapsed
|
|
578
|
+
and priority_lines (lines the parsers marked, both streams) describe
|
|
579
|
+
what this renderer did.
|
|
512
580
|
"""
|
|
513
581
|
out = _stream_facts(result, "stdout")
|
|
514
582
|
err = _stream_facts(result, "stderr")
|
|
@@ -524,6 +592,11 @@ def render_shell_response(cmd: str, result: dict, svc, *,
|
|
|
524
592
|
"output_id": None,
|
|
525
593
|
"cmd_class": _cmd_class(cmd),
|
|
526
594
|
"needs_spill": False,
|
|
595
|
+
"runner": None,
|
|
596
|
+
"ansi_stripped": 0,
|
|
597
|
+
"cr_collapsed": 0,
|
|
598
|
+
"dup_collapsed": 0,
|
|
599
|
+
"priority_lines": 0,
|
|
527
600
|
}
|
|
528
601
|
|
|
529
602
|
config_default = None
|
|
@@ -532,45 +605,56 @@ def render_shell_response(cmd: str, result: dict, svc, *,
|
|
|
532
605
|
except Exception:
|
|
533
606
|
config_default = None
|
|
534
607
|
budget = effective_budget(max_bytes, config_default=config_default)
|
|
535
|
-
out_alloc, err_alloc = allocate(budget, out["bytes"], err["bytes"])
|
|
536
608
|
stats["budget_bytes"] = budget
|
|
537
609
|
output_id = getattr(capture, "output_id", None) if capture is not None else None
|
|
538
610
|
focus = grep_pattern(cmd)
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
#
|
|
542
|
-
#
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
611
|
+
collapse = bool(filter_output)
|
|
612
|
+
|
|
613
|
+
# 1. Normalise. A stream with previews only (over TEXT_MAX_BYTES) is over
|
|
614
|
+
# budget by definition, so it gets the widened duplicate test at once.
|
|
615
|
+
norm_out = _normalised(out, collapse=collapse, fuzzy=out["text"] is None)
|
|
616
|
+
norm_err = _normalised(err, collapse=collapse, fuzzy=err["text"] is None)
|
|
617
|
+
|
|
618
|
+
# 2. Runner, summary, allocation. The summary is measured first so the
|
|
619
|
+
# streams are allocated what is left of the budget.
|
|
620
|
+
runner = detect_runner(cmd, norm_out["text"] or norm_out["head"] + norm_out["tail"],
|
|
621
|
+
norm_err["text"] or norm_err["head"] + norm_err["tail"])
|
|
622
|
+
stats["runner"] = runner
|
|
623
|
+
summary = ""
|
|
624
|
+
if runner and (out["lines"] + err["lines"]) > SUMMARY_MIN_LINES:
|
|
625
|
+
summary = structured_tail(runner, norm_out["lines"] + norm_err["lines"], result.get("exit_code"))
|
|
626
|
+
summary_bytes = len(summary.encode("utf-8", errors="replace"))
|
|
627
|
+
out_alloc, err_alloc = allocate(budget - summary_bytes, norm_out["bytes"], norm_err["bytes"])
|
|
628
|
+
|
|
629
|
+
# 3. A stream that does not fit is re-normalised with fuzzy duplicates,
|
|
630
|
+
# then shaped around its priority regions.
|
|
631
|
+
if collapse and norm_out["text"] is not None and norm_out["bytes"] > out_alloc:
|
|
632
|
+
norm_out = _normalised(out, collapse=True, fuzzy=True)
|
|
633
|
+
if collapse and norm_err["text"] is not None and norm_err["bytes"] > err_alloc:
|
|
634
|
+
norm_err = _normalised(err, collapse=True, fuzzy=True)
|
|
635
|
+
for key in ("ansi_stripped", "cr_collapsed", "dup_collapsed"):
|
|
636
|
+
stats[key] = norm_out["info"][key] + norm_err["info"][key]
|
|
637
|
+
stats["filtered"] = bool(stats["cr_collapsed"] or stats["dup_collapsed"])
|
|
638
|
+
|
|
639
|
+
prio_out = priority_regions(runner, norm_out["lines"]) if norm_out["lines"] else []
|
|
640
|
+
prio_err = priority_regions(runner, norm_err["lines"]) if norm_err["lines"] else []
|
|
641
|
+
stats["priority_lines"] = _region_line_count(prio_out) + _region_line_count(prio_err)
|
|
642
|
+
share = 1.0 if runner else 0.6
|
|
560
643
|
|
|
561
644
|
shaped_out, info_out = shape_stream(
|
|
562
|
-
full_text=
|
|
563
|
-
total_bytes=
|
|
564
|
-
output_id=output_id, focus=focus,
|
|
565
|
-
|
|
645
|
+
full_text=norm_out["text"], head=norm_out["head"], tail=norm_out["tail"],
|
|
646
|
+
total_bytes=norm_out["bytes"], total_lines=norm_out["total_lines"], alloc=out_alloc,
|
|
647
|
+
output_id=output_id, focus=focus, priority=prio_out, priority_share=share,
|
|
648
|
+
line_numbers=norm_out["numbers"], tail_line_numbers=norm_out["tail_numbers"])
|
|
566
649
|
if err["bytes"] > 0 or (err["text"] or "").strip():
|
|
567
650
|
shaped_err, info_err = shape_stream(
|
|
568
|
-
full_text=
|
|
569
|
-
total_bytes=
|
|
570
|
-
output_id=output_id, focus=focus
|
|
651
|
+
full_text=norm_err["text"], head=norm_err["head"], tail=norm_err["tail"],
|
|
652
|
+
total_bytes=norm_err["bytes"], total_lines=norm_err["total_lines"], alloc=err_alloc,
|
|
653
|
+
output_id=output_id, focus=focus, priority=prio_err, priority_share=share,
|
|
654
|
+
line_numbers=norm_err["numbers"], tail_line_numbers=norm_err["tail_numbers"])
|
|
571
655
|
else:
|
|
572
656
|
shaped_err, info_err = "", {"cut": False, "omitted_lines": 0, "omitted_bytes": 0,
|
|
573
|
-
"clipped_lines": 0, "rendered_bytes": 0}
|
|
657
|
+
"clipped_lines": 0, "rendered_bytes": 0, "priority_kept": 0}
|
|
574
658
|
|
|
575
659
|
cut = bool(info_out["cut"] or info_err["cut"])
|
|
576
660
|
stats["needs_spill"] = bool(stats["filtered"] or cut)
|
|
@@ -586,6 +670,14 @@ def render_shell_response(cmd: str, result: dict, svc, *,
|
|
|
586
670
|
else:
|
|
587
671
|
status = f"FAIL({result.get('exit_code')})"
|
|
588
672
|
|
|
673
|
+
collapsed_note = ""
|
|
674
|
+
if stats["filtered"]:
|
|
675
|
+
parts = []
|
|
676
|
+
if stats["cr_collapsed"]:
|
|
677
|
+
parts.append(f"{stats['cr_collapsed']} cr rewrites")
|
|
678
|
+
if stats["dup_collapsed"]:
|
|
679
|
+
parts.append(f"{stats['dup_collapsed']} dup lines")
|
|
680
|
+
collapsed_note = f" [collapsed {', '.join(parts)}]"
|
|
589
681
|
size_note = ""
|
|
590
682
|
if cut or stats["spilled"]:
|
|
591
683
|
size_note = (f" (stdout {human_bytes(out['bytes'])}/{out['lines']} lines,"
|
|
@@ -594,12 +686,14 @@ def render_shell_response(cmd: str, result: dict, svc, *,
|
|
|
594
686
|
|
|
595
687
|
body = (
|
|
596
688
|
f"{warn}{capped_note}"
|
|
597
|
-
f"[c3_shell:{status}] {result.get('duration_ms', 0)}ms{
|
|
689
|
+
f"[c3_shell:{status}] {result.get('duration_ms', 0)}ms{collapsed_note}{size_note}\n"
|
|
598
690
|
f"$ {cmd_display(cmd)}\n"
|
|
599
691
|
f"--- stdout ---\n{shaped_out.rstrip()}\n"
|
|
600
692
|
)
|
|
601
693
|
if shaped_err.strip():
|
|
602
694
|
body += f"--- stderr ---\n{shaped_err.rstrip()}\n"
|
|
695
|
+
if summary:
|
|
696
|
+
body += summary
|
|
603
697
|
dependency_hint = _dependency_hint(cmd, result)
|
|
604
698
|
if dependency_hint:
|
|
605
699
|
body += f"--- hint ---\n{dependency_hint}\n"
|