From 3f8f26ad06b8d52008847fa7772085fe948919cb Mon Sep 17 00:00:00 2001 From: fylorn <249551762+fylorn@users.noreply.github.com> Date: Sat, 3 Oct 2026 22:53:00 +0800 Subject: [PATCH] chore: v0.60.0 Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 38 +++++++++++++++++++------------------- Cargo.toml | 2 +- release-notes/0.60.0.md | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 release-notes/0.60.0.md diff --git a/Cargo.lock b/Cargo.lock index 4b70b57..d83b5a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3143,7 +3143,7 @@ dependencies = [ [[package]] name = "tw-api" -version = "0.59.0" +version = "0.60.0" dependencies = [ "serde", "serde_json", @@ -3154,7 +3154,7 @@ dependencies = [ [[package]] name = "tw-bedrock" -version = "0.59.0" +version = "0.60.0" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -3175,7 +3175,7 @@ dependencies = [ [[package]] name = "tw-breaker" -version = "0.59.0" +version = "0.60.0" dependencies = [ "serde", "serde_json", @@ -3183,7 +3183,7 @@ dependencies = [ [[package]] name = "tw-config" -version = "0.59.0" +version = "0.60.0" dependencies = [ "blake3", "libc", @@ -3208,7 +3208,7 @@ dependencies = [ [[package]] name = "tw-control" -version = "0.59.0" +version = "0.60.0" dependencies = [ "axum", "base64", @@ -3249,7 +3249,7 @@ dependencies = [ [[package]] name = "tw-dialect" -version = "0.59.0" +version = "0.60.0" dependencies = [ "serde", "serde_json", @@ -3257,7 +3257,7 @@ dependencies = [ [[package]] name = "tw-engine" -version = "0.59.0" +version = "0.60.0" dependencies = [ "serde", "serde_json", @@ -3270,7 +3270,7 @@ dependencies = [ [[package]] name = "tw-gateway" -version = "0.59.0" +version = "0.60.0" dependencies = [ "arc-swap", "async-stream", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "tw-guard" -version = "0.59.0" +version = "0.60.0" dependencies = [ "base64", "bytes", @@ -3334,7 +3334,7 @@ dependencies = [ [[package]] name = "tw-link" -version = "0.59.0" +version = "0.60.0" dependencies = [ "serde", "serde_json", @@ -3348,7 +3348,7 @@ dependencies = [ [[package]] name = "tw-observe" -version = "0.59.0" +version = "0.60.0" dependencies = [ "tokio", "tracing", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "tw-plugin" -version = "0.59.0" +version = "0.60.0" dependencies = [ "libc", "rand 0.10.2", @@ -3372,7 +3372,7 @@ dependencies = [ [[package]] name = "tw-pricing" -version = "0.59.0" +version = "0.60.0" dependencies = [ "arc-swap", "flate2", @@ -3385,14 +3385,14 @@ dependencies = [ [[package]] name = "tw-secret" -version = "0.59.0" +version = "0.60.0" dependencies = [ "thiserror", ] [[package]] name = "tw-store" -version = "0.59.0" +version = "0.60.0" dependencies = [ "blake3", "bytes", @@ -3412,7 +3412,7 @@ dependencies = [ [[package]] name = "tw-types" -version = "0.59.0" +version = "0.60.0" dependencies = [ "serde", "serde_json", @@ -3421,7 +3421,7 @@ dependencies = [ [[package]] name = "tw-watch" -version = "0.59.0" +version = "0.60.0" dependencies = [ "notify", "tempfile", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "tw-yaml" -version = "0.59.0" +version = "0.60.0" dependencies = [ "saphyr-parser", "serde_yaml_ng", @@ -3441,7 +3441,7 @@ dependencies = [ [[package]] name = "twcore" -version = "0.59.0" +version = "0.60.0" dependencies = [ "anyhow", "axum", diff --git a/Cargo.toml b/Cargo.toml index 924493a..138c6bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,7 @@ categories = ["network-programming", "web-programming::http-server"] # 二进制走 CalVer,crate 走 SemVer —— 两者是两回事,卖给不同的人。 # 这里是 crate 的版本。 -version = "0.59.0" +version = "0.60.0" [workspace.dependencies] # ── 内部 crate ─────────────────────────────────────────── diff --git a/release-notes/0.60.0.md b/release-notes/0.60.0.md new file mode 100644 index 0000000..a615f9e --- /dev/null +++ b/release-notes/0.60.0.md @@ -0,0 +1,19 @@ +This release gives client helper requests two modes instead of three: answered locally, or forwarded. A forwarded helper request goes through the routing rules like any other request and carries its class, so a rule with `when.intent` takes effect as soon as it is written. An older core no longer clears a request history written by a newer one. + +**Upgrade notes** + +- The control-plane protocol version (`CONTROL_API_VERSION`) goes from 35 to 36. ThinkWatch Lite connects only to a core with the same protocol version. ThinkWatch Lite 2026.10.1 includes 0.59.0 (protocol 35) and does not connect to 0.60.0. A server used with it stays on 0.59.0 until the app is updated to a release that includes 0.60.0; `sudo twcore upgrade --version 0.59.0 --restart` switches a server back. +- The request store's schema is unchanged (25): upgrading from 0.59.0 keeps the request history. +- **`client_probes` takes `intercept` or `forward`.** `passthrough` and `route` are gone, and a configuration that still sets either does not load. Change them to `forward`, or delete the line: health checks and warm-ups default to `intercept`, titles, topic detection and suggestions to `forward`. A configuration that never set `client_probes` is not affected. +- Changed in the protocol: + - `ProbeMode` is `intercept` | `forward`. + - `DryRunOutcome` no longer has `passthrough`. A dry run of a forwarded helper request evaluates the rules and ends in `route`, `deny`, `no_match` or `unavailable`, like any other request. + - `RouteSave.route_probes` is removed. Saving a route no longer changes `client_probes`. +- Message codes, compared with 0.59.0: `control.unknown_probe_class` is removed, along with `route_probes`. No code is added and no sentence changes. + +**Helper requests.** Clients such as Claude Code send requests of their own: health checks, warm-ups, session titles, topic detection and suggestions. `passthrough` and `route` both sent such a request through the routing rules. They differed only in whether it carried its class, and so in whether a `when.intent` condition could match it. The names suggested that `passthrough` skipped routing, and the dry run said so too: it stopped before the rules and reported `passthrough`, while the gateway evaluated the rules for that request like for any other. +- `forward` replaces both. The request carries its class, so `when: { intent: titling }` or `when: { intent: assistant_internal }` matches it without any other setting. +- `intercept` is unchanged: the gateway answers the request itself, nothing is sent upstream, and no rule is evaluated. A `when.intent` condition never matches a class set to `intercept`. +- Defaults are unchanged in effect: health checks and warm-ups are answered locally; titles, topic detection and suggestions are forwarded. + +**Request history across versions.** Core rebuilt the request store, bodies included, whenever its schema differed from the build's own, in either direction. An older core opening a store written by a newer one therefore cleared a history the newer version would have read again: after installing an older release over a newer one, or with a second copy of the app on the same machine that has not updated yet. Now only an older store is rebuilt. A newer one is left as it is: core records nothing while it runs, forwarding is unaffected, `/storage` reports `recording: false`, and the newer version opens the store unchanged later.