• v0.9.0 4cf6d86bd7

    v0.9.0 Stable

    rwachters released this 2026-08-06 18:58:50 +00:00 | 329 commits to master since this release

    📦 Release v0.9.0

    📝 Executive Summary

    Release v0.9.0 makes the builtin worker tools substantially more capable and safer, adding HTML cleaning, in-content search, unified output truncation, and stricter input validation, while introducing interactive turn control — pause/stop and cooperative cancellation — across the Worker, Server, and App. The release also adds LLM resilience features (retrying API client, embedded-error handling for OpenRouter) and restructures the client into platform-specific modules on an upgraded toolchain.

    🚀 What's New

    Worker (Builtin Tools)

    • HTML Cleaning for Web Tools: New HtmlCleaner sanitizes fetched content down to core tags and visible text; fetch_web_content and download_file support an opt-out cleanHtml parameter (default on) via the new jsoup dependency.
    • In-Content Search: fetch_web_content now supports searchQuery with regex/plain modes, case sensitivity, whole-word matching, context windows, and capped results for targeted text retrieval.
    • Unified Output Limits & Truncation: maxLines / maxBytes / range (line selection) / maxResults / maxEntries across fetch, read, run-command, list, and search tools, with structured truncation notices.
    • Git-Style Unified Diff: edit_file dry runs now show compact Git-compatible unified diffs instead of positional output.
    • Search Enhancements: Regex is the default search mode; overlapping context windows are compacted; SearchTextTool gained configurable timeouts with graceful partial-result feedback.
    • Case-Sensitive File Matches: SearchFilesTool accepts a caseSensitive flag via a new ConfigurableGlobMatcher.
    • Input Validation Overhaul: Consolidated validation helpers, accumulated multi-field error reporting, strict JSON parsing (rejecting literal control characters), and structured error diagnostics surfaced to the LLM.

    Server

    • LLM Resilience: New RetryLLMApiClient adds exponential backoff with jitter for streaming and non-streaming completions.
    • Streaming Error Handling: Embedded error chunks in otherwise-successful SSE streams (e.g., OpenRouter) are detected, surfaced as typed errors, and retried where appropriate.
    • Turn Control: A TurnControlSignal enables pausing and cancelling active chat turns, propagated through the orchestrator and WebSocket layer with proper cooperative cancellation.
    • Response Safety Limits: Byte and character caps on LLM responses with UTF-8 validation and truncation notices prevent unbounded allocations.
    • Structured Tool-Call Metadata: errorCode / errorDetails are persisted on tool calls and preserved through cloning and orchestration.
    • LLM-Safe Tool Naming: Tool name prefix validation and sanitization ensure provider-safe public names (underscore-based, dot removed).

    App

    • Turn Control UI: Pause and Stop controls in the chat input area; cancelled tool calls now render with clear visual and textual indicators.
    • Discoverable "Branch & Continue": Moved to the primary action row for direct access.
    • Faster Message Search: Optimized query handling with a minimum-query-length gate and tuned debounce.

    🐛 Bug Fixes & Improvements

    • EditFileTool: Exact character-by-character matching, normalized EOL handling, preserved indentation, and clarified zero-based edit indices produce predictable, consistent edits across platforms.
    • RunCommand: Updated schema default timeout (600s) and clearer validation guidance; empty/full command lines are rejected with actionable messages.
    • Approval Badges: Removed pulsing animation on static states, fixing an idle CPU usage issue in the desktop app.
    • WebSocket Cancellation: In-flight LLM requests and retry delays are cancelled with the websocket close, and expected CancellationExceptions no longer log as server errors.
    • Tool-Call Replay: Tool calls are replayed faithfully with arguments stored verbatim, improving reliability for interrupted/provisional calls.
    • Worker Workspace: Dedicated workspace directory is initialized and mounted for idempotent reuse in Docker deploys.

    🏗️ Technical Updates

    • Client Module Split: Upgraded to Gradle 9.6.1 with AGP 9.6.1 and split platform entry points into dedicated androidApp, desktopApp, and webApp modules; the shared app module is now a KMP library.
    • Tool-Call Architecture: Removed ToolCallArgumentNormalizer and its code paths, simplifying context-building and replay logic.
    • OpenRouter Integration: Centralized OpenRouterClientInfo attribution headers (HTTP-Referer, X-OpenRouter-Title, X-OpenRouter-Categories) added to requests; model discovery strategy and chat strategy updated accordingly.
    • Gradle Cache Externalization: Project and build-logic caches can be redirected outside the repo via CHATBOT_GRADLE_ROOT or local.gradle.properties, moved into wrapper launchers.
    • Test Refactoring: Split OpenAI strategy and Ktor client suites into focused request/response/streaming tests with shared base fixtures.
    • Documentation: Roadmap and issue tracking documentation updated, with the known-bugs list replaced by a dedicated known-issues document.
    • Docker/Deployment: Worker Docker image now uses a JDK base image with git; build script gains -NoPublish, ServerOnly/WorkerOnly, and production-tag detection modes; server dispatch timeout ceiling raised to 1 hour.
    Downloads