@dofek/training 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,64 @@
1
+ /**
2
+ * User-facing names for training metrics. Plain labels belong in headings and
3
+ * chart series; technical names and calculation descriptions belong in details.
4
+ */
5
+ export const TRAINING_TERMINOLOGY = {
6
+ intensityDistribution: {
7
+ plainLabel: "Heart-rate zone distribution",
8
+ plainDescription: "Shows how recorded heart-rate time is distributed across effort zones.",
9
+ technicalName: "Karvonen five-zone model",
10
+ details: "Heart-rate time is grouped into five intensity zones using heart-rate reserve.",
11
+ },
12
+ workloadRatio: {
13
+ plainLabel: "Recent-to-baseline workload ratio",
14
+ plainDescription: "Compares recent training load with the latest baseline period.",
15
+ technicalName: "Acute-to-chronic workload ratio (ACWR)",
16
+ details: "Compares load from the latest 7 days with an equivalent 7-day baseline from the latest 28 days. This is descriptive context, not a safe range or an injury prediction.",
17
+ },
18
+ normalizedPower: {
19
+ plainLabel: "Effort-adjusted power",
20
+ plainDescription: "Power adjusted to reflect the extra effort of variable cycling.",
21
+ technicalName: "Normalized Power",
22
+ details: "Uses 30-second rolling average power and fourth-power weighting to represent variable cycling effort.",
23
+ },
24
+ criticalPower: {
25
+ plainLabel: "Sustainable cycling power",
26
+ plainDescription: "Shows the cycling power estimated for longer efforts.",
27
+ technicalName: "Critical Power",
28
+ details: "A power-duration model estimates the longer-effort power level and the finite work available above it.",
29
+ },
30
+ anaerobicWorkCapacity: {
31
+ plainLabel: "Short-burst power reserve",
32
+ plainDescription: "Shows the estimated power reserve available for short bursts.",
33
+ technicalName: "W′ (anaerobic work capacity)",
34
+ details: "The model's finite work term represents the estimated power reserve above sustainable power.",
35
+ },
36
+ polarization: {
37
+ plainLabel: "Easy-to-hard training balance",
38
+ plainDescription: "Shows the balance of easy, threshold, and high-intensity cycling.",
39
+ valueLabel: "Easy-to-hard balance",
40
+ technicalName: "Polarization Index (Treff three-zone model)",
41
+ details: "Summarizes the recorded distribution of easy, threshold, and high-intensity cycling.",
42
+ },
43
+ monotony: {
44
+ plainLabel: "Training variety and total load",
45
+ plainDescription: "Shows how varied your weekly training load is.",
46
+ valueLabel: "Training variety",
47
+ strainLabel: "Weekly load strain",
48
+ technicalName: "Training Monotony (Foster method)",
49
+ details: "Describes how evenly cycling training load is distributed across each calendar week.",
50
+ },
51
+ gradeAdjustedPace: {
52
+ plainLabel: "Effort-adjusted pace for grade",
53
+ plainDescription: "Shows walking or hiking pace adjusted for slopes.",
54
+ technicalName: "Grade-adjusted pace (Minetti slope-cost model)",
55
+ details: "Adjusts walking or hiking pace for the estimated energy cost of the recorded slope.",
56
+ },
57
+ estimatedOneRepMax: {
58
+ plainLabel: "Estimated single-rep strength",
59
+ plainDescription: "Shows the estimated maximum weight for one repetition.",
60
+ technicalName: "Estimated 1-Rep Max (e1RM)",
61
+ details: "Uses the Epley formula: estimated max = weight × (1 + repetitions ÷ 30).",
62
+ },
63
+ };
64
+ //# sourceMappingURL=terminology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminology.js","sourceRoot":"","sources":["../src/terminology.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,qBAAqB,EAAE;QACrB,UAAU,EAAE,8BAA8B;QAC1C,gBAAgB,EAAE,wEAAwE;QAC1F,aAAa,EAAE,0BAA0B;QACzC,OAAO,EAAE,gFAAgF;KAC1F;IACD,aAAa,EAAE;QACb,UAAU,EAAE,mCAAmC;QAC/C,gBAAgB,EAAE,gEAAgE;QAClF,aAAa,EAAE,wCAAwC;QACvD,OAAO,EACL,wKAAwK;KAC3K;IACD,eAAe,EAAE;QACf,UAAU,EAAE,uBAAuB;QACnC,gBAAgB,EAAE,iEAAiE;QACnF,aAAa,EAAE,kBAAkB;QACjC,OAAO,EACL,uGAAuG;KAC1G;IACD,aAAa,EAAE;QACb,UAAU,EAAE,2BAA2B;QACvC,gBAAgB,EAAE,uDAAuD;QACzE,aAAa,EAAE,gBAAgB;QAC/B,OAAO,EACL,wGAAwG;KAC3G;IACD,qBAAqB,EAAE;QACrB,UAAU,EAAE,2BAA2B;QACvC,gBAAgB,EAAE,+DAA+D;QACjF,aAAa,EAAE,8BAA8B;QAC7C,OAAO,EACL,8FAA8F;KACjG;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,+BAA+B;QAC3C,gBAAgB,EAAE,mEAAmE;QACrF,UAAU,EAAE,sBAAsB;QAClC,aAAa,EAAE,6CAA6C;QAC5D,OAAO,EAAE,sFAAsF;KAChG;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,iCAAiC;QAC7C,gBAAgB,EAAE,gDAAgD;QAClE,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE,oBAAoB;QACjC,aAAa,EAAE,mCAAmC;QAClD,OAAO,EAAE,sFAAsF;KAChG;IACD,iBAAiB,EAAE;QACjB,UAAU,EAAE,gCAAgC;QAC5C,gBAAgB,EAAE,mDAAmD;QACrE,aAAa,EAAE,gDAAgD;QAC/D,OAAO,EAAE,qFAAqF;KAC/F;IACD,kBAAkB,EAAE;QAClB,UAAU,EAAE,+BAA+B;QAC3C,gBAAgB,EAAE,wDAAwD;QAC1E,aAAa,EAAE,4BAA4B;QAC3C,OAAO,EAAE,0EAA0E;KACpF;CACmF,CAAC"}
@@ -38,6 +38,7 @@ export interface TreffPolarizationWeek extends TreffPolarizationWeekInput {
38
38
  statusLabel: string;
39
39
  explanation: string;
40
40
  }
41
+ export declare const DEFAULT_POLARIZATION_THRESHOLD = 2;
41
42
  export declare function buildKarvonenIntensityDistribution(weeks: KarvonenZoneWeek[]): IntensityDistribution;
42
43
  export declare function buildTreffPolarizationWeek(input: TreffPolarizationWeekInput): TreffPolarizationWeek;
43
44
  //# sourceMappingURL=training-distribution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"training-distribution.d.ts","sourceRoot":"","sources":["../src/training-distribution.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,aAAa,EAAE,WAAW,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAErF,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,qBAAsB,SAAQ,0BAA0B;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AASD,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,gBAAgB,EAAE,GACxB,qBAAqB,CA0BvB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,0BAA0B,GAChC,qBAAqB,CAuCvB"}
1
+ {"version":3,"file":"training-distribution.d.ts","sourceRoot":"","sources":["../src/training-distribution.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,aAAa,EAAE,WAAW,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAErF,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,qBAAsB,SAAQ,0BAA0B;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAMhD,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,gBAAgB,EAAE,GACxB,qBAAqB,CA0BvB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,0BAA0B,GAChC,qBAAqB,CA4CvB"}
@@ -1,5 +1,6 @@
1
1
  import { HEART_RATE_ZONES } from "@dofek/zones/zones";
2
2
  const INTENSITY_EXPLANATION = "A descriptive view of endurance training time across the Karvonen five-zone heart-rate model. It does not classify training polarization.";
3
+ export const DEFAULT_POLARIZATION_THRESHOLD = 2;
3
4
  function roundedPercent(seconds, totalSeconds) {
4
5
  return totalSeconds > 0 ? Math.round((seconds / totalSeconds) * 1000) / 10 : 0;
5
6
  }
@@ -37,23 +38,26 @@ export function buildTreffPolarizationWeek(input) {
37
38
  z3: roundedPercent(input.z3Seconds, totalSeconds),
38
39
  };
39
40
  if (input.polarizationIndex === null) {
41
+ const explanation = input.z3Seconds > input.z1Seconds
42
+ ? "The index is not calculated because recorded Zone 3 time exceeds Zone 1, which is outside Treff's valid definition."
43
+ : "The index is not calculated because Dofek requires recorded cycling time in all three Treff heart-rate zones.";
40
44
  return {
41
45
  ...input,
42
46
  totalSeconds,
43
47
  zonePercentages,
44
48
  status: "insufficient_data",
45
- statusLabel: "Insufficient data",
46
- explanation: "Polarization needs recorded cycling time in all three Treff heart-rate zones.",
49
+ statusLabel: "Not calculated",
50
+ explanation,
47
51
  };
48
52
  }
49
- if (input.polarizationIndex > 2) {
53
+ if (input.polarizationIndex > DEFAULT_POLARIZATION_THRESHOLD) {
50
54
  return {
51
55
  ...input,
52
56
  totalSeconds,
53
57
  zonePercentages,
54
58
  status: "polarized",
55
- statusLabel: "Polarized",
56
- explanation: "This cycling week is polarized: it has a Treff polarization index above 2.00.",
59
+ statusLabel: "Matches polarized-pattern heuristic",
60
+ explanation: "This week's recorded cycling distribution is above Treff's descriptive 2.00 heuristic. It is not a physiological or medical assessment.",
57
61
  };
58
62
  }
59
63
  return {
@@ -61,8 +65,8 @@ export function buildTreffPolarizationWeek(input) {
61
65
  totalSeconds,
62
66
  zonePercentages,
63
67
  status: "not_polarized",
64
- statusLabel: "Not polarized",
65
- explanation: "This cycling week is not polarized because its Treff polarization index is 2.00 or lower.",
68
+ statusLabel: "Does not match polarized-pattern heuristic",
69
+ explanation: "This week's recorded cycling distribution is at or below Treff's descriptive 2.00 heuristic. It is not a physiological or medical assessment.",
66
70
  };
67
71
  }
68
72
  //# sourceMappingURL=training-distribution.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"training-distribution.js","sourceRoot":"","sources":["../src/training-distribution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"training-distribution.js","sourceRoot":"","sources":["../src/training-distribution.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,12 @@
1
+ import { type ActivityModality, type LegacyActivityType, type ProviderActivityType } from "./activity-types.ts";
1
2
  export declare const OTHER_ACTIVITY_TYPE = "__other__";
2
- /**
3
- * Superset of all valid internal activity types across all providers.
4
- * Providers map their domain-specific types to one of these canonical values.
5
- */
6
- export declare const CANONICAL_ACTIVITY_TYPES: readonly ["cycling", "road_cycling", "mountain_biking", "gravel_cycling", "indoor_cycling", "virtual_cycling", "e_bike_cycling", "cyclocross", "track_cycling", "bmx", "running", "swimming", "walking", "hiking", "strength", "strength_training", "functional_strength", "yoga", "pilates", "elliptical", "rowing", "skiing", "skating", "climbing", "cardio", "hiit", "cross_training", "trail_running", "stair_climbing", "stairmaster", "stretching", "dance", "martial_arts", "tennis", "basketball", "soccer", "golf", "ice_hockey", "snowboarding", "rock_climbing", "surfing", "kayaking", "functional_fitness", "bootcamp", "boxing", "core", "aqua_fitness", "circuit_training", "group_exercise", "triathlon", "dancing", "american_football", "archery", "australian_football", "badminton", "baseball", "bowling", "cricket", "curling", "equestrian", "fencing", "fishing", "gymnastics", "handball", "hockey", "hunting", "lacrosse", "mind_and_body", "mixed_cardio", "paddle_sports", "play", "preparation_and_recovery", "racquetball", "rugby", "sailing", "snow_sports", "softball", "squash", "table_tennis", "track_and_field", "volleyball", "water_fitness", "water_polo", "water_sports", "wrestling", "barre", "core_training", "flexibility", "jump_rope", "kickboxing", "stairs", "step_training", "wheelchair_walk", "wheelchair_run", "tai_chi", "mixed_metabolic_cardio", "hand_cycling", "disc_sports", "fitness_gaming", "cardio_dance", "social_dance", "paddle_racquet", "cooldown", "transition", "underwater_diving", "cross_country_skiing", "downhill_skiing", "breathwork", "meditation", "paddleboarding", "snowshoeing", "pickleball", "padel", "football", "multisport", "disc_golf", "skydiving", "paragliding", "diving", "snorkeling", "navigation", "geocaching", "paddling", "gym", "open_water_swimming", "other"];
7
- export type CanonicalActivityType = (typeof CANONICAL_ACTIVITY_TYPES)[number];
3
+ export declare const STRENGTH_ACTIVITY_TYPES: readonly ["strength"];
8
4
  /**
9
5
  * All canonical activity types considered "cycling" for consolidated views.
10
6
  * Individual activities show the specific subtype, but aggregated views
11
7
  * (weekly volume, PMC, cycling page) treat them as one sport.
12
8
  */
13
- export declare const CYCLING_ACTIVITY_TYPES: readonly ["cycling", "road_cycling", "mountain_biking", "gravel_cycling", "indoor_cycling", "virtual_cycling", "e_bike_cycling", "cyclocross", "track_cycling", "bmx", "hand_cycling"];
9
+ export declare const CYCLING_ACTIVITY_TYPES: readonly ["cycling"];
14
10
  export type CyclingActivityType = (typeof CYCLING_ACTIVITY_TYPES)[number];
15
11
  /** Check whether an activity type is a cycling variant. */
16
12
  export declare function isCyclingActivity(activityType: string): activityType is CyclingActivityType;
@@ -22,24 +18,24 @@ export declare function cadenceAxisLabel(activityType: string): string;
22
18
  * Creates a mapping function from provider-specific types to canonical types.
23
19
  * Unknown provider types default to "other".
24
20
  */
25
- export declare function createActivityTypeMapper<K extends string | number>(providerMappings: Record<K, CanonicalActivityType>): (providerType: K) => CanonicalActivityType;
21
+ export declare function createActivityTypeMapper<K extends string | number>(providerMappings: Record<K, LegacyActivityType>): (providerType: K) => ProviderActivityType;
26
22
  /** Strava sport_type → canonical activity type */
27
- export declare const STRAVA_ACTIVITY_TYPE_MAP: Record<string, CanonicalActivityType>;
23
+ export declare const STRAVA_ACTIVITY_TYPE_MAP: Record<string, LegacyActivityType>;
28
24
  /** Wahoo workout_type_id (numeric) → canonical activity type */
29
- export declare const WAHOO_WORKOUT_TYPE_MAP: Record<number, CanonicalActivityType>;
25
+ export declare const WAHOO_WORKOUT_TYPE_MAP: Record<number, LegacyActivityType>;
30
26
  /** Polar sport (lowercased) → canonical activity type */
31
- export declare const POLAR_SPORT_MAP: Record<string, CanonicalActivityType>;
27
+ export declare const POLAR_SPORT_MAP: Record<string, LegacyActivityType>;
32
28
  /** Garmin activityType → canonical activity type */
33
- export declare const GARMIN_ACTIVITY_TYPE_MAP: Record<string, CanonicalActivityType>;
29
+ export declare const GARMIN_ACTIVITY_TYPE_MAP: Record<string, LegacyActivityType>;
34
30
  /** Oura activity (lowercased) → canonical activity type */
35
- export declare const OURA_ACTIVITY_TYPE_MAP: Record<string, CanonicalActivityType>;
31
+ export declare const OURA_ACTIVITY_TYPE_MAP: Record<string, LegacyActivityType>;
36
32
  /** RideWithGPS activity_type → canonical activity type */
37
- export declare const RIDE_WITH_GPS_ACTIVITY_TYPE_MAP: Record<string, CanonicalActivityType>;
33
+ export declare const RIDE_WITH_GPS_ACTIVITY_TYPE_MAP: Record<string, LegacyActivityType>;
38
34
  /** Apple Health HKWorkoutActivityType → normalized lowercase name */
39
- export declare const APPLE_HEALTH_WORKOUT_TYPE_MAP: Record<string, CanonicalActivityType>;
35
+ export declare const APPLE_HEALTH_WORKOUT_TYPE_MAP: Record<string, LegacyActivityType>;
40
36
  export interface WeeklyVolumeChartRow {
41
37
  week: string;
42
- activity_type: string;
38
+ canonical_type: string;
43
39
  count: number;
44
40
  hours: number;
45
41
  }
@@ -49,7 +45,7 @@ export interface DailyLoadRow {
49
45
  }
50
46
  export type VerticalAscentActivityTypeGroup = "road_cycling" | "mountain_biking" | "gravel_cycling" | "other_cycling";
51
47
  export declare function formatActivityTypeLabel(activityType: string): string;
52
- export declare function getVerticalAscentActivityTypeGroup(activityType: string): VerticalAscentActivityTypeGroup;
48
+ export declare function getVerticalAscentActivityTypeGroup(modality: ActivityModality | null): VerticalAscentActivityTypeGroup;
53
49
  export declare function formatVerticalAscentActivityTypeGroupLabel(activityTypeGroup: VerticalAscentActivityTypeGroup): string;
54
50
  export declare function collapseWeeklyVolumeActivityTypes(rows: WeeklyVolumeChartRow[], maxLegendItems?: number): WeeklyVolumeChartRow[];
55
51
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAM/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,swDAiI3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM9E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,wLAYzB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,IAAI,mBAAmB,CAE3F;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,CAErE;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAUD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAChE,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,GACjD,CAAC,YAAY,EAAE,CAAC,KAAK,qBAAqB,CAI5C;AAMD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CA2B1E,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAexE,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CA2CjE,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CA4B1E,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAgBxE,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAkBjF,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAoF/E,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAgCD,MAAM,MAAM,+BAA+B,GACvC,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,CAAC;AA8BpB,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,MAAM,GACnB,+BAA+B,CAMjC;AAED,wBAAgB,0CAA0C,CACxD,iBAAiB,EAAE,+BAA+B,GACjD,MAAM,CAER;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,oBAAoB,EAAE,EAC5B,cAAc,SAAI,GACjB,oBAAoB,EAAE,CAgDxB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAGjF"}
1
+ {"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAE1B,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,eAAO,MAAM,uBAAuB,uBAAwB,CAAC;AAM7D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,sBAAuB,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,IAAI,mBAAmB,CAE3F;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,CAErE;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAUD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAChE,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAC9C,CAAC,YAAY,EAAE,CAAC,KAAK,oBAAoB,CAI3C;AAMD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CA2BvE,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAerE,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CA2C9D,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CA4BvE,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAgBrE,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAkB9E,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAoF5E,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAiCD,MAAM,MAAM,+BAA+B,GACvC,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,CAAC;AA8BpB,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAChC,+BAA+B,CAKjC;AAED,wBAAgB,0CAA0C,CACxD,iBAAiB,EAAE,+BAA+B,GACjD,MAAM,CAER;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,oBAAoB,EAAE,EAC5B,cAAc,SAAI,GACjB,oBAAoB,EAAE,CAkDxB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAGjF"}
package/dist/training.js CHANGED
@@ -1,141 +1,6 @@
1
+ import { resolveProviderActivityType, } from "./activity-types.js";
1
2
  export const OTHER_ACTIVITY_TYPE = "__other__";
2
- // ============================================================
3
- // Canonical activity types
4
- // ============================================================
5
- /**
6
- * Superset of all valid internal activity types across all providers.
7
- * Providers map their domain-specific types to one of these canonical values.
8
- */
9
- export const CANONICAL_ACTIVITY_TYPES = [
10
- "cycling",
11
- "road_cycling",
12
- "mountain_biking",
13
- "gravel_cycling",
14
- "indoor_cycling",
15
- "virtual_cycling",
16
- "e_bike_cycling",
17
- "cyclocross",
18
- "track_cycling",
19
- "bmx",
20
- "running",
21
- "swimming",
22
- "walking",
23
- "hiking",
24
- "strength",
25
- "strength_training",
26
- "functional_strength",
27
- "yoga",
28
- "pilates",
29
- "elliptical",
30
- "rowing",
31
- "skiing",
32
- "skating",
33
- "climbing",
34
- "cardio",
35
- "hiit",
36
- "cross_training",
37
- "trail_running",
38
- "stair_climbing",
39
- "stairmaster",
40
- "stretching",
41
- "dance",
42
- "martial_arts",
43
- "tennis",
44
- "basketball",
45
- "soccer",
46
- "golf",
47
- "ice_hockey",
48
- "snowboarding",
49
- "rock_climbing",
50
- "surfing",
51
- "kayaking",
52
- "functional_fitness",
53
- "bootcamp",
54
- "boxing",
55
- "core",
56
- "aqua_fitness",
57
- "circuit_training",
58
- "group_exercise",
59
- "triathlon",
60
- "dancing",
61
- // Apple Health granular types
62
- "american_football",
63
- "archery",
64
- "australian_football",
65
- "badminton",
66
- "baseball",
67
- "bowling",
68
- "cricket",
69
- "curling",
70
- "equestrian",
71
- "fencing",
72
- "fishing",
73
- "gymnastics",
74
- "handball",
75
- "hockey",
76
- "hunting",
77
- "lacrosse",
78
- "mind_and_body",
79
- "mixed_cardio",
80
- "paddle_sports",
81
- "play",
82
- "preparation_and_recovery",
83
- "racquetball",
84
- "rugby",
85
- "sailing",
86
- "snow_sports",
87
- "softball",
88
- "squash",
89
- "table_tennis",
90
- "track_and_field",
91
- "volleyball",
92
- "water_fitness",
93
- "water_polo",
94
- "water_sports",
95
- "wrestling",
96
- "barre",
97
- "core_training",
98
- "flexibility",
99
- "jump_rope",
100
- "kickboxing",
101
- "stairs",
102
- "step_training",
103
- "wheelchair_walk",
104
- "wheelchair_run",
105
- "tai_chi",
106
- "mixed_metabolic_cardio",
107
- "hand_cycling",
108
- "disc_sports",
109
- "fitness_gaming",
110
- "cardio_dance",
111
- "social_dance",
112
- "paddle_racquet",
113
- "cooldown",
114
- "transition",
115
- "underwater_diving",
116
- "cross_country_skiing",
117
- "downhill_skiing",
118
- // Provider-specific types (Garmin, Peloton, Komoot, Decathlon)
119
- "breathwork",
120
- "meditation",
121
- "paddleboarding",
122
- "snowshoeing",
123
- "pickleball",
124
- "padel",
125
- "football",
126
- "multisport",
127
- "disc_golf",
128
- "skydiving",
129
- "paragliding",
130
- "diving",
131
- "snorkeling",
132
- "navigation",
133
- "geocaching",
134
- "paddling",
135
- "gym",
136
- "open_water_swimming",
137
- "other",
138
- ];
3
+ export const STRENGTH_ACTIVITY_TYPES = ["strength"];
139
4
  // ============================================================
140
5
  // Cycling activity types
141
6
  // ============================================================
@@ -144,19 +9,7 @@ export const CANONICAL_ACTIVITY_TYPES = [
144
9
  * Individual activities show the specific subtype, but aggregated views
145
10
  * (weekly volume, PMC, cycling page) treat them as one sport.
146
11
  */
147
- export const CYCLING_ACTIVITY_TYPES = [
148
- "cycling",
149
- "road_cycling",
150
- "mountain_biking",
151
- "gravel_cycling",
152
- "indoor_cycling",
153
- "virtual_cycling",
154
- "e_bike_cycling",
155
- "cyclocross",
156
- "track_cycling",
157
- "bmx",
158
- "hand_cycling",
159
- ];
12
+ export const CYCLING_ACTIVITY_TYPES = ["cycling"];
160
13
  /** Check whether an activity type is a cycling variant. */
161
14
  export function isCyclingActivity(activityType) {
162
15
  return CYCLING_ACTIVITY_TYPES.some((t) => t === activityType);
@@ -181,7 +34,7 @@ export function cadenceAxisLabel(activityType) {
181
34
  */
182
35
  export function createActivityTypeMapper(providerMappings) {
183
36
  return (providerType) => {
184
- return providerMappings[providerType] ?? "other";
37
+ return resolveProviderActivityType(providerType, providerMappings[providerType] ?? "other");
185
38
  };
186
39
  }
187
40
  // ============================================================
@@ -455,6 +308,7 @@ const ACTIVITY_TYPE_LABELS = {
455
308
  strength: "Strength",
456
309
  strength_training: "Strength Training",
457
310
  functional_strength: "Functional Strength",
311
+ hangboard: "Hangboard",
458
312
  stair_climbing: "Stair Climbing",
459
313
  cross_training: "Cross Training",
460
314
  hiit: "HIIT",
@@ -493,13 +347,12 @@ export function formatActivityTypeLabel(activityType) {
493
347
  }
494
348
  return ACTIVITY_TYPE_LABELS[normalized] ?? toTitleCase(normalized);
495
349
  }
496
- export function getVerticalAscentActivityTypeGroup(activityType) {
497
- const normalized = normalizeActivityType(activityType);
498
- if (normalized === "road_cycling")
350
+ export function getVerticalAscentActivityTypeGroup(modality) {
351
+ if (modality === "road")
499
352
  return "road_cycling";
500
- if (normalized === "mountain_biking")
353
+ if (modality === "mountain")
501
354
  return "mountain_biking";
502
- if (normalized === "gravel_cycling")
355
+ if (modality === "gravel")
503
356
  return "gravel_cycling";
504
357
  return "other_cycling";
505
358
  }
@@ -511,15 +364,15 @@ export function collapseWeeklyVolumeActivityTypes(rows, maxLegendItems = 6) {
511
364
  return rows;
512
365
  // Consolidate all cycling subtypes into generic "cycling" before grouping
513
366
  const normalizedRows = rows.map((row) => {
514
- const normalized = normalizeActivityType(row.activity_type);
367
+ const normalized = normalizeActivityType(row.canonical_type);
515
368
  return {
516
369
  ...row,
517
- activity_type: isCyclingActivity(normalized) ? "cycling" : normalized,
370
+ canonical_type: isCyclingActivity(normalized) ? "cycling" : normalized,
518
371
  };
519
372
  });
520
373
  const totalsByType = new Map();
521
374
  for (const row of normalizedRows) {
522
- totalsByType.set(row.activity_type, (totalsByType.get(row.activity_type) ?? 0) + row.hours);
375
+ totalsByType.set(row.canonical_type, (totalsByType.get(row.canonical_type) ?? 0) + row.hours);
523
376
  }
524
377
  const orderedTypes = [...totalsByType.entries()]
525
378
  .sort((a, b) => b[1] - a[1])
@@ -530,7 +383,9 @@ export function collapseWeeklyVolumeActivityTypes(rows, maxLegendItems = 6) {
530
383
  : new Set(orderedTypes);
531
384
  const aggregated = new Map();
532
385
  for (const row of normalizedRows) {
533
- const groupedType = keepTypes.has(row.activity_type) ? row.activity_type : OTHER_ACTIVITY_TYPE;
386
+ const groupedType = keepTypes.has(row.canonical_type)
387
+ ? row.canonical_type
388
+ : OTHER_ACTIVITY_TYPE;
534
389
  const key = `${row.week}::${groupedType}`;
535
390
  const existing = aggregated.get(key);
536
391
  if (existing) {
@@ -540,7 +395,7 @@ export function collapseWeeklyVolumeActivityTypes(rows, maxLegendItems = 6) {
540
395
  }
541
396
  aggregated.set(key, {
542
397
  week: row.week,
543
- activity_type: groupedType,
398
+ canonical_type: groupedType,
544
399
  count: row.count,
545
400
  hours: row.hours,
546
401
  });
@@ -548,7 +403,7 @@ export function collapseWeeklyVolumeActivityTypes(rows, maxLegendItems = 6) {
548
403
  return [...aggregated.values()].sort((a, b) => {
549
404
  if (a.week !== b.week)
550
405
  return a.week.localeCompare(b.week);
551
- return a.activity_type.localeCompare(b.activity_type);
406
+ return a.canonical_type.localeCompare(b.canonical_type);
552
407
  });
553
408
  }
554
409
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"training.js","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"training.js","sourceRoot":"","sources":["../src/training.ts"],"names":[],"mappings":"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"}
@@ -72,7 +72,6 @@ export interface MuscleGroupFreshness {
72
72
  export interface RecommendationInput {
73
73
  today: string;
74
74
  readinessScore: number | null;
75
- workloadRatio: number | null;
76
75
  trainingStressBalance: number | null;
77
76
  sleepDebtMinutes: number;
78
77
  recentActivities: RecentActivity[];
@@ -1 +1 @@
1
- {"version":3,"file":"workout-recommendation.d.ts","sourceRoot":"","sources":["../src/workout-recommendation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,iBAAiB,GACjB,aAAa,GACb,kBAAkB,GAClB,UAAU,CAAC;AAEf,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACrD;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAyCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AA8BD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,qBAAqB,CA4EtF"}
1
+ {"version":3,"file":"workout-recommendation.d.ts","sourceRoot":"","sources":["../src/workout-recommendation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,iBAAiB,GACjB,aAAa,GACb,kBAAkB,GAClB,UAAU,CAAC;AAEf,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACrD;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAyCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AA8BD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,qBAAqB,CAsEtF"}
@@ -86,19 +86,14 @@ export function recommendNextWorkout(input) {
86
86
  reasoning.push(`Recovery score is ${input.readinessScore}/100 — keep it light today`);
87
87
  return makeActiveRecovery(reasoning);
88
88
  }
89
- // Step 2: Check workload ratio for injury risk
90
- if (input.workloadRatio != null && input.workloadRatio > 1.5) {
91
- reasoning.push(`Workload ratio is ${input.workloadRatio.toFixed(2)} — high injury risk zone`);
92
- return makeActiveRecovery(reasoning);
93
- }
94
- // Step 3: Hard/easy alternation — was yesterday hard?
89
+ // Step 2: Hard/easy alternation — was yesterday hard?
95
90
  const yesterdayWasHard = wasYesterdayHard(input);
96
91
  const isModerateReadiness = input.readinessScore != null && input.readinessScore < READINESS_MODERATE;
97
92
  if (yesterdayWasHard && isModerateReadiness) {
98
93
  reasoning.push("Yesterday was a hard training day and recovery is moderate");
99
94
  return makeCardioEasy(input, reasoning);
100
95
  }
101
- // Step 4: Decide between strength and cardio
96
+ // Step 3: Decide between strength and cardio
102
97
  const daysSinceStrength = daysSinceActivityType(input, "strength");
103
98
  const daysSinceCardio = daysSinceActivityType(input, "cardio");
104
99
  const freshMuscleGroups = getFreshMuscleGroups(input);