Skip to content

v1.2.1

Choose a tag to compare

@thebriangao thebriangao released this 31 May 20:12
· 18 commits to main since this release

A correctness + stealth pass. Every read and write tool was exercised individually against a live account — comparing each call's raw API exchange to the projected output and reading the state back — which surfaced a class of "returns HTTP 200 but the payload is empty or wrong" bugs that receipt-only testing missed.

Highlights since v1.2.0

  • iOS-app identity headers on every data request. Data requests now carry the WHOOP iOS app's own header set (user-agent: iOS, the x-whoop-* device headers, a per-install identifier, capital Bearer), captured from a live mitmproxy session, so traffic blends with the legitimate app instead of being a bare bearer token. Static values are the app's shared constants (camouflage, not a per-user signature); the installation id is a per-install random UUID persisted to .env.
  • whoop_behavior_impact resurrected. It was effectively un-callable — it required an impact UUID that no other tool exposed. It now lists every behavior + its impact_uuid when called with no argument, then returns the full detail for a UUID.
  • Seven read tools fixed that returned 200 with an empty or wrong projection: whoop_stress, whoop_trend (every time/duration metric was null), whoop_cycle (all-null despite real data; also needs the ?date param), whoop_workout (HR curve was always empty), whoop_lift_progression (mislabeled segments), whoop_recovery (SpO2 / skin temp), and whoop_behavior_impact.
  • Write fixes. whoop_coach_ask returned a truncated streamed reply ("56" instead of the full answer) — now polls until the turn is COMPLETE. whoop_symptom_log crashed on menstruation-only calls.
  • Tool descriptions rewritten across the surface — terser and example-free for id-taking tools (sample ids led the model to hallucinate ones outside the list) — with the catalog read enforced by a hard gate.
  • Docs reconciled with the codebase; descriptions clarified for whoop_journal_log (replaces the day — read first), whoop_smart_alarm_set (wake time goes through mode=schedule), whoop_cycle, and whoop_workout.

212 tests (was 178). TypeScript 6, Node 24.

Full detail in CHANGELOG.md.