/tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-262- /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py:263: def apply_cached(self, messages: list[dict]) -> list[dict]: /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-264- """Return a new list with cached compressions swapped into tool results. /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-265- /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-266- Never mutates the input list or any message dict within it. /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-267- Output always has the same length as input. /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-268- """ /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-269- # `get_compressed` re-acquires the lock (RLock); single contiguous /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-270- # critical section so concurrent `store_compressed` cannot mutate /tmp/headv4/lib/python3.12/site-packages/headroom/cache/compression_cache.py-271- # `_cache` mid-iteration. -- /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-611- /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py:612: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-613- self, /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-614- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-615- provider: str = "openai", /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-616- ) -> list[dict[str, Any]]: /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-617- """Compress images in messages. /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-618- /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-619- Pipeline: /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-620- 1. Tile-boundary alignment (pure math, zero quality loss) -- /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-732- /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py:733:def compress_images( /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-734- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-735- provider: str = "openai", /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-736-) -> list[dict[str, Any]]: /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-737- """Convenience function to compress images in messages. /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-738- /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-739- Args: /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-740- messages: LLM messages /tmp/headv4/lib/python3.12/site-packages/headroom/image/compressor.py-741- provider: Target provider -- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-15- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py:16:class PipelineStage(str, Enum): /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-17- """Stable lifecycle stages for the canonical Headroom pipeline.""" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-18- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-19- SETUP = "setup" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-20- PRE_START = "pre_start" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-21- POST_START = "post_start" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-22- INPUT_RECEIVED = "input_received" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-23- INPUT_CACHED = "input_cached" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-24- INPUT_ROUTED = "input_routed" -- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-47-@dataclass /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py:48:class PipelineEvent: /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-49- """Event emitted at a canonical pipeline stage. /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-50- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-51- Extensions may mutate ``messages``, ``tools``, ``headers``, or ``metadata`` in /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-52- place, or return a replacement ``PipelineEvent`` from ``on_pipeline_event``. /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-53- """ /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-54- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-55- stage: PipelineStage /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-56- operation: str -- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-66- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py:67:class PipelineExtension(Protocol): /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-68- """Request lifecycle extension contract for the canonical pipeline.""" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-69- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-70- def on_pipeline_event(self, event: PipelineEvent) -> PipelineEvent | None: /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-71- """Handle a canonical pipeline event.""" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-72- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-73- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-74-def discover_pipeline_extensions() -> list[PipelineExtension]: /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-75- """Load registered pipeline extensions from Python entry points.""" -- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-108- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py:109:class PipelineExtensionManager: /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-110- """Dispatch canonical pipeline events to configured extensions.""" /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-111- /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-112- def __init__( /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-113- self, /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-114- *, /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-115- hooks: Any = None, /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-116- extensions: list[Any] | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/pipeline.py-117- discover: bool = True, -- /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-86- @property /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py:87: def compression_benchmarks(self) -> list[BenchmarkRunResult]: /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-88- """Benchmarks measuring compression accuracy.""" /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-89- return [b for b in self.benchmarks if b.accuracy_rate is not None] /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-90- /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-91- @property /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-92- def all_passed(self) -> bool: /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-93- return all(b.passed for b in self.benchmarks) /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-94- /tmp/headv4/lib/python3.12/site-packages/headroom/evals/reports/report_card.py-95- @property -- /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-147- /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py:148:def apply_mutations(manifest: DeploymentManifest) -> list[ManagedMutation]: /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-149- """Apply provider/user/system configuration for a deployment.""" /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-150- /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-151- mutations: list[ManagedMutation] = [] /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-152- if manifest.scope in {ConfigScope.USER.value, ConfigScope.SYSTEM.value}: /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-153- if os.name == "nt": /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-154- mutations.extend(_apply_windows_env_scope(manifest)) /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-155- else: /tmp/headv4/lib/python3.12/site-packages/headroom/install/providers.py-156- mutations.extend(_apply_unix_env_scope(manifest)) -- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-76-@dataclass /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py:77:class CompressConfig: /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-78- """User-facing compression options. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-79- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-80- Controls what gets compressed, how aggressively, and with which model. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-81- Pass to ``compress()`` or any integration that uses headroom. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-82- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-83- Examples:: /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-84- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-85- # Coding agent (default — skip user messages, protect recent) -- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-137-@dataclass /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py:138:class CompressResult: /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-139- """Result of compressing messages. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-140- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-141- Attributes: /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-142- messages: The compressed messages (same format as input). /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-143- tokens_before: Token count before compression. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-144- tokens_after: Token count after compression. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-145- tokens_saved: Tokens removed by compression. /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-146- compression_ratio: Ratio of tokens saved (0.0 = no savings, 1.0 = 100% removed). -- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-157- /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py:158:def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-159- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-160- model: str = "claude-sonnet-4-5-20250929", /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-161- model_limit: int = 200000, /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-162- optimize: bool = True, /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-163- hooks: Any = None, /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-164- config: CompressConfig | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-165- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/compress.py-166-) -> CompressResult: -- /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-407- /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py:408: def compression_saved(self) -> int: /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-409- """Tokens removed before model context by compression plus CLI filtering.""" /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-410- /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-411- return self.tokens_saved_compression + self.cli_filtering_saved() /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-412- /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-413- def total_savings_usd(self) -> float: /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-414- return self.compression_savings_usd + self.cache_savings_usd /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-415- /tmp/headv4/lib/python3.12/site-packages/headroom/subscription/models.py-416- def raw_without_headroom(self) -> int: -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-898- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py:899: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-900- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-901- code: str, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-902- language: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-903- context: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-904- tokenizer: Tokenizer | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-905- ) -> CodeCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-906- """Compress code while preserving syntax validity. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-907- -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1756- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py:1757: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1758- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1759- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1760- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1761- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1762- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1763- """Apply code-aware compression to messages. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1764- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1765- Handles both string content and Anthropic content block format -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1985- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py:1986:def compress_code( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1987- code: str, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1988- language: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1989- target_rate: float = 0.2, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1990- context: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1991-) -> str: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1992- """Convenience function for one-off code compression. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1993- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/code_compressor.py-1994- Args: -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-57- @property /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py:58: def compression_ratio(self) -> float: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-59- if self.original_line_count == 0: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-60- return 1.0 /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-61- return self.compressed_line_count / self.original_line_count /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-62- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-63- @property /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-64- def tokens_saved_estimate(self) -> int: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-65- lines_saved = self.original_line_count - self.compressed_line_count /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-66- chars_saved = lines_saved * 40 -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-104- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py:105: def compress(self, content: str, context: str = "") -> DiffCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-106- r = self._rust.compress(content, context) /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-107- cache_key: str | None = r.cache_key /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-108- if cache_key is not None: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-109- # Mirror log_compressor.py + search_compressor.py: when the /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-110- # Rust path emits a CCR retrieval marker, persist the /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-111- # original payload to Python's CompressionStore so the /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-112- # marker actually resolves on the LLM's retrieval tool /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-113- # call. Without this, every diff CCR marker emitted in -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-149- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py:150: def compress_with_stats( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-151- self, content: str, context: str = "" /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-152- ) -> tuple[DiffCompressionResult, Any]: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-153- """Sidecar API exposing the Rust-only `DiffCompressorStats` struct /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-154- (per-file hunk drops, context lines trimmed, file_mode normalizations, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-155- etc.) alongside the result. Stats is the raw PyO3 wrapper — no /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-156- Python equivalent to mirror to. Typed as `Any` because the PyO3 /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-157- class has no Python type stub. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/diff_compressor.py-158- """ -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-35- @abstractmethod /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py:36: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-37- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-38- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-39- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-40- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-41- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-42- """ /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-43- Apply the transform to messages. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/base.py-44- -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-592- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py:593: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-594- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-595- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-596- context: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-597- content_type: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-598- question: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-599- target_ratio: float | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-600- ) -> KompressResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-601- """Compress content using Kompress model. -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-760- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py:761: def compress_batch( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-762- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-763- contents: list[str], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-764- context: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-765- content_type: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-766- question: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-767- target_ratio: float | list[float | None] | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-768- batch_size: int = 32, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-769- ) -> list[KompressResult]: -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1074- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py:1075: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1076- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1077- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1078- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1079- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1080- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1081- """Apply Kompress compression to messages (Transform interface).""" /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1082- tokens_before = sum(tokenizer.count_text(str(m.get("content", ""))) for m in messages) /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/kompress_compressor.py-1083- transformed = [] -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-323- @property /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py:324: def compression_ratio(self) -> float: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-325- if self.original_tokens == 0: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-326- return 1.0 /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-327- return self.compressed_tokens / self.original_tokens /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-328- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-329- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-330-@dataclass /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-331-class ContentSection: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-332- """A typed section of content.""" -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-382- @property /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py:383: def compression_ratio(self) -> float: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-384- """Overall compression ratio.""" /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-385- if self.total_original_tokens == 0: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-386- return 1.0 /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-387- return self.total_compressed_tokens / self.total_original_tokens /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-388- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-389- @property /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-390- def tokens_saved(self) -> int: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-391- """Number of tokens saved.""" -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-854- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py:855: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-856- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-857- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-858- context: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-859- question: str | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-860- bias: float = 1.0, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-861- ) -> RouterCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-862- """Compress content using optimal strategy based on content detection. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-863- -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1800- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py:1801: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1802- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1803- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1804- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1805- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1806- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1807- """Apply intelligent routing to messages. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1808- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/content_router.py-1809- Args: -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-97- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py:98: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-99- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-100- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-101- frozen_message_count: int = 0, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-102- ) -> ReadLifecycleResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-103- """Apply lifecycle management to messages. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-104- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-105- Single-pass analysis, targeted replacement of stale/superseded Reads. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/read_lifecycle.py-106- -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-193- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py:194: def compress(self, content: str, context: str = "", bias: float = 1.0) -> LogCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-195- # `context` is unused upstream and unused here (Python original /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-196- # also didn't use it). Kept in the signature for drop-in compat. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-197- del context /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-198- rust_result = self._rust.compress(content, bias) /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-199- cache_key: str | None = rust_result.cache_key /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-200- if cache_key is not None: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-201- self._persist_to_python_ccr(content, rust_result.compressed, cache_key) /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/log_compressor.py-202- -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-136- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py:137: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-138- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-139- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-140- model: str, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-141- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-142- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-143- """ /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-144- Apply all transforms in sequence. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/pipeline.py-145- -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-265- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py:266: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-267- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-268- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-269- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-270- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-271- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-272- """Detect volatile content; emit warnings; never mutate messages. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-273- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/cache_aligner.py-274- Invariant: ``result.messages`` is byte-equal to the input -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-797- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py:798: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-799- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-800- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-801- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-802- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-803- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-804- """Transform-protocol entry point. Walks every tool/tool_result /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-805- message, applies SmartCrusher to large enough payloads, and /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/smart_crusher.py-806- replaces the message content with `\\n`. -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-168- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py:169: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-170- self, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-171- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-172- context: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-173- bias: float = 1.0, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-174- ) -> SearchCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-175- rust_result = self._rust.compress(content, context, bias) /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-176- cache_key: str | None = rust_result.cache_key /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/search_compressor.py-177- if cache_key is not None: -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-203- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py:204:def compress_unit_with_router( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-205- unit: CompressionUnit, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-206- *, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-207- router: ContentRouter, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-208- tokenizer: TokenCounterLike, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-209-) -> UnitCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-210- """Compress one safe text unit through ContentRouter. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-211- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-212- The final accept/reject gate uses the provider/model tokenizer, not the -- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-334- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py:335:def compress_units_with_router( /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-336- units: Iterable[RoutedCompressionUnit], /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-337- *, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-338- router: ContentRouter, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-339- tokenizer: TokenCounterLike, /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-340-) -> list[tuple[object, UnitCompressionResult]]: /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-341- """Compress provider-extracted units and preserve provider slot refs. /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-342- /tmp/headv4/lib/python3.12/site-packages/headroom/transforms/compression_units.py-343- Provider adapters use this when they have many candidate text slots in one -- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-217- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py:218: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-219- self, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-220- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-221- content_type: ContentType | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-222- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-223- ) -> CompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-224- """Compress content with structure preservation. /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-225- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-226- Args: -- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-384- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py:385: def compress_batch( /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-386- self, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-387- contents: list[str], /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-388- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-389- ) -> list[CompressionResult]: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-390- """Compress multiple contents. /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-391- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-392- More efficient than calling compress() in a loop for /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-393- ML detection. -- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-447- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py:448:def compress(content: str, **kwargs: Any) -> CompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-449- """Convenience function for one-off compression. /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-450- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-451- Args: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-452- content: Content to compress. /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-453- **kwargs: Passed to UniversalCompressor.compress(). /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-454- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-455- Returns: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/universal.py-456- CompressionResult. -- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-56- @property /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py:57: def compressible_count(self) -> int: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-58- """Number of compressible tokens.""" /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-59- return len(self.mask) - sum(self.mask) /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-60- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-61- def get_structural_tokens(self) -> list[str | int]: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-62- """Get list of tokens marked as structural.""" /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-63- return [t for t, m in zip(self.tokens, self.mask) if m] /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-64- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-65- def get_compressible_tokens(self) -> list[str | int]: -- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-194- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py:195:def apply_mask_to_text( /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-196- text: str, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-197- mask: StructureMask, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-198- compress_fn: Callable[[str], str], /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-199- tokenizer_decode: Callable[[Sequence[str | int]], str] | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-200-) -> str: /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-201- """Apply compression to non-structural regions of text. /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-202- /tmp/headv4/lib/python3.12/site-packages/headroom/compression/masks.py-203- This is the core function that enables structure-preserving compression. -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-111- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py:112: def apply_to_tags(self, tags: dict[str, str]) -> None: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-113- """Stamp the skip reason into a tags dict for dashboard slicing. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-114- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-115- Mutates ``tags`` in place. No-op when ``should_compress=True`` /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-116- — absence vs presence is the signal. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-117- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-118- Mirror of :meth:`CompressionDecision.apply_to_tags` and /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-119- :meth:`MemoryDecision.apply_to_tags`. Multiple decision tags /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/image_compression_decision.py-120- coexist in the same dict (``passthrough_reason``, -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-55- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py:56: def apply_to_text(self, text: str) -> str: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-57- """Bound a formatted injection block by ``max_tokens``. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-58- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-59- Truncation prefers line boundaries (memory entries are /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-60- line-delimited so the dashboard renders intact bullet points /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-61- rather than mid-word cuts). Empty input → empty output. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-62- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-63- This caps the OUTPUT block. The INPUT (the query going to the /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-64- embedder) is NOT truncated — that's MemoryQuery's contract. -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-78- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py:79: def apply_to_entries(self, entries: list[dict[str, Any]]) -> list[dict[str, Any]]: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-80- """Cap a list of ranked memory candidates by entry count + min similarity. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-81- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-82- Preserves order (assumes upstream has already ranked by /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-83- score). The budget does NOT re-rank — it only filters/caps. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-84- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-85- Filtering precedence: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-86- 1. Drop entries with ``score < min_similarity`` /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_injection.py-87- 2. Cap to ``max_entries`` -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-191- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py:192:def apply_to_messages( /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-193- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-194- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-195- *, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-196- frozen_count: int = 0, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-197-) -> InterceptionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-198- """Run every registered interceptor against every tool_result in `messages`. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-199- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-200- `frozen_count`: leading messages in the provider's prefix cache that -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-342- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py:343: def apply( /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-344- self, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-345- messages: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-346- tokenizer: Tokenizer, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-347- **kwargs: Any, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-348- ) -> TransformResult: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-349- # Measure the true baseline on the original messages — back-calculating /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-350- # from `tokens_after + sum(saved)` would double-count per-message /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/interceptors/base.py-351- # overhead that spans don't track. -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-130- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py:131: def apply_to_tags(self, tags: dict[str, str]) -> None: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-132- """Stamp the skip reason into a tags dict for dashboard slicing. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-133- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-134- Mutates ``tags`` in place. No-op when ``inject=True`` — /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-135- absence vs presence of ``memory_skip_reason`` is the signal. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-136- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-137- Mirror of :meth:`CompressionDecision.apply_to_tags`. Handlers /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-138- call this immediately after ``decide()`` so the resulting /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/memory_decision.py-139- ``RequestOutcome.tags`` carries memory observability via the -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-148- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py:149: def apply_to_tags(self, tags: dict[str, str]) -> None: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-150- """Stamp the passthrough reason into a tags dict for downstream /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-151- observability. /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-152- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-153- Mutates ``tags`` in place. No-op when ``should_compress=True`` /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-154- (compressing requests don't carry a ``passthrough_reason`` tag — /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-155- absence vs presence is itself the signal). /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-156- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/compression_decision.py-157- Handler call pattern, after ``CompressionDecision.decide(...)``:: -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2162- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py:2163:def apply_session_sticky_memory_tools( /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2164- *, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2165- provider: Literal["anthropic", "openai"], /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2166- session_id: str | None, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2167- request_id: str | None, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2168- existing_tools: list[dict[str, Any]] | None, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2169- memory_tools_to_inject: list[dict[str, Any]], /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2170- inject_this_turn: bool, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2171-) -> tuple[list[dict[str, Any]], bool]: -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2480- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py:2481:def apply_session_sticky_ccr_tool( /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2482- *, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2483- provider: Literal["anthropic", "openai", "google"], /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2484- session_id: str | None, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2485- request_id: str | None, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2486- existing_tools: list[dict[str, Any]] | None, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2487- has_compressed_content_this_turn: bool, /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2488-) -> tuple[list[dict[str, Any]], bool]: /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/helpers.py-2489- """Apply sticky-on CCR retrieval-tool injection per :class:`SessionCcrTracker`. -- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2910- @app.post("/v1/compress") /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py:2911: async def compress_messages(request: Request): /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2912- return await proxy.handle_compress(request) /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2913- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2914- register_provider_routes(app, proxy) /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2915- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2916- return app /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2917- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2918- /tmp/headv4/lib/python3.12/site-packages/headroom/proxy/server.py-2919-def _json_ready(value: Any) -> Any: -- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-67- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py:68:def apply_provider_scope_mutations(manifest: DeploymentManifest) -> list[ManagedMutation]: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-69- """Apply provider-scope mutations owned by provider slices.""" /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-70- mutations: list[ManagedMutation] = [] /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-71- for target in manifest.targets: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-72- handlers = _PROVIDER_SCOPE_HANDLERS.get(target) /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-73- if handlers is None: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-74- continue /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-75- mutation = handlers[0](manifest) /tmp/headv4/lib/python3.12/site-packages/headroom/providers/install_registry.py-76- if mutation is not None: -- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-19- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py:20:def apply_provider_scope(manifest: DeploymentManifest) -> ManagedMutation | None: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-21- """Apply Claude provider-scope configuration when requested.""" /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-22- if manifest.scope != ConfigScope.PROVIDER.value: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-23- return None /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-24- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-25- path = claude_settings_path() /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-26- path.parent.mkdir(parents=True, exist_ok=True) /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-27- payload: dict[str, object] = {} /tmp/headv4/lib/python3.12/site-packages/headroom/providers/claude/install.py-28- if path.exists(): -- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-63- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py:64:def apply_provider_scope(manifest: DeploymentManifest) -> ManagedMutation | None: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-65- """Apply Codex provider-scope configuration when requested.""" /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-66- if manifest.scope != ConfigScope.PROVIDER.value: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-67- return None /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-68- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-69- path = codex_config_path() /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-70- path.parent.mkdir(parents=True, exist_ok=True) /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-71- section = ( /tmp/headv4/lib/python3.12/site-packages/headroom/providers/codex/install.py-72- f"{_CODEX_MARKER_START}\n" -- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-23- /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py:24:def apply_provider_scope(manifest: DeploymentManifest) -> ManagedMutation: /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-25- """Configure OpenClaw to route through the persistent proxy.""" /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-26- if not shutil_which("openclaw"): /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-27- raise click.ClickException("openclaw not found in PATH; cannot apply provider scope.") /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-28- command = [ /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-29- *resolve_headroom_command(), /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-30- "wrap", /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-31- "openclaw", /tmp/headv4/lib/python3.12/site-packages/headroom/providers/openclaw/install.py-32- "--no-auto-start", -- /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-431- /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py:432:async def apply_copilot_api_auth(headers: dict[str, str], *, url: str) -> dict[str, str]: /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-433- """Replace Authorization with a fresh Copilot API token when targeting Copilot.""" /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-434- /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-435- resolved = dict(headers) /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-436- if not is_copilot_api_url(url): /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-437- return resolved /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-438- /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-439- token = await get_copilot_token_provider().get_api_token() /tmp/headv4/lib/python3.12/site-packages/headroom/copilot_auth.py-440- for key in list(resolved): -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-178- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py:179:def compress_tool_messages( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-180- messages: list[BaseMessage], # type: ignore[type-arg] /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-181- *, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-182- min_tokens_to_compress: int = 100, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-183- preserve_errors: bool = True, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-184- config: CompressToolMessagesConfig | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-185-) -> CompressToolMessagesResult: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-186- """Compress ToolMessage content in a list of LangChain messages. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-187- -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-381- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py:382: def compress_node(state: dict[str, Any]) -> dict[str, Any]: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-383- """LangGraph node that compresses ToolMessages in state. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-384- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-385- Args: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-386- state: LangGraph state dict containing a "messages" key. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-387- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-388- Returns: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-389- Updated state dict with compressed messages. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/langgraph.py-390- """ -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-43- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py:44: def compress_documents( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-45- self, documents: Sequence[Any], query: str, callbacks: Any = None /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-46- ) -> Sequence[Any]: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-47- raise NotImplementedError /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-48- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-49-# LangChain imports - these are optional dependencies /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-50-else: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-51- try: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-52- from langchain_core.callbacks import Callbacks -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-65- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py:66: def compress_documents( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-67- self, documents: Sequence[Any], query: str, callbacks: Any = None /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-68- ) -> Sequence[Any]: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-69- raise NotImplementedError /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-70- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-71- LANGCHAIN_AVAILABLE = True /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-72- except ImportError: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-73- LANGCHAIN_AVAILABLE = False /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-74- BaseDocumentCompressor = object # type: ignore[misc,assignment] -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-162- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py:163: def compress_documents( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-164- self, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-165- documents: Sequence[Document], /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-166- query: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-167- callbacks: Callbacks = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-168- ) -> Sequence[Document]: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-169- """Compress documents based on relevance to query. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-170- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/langchain/retriever.py-171- Args: -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-176- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py:177: def compress( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-178- self, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-179- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-180- tool_name: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-181- tool_args: dict[str, Any] | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-182- user_query: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-183- ) -> MCPCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-184- """Compress MCP tool output. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-185- -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-351- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py:352:def compress_tool_result( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-353- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-354- tool_name: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-355- tool_args: dict[str, Any] | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-356- user_query: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-357- config: HeadroomConfig | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-358-) -> str: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-359- """Compress an MCP tool result (standalone function). /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-360- -- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-397- /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py:398:def compress_tool_result_with_metrics( /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-399- content: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-400- tool_name: str, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-401- tool_args: dict[str, Any] | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-402- user_query: str = "", /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-403- config: HeadroomConfig | None = None, /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-404-) -> MCPCompressionResult: /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-405- """Compress an MCP tool result and return full metrics. /tmp/headv4/lib/python3.12/site-packages/headroom/integrations/mcp/server.py-406-