Repository navigation
ThinkWatch v3.7.1
Images
ghcr.io/thinkwatchproject/think-watch-server:3.7.1ghcr.io/thinkwatchproject/think-watch-web:3.7.1
Helm
helm install think-watch ./think-watch-3.7.1.tgz \
--namespace thinkwatch --create-namespaceTool-call inspection no longer crashes on a URL written right after a
non-ASCII character, which cut streamed answers off, and redacted values
come back exactly as the caller sent them. The thinkwatch-core crates move
from v0.71.0 to v0.72.0.
Fixed
-
A tool call with a URL right after a non-ASCII character no longer
breaks the answer. Tool-call inspection, on in observe mode by default,
looks for URLs in the arguments of the tool calls an upstream returns.
When a non-ASCII character stood directly before a URL, as in
文档见:https://…, finding the URL's scheme cut that character in two
and the gateway panicked. A streamed answer stopped partway, with no
error event and no end of stream, and the request was logged with status
499 andclient_cancelled, as if the client had left; on the Responses
WebSocket the whole connection closed. A whole answer was refused with a
500 whose body isService panicked, and logged with status 499 as
cancelled before the response. No tool-call event was written for that
call. Rust's panic message (… is not a char boundary …, at tw-guard's
tools/net.rs) went to standard error, and for a whole answer the
gateway's log also has aService panickederror. Affected since 3.0.0. -
Redacted values come back exactly as the caller sent them. With
outbound redaction in enforce mode, a value is now remembered as it
reads rather than as the request's JSON wrote it, and is escaped for each
place it goes back into. A value holding characters that JSON writes
with an escape, such as the line breaks of a private key, a quote or a
backslash, came back wrong:- In a streamed answer, put back into text (the answer's own, or the
input of a freeform tool such as Codex'sapply_patch), a private key
arrived with\nin place of each line break. - In a whole answer, including one served from the cache, such a value
inside a tool call's arguments, which are JSON written into a JSON
string, was escaped once instead of twice, so the arguments the client
received did not parse, or parsed to a different value.
A placeholder split across two pieces of a freeform tool's streamed
input (response.custom_tool_call_input.delta) also reached the client
as written; it is now put back. - In a streamed answer, put back into text (the answer's own, or the
Changed
- thinkwatch-core crates (tw-bedrock, tw-breaker, tw-dialect, tw-guard)
v0.71.0 → v0.72.0. Only tw-guard changes.