-
v0.9.0 Stable
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
HtmlCleanersanitizes fetched content down to core tags and visible text;fetch_web_contentanddownload_filesupport an opt-outcleanHtmlparameter (default on) via the new jsoup dependency. - In-Content Search:
fetch_web_contentnow supportssearchQuerywith 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/maxEntriesacross fetch, read, run-command, list, and search tools, with structured truncation notices. - Git-Style Unified Diff:
edit_filedry 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;
SearchTextToolgained configurable timeouts with graceful partial-result feedback. - Case-Sensitive File Matches:
SearchFilesToolaccepts acaseSensitiveflag via a newConfigurableGlobMatcher. - 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
RetryLLMApiClientadds 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
TurnControlSignalenables 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/errorDetailsare 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, andwebAppmodules; the sharedappmodule is now a KMP library. - Tool-Call Architecture: Removed
ToolCallArgumentNormalizerand its code paths, simplifying context-building and replay logic. - OpenRouter Integration: Centralized
OpenRouterClientInfoattribution 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-logiccaches can be redirected outside the repo viaCHATBOT_GRADLE_ROOTorlocal.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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- HTML Cleaning for Web Tools: New