From 4f9d727a1e43742db900bb51ed851a4ede0ce03e Mon Sep 17 00:00:00 2001 From: fylorn <249551762+fylorn@users.noreply.github.com> Date: Mon, 12 Oct 2026 17:25:11 +0800 Subject: [PATCH 1/2] 2026.10.18: pin core v0.72.0; release notes and version Core 0.72.0: tool calls with a URL right after non-ASCII text no longer crash the stream; internal errors say what failed and where (gw.internal_panic, translated); redacted values come back in the form and depth each place needs. Co-Authored-By: Claude Opus 5.5 --- package.json | 2 +- release-notes/2026.10.18.md | 13 +++++++++++++ src-tauri/Cargo.lock | 30 +++++++++++++++--------------- src-tauri/Cargo.toml | 14 +++++++------- src-tauri/tauri.conf.json | 2 +- src/i18n/core.zh.json | 1 + 6 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 release-notes/2026.10.18.md diff --git a/package.json b/package.json index 59cd1730..af275ae2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "thinkwatch-lite", "private": true, "description": "Desktop app for a local AI API gateway on macOS, Windows and Linux", - "version": "2026.10.17", + "version": "2026.10.18", "type": "module", "packageManager": "pnpm@11.13.0", "scripts": { diff --git a/release-notes/2026.10.18.md b/release-notes/2026.10.18.md new file mode 100644 index 00000000..c784b208 --- /dev/null +++ b/release-notes/2026.10.18.md @@ -0,0 +1,13 @@ +**Upgrade notes:** +- The bundled core is now 0.72.0, with control-plane protocol 47 as before. A remote server on core 0.71.0 or 0.72.0 keeps working. +- Nothing is cleared; the request history, stored payloads and settings carry over. + +**Fixed:** +- A tool call whose arguments had a URL right after a non-ASCII character, as in `文档见:https://…`, no longer ends the answer early. Tool-call inspection, on in observe mode by default, crashed on such text while the answer streamed: Codex reported `stream disconnected before completion`, and the request was recorded as interrupted by an error inside the gateway. +- When the gateway's own code fails during a request, the request's error now says what failed and where, instead of only that the request was interrupted. + +**Outbound redaction (Replace mode):** +- A private key echoed in an answer comes back with real line breaks instead of `\n`. +- A value inside a tool call's arguments is put back so the arguments still parse, in streamed and whole answers, replays and WebSocket connections. +- Codex's freeform tool input, such as `apply_patch`, is restored while it streams, and over WebSocket a placeholder cut across two messages is restored. +- A stored request shows the placeholder the upstream received, also when the client wrote the value with escapes such as `é` or `\/`. diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index f93aebbb..292a5939 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4832,7 +4832,7 @@ dependencies = [ [[package]] name = "thinkwatch-lite" -version = "2026.10.17" +version = "2026.10.18" dependencies = [ "anyhow", "block2", @@ -5335,8 +5335,8 @@ dependencies = [ [[package]] name = "tw-api" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "serde", "serde_json", @@ -5347,8 +5347,8 @@ dependencies = [ [[package]] name = "tw-dialect" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "memchr", "serde", @@ -5357,8 +5357,8 @@ dependencies = [ [[package]] name = "tw-guard" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "base64 0.22.1", "bytes", @@ -5374,8 +5374,8 @@ dependencies = [ [[package]] name = "tw-link" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "serde", "serde_json", @@ -5401,8 +5401,8 @@ dependencies = [ [[package]] name = "tw-types" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "serde", "ts-rs", @@ -5410,8 +5410,8 @@ dependencies = [ [[package]] name = "tw-watch" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "libc", "notify", @@ -5421,8 +5421,8 @@ dependencies = [ [[package]] name = "tw-yaml" -version = "0.71.0" -source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.71.0#911f9373bdbc4e39c37f25408aa802f3c4a32028" +version = "0.72.0" +source = "git+https://github.com/ThinkWatchProject/ThinkWatch-Core.git?tag=v0.72.0#226a9bd816d2c1aa81c5bc6bf0eca6ea79cbe383" dependencies = [ "saphyr-parser", "thiserror 2.0.21", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 244087b8..c0f4016c 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "thinkwatch-lite" -version = "2026.10.17" +version = "2026.10.18" edition = "2024" # **这个数决定依赖能升到哪一版。**edition 2024 的解析器只挑声明的 Rust # 版本编得动的依赖:写 1.85 的时候,`cargo update` 一直停在旧的 time 和 @@ -26,12 +26,12 @@ license = "MIT" # twcore 二进制必须和这里编译进去的协议镜像来自同一个 core 版本 —— 打包脚本正是 # 从 tw-api 锁到的 tag 去取二进制的(见 scripts/fetch-core.sh)。 [workspace.dependencies] -tw-api = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.71.0" } -tw-types = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.71.0" } -tw-yaml = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.71.0" } -tw-guard = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.71.0" } -tw-watch = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.71.0" } -tw-link = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.71.0" } +tw-api = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.72.0" } +tw-types = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.72.0" } +tw-yaml = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.72.0" } +tw-guard = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.72.0" } +tw-watch = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.72.0" } +tw-link = { git = "https://github.com/ThinkWatchProject/ThinkWatch-Core.git", tag = "v0.72.0" } [lib] name = "thinkwatch_lite_lib" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index fadd83fc..909cd0bb 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "ThinkWatch Lite", - "version": "2026.10.17", + "version": "2026.10.18", "identifier": "app.thinkwatch.lite", "build": { "beforeDevCommand": "pnpm dev", diff --git a/src/i18n/core.zh.json b/src/i18n/core.zh.json index 56046cd8..6ce53549 100644 --- a/src/i18n/core.zh.json +++ b/src/i18n/core.zh.json @@ -317,6 +317,7 @@ "lite.core_stopped": "core 在请求完成前停止运行,请求已中断。", "// ── gw:网关的数据面。这些话同时发给 AI 客户端和界面 ──────────────": "", "gw.internal": "请求被网关内部的错误中断。", + "gw.internal_panic": "请求被网关内部的错误中断:{detail}", "gw.auth.no_key": "请求未携带网关密钥。请将 config.yaml 的 clients 中的网关密钥配置到客户端。", "gw.auth.key_invalid": "网关密钥无效。请检查客户端配置中的密钥与 config.yaml 是否一致。", "gw.auth.key_disabled": "网关密钥「{key}」已停用。在应用的密钥页启用它即可恢复。", From 6cc1a2c0c23c648c6a046f8070c2f26abe70d148 Mon Sep 17 00:00:00 2001 From: fylorn <249551762+fylorn@users.noreply.github.com> Date: Mon, 12 Oct 2026 17:47:14 +0800 Subject: [PATCH 2/2] release notes 2026.10.18: keep the release page in English Co-Authored-By: Claude Opus 5.5 --- release-notes/2026.10.18.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release-notes/2026.10.18.md b/release-notes/2026.10.18.md index c784b208..b437d4ce 100644 --- a/release-notes/2026.10.18.md +++ b/release-notes/2026.10.18.md @@ -3,11 +3,11 @@ - Nothing is cleared; the request history, stored payloads and settings carry over. **Fixed:** -- A tool call whose arguments had a URL right after a non-ASCII character, as in `文档见:https://…`, no longer ends the answer early. Tool-call inspection, on in observe mode by default, crashed on such text while the answer streamed: Codex reported `stream disconnected before completion`, and the request was recorded as interrupted by an error inside the gateway. +- A tool call whose arguments had a URL right after a non-ASCII character, such as Chinese text followed by a full-width colon and a link, no longer ends the answer early. Tool-call inspection, on in observe mode by default, crashed on such text while the answer streamed: Codex reported `stream disconnected before completion`, and the request was recorded as interrupted by an error inside the gateway. - When the gateway's own code fails during a request, the request's error now says what failed and where, instead of only that the request was interrupted. **Outbound redaction (Replace mode):** - A private key echoed in an answer comes back with real line breaks instead of `\n`. - A value inside a tool call's arguments is put back so the arguments still parse, in streamed and whole answers, replays and WebSocket connections. - Codex's freeform tool input, such as `apply_patch`, is restored while it streams, and over WebSocket a placeholder cut across two messages is restored. -- A stored request shows the placeholder the upstream received, also when the client wrote the value with escapes such as `é` or `\/`. +- A stored request shows the placeholder the upstream received, also when the client wrote the value with escapes such as `\u00e9` or `\/`.