Files
kami 968cbfa973 fix(context,tools): context hygiene + tool ergonomics from freestyle QA
Found while live-QAing freestyle_planning on a 12B local model:

- list_dir tool: recursive, .gitignore-aware listing so weak models stop
  flooding context with `ls -R` over node_modules/build/dist. Wired into
  the fileRead toggle + advertised to the planner (architect_freestyle).
- ContextClassifier: assistantToolCall turns are STRUCTURED, so the token
  pruner never shreds the model's own tool-call history — that was causing
  amnesia loops (re-issuing calls it had already made).
- Retire instruction-doc LLMLingua pruning (DOC_SOURCE_TYPES emptied): it
  fused load-bearing procedural text into unparseable soup. The static
  block stays small by dropping CLAUDE.md at the loader instead.
- AgentInstructionsLoader: load only AGENTS.md, not CLAUDE.md — the latter
  targets the outer assistant and polluted the agent's stage context.
- DefaultSessionReducer: WorkflowFailed flips session status to FAILED (was
  stuck ACTIVE forever, so clients/approval loops never saw a terminal).
- ShellTool: run shell command lines (cd/&&/pipes) via `sh -c`; unrunnable
  program is recoverable instead of an uncaught IOException killing the
  stage; malformed argv (non-string/collapsed-array) rejected with guidance.
- llmlingua sidecar: cap force_tokens to max_force_token (big docs blew the
  assert and 500'd, so doc pruning silently failed open).

Tests added/updated across all of the above.
2026-07-02 00:44:04 +04:00
..

LLMLingua-2 token-pruning sidecar

Prunes low-perplexity tokens from freeform prose before it hits the local LLM, so more usable context fits a bounded window. Implements pipeline stage 3 (TOKEN_PRUNE, level 3+) — see docs/plans/correx-compression-pipeline.md §4.

Python-only because LLMLingua-2 is a torch/BERT classifier with no JVM equivalent. correx calls it over localhost HTTP via HttpTokenPruner, which fails open: if this sidecar is down, the kernel passes context through uncompressed. Nothing breaks; you just don't get token pruning.

Run

cd sidecars/llmlingua
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn server:app --host 127.0.0.1 --port 8199

First /prune call downloads the model (~1-2 GB) and loads torch; /health responds immediately.

Wire into correx

Set compression level ≥ 3 for the workflow and point the kernel at the sidecar:

[compression]
level = 4
token_pruner_url = "http://127.0.0.1:8199"

API

  • GET /health{"status":"ok"}
  • POST /prune {"text": str, "protected": [str], "rate": 0.55}{"compressed": str}
    • rate = fraction of tokens to keep (0.55 ≈ 45% compression)
    • protected substrings (IDs, numbers, paths, code) are kept verbatim