Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.25",
"version": "2026.10.26",
"type": "module",
"packageManager": "pnpm@11.13.0",
"scripts": {
Expand Down
24 changes: 24 additions & 0 deletions release-notes/2026.10.26.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
**Upgrade notes:**
- The bundled core is now 0.79.0 and the control-plane protocol is 51. A remote server running an older core must be upgraded to 0.79.0 to stay connected.
- Nothing is cleared; the request history, stored payloads and settings carry over.
- Settings > Failover: "Wait for a free slot at most" is now "Wait at most" and covers every kind of wait, with a default of 120 seconds. A configuration that set the old value (`failover.slot_wait_secs`) opens in safe mode; Fix removes it, and the new setting can then be set again.

**Rate limits no longer stop the agent:**
- When an upstream answers 429, the gateway pauses that upstream for the time it asks for (or backs off 5, 10, 20, 40, then 60 seconds) and holds its requests instead of returning the error. When the pause ends, one request goes first; the rest follow once it gets through. A request that can go to another upstream right away goes there.
- A conversation that stays on an upstream for its prompt cache waits for it when it can recover in time. A single upstream is waited for as well.
- Streaming clients receive their response and keep-alives while they wait, so an agent only sees a slower first token. Only after Settings > Failover > Wait at most does the client get a 429, with the time to retry.
- The Upstreams page tags an upstream that is waiting, such as "Rate limited" or "Usage limit reached", with a countdown. Traffic shows requests that are queued and which upstreams they wait for, and the route view shows each 429 pause.

**Usage limits on upstreams:**
- The upstream dialog has Usage limits under the concurrency limit: requests, tokens or cost per minute, hour, day, week or month, and per several minutes or hours, for example 10,000,000 tokens every 5 minutes. Gateway keys accept "every N minutes / hours" too.
- When a minute or hour limit is reached, requests go to another upstream or wait. When a day, week or month limit is used up, the upstream is skipped until it resets.
- Shared upstream links and exports carry the limits.

**Linux:**
- Launch at login works when the AppImage is unpacked, as the AUR package `thinkwatch-lite-bin` does: the login entry starts the AppImage's `AppRun`. Thanks to [@sunnysab](https://github.com/sunnysab) for finding the problem, sending the first fix and testing the final one on Arch (#348).

**Windows:**
- A plugin's CPU limit no longer counts time the computer was busy with other work.

**Security:**
- The core's plugin sandbox is updated to Wasmtime 49.0.4 (RUSTSEC-2026-0378, RUSTSEC-2026-0379).
9 changes: 8 additions & 1 deletion scripts/shots/core/en/overview.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"pause_secs": 60,
"quota_pause_secs": 3600,
"rate_limit_max_pause_secs": 3600,
"slot_wait_secs": 30
"wait_secs": 120
},
"groups": [
{
Expand Down Expand Up @@ -152,6 +152,7 @@
"forward_client_identity": false,
"health": "ok",
"key": "sk-anEXAMPLEQ3xA",
"limits": [],
"model_count": 0,
"model_fetching": false,
"model_source": "none",
Expand Down Expand Up @@ -191,6 +192,7 @@
"forward_client_identity": false,
"health": "ok",
"key": "sk-rlEXAMPLEGa7e",
"limits": [],
"model_count": 0,
"model_fetching": false,
"model_source": "none",
Expand Down Expand Up @@ -224,6 +226,7 @@
"disabled": false,
"forward_client_identity": false,
"health": "ok",
"limits": [],
"model_count": 0,
"model_fetching": false,
"model_source": "none",
Expand Down Expand Up @@ -265,6 +268,7 @@
"forward_client_identity": false,
"health": "ok",
"key": "${OPENROUTER_API_KEY}",
"limits": [],
"model_count": 0,
"model_fetching": false,
"model_source": "none",
Expand Down Expand Up @@ -300,6 +304,7 @@
"forward_client_identity": false,
"health": "ok",
"key": "sk-3fEXAMPLE9f2c",
"limits": [],
"model_count": 0,
"model_fetching": false,
"model_source": "none",
Expand Down Expand Up @@ -331,6 +336,7 @@
"forward_client_identity": false,
"health": "ok",
"key": "${GEMINI_API_KEY}",
"limits": [],
"model_count": 0,
"model_fetching": false,
"model_source": "none",
Expand Down Expand Up @@ -366,6 +372,7 @@
"disabled": false,
"forward_client_identity": false,
"health": "ok",
"limits": [],
"model_count": 1,
"model_fetching": false,
"model_source": "manual",
Expand Down
Loading
Loading