diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d9cb3b57..287df926e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## [1.41.2] — 2026-10-07 + +More room for a Coach turn, prompt caching that holds across its rounds, and +MCP tool results that match their schemas. + +### Changed + +- **Turn budget.** A turn on the person's own provider gets 165k tokens, + 200 s and 16 rounds (was 120k, 150 s, 12); a turn on the operator's budget + 55k tokens, 120 s and 8 rounds (was 40k, 90 s, 6). The final answer's + reserve keeps its share of each (1,650 tokens), the concurrent-turn slot + follows the longer wall time, and a turn shows up to 64 steps. + +### Fixed + +- **Cached input in the turn budget.** Codex requests carry a stable + `prompt_cache_key` and session id per conversation, as the official client + does, so later rounds of a turn read the prefix from the provider's cache + instead of paying for it again; `api.openai.com` gets the same key, gateways + do not. Anthropic usage now counts cache reads and cache writes in the + turn's total (they are reported beside `input_tokens`), so a cached round is + weighted at a tenth instead of almost nothing and a cache write in full. + Local and OpenAI-compatible servers that report + `prompt_tokens_details.cached_tokens` have it counted. +- **MCP output schemas (#1170).** `list_metrics` declares the `availability` + its rows already returned, the Coach-backed reads declare `searchedWindow` + and `available`, and `get_intraday_pulse` declares each bucket's `min` and + `max`. The advertised + schemas close every object, so a strict client refused these results. Every + tool's real output is now validated against its advertised schema under a + strict 2020-12 validator. Thanks to @RyRyMason for #1170. +- **Deleted readings in MCP discovery.** The `list_metrics` discovery rows and + the `search` clinical-signal probe count live rows only: a measurement type + whose readings were all deleted is no longer listed as present, and the + probes use the live-rows index instead of walking every deleted row. + ## [1.41.1] — 2026-10-07 A calmer thinking row in the Coach. diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index 7cb871c49..0603ce22e 100644 --- a/docs/api/openapi.yaml +++ b/docs/api/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: HealthLog API - version: 1.41.1 + version: 1.41.2 description: >- Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest. @@ -52829,7 +52829,7 @@ components: id: type: string pattern: ^s[1-9]\d{0,2}$ - description: "`s1`..`s48`, unique within a turn." + description: "`s1`..`s64`, unique within a turn." tool: type: string enum: diff --git a/package.json b/package.json index 539890a1a..60195cac5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.41.1", + "version": "1.41.2", "description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.", "license": "PolyForm-Noncommercial-1.0.0", "homepage": "https://healthlog.dev", diff --git a/public/sw.js b/public/sw.js index 2bfd0ac0d..c83b525f8 100644 --- a/public/sw.js +++ b/public/sw.js @@ -36,7 +36,7 @@ try { // v1.4.38.4 → v1.4.42. Do not hand-edit; bump `package.json` and rebuild. const CACHE_VERSION = (typeof self !== "undefined" && self.__APP_VERSION__) || - /* @sw-version-fallback */ "v1.40.6"; + /* @sw-version-fallback */ "v1.41.2"; const STATIC_CACHE = `healthlog-static-${CACHE_VERSION}`; const PAGE_CACHE = `healthlog-pages-${CACHE_VERSION}`; // v1.18.6 — read-only data cache for a curated allowlist of safe GET `/api/*`