feat(integrations): list imported cycle days in the details

The details of the Garmin and Oura cards listed measurement types and
workouts only, so cycle days a wearable imported appeared nowhere, and a
bug report could not say whether any had arrived. The status envelope now
carries a `CYCLE_DAYS` entry per cycle-importing source with the newest
day and the count, and the freshness list renders it. It counts as a
sparse type, so a month between periods never reads as a dead pipe.

Refs #1333
This commit is contained in:
Marc-André Bombeck committed 2026-11-04 22:03:18 +01:00
1 parent afdb8163ce
commit 27a1cd6c2f
19 files changed
+200 -28

No files matched your search

+20 -8
View File
@@ -83834,14 +83834,20 @@ components:
properties:
type:
type: string
description: The measurement type (e.g. `RESPIRATORY_RATE`), `WORKOUTS` for the workout leg, or (Apple Health only,
since v1.42.4) `MEDICATION_DOSE` for medication doses imported from Apple Health. Clients should show or
skip a type they do not know rather than fail.
description: The measurement type (e.g. `RESPIRATORY_RATE`), `WORKOUTS` for the workout leg, `CYCLE_DAYS` for the period
days a wearable imported (Garmin, Oura), or (Apple Health only, since v1.42.4) `MEDICATION_DOSE` for
medication doses imported from Apple Health. Clients should show or skip a type they do not know rather than
fail.
lastSeenAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: Newest recorded reading for this type from this source.
description: Newest recorded reading for this type from this source. On `CYCLE_DAYS`, the newest cycle day at noon UTC.
count:
description: How many live cycle days the source holds. Present on `CYCLE_DAYS` only.
type: integer
minimum: 0
maximum: 9007199254740991
stale:
type: boolean
description: This type has gone quiet while the source around it reads healthy — the dead-pipe signature (e.g. a single
@@ -86477,14 +86483,20 @@ components:
properties:
type:
type: string
description: The measurement type (e.g. `RESPIRATORY_RATE`), `WORKOUTS` for the workout leg, or (Apple Health only,
since v1.42.4) `MEDICATION_DOSE` for medication doses imported from Apple Health. Clients should show or
skip a type they do not know rather than fail.
description: The measurement type (e.g. `RESPIRATORY_RATE`), `WORKOUTS` for the workout leg, `CYCLE_DAYS` for the period
days a wearable imported (Garmin, Oura), or (Apple Health only, since v1.42.4) `MEDICATION_DOSE` for
medication doses imported from Apple Health. Clients should show or skip a type they do not know rather than
fail.
lastSeenAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: Newest recorded reading for this type from this source.
description: Newest recorded reading for this type from this source. On `CYCLE_DAYS`, the newest cycle day at noon UTC.
count:
description: How many live cycle days the source holds. Present on `CYCLE_DAYS` only.
type: integer
minimum: 0
maximum: 9007199254740991
stale:
type: boolean
description: This type has gone quiet while the source around it reads healthy — the dead-pipe signature (e.g. a single