v0.3.43

RightNow-AI/openfangv0.3.43Mar 10, 2026by jaberjaber23

AI Summary

Fixes critical crashes related to decompression, UTF-8 handling, and configuration persistence to ensure stability with CJK characters and finance data sources.

Key Highlights

  • Gzip/deflate/brotli decompression enabled for web_fetch to fix panics.
  • UTF-8 boundary panic fixed for CJK characters across 6 crates.
  • Gemini tool schema rejection fixed by extending schema normalizer.
  • Hourly token rate limit made configurable via `default_max_llm_tokens_per_hour`.
  • Voice messages lost bug fixed by enabling concurrent bridge dispatch.

New Features

  • Configurable hourly token rate limit exposed in dashboard API.
  • Safe string truncation functions added for CJK character safety.

Full Release Notes

7 bug fixes — 21 files changed, 1994 tests passing

**#496 — web_fetch panics on gzip responses:**
Enabled gzip/deflate/brotli decompression in reqwest. Fixed unsafe byte-index string truncation with safe_truncate_str. Finance sites (Yahoo Finance, Bloomberg, etc.) now work.

**#490 — UTF-8 boundary panic with CJK characters:**
Fixed 9 string slicing sites across 6 crates that panicked when byte index fell inside multi-byte UTF-8 characters (CJK = 3 bytes, emoji = 4 bytes). All now use char-boundary-safe truncation. 4 new CJK tests.

**#488 — Gemini tool schema still rejects oneOf/const/type-array:**
Extended schema normalizer to strip const, format fields. Handle oneOf same as anyOf (flatten or strip). Flatten type arrays like ["string","null"] to single type + nullable. 10 new tests.

**#500 — Hourly token rate limit not configurable:**
Added [budget] default_max_llm_tokens_per_hour to config.toml (0 = unlimited). Exposed in GET/PUT /api/budget API and dashboard. Per-agent override via PUT /api/budget/agents/{id}.

**#479 — Empty response with local LLM (LM Studio/Qwen3):**
Capture reasoning_content field from local LLMs (Qwen3, DeepSeek-R1). Extract <think> tags from inline content. Synthesize response from thinking when content is empty. Synthetic usage guard prevents false "silent failure" retries. 10 new tests.

**#495 — Voice messages lost when sent quickly:**
Bridge dispatch is now concurrent (tokio::spawn + Semaphore(32)) instead of sequential await. Per-agent message lock in kernel ensures session integrity while allowing parallel dispatch across agents.

**#494 — Custom model API keys lost on reload:**
resolve_driver() now checks both boot-time config AND runtime model catalog for provider URLs. Custom providers added via dashboard now resolve correctly. Fixed delete_provider_key for unknown providers.