From 5142582d3db73969ecbd8058737ec2ebd809fa7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sat, 27 Jun 2026 10:33:11 +0200 Subject: [PATCH] chore(release): v1.21.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hotfix: the Coach and daily briefing failed for ChatGPT-provider accounts — a provider tool-call rejection surfaced as a 500. Provider failures now degrade gracefully, the Codex tool-call wire format is corrected, and the provider error body is captured for diagnosis. Also: the thinking bubble shows only the animated dots. --- CHANGELOG.md | 12 ++++++++++++ docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- src/app/api/insights/chat/route.ts | 4 +--- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c620cee7..e065ef2ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ ## [Unreleased] +## [1.21.2.1] — 2026-06-27 — Coach + briefing provider hotfix + +A hotfix. No migrations, no breaking changes. + +### Fixed + +- The Coach and the daily briefing failed for accounts signed in through the ChatGPT provider: the provider rejected the multi-step tool-call request, and the failure surfaced as a server error instead of a graceful message. A provider failure now always degrades to a clear in-chat notice — with the correct reconnect or rate-limit prompt where those apply — rather than a 500, and the provider request follows the documented tool-call wire format so the Coach's multi-round reasoning and the briefing generate again. The provider's own error detail is now captured for diagnosis. + +### Changed + +- While the Coach is thinking, the bubble shows only the three animated dots — the "Thinking…" word is gone (it remains for screen readers). + ## [1.21.2] — 2026-06-27 — Ambient Coach presence A patch release. The Coach surfaces what it already computes — at the metric, on the score, in the briefing — instead of waiting to be asked. No migrations, no breaking changes. diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index f3bf9d7a6..cfa67c713 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.21.2 + version: 1.21.2.1 description: >- Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest. diff --git a/package.json b/package.json index bf6672d7d..85281c707 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.21.2", + "version": "1.21.2.1", "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 2d7b374cc..484288a22 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.21.2"; + /* @sw-version-fallback */ "v1.21.2.1"; 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/*` diff --git a/src/app/api/insights/chat/route.ts b/src/app/api/insights/chat/route.ts index 5b2f9bdeb..c43ad8afa 100644 --- a/src/app/api/insights/chat/route.ts +++ b/src/app/api/insights/chat/route.ts @@ -1107,9 +1107,7 @@ async function streamRefusal(args: { * GlitchTip path. Status mapping mirrors `AllProvidersFailedError`: 401/403 → * credential_expired, 429 → rate_limited, everything else → unavailable. */ -function classifyBubblingProviderError( - err: unknown, -): { +function classifyBubblingProviderError(err: unknown): { code: "credential_expired" | "rate_limited" | "unavailable"; httpStatus: number | null; } | null {