June 22, 2026
search hang fix, browser style verb, provider timeout guard
The search_files tool was reworked around four problems
The search_files tool was reworked around four problems. The directory walk now prunes /proc, /sys, /dev and skips every non-regular file before reading, so a grep can no longer park forever opening a FIFO, socket, device or broken symlink. The max_files cap is gone; output is paginated at five results per page, where a result is one matched line for grep or one file for glob. The full result list is cached to /tmp/
Provider completions can hang indefinitely and the per-platform SDK timeouts (anthropic/openai 120s, ollama 60s) don’t reliably cap a stalled stream. Providers.send now runs the single client.send(dto) call on a daemon thread joined with a SINGLE_CALL_TIMEOUT_S of 300s, abandoning the call on expiry and surfacing it as a ProviderResponseError. The per-client timeouts are removed so this wrapper is the sole provider call timeout, uniform across every provider. Ollama’s 5s /api/show metadata probes keep their own timeout since they run outside the wrapped send during pre-flight.
The persistent-page browser tool gains a tenth flat verb: style. It resolves an element by its visible text (the same locator click uses) and reads its computed CSS in-page via getComputedStyle, returning a flat map of color, background-color, border-color and font properties. Colours come back as exact rgb() values, so a model answering “what colour is X” gets a precise value directly. The live e2e flow now drives open->read->find->click->back->style->screenshot against the converged db fixture.
The web-browse delegate prompt was rewritten to drive the browser in the fewest steps and bail with an error rather than grinding. The screenshot guardrail moved fully into the system prompt so the per-turn user message carries only state (goal + screenshot ledger + act-trail). Screenshots now self-describe through the existing ingest_file pipeline: the describe_image description stored as clean_text is surfaced inline as data[‘vision’], so the delegate sees the page directly instead of looping on doc_id-only output. Ingest hardening catches a vision-provider failure into status=‘failed’ with no error key, gating on status != ‘ready’ and guarding a missing document record. Caller-facing guidance now recommends one narrow concrete goal per subagent and firing several in parallel.
Boot was hanging the ‘Waking up Chalie’ splash for 120s on every refresh because onnxruntime was only ever pulled transitively and the self-heal install failed instantly with the container network not yet up, pinning the runtime to ‘failed’ for the process life. pyproject now declares onnxruntime>=1.20.0 as an explicit base dependency, so the CPU runtime is always installed by ‘uv pip install -e backend’ independent of any transitive pull. runtime_deps_service retries the CPU-wheel install up to three times with backoff so a transient boot-time failure recovers instead of becoming permanent.
The typing-gate completeness test walked os.listdir(backend) and broke on local non-source artifacts like chalie.egg-info editable-install output and an untracked docs/ tree. A new _tracked_entries() helper measures only git-tracked top-level entries, matching the gate’s semantic of first-party source. Build artifacts and untracked clutter are excluded by construction; tracked py-free dirs are kept. The accompanying docs note the gate measures only git-tracked entries.
-
search_files hangs eliminated by pruning /proc, /sys, /dev and skipping non-regular files; results paginated at 5/page and cached to /tmp/
.json with a 10-minute TTL -
SINGLE_CALL_TIMEOUT_S = 300s daemon-thread guard replaces per-platform SDK timeouts as the sole provider call timeout
-
browser gains a tenth
styleverb returning exact rgb()/px computed CSS resolved by visible text -
web-browse delegate now self-describes screenshots via the existing ingest pipeline (vision surfaced inline) and runs on a leaner prompt that bails early
-
onnxruntime pinned as explicit base dep with a 3x backoff retry in runtime_deps_service to unstick /ready when boot-time install fails
-
typing-gate roster test now counts only git-tracked top-level entries via _tracked_entries()