Repository navigation
ThinkWatch Core 0.72.0
This release fixes a crash that cut off streamed answers whose tool calls had a URL right after a non-ASCII character, records the cause when the gateway's code fails during a request, and makes redacted values come back exactly as they were in every kind of answer.
Upgrade notes
- The control-plane protocol version stays at 47; ThinkWatch Lite releases that include 0.71.0 connect to 0.72.0 and the other way round.
- The request store's schema and the configuration are unchanged; nothing is cleared.
- New message code:
gw.internal_panic. - For crates that embed the gateway:
tw_guard::redact::replace::restore_jsonis removed (restorenow escapes each value as deeply as it sits), and the ledger (Ledger::table,replacements,placeholder_of) holds decoded values. New:replace::Form,json_escaped,apply_text,restore_text,stream::Restorer::text,Restorer::fresh_as,Restorer::rebookandsse::FrameRestorer::rebook.
Tool calls with a URL after non-ASCII text no longer break the stream. Tool-call inspection looks for URLs in a tool call's arguments while they stream, and it is on in observe mode by default. Finding a URL's scheme cut a multibyte character in two when one stood right before the URL, such as Chinese text followed by a full-width colon and a link, and the gateway's code panicked: the client's stream ended with a transport error and the request was recorded as interrupted by an internal error. The scheme is now found byte by byte. Masking credentials in URLs on configuration lines had the same flaw and is fixed too. The fault dates from 0.58.0.
Internal errors say where and why. When the gateway's code panics during a request, the request's outcome now carries the panic's message and its place in the source (gw.internal_panic), and the panic is logged; before, it only said the request was interrupted by an error inside the gateway. Data that the standard library prints into some panic messages is left out.
Redacted values come back exactly. A value found in a request is now remembered as it reads, not as it was written in the request's JSON, and is put back in the form each place needs:
- A private key echoed in a streamed answer comes back with real line breaks instead of
\n. - A value inside a tool call's arguments, which are JSON text inside JSON, is escaped for every level it sits in, however deep, in streamed answers, whole answers, replays and WebSocket frames, so the arguments still parse.
- Codex's freeform tool input (such as
apply_patch) is restored while it streams, including a placeholder cut across two pieces. - Over WebSocket, a placeholder cut across two frames is restored, also when the client sends a new value while the answer streams; what is still held when the upstream disconnects goes through the same renaming, reply plugins and tool-call inspection as the rest of the answer.
- The same value seen in a request's JSON and in the decoded text a plugin reads now has one placeholder number, and a stored request shows the placeholder upstream received even when the client wrote the value with escapes such as
\u00e9or\/.
Bodies with nothing to restore are passed on unchanged, byte for byte.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.72.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.72.0An installation made with the script switches to 0.72.0 with:
sudo twcore upgrade --version 0.72.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
Verifying a download
A .sha256 file holds the SHA-256 of the file followed by its name. With both files in the current directory, on Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
- fix(gateway): say where and why the gateway panicked in the request's outcome by @fylorn in #332
- fix(guard): do not split a character when finding a URL's scheme by @fylorn in #333
- v0.72.0: restore redacted values in the form and depth each place needs by @fylorn in #334
Full Changelog: v0.71.0...v0.72.0