@sunsteel/contracts 0.72.0 → 0.74.0

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.
package/dist/index.cjs CHANGED
@@ -40,6 +40,9 @@ __export(index_exports, {
40
40
  BAR_CHOICES_KG: () => BAR_CHOICES_KG,
41
41
  BAR_WARM_UP_STEPS: () => BAR_WARM_UP_STEPS,
42
42
  BLOCKED_MEMBERS_MAX: () => BLOCKED_MEMBERS_MAX,
43
+ BODY_MEASUREMENT_FIELDS: () => BODY_MEASUREMENT_FIELDS,
44
+ BODY_MEASUREMENT_FIELD_KEYS: () => BODY_MEASUREMENT_FIELD_KEYS,
45
+ BODY_PROGRESS_RANGES: () => BODY_PROGRESS_RANGES,
43
46
  CLONE_ROUTINE_REFUSALS: () => CLONE_ROUTINE_REFUSALS,
44
47
  COMEBACK_MIN_INACTIVE_DAYS: () => COMEBACK_MIN_INACTIVE_DAYS,
45
48
  COMEBACK_RECOGNITION_LIMIT: () => COMEBACK_RECOGNITION_LIMIT,
@@ -64,6 +67,8 @@ __export(index_exports, {
64
67
  DELOAD_SUGGESTION_ROUTINE_DAYS: () => DELOAD_SUGGESTION_ROUTINE_DAYS,
65
68
  DELOAD_SUGGESTION_SIGNALS: () => DELOAD_SUGGESTION_SIGNALS,
66
69
  EXERCISE_EQUIPMENT: () => EXERCISE_EQUIPMENT,
70
+ EXERCISE_GROUP_KIND_LABELS: () => EXERCISE_GROUP_KIND_LABELS,
71
+ EXERCISE_GROUP_MAX: () => EXERCISE_GROUP_MAX,
67
72
  EXERCISE_MECHANICS: () => EXERCISE_MECHANICS,
68
73
  FEATURED_PROFILE_ITEMS_MAX: () => FEATURED_PROFILE_ITEMS_MAX,
69
74
  FEATURED_PROFILE_ITEM_KINDS: () => FEATURED_PROFILE_ITEM_KINDS,
@@ -188,20 +193,30 @@ __export(index_exports, {
188
193
  WORKOUT_SESSION_STATUSES: () => WORKOUT_SESSION_STATUSES,
189
194
  accountExportFileName: () => accountExportFileName,
190
195
  applyDeload: () => applyDeload,
196
+ bodyMeasurementProblems: () => bodyMeasurementProblems,
197
+ bodyProgressRangeStart: () => bodyProgressRangeStart,
191
198
  buildWarmUpRamp: () => buildWarmUpRamp,
192
199
  calculatePlateLoading: () => calculatePlateLoading,
200
+ canLinkToNext: () => canLinkToNext,
193
201
  countsAsWork: () => countsAsWork,
194
202
  countsForProgression: () => countsForProgression,
195
203
  customExerciseProblem: () => customExerciseProblem,
196
204
  defaultWarmUpEquipment: () => defaultWarmUpEquipment,
197
205
  deloadLengthDays: () => deloadLengthDays,
206
+ exerciseGroupLabel: () => exerciseGroupLabel,
207
+ exerciseGroupPosition: () => exerciseGroupPosition,
208
+ exerciseGroups: () => exerciseGroups,
198
209
  exerciseNameKey: () => exerciseNameKey,
199
210
  followWorkingLoad: () => followWorkingLoad,
211
+ hasOversizedGroup: () => hasOversizedGroup,
200
212
  isBarLoaded: () => isBarLoaded,
213
+ isBodyMeasurementDate: () => isBodyMeasurementDate,
201
214
  isSetKind: () => isSetKind,
202
215
  isWithinQuietHours: () => isWithinQuietHours,
216
+ latestBodyWeight: () => latestBodyWeight,
203
217
  leadWorkingWeight: () => leadWorkingWeight,
204
218
  matchesDeletionConfirmation: () => matchesDeletionConfirmation,
219
+ normalizeExerciseLinks: () => normalizeExerciseLinks,
205
220
  normalizeExerciseName: () => normalizeExerciseName,
206
221
  primaryEquipment: () => primaryEquipment,
207
222
  requiredToFinish: () => requiredToFinish,
@@ -211,6 +226,7 @@ __export(index_exports, {
211
226
  sessionCorrectionWindow: () => sessionCorrectionWindow,
212
227
  setKindOf: () => setKindOf,
213
228
  setLogValuesDiffer: () => setLogValuesDiffer,
229
+ summarizeBodyProgress: () => summarizeBodyProgress,
214
230
  trainingBlockCovers: () => trainingBlockCovers,
215
231
  warmUpLoad: () => warmUpLoad
216
232
  });
@@ -482,6 +498,92 @@ var MEASURABLE_GOAL_TYPES = [
482
498
  var MEASURABLE_GOAL_DIRECTIONS = ["AT_LEAST", "AT_MOST"];
483
499
  var MEASURABLE_GOALS_MAX = 8;
484
500
 
501
+ // src/body-measurements.ts
502
+ var BODY_MEASUREMENT_FIELDS = [
503
+ { key: "weightKg", label: "Weight", unit: "kg", min: 20, max: 1e3 },
504
+ { key: "waistCm", label: "Waist", unit: "cm", min: 10, max: 300 },
505
+ { key: "hipsCm", label: "Hips", unit: "cm", min: 10, max: 300 },
506
+ { key: "chestCm", label: "Chest", unit: "cm", min: 10, max: 300 },
507
+ { key: "armCm", label: "Arm", unit: "cm", min: 10, max: 300 },
508
+ { key: "thighCm", label: "Thigh", unit: "cm", min: 10, max: 300 },
509
+ { key: "bodyFatPercent", label: "Body fat", unit: "%", min: 2, max: 75 }
510
+ ];
511
+ var BODY_MEASUREMENT_FIELD_KEYS = BODY_MEASUREMENT_FIELDS.map((field) => field.key);
512
+ var BODY_PROGRESS_RANGES = ["30D", "90D", "1Y", "ALL"];
513
+ var DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
514
+ function isBodyMeasurementDate(value) {
515
+ const match = DATE_PATTERN.exec(value);
516
+ if (!match) return false;
517
+ const date = /* @__PURE__ */ new Date(`${value}T00:00:00Z`);
518
+ return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
519
+ }
520
+ function shiftDate(date, days) {
521
+ const shifted = /* @__PURE__ */ new Date(`${date}T00:00:00Z`);
522
+ shifted.setUTCDate(shifted.getUTCDate() + days);
523
+ return shifted.toISOString().slice(0, 10);
524
+ }
525
+ function bodyProgressRangeStart(range, today) {
526
+ switch (range) {
527
+ case "30D":
528
+ return shiftDate(today, -29);
529
+ case "90D":
530
+ return shiftDate(today, -89);
531
+ case "1Y":
532
+ return shiftDate(today, -364);
533
+ case "ALL":
534
+ return null;
535
+ }
536
+ }
537
+ function bodyMeasurementProblems(input) {
538
+ const problems = [];
539
+ let values = 0;
540
+ for (const field of BODY_MEASUREMENT_FIELDS) {
541
+ const value = input[field.key];
542
+ if (value === void 0 || value === null) continue;
543
+ if (typeof value !== "number" || !Number.isFinite(value)) {
544
+ problems.push({ field: field.key, message: `${field.label} must be a number` });
545
+ continue;
546
+ }
547
+ values += 1;
548
+ if (value < field.min || value > field.max) {
549
+ problems.push({
550
+ field: field.key,
551
+ message: `${field.label} must be between ${field.min} and ${field.max} ${field.unit}`
552
+ });
553
+ }
554
+ }
555
+ if (values === 0 && problems.length === 0) {
556
+ problems.push({ field: null, message: "Add at least one measurement" });
557
+ }
558
+ return problems;
559
+ }
560
+ function summarizeBodyProgress(entries, rangeStart) {
561
+ const ordered = [...entries].sort((a, b) => a.date.localeCompare(b.date));
562
+ return BODY_MEASUREMENT_FIELD_KEYS.map((field) => {
563
+ const recorded = ordered.filter((entry) => entry[field] !== null);
564
+ const latestEntry = recorded[recorded.length - 1] ?? null;
565
+ const firstInRange = recorded.find((entry) => rangeStart === null || entry.date >= rangeStart) ?? null;
566
+ const hasChange = latestEntry !== null && firstInRange !== null && firstInRange.date !== latestEntry.date;
567
+ return {
568
+ field,
569
+ latest: latestEntry?.[field] ?? null,
570
+ latestDate: latestEntry?.date ?? null,
571
+ change: hasChange ? Math.round((latestEntry[field] - firstInRange[field]) * 100) / 100 : null,
572
+ changeSince: hasChange ? firstInRange.date : null
573
+ };
574
+ });
575
+ }
576
+ function latestBodyWeight(entries) {
577
+ let latest = null;
578
+ for (const entry of entries) {
579
+ if (entry.weightKg === null) continue;
580
+ if (latest === null || entry.date > latest.date) {
581
+ latest = { date: entry.date, weightKg: entry.weightKg };
582
+ }
583
+ }
584
+ return latest?.weightKg ?? null;
585
+ }
586
+
485
587
  // src/achievements.ts
486
588
  var ACHIEVEMENT_CATEGORIES = [
487
589
  "SESSIONS",
@@ -864,6 +966,59 @@ function followWorkingLoad(sets, equipment) {
864
966
  );
865
967
  }
866
968
 
969
+ // src/exercise-groups.ts
970
+ var EXERCISE_GROUP_MAX = 6;
971
+ var EXERCISE_GROUP_KIND_LABELS = {
972
+ SUPERSET: "Superset",
973
+ CIRCUIT: "Circuit"
974
+ };
975
+ var letterFor = (index) => index < 26 ? String.fromCharCode(65 + index) : letterFor(Math.floor(index / 26) - 1) + letterFor(index % 26);
976
+ function exerciseGroups(exercises) {
977
+ const groups = [];
978
+ let index = 0;
979
+ while (index < exercises.length) {
980
+ const indices = [index];
981
+ while (exercises[indices[indices.length - 1]].linkedToNext && indices[indices.length - 1] + 1 < exercises.length) {
982
+ indices.push(indices[indices.length - 1] + 1);
983
+ }
984
+ if (indices.length > 1) {
985
+ groups.push({
986
+ letter: letterFor(groups.length),
987
+ kind: indices.length === 2 ? "SUPERSET" : "CIRCUIT",
988
+ indices
989
+ });
990
+ }
991
+ index = indices[indices.length - 1] + 1;
992
+ }
993
+ return groups;
994
+ }
995
+ function exerciseGroupPosition(exercises, index) {
996
+ for (const group of exerciseGroups(exercises)) {
997
+ const at = group.indices.indexOf(index);
998
+ if (at >= 0) return { group, position: at + 1 };
999
+ }
1000
+ return null;
1001
+ }
1002
+ var exerciseGroupLabel = ({ group, position }) => `${EXERCISE_GROUP_KIND_LABELS[group.kind]} ${group.letter}${position}`;
1003
+ function canLinkToNext(exercises, index) {
1004
+ if (index < 0 || index >= exercises.length - 1) return false;
1005
+ let start = index;
1006
+ while (start > 0 && exercises[start - 1].linkedToNext) start -= 1;
1007
+ let end = index + 1;
1008
+ while (end < exercises.length - 1 && exercises[end].linkedToNext) end += 1;
1009
+ return end - start + 1 <= EXERCISE_GROUP_MAX;
1010
+ }
1011
+ function normalizeExerciseLinks(exercises) {
1012
+ return exercises.map(
1013
+ (exercise, index) => exercise.linkedToNext && index === exercises.length - 1 ? { ...exercise, linkedToNext: false } : exercise
1014
+ );
1015
+ }
1016
+ function hasOversizedGroup(exercises) {
1017
+ return exerciseGroups(exercises).some(
1018
+ (group) => group.indices.length > EXERCISE_GROUP_MAX
1019
+ );
1020
+ }
1021
+
867
1022
  // src/routine.ts
868
1023
  var ROUTINE_SCHEDULE_MODES = ["WEEKLY", "ROTATION"];
869
1024
  var ROUTINE_DAYS_MAX = 7;
@@ -1292,6 +1447,9 @@ function accountExportFileName(username, exportedAt) {
1292
1447
  BAR_CHOICES_KG,
1293
1448
  BAR_WARM_UP_STEPS,
1294
1449
  BLOCKED_MEMBERS_MAX,
1450
+ BODY_MEASUREMENT_FIELDS,
1451
+ BODY_MEASUREMENT_FIELD_KEYS,
1452
+ BODY_PROGRESS_RANGES,
1295
1453
  CLONE_ROUTINE_REFUSALS,
1296
1454
  COMEBACK_MIN_INACTIVE_DAYS,
1297
1455
  COMEBACK_RECOGNITION_LIMIT,
@@ -1316,6 +1474,8 @@ function accountExportFileName(username, exportedAt) {
1316
1474
  DELOAD_SUGGESTION_ROUTINE_DAYS,
1317
1475
  DELOAD_SUGGESTION_SIGNALS,
1318
1476
  EXERCISE_EQUIPMENT,
1477
+ EXERCISE_GROUP_KIND_LABELS,
1478
+ EXERCISE_GROUP_MAX,
1319
1479
  EXERCISE_MECHANICS,
1320
1480
  FEATURED_PROFILE_ITEMS_MAX,
1321
1481
  FEATURED_PROFILE_ITEM_KINDS,
@@ -1440,20 +1600,30 @@ function accountExportFileName(username, exportedAt) {
1440
1600
  WORKOUT_SESSION_STATUSES,
1441
1601
  accountExportFileName,
1442
1602
  applyDeload,
1603
+ bodyMeasurementProblems,
1604
+ bodyProgressRangeStart,
1443
1605
  buildWarmUpRamp,
1444
1606
  calculatePlateLoading,
1607
+ canLinkToNext,
1445
1608
  countsAsWork,
1446
1609
  countsForProgression,
1447
1610
  customExerciseProblem,
1448
1611
  defaultWarmUpEquipment,
1449
1612
  deloadLengthDays,
1613
+ exerciseGroupLabel,
1614
+ exerciseGroupPosition,
1615
+ exerciseGroups,
1450
1616
  exerciseNameKey,
1451
1617
  followWorkingLoad,
1618
+ hasOversizedGroup,
1452
1619
  isBarLoaded,
1620
+ isBodyMeasurementDate,
1453
1621
  isSetKind,
1454
1622
  isWithinQuietHours,
1623
+ latestBodyWeight,
1455
1624
  leadWorkingWeight,
1456
1625
  matchesDeletionConfirmation,
1626
+ normalizeExerciseLinks,
1457
1627
  normalizeExerciseName,
1458
1628
  primaryEquipment,
1459
1629
  requiredToFinish,
@@ -1463,6 +1633,7 @@ function accountExportFileName(username, exportedAt) {
1463
1633
  sessionCorrectionWindow,
1464
1634
  setKindOf,
1465
1635
  setLogValuesDiffer,
1636
+ summarizeBodyProgress,
1466
1637
  trainingBlockCovers,
1467
1638
  warmUpLoad
1468
1639
  });
package/dist/index.d.cts CHANGED
@@ -406,6 +406,11 @@ interface RoutineExercise {
406
406
  minWeightIncrement: number;
407
407
  /** LIVE-20: warm-ups with a share follow the first working set. */
408
408
  warmUpsFollowLoad?: boolean;
409
+ /**
410
+ * ROUT-12: done in rounds with the next exercise of the day (a superset,
411
+ * or a circuit of three to six); see `exerciseGroups`.
412
+ */
413
+ linkedToNext?: boolean;
409
414
  exercise: {
410
415
  id: string;
411
416
  name: string;
@@ -423,6 +428,11 @@ interface CreateRoutineExerciseInput {
423
428
  minWeightIncrement: number;
424
429
  /** LIVE-20: warm-ups with a share follow the first working set. */
425
430
  warmUpsFollowLoad?: boolean;
431
+ /**
432
+ * ROUT-12: done in rounds with the next exercise of the day (a superset,
433
+ * or a circuit of three to six); see `exerciseGroups`.
434
+ */
435
+ linkedToNext?: boolean;
426
436
  sets: RoutineSet[];
427
437
  }
428
438
  interface RoutineDay {
@@ -553,6 +563,11 @@ interface RoutineVersionExercise {
553
563
  minWeightIncrement: number;
554
564
  /** LIVE-20; absent in setups captured before it. */
555
565
  warmUpsFollowLoad?: boolean;
566
+ /**
567
+ * ROUT-12: done in rounds with the next exercise of the day (a superset,
568
+ * or a circuit of three to six); see `exerciseGroups`.
569
+ */
570
+ linkedToNext?: boolean;
556
571
  sets: RoutineSet[];
557
572
  }
558
573
  interface RoutineVersionDay {
@@ -754,6 +769,8 @@ interface WorkoutSession {
754
769
  note?: string | null;
755
770
  progressionScheme: ProgressionScheme;
756
771
  minWeightIncrement: number;
772
+ /** ROUT-12: done in rounds with the next exercise of the day. */
773
+ linkedToNext?: boolean;
757
774
  exercise: {
758
775
  id: string;
759
776
  name: string;
@@ -1756,6 +1773,8 @@ interface ProfilePrivacySettings {
1756
1773
  routines: ProfileVisibility;
1757
1774
  achievements: ProfileVisibility;
1758
1775
  bodyMetrics: ProfileVisibility;
1776
+ /** PROG-12: the dated weight and measurement history, separate from bodyMetrics. */
1777
+ bodyProgress: ProfileVisibility;
1759
1778
  }
1760
1779
  interface ProfileDiscoverySettings {
1761
1780
  discoverableByName: boolean;
@@ -1771,6 +1790,7 @@ interface ProfileViewerAccess {
1771
1790
  routines: boolean;
1772
1791
  achievements: boolean;
1773
1792
  bodyMetrics: boolean;
1793
+ bodyProgress: boolean;
1774
1794
  }
1775
1795
  interface PublicTrainingSummary {
1776
1796
  completedWorkouts: number;
@@ -1912,8 +1932,13 @@ interface UpdateProfileRequest {
1912
1932
  weight?: number | null;
1913
1933
  height?: number | null;
1914
1934
  weightUnit?: WeightUnit;
1935
+ /**
1936
+ * PROG-12: the member's local date (YYYY-MM-DD). A changed weight is also
1937
+ * recorded as that date's body measurement; without it the server uses UTC.
1938
+ */
1939
+ localDate?: string;
1915
1940
  }
1916
- type UpdateProfilePrivacyRequest = Omit<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity'> & Partial<Pick<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity'>>;
1941
+ type UpdateProfilePrivacyRequest = Omit<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity' | 'bodyProgress'> & Partial<Pick<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity' | 'bodyProgress'>>;
1917
1942
  type UpdateProfileDiscoveryRequest = ProfileDiscoverySettings;
1918
1943
  interface PlatePairInventory {
1919
1944
  weightKg: number;
@@ -2171,6 +2196,108 @@ interface PersonalGoalsResponse {
2171
2196
  goals: PersonalGoalProgress[];
2172
2197
  }
2173
2198
 
2199
+ /**
2200
+ * PROG-12: dated body weight and measurements. One entry per member per local
2201
+ * date; every value is optional but an entry holds at least one. Weight is
2202
+ * kilograms whatever unit the account displays, lengths are centimetres.
2203
+ */
2204
+ declare const BODY_MEASUREMENT_FIELDS: readonly [{
2205
+ readonly key: "weightKg";
2206
+ readonly label: "Weight";
2207
+ readonly unit: "kg";
2208
+ readonly min: 20;
2209
+ readonly max: 1000;
2210
+ }, {
2211
+ readonly key: "waistCm";
2212
+ readonly label: "Waist";
2213
+ readonly unit: "cm";
2214
+ readonly min: 10;
2215
+ readonly max: 300;
2216
+ }, {
2217
+ readonly key: "hipsCm";
2218
+ readonly label: "Hips";
2219
+ readonly unit: "cm";
2220
+ readonly min: 10;
2221
+ readonly max: 300;
2222
+ }, {
2223
+ readonly key: "chestCm";
2224
+ readonly label: "Chest";
2225
+ readonly unit: "cm";
2226
+ readonly min: 10;
2227
+ readonly max: 300;
2228
+ }, {
2229
+ readonly key: "armCm";
2230
+ readonly label: "Arm";
2231
+ readonly unit: "cm";
2232
+ readonly min: 10;
2233
+ readonly max: 300;
2234
+ }, {
2235
+ readonly key: "thighCm";
2236
+ readonly label: "Thigh";
2237
+ readonly unit: "cm";
2238
+ readonly min: 10;
2239
+ readonly max: 300;
2240
+ }, {
2241
+ readonly key: "bodyFatPercent";
2242
+ readonly label: "Body fat";
2243
+ readonly unit: "%";
2244
+ readonly min: 2;
2245
+ readonly max: 75;
2246
+ }];
2247
+ type BodyMeasurementField = (typeof BODY_MEASUREMENT_FIELDS)[number]["key"];
2248
+ declare const BODY_MEASUREMENT_FIELD_KEYS: readonly BodyMeasurementField[];
2249
+ type BodyMeasurementValues = {
2250
+ [K in BodyMeasurementField]: number | null;
2251
+ };
2252
+ interface BodyMeasurement extends BodyMeasurementValues {
2253
+ /** The member's local date, YYYY-MM-DD. */
2254
+ date: string;
2255
+ updatedAt: IsoDateString;
2256
+ }
2257
+ /** PUT /body-measurements/:date. A missing or null value clears that field. */
2258
+ type UpsertBodyMeasurementRequest = Partial<BodyMeasurementValues>;
2259
+ declare const BODY_PROGRESS_RANGES: readonly ["30D", "90D", "1Y", "ALL"];
2260
+ type BodyProgressRange = (typeof BODY_PROGRESS_RANGES)[number];
2261
+ interface BodyFieldSummary {
2262
+ field: BodyMeasurementField;
2263
+ /** The most recent value ever recorded, and its date. */
2264
+ latest: number | null;
2265
+ latestDate: string | null;
2266
+ /**
2267
+ * Latest minus the first value recorded inside the range, when both exist
2268
+ * on different dates inside it; otherwise null.
2269
+ */
2270
+ change: number | null;
2271
+ changeSince: string | null;
2272
+ }
2273
+ /**
2274
+ * GET /body-measurements (the owner) and
2275
+ * GET /users/:identifier/body-measurements (another member, when their
2276
+ * `bodyProgress` visibility allows it). Entries are the range's, oldest first.
2277
+ */
2278
+ interface BodyProgressResponse {
2279
+ range: BodyProgressRange;
2280
+ rangeStart: string | null;
2281
+ entries: BodyMeasurement[];
2282
+ summary: BodyFieldSummary[];
2283
+ }
2284
+ declare function isBodyMeasurementDate(value: string): boolean;
2285
+ /** The first date a range covers, counting today; null for ALL. */
2286
+ declare function bodyProgressRangeStart(range: BodyProgressRange, today: string): string | null;
2287
+ /** The field a value is out of bounds for, with the reason in words. */
2288
+ interface BodyMeasurementProblem {
2289
+ field: BodyMeasurementField | null;
2290
+ message: string;
2291
+ }
2292
+ declare function bodyMeasurementProblems(input: UpsertBodyMeasurementRequest): BodyMeasurementProblem[];
2293
+ /**
2294
+ * Per field: the latest value ever recorded and its change over the range.
2295
+ * `entries` is every entry the member has, in any order.
2296
+ */
2297
+ declare function summarizeBodyProgress(entries: ReadonlyArray<Pick<BodyMeasurement, "date"> & BodyMeasurementValues>, rangeStart: string | null): BodyFieldSummary[];
2298
+ /** The date `User.weight` follows: the latest entry that records a weight. */
2299
+ declare function latestBodyWeight(entries: ReadonlyArray<Pick<BodyMeasurement, "date" | "weightKg">>): number | null;
2300
+
2174
2301
  interface PlateLoadingItem {
2175
2302
  weightKg: number;
2176
2303
  platesPerSide: number;
@@ -2267,6 +2394,41 @@ declare function leadWorkingWeight(sets: readonly FollowingSet[]): number | null
2267
2394
  */
2268
2395
  declare function followWorkingLoad<T extends FollowingSet>(sets: readonly T[], equipment: WarmUpEquipment): T[];
2269
2396
 
2397
+ /** Two linked exercises are a superset; three to this many, a circuit. */
2398
+ declare const EXERCISE_GROUP_MAX = 6;
2399
+ type ExerciseGroupKind = 'SUPERSET' | 'CIRCUIT';
2400
+ declare const EXERCISE_GROUP_KIND_LABELS: Record<ExerciseGroupKind, string>;
2401
+ type Linkable = {
2402
+ linkedToNext?: boolean | null;
2403
+ };
2404
+ interface ExerciseGroup {
2405
+ /** A, B, C… in the order the groups appear in the day. */
2406
+ letter: string;
2407
+ kind: ExerciseGroupKind;
2408
+ /** Positions of the members in the day's exercise list, in order. */
2409
+ indices: number[];
2410
+ }
2411
+ /**
2412
+ * The day's groups, in order. An exercise linked to nothing, and the link of
2413
+ * a day's last exercise, belong to no group.
2414
+ */
2415
+ declare function exerciseGroups(exercises: readonly Linkable[]): ExerciseGroup[];
2416
+ interface ExerciseGroupPosition {
2417
+ group: ExerciseGroup;
2418
+ /** 1-based place in the round: A1, A2… */
2419
+ position: number;
2420
+ }
2421
+ /** Where one exercise of the day stands, or null when it is on its own. */
2422
+ declare function exerciseGroupPosition(exercises: readonly Linkable[], index: number): ExerciseGroupPosition | null;
2423
+ /** "Superset A1", "Circuit B3". */
2424
+ declare const exerciseGroupLabel: ({ group, position }: ExerciseGroupPosition) => string;
2425
+ /** Whether linking exercise `index` to the next would make a group too large. */
2426
+ declare function canLinkToNext(exercises: readonly Linkable[], index: number): boolean;
2427
+ /** A day's links as they may be stored: the last exercise never links. */
2428
+ declare function normalizeExerciseLinks<T extends Linkable>(exercises: readonly T[]): T[];
2429
+ /** A group larger than `EXERCISE_GROUP_MAX`, which no day may hold. */
2430
+ declare function hasOversizedGroup(exercises: readonly Linkable[]): boolean;
2431
+
2270
2432
  /**
2271
2433
  * INTEL-02: a lighter period proposed from the signals `PROG-10` states. The
2272
2434
  * suggestion acts on evidence only -- it names what was marked and when, never
@@ -3529,6 +3691,12 @@ interface AccountExportTrainingEvent {
3529
3691
  schemaVersion: number;
3530
3692
  payload: unknown;
3531
3693
  }
3694
+ /** Weight in kilograms, lengths in centimetres. */
3695
+ interface AccountExportBodyMeasurement extends BodyMeasurementValues {
3696
+ date: string;
3697
+ createdAt: IsoDateString;
3698
+ updatedAt: IsoDateString;
3699
+ }
3532
3700
  interface AccountExportGoal {
3533
3701
  type: string;
3534
3702
  direction: string;
@@ -3588,6 +3756,8 @@ interface AccountExportV1 {
3588
3756
  personalRecords: AccountExportPersonalRecord[];
3589
3757
  trainingEvents: AccountExportTrainingEvent[];
3590
3758
  goals: AccountExportGoal[];
3759
+ /** PROG-12: every dated body weight and measurement entry. */
3760
+ bodyMeasurements?: AccountExportBodyMeasurement[];
3591
3761
  trainingLocations: AccountExportTrainingLocation[];
3592
3762
  scheduleOverrides: AccountExportScheduleOverride[];
3593
3763
  exercises: {
@@ -3652,4 +3822,4 @@ interface AccountExportV1 {
3652
3822
  /** The file name a download of the export is saved under. */
3653
3823
  declare function accountExportFileName(username: string, exportedAt: string): string;
3654
3824
 
3655
- export { ACCOUNT_EXPORT_FORMAT, ACCOUNT_EXPORT_VERSION, ACHIEVEMENT_CATEGORIES, ACHIEVEMENT_DEFINITIONS, ACTIVITY_CAPS, ACTIVITY_COMMENTS_PAGE_SIZE, ACTIVITY_COMMENTS_PER_DAY_MAX, ACTIVITY_COMMENT_MAX_LENGTH, ACTIVITY_DEFAULT_AUDIENCE, ACTIVITY_ENTRY_ID_MAX_LENGTH, ACTIVITY_FEED_FOLLOWED_MAX, ACTIVITY_PAGE_DEFAULT_LIMIT, ACTIVITY_PAGE_MAX_LIMIT, ACTIVITY_PREVIEW_AUDIENCES, ACTIVITY_REACTIONS, ACTIVITY_TYPES, ACTIVITY_TYPE_SECTIONS, type AccountExportGoal, type AccountExportMember, type AccountExportPersonalRecord, type AccountExportRoutine, type AccountExportScheduleOverride, type AccountExportTrainingEvent, type AccountExportTrainingLocation, type AccountExportV1, type AchievementActivity, type AchievementCategory, type AchievementCategoryProgress, type AchievementDefinition, type AchievementNotification, type AchievementUnlockedEventPayload, type AchievementsResponse, type ActivityAudience, type ActivityCap, type ActivityComment, type ActivityCommentNotification, type ActivityCommentSummary, type ActivityCommentsQuery, type ActivityCommentsResponse, type ActivityEntry, type ActivityEntrySharing, type ActivityFeedResponse, type ActivityLink, type ActivityPage, type ActivityPageQuery, type ActivityPreviewAudience, type ActivityPreviewQuery, type ActivityReaction, type ActivityReactionSummary, type ActivitySection, type ActivitySharingSettings, type ActivityType, type AppNotification, BAR_CHOICES_KG, BAR_WARM_UP_STEPS, BLOCKED_MEMBERS_MAX, type BlockComparisonLift, type BlockComparisonLiftBest, type BlockComparisonPeriod, type BlockComparisonPeriodKind, type BlockedMember, type BlockedMembersResponse, type Brand, CLONE_ROUTINE_REFUSALS, COMEBACK_MIN_INACTIVE_DAYS, COMEBACK_RECOGNITION_LIMIT, COMEBACK_REQUIRED_ACTIVE_DAYS, COMEBACK_SESSION_LOOKBACK, COMEBACK_WINDOW_DAYS, CUSTOM_EXERCISES_MAX, CUSTOM_EXERCISE_NAME_MAX, CUSTOM_EXERCISE_NOTE_MAX, CUSTOM_EXERCISE_PROBLEM_MESSAGES, CUSTOM_EXERCISE_REFUSALS, type CalendarDate, type CloneRoutineRefusal, type CloneRoutineRequest, type ComebackActivity, type ComebackRecognition, type ComebackRecognitionSummary, type CorrectSessionRequest, type CorrectSessionResponse, type CorrectSessionSetRequest, type CreateActivityCommentRequest, type CreateActivityCommentResponse, type CreateDeloadRequest, type CreateReportRequest, type CreateReportResponse, type CreateRoutineDayInput, type CreateRoutineExerciseInput, type CreateRoutineRequest, type CreateRoutineVersionRequest, type CreateSessionShareRequest, type CustomExerciseInput, type CustomExerciseProblem, type CustomExerciseRefusal, DELOAD_DEFAULT_DAYS, DELOAD_DEFAULT_LOAD_REDUCTION, DELOAD_DEFAULT_SET_MODE, DELOAD_LOAD_REDUCTIONS, DELOAD_MAX_DAYS, DELOAD_NOT_LIGHTER, DELOAD_SET_MODES, DELOAD_SUGGESTION_COOLDOWN_DAYS, DELOAD_SUGGESTION_EARLIER_DAYS, DELOAD_SUGGESTION_MIN_MARKED_TODAY, DELOAD_SUGGESTION_ROUTINE_DAYS, DELOAD_SUGGESTION_SIGNALS, type DeclineSignal, type DecliningLift, type DecliningLiftSession, type DeleteAccountRequest, type DeleteAccountResponse, type DeleteActivityCommentResponse, type DeletePushSubscriptionRequest, type DeloadLoadReduction, type DeloadOptions, type DeloadSetMode, type DeloadSuggestion, type DeloadSuggestionEvidence, type DeloadSuggestionResponse, type DeloadSuggestionSignal, type DeloadSuggestionUnavailableReason, type DiscoverableRoutine, EXERCISE_EQUIPMENT, EXERCISE_MECHANICS, type EarnedAchievement, type EarnedPersonalRecord, type EffortPeriod, type EffortSignal, type Exercise, type ExerciseEquipment, type ExerciseId, type ExerciseMechanic, type ExercisePerformanceHistoryQuery, type ExercisePerformanceHistoryResponse, type ExercisePerformancePrescription, type ExercisePerformancePrescriptionSet, type ExercisePerformanceSession, type ExercisePerformanceSet, type ExercisePerformanceSummary, type ExercisePlateau, type ExerciseStrengthSummary, type ExerciseStrengthTrendPoint, type ExerciseStrengthTrendQuery, type ExerciseStrengthTrendResponse, FEATURED_PROFILE_ITEMS_MAX, FEATURED_PROFILE_ITEM_KINDS, FEATURED_PROFILE_REFERENCE_MAX_LENGTH, FOLLOW_SUGGESTIONS_DEFAULT_LIMIT, FOLLOW_SUGGESTIONS_MAX_LIMIT, FOLLOW_SUGGESTION_REASONS, type FeaturedProfileAchievementItem, type FeaturedProfileItem, type FeaturedProfileItemKind, type FeaturedProfileRankItem, type FeaturedProfileRecordItem, type FeaturedProfileRoutineItem, type FeaturedProfileSelection, type FeaturedProfileSelectionInput, type FeaturedProfileSelectionsResponse, type FinishStatus, type FinishWorkoutRequest, type FinishWorkoutResponse, type FollowSuggestion, type FollowSuggestionReason, type FollowSuggestionsResponse, type IsoDateString, LIMITED_SHORTFALL_KG, type ListSessionsParams, MAX_SETS_PER_EXERCISE, MEASURABLE_GOALS_MAX, MEASURABLE_GOAL_DIRECTIONS, MEASURABLE_GOAL_TYPES, MINUTES_IN_DAY, MODERATION_ACTION_KINDS, MODERATION_HISTORY_PAGE_SIZE, MODERATION_NOTE_MAX_LENGTH, MODERATION_QUEUE_PAGE_SIZE, MOVEMENT_PATTERNS, MUSCLE_GROUPS, type MarkNotificationsReadRequest, type MarkNotificationsReadResponse, type MeasurableGoal, type MeasurableGoalDirection, type MeasurableGoalExercise, type MeasurableGoalInput, type MeasurableGoalType, type MemberActivityResponse, type MemberModerationState, type MemberRoutinesResponse, type ModerationActionKind, type ModerationActionRecord, type ModerationHistoryQuery, type ModerationHistoryResponse, type ModerationQueueQuery, type ModerationQueueResponse, type ModerationReport, type ModeratorState, type MoveOccurrenceRequest, type MovementPattern, type MuscleGroup, type MuscleGroupHeatmapQuery, type MuscleGroupHeatmapResponse, type MuscleGroupHeatmapValue, type MuscleGroupHeatmapWeek, type MuscleVolumeTrendSeries, NOTIFICATIONS_LIST_LIMIT, NOTIFICATIONS_LOOKBACK_DAYS, NOTIFICATIONS_RETENTION_DAYS, NOTIFICATION_CATEGORIES, NOTIFICATION_KINDS, type NewFollowerNotification, type NotificationCategory, type NotificationKind, type NotificationPreferences, type NotificationPreferencesResponse, type NotificationsResponse, OTHER_WARM_UP_STEPS, type OwnActivityEntry, type OwnActivityResponse, PLATEAU_MIN_DAYS_SINCE_BEST, PLATEAU_MIN_SESSIONS, PLATEAU_MIN_SESSIONS_MAX, PLATEAU_MIN_SESSIONS_MIN, PLATEAU_RECENT_DAYS, PLATEAU_WINDOW_DAYS, PLATE_SETS, PREFERRED_TRAINING_STYLE_VALUES, PROFILE_BIO_MAX_LENGTH, PROFILE_FAVORITE_EXERCISES_MAX, PROFILE_LOCATION_MAX_LENGTH, PROFILE_TRAINING_DISCIPLINES_MAX, PROFILE_TRAINING_GOALS_MAX, PROFILE_VISIBILITY_VALUES, PROGRESSION_SCHEMES, PROGRESS_TIMELINE_EVENT_TYPES, PUSH_PAYLOAD_KINDS, PUSH_SUBSCRIPTIONS_MAX, type PaginatedResponse, type PersonalGoalProgress, type PersonalGoalsResponse, type PersonalRecordActivity, type PersonalRecordEntry, type PersonalRecordKind, type PlannedReminder, type PlateLoadingItem, type PlateLoadingResult, type PlatePairInventory, type PlateSetChoice, type PlateauPreferences, type PlateauSet, type PlateausResponse, type PreferredTrainingStyle, type PreviousPerformanceResponse, type PreviousSessionRecap, type PreviousSetPerformance, type ProfileDiscoverySettings, type ProfileFavoriteExercise, type ProfilePrivacySettings, type ProfileViewerAccess, type ProfileVisibility, type ProgressTimelineEventType, type ProgressTimelineItem, type ProgressTimelinePersonalRecordItem, type ProgressTimelineProgressionItem, type ProgressTimelineQuery, type ProgressTimelineRecordPerformance, type ProgressTimelineRecordReason, type ProgressTimelineResponse, type ProgressTimelineSessionContext, type ProgressionActivity, type ProgressionChange, type ProgressionRule, type ProgressionScheme, type ProgressionSetChange, type PublicBodyMetrics, type PublicProfileAchievements, type PublicTrainingSummary, type PublicUserProfile, type PushPayload, type PushPayloadKind, type PushSubscriptionKeys, type PushSubscriptionSummary, type PushSubscriptionsResponse, type QuietHours, RELATIONSHIP_LIST_DEFAULT_LIMIT, RELATIONSHIP_LIST_KINDS, RELATIONSHIP_LIST_MAX_LIMIT, RENAISSANCE_RANK_DEFINITIONS, REPORTS_PER_DAY_MAX, REPORT_DETAILS_MAX_LENGTH, REPORT_REASONS, REPORT_STATUSES, REPORT_SUBJECT_KINDS, REP_TYPES, RESERVED_USERNAMES, REST_ALERT_MAX_LEAD_SECONDS, REST_ALERT_MIN_LEAD_SECONDS, REST_ALERT_REFUSALS, ROUTINE_DAYS_MAX, ROUTINE_DAY_NAME_MAX, ROUTINE_DISCOVERY_DEFAULT_LIMIT, ROUTINE_DISCOVERY_MAX_LIMIT, ROUTINE_DISCOVERY_SCAN_LIMIT, ROUTINE_DURATION_BANDS, ROUTINE_DURATION_BAND_MAX_MINUTES, ROUTINE_SCHEDULE_MODES, ROUTINE_SHARE_MAX_ACTIVE_LINKS, ROUTINE_TRAINING_BLOCKS_MAX, ROUTINE_TRAINING_BLOCK_NAME_MAX, ROUTINE_TRAINING_BLOCK_REVISIONS_MAX, ROUTINE_TRAINING_BLOCK_SOURCE_KINDS, ROUTINE_TRAINING_BLOCK_STATES, ROUTINE_VERSIONS_MAX, ROUTINE_VERSION_KINDS, ROUTINE_VERSION_NAME_MAX, ROUTINE_VISIBILITY_VALUES, type RecentActivityEntry, type RegisterPushSubscriptionRequest, type RelationshipListKind, type RelationshipListQuery, type RelationshipListResponse, type RelationshipMember, type RenaissanceRankDefinition, type RenaissanceRankProgress, type RepTargetPeriod, type RepTargetSignal, type RepType, type ReplaceFeaturedProfileItemsRequest, type ReplaceMeasurableGoalsRequest, type ReplaceTrainingLocationsRequest, type ReportReason, type ReportStatus, type ReportSubjectKind, type ReportSubjectPreview, type ResolvedRoutinePlan, type RestAlertPushPayload, type RestAlertRefusal, type RestoreRoutineVersionResponse, type ReviewReportRequest, type ReviewReportResponse, type Routine, type RoutineClassification, type RoutineDay, type RoutineDayId, type RoutineDiscoveryQuery, type RoutineDiscoveryResponse, type RoutineDurationBand, type RoutineExercise, type RoutineFacets, type RoutineId, type RoutineLineage, type RoutinePlanSource, type RoutineScheduleMode, type RoutineSet, type RoutineShare, type RoutineShareListResponse, type RoutineSharedActivity, type RoutineTemporaryOverride, type RoutineTemporaryOverridePlan, type RoutineTemporaryOverridesResponse, type RoutineTrainingBlock, type RoutineTrainingBlockPlan, type RoutineTrainingBlockRevision, type RoutineTrainingBlockRevisionsResponse, type RoutineTrainingBlockSource, type RoutineTrainingBlockSourceKind, type RoutineTrainingBlockState, type RoutineTrainingBlocksResponse, type RoutineVersion, type RoutineVersionDay, type RoutineVersionExercise, type RoutineVersionKind, type RoutineVersionSetup, type RoutineVersionsResponse, type RoutineVisibility, SCHEDULE_MOVE_MAX_DAYS, SCHEDULE_OVERRIDES_MAX_RANGE_DAYS, SCHEDULE_OVERRIDE_KINDS, SCHEDULE_SKIP_PAST_DAYS, SESSION_CORRECTIONS_MAX, SESSION_CORRECTION_LIMITS, SESSION_CORRECTION_WINDOW_HOURS, SESSION_EXERCISE_NOTE_MAX_LENGTH, SESSION_NOTE_MAX_LENGTH, SESSION_SHARE_DEFAULT_FIELDS, SESSION_SHARE_FIELDS, SESSION_SHARE_MAX_ACTIVE_LINKS, SET_KINDS, SET_KIND_LABELS, SEXES, SHARED_ROUTINE_SOURCES, STARRED_EXERCISES_MAX, STREAK_MAX_GAP_DAYS, type ScheduleOverride, type ScheduleOverrideKind, type ScheduleOverridesQuery, type ScheduleOverridesResponse, type ScheduleRestAlertRequest, type ScheduleRestAlertResponse, type SendTrainingPartnerEncouragementRequest, type SendTrainingPartnerEncouragementResponse, type SessionComparisonExercise, type SessionComparisonQuery, type SessionComparisonResponse, type SessionComparisonRoutineDay, type SessionComparisonSession, type SessionComparisonSet, type SessionCompletedActivity, type SessionCorrection, type SessionCorrectionClosedReason, type SessionCorrectionWindow, type SessionCorrectionsResponse, type SessionExerciseNote, type SessionExerciseSubstitution, type SessionProgressNotification, type SessionRecapExerciseNote, type SessionRecapRecord, type SessionSetCorrection, type SessionShare, type SessionShareField, type SessionShareListResponse, type SessionTemporaryOverride, type SessionTrainingBlock, type SetAccountTimeZoneRequest, type SetActivityEntryAudienceRequest, type SetActivityEntryAudienceResponse, type SetActivityReactionRequest, type SetActivityReactionResponse, type SetKind, type SetLog, type SetLogValues, type Sex, type SharedRoutine, type SharedRoutineOwner, type SharedRoutineSource, type SharedRoutineSummary, type SharedSessionOwner, type SharedSessionRecap, type SkipOccurrenceRequest, type StarredExercise, type StarredExercisesResponse, type StartWorkoutRequest, type StartWorkoutResponse, type StreakAtRiskPushPayload, type StreakMilestoneActivity, type StreakMilestoneEventPayload, type SubstituteSessionExerciseRequest, type SubstituteSessionExerciseResponse, type SupabaseAuthResponse, type SupabaseAuthUser, type SupabaseMigrationResponse, TEMPORARY_OVERRIDE_KINDS, TEMPORARY_OVERRIDE_SOURCE_KINDS, TRAINING_BLOCK_COMPARISON_MAX_DAYS, TRAINING_DISCIPLINE_VALUES, TRAINING_EVENT_TYPES, TRAINING_EXPERIENCE_LEVEL_VALUES, TRAINING_GOAL_VALUES, TRAINING_PARTNERSHIP_STATUSES, TRAINING_PARTNERS_MAX, TRAINING_PARTNER_ENCOURAGEMENTS_PER_24_HOURS_MAX, TRAINING_PARTNER_ENCOURAGEMENT_KINDS, TRAINING_PARTNER_PERMISSION_KEYS, TRAINING_PARTNER_REQUESTS_PER_DAY_MAX, TRAINING_SIGNAL_DECLINES_MAX, TRAINING_SIGNAL_DECLINE_SESSIONS, TRAINING_SIGNAL_MIN_DECLINE, TRAINING_SIGNAL_MIN_RPE_SETS, TRAINING_SIGNAL_MIN_SHORT_SETS, TRAINING_SIGNAL_MIN_TARGET_SETS, TRAINING_SIGNAL_PERIOD_DAYS, TRAINING_SIGNAL_RPE_RISE, TRAINING_SIGNAL_SHORT_LIFTS_MAX, TRAINING_SIGNAL_SHORT_POINTS_RISE, TRAINING_SIGNAL_WORKOUT_DROP, type TemporaryOverrideKind, type TemporaryOverrideSource, type TemporaryOverrideSourceKind, type TrainingBlockComparisonResponse, type TrainingDiscipline, type TrainingEventType, type TrainingExperienceLevel, type TrainingGoal, type TrainingIdentity, type TrainingLocationPreference, type TrainingLocationPreferenceInput, type TrainingPartnerAchievementNotification, type TrainingPartnerAchievementPushPayload, type TrainingPartnerEncouragementKind, type TrainingPartnerEncouragementNotification, type TrainingPartnerPermissions, type TrainingPartnerScheduleDay, type TrainingPartnerScheduleResponse, type TrainingPartnerSessionNotification, type TrainingPartnerSessionPushPayload, type TrainingPartnership, type TrainingPartnershipStatus, type TrainingPartnershipsResponse, type TrainingReminderPreference, type TrainingReminderPushPayload, type TrainingSignalPeriod, type TrainingSignalsResponse, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, USERNAME_PATTERN_SOURCE, type UpdateActivitySharingRequest, type UpdateCustomExerciseRequest, type UpdateNotificationPreferencesRequest, type UpdateProfileDiscoveryRequest, type UpdateProfilePrivacyRequest, type UpdateProfileRequest, type UpdateRoutineRequest, type UpdateRoutineVisibilityRequest, type UpdateSessionNotesRequest, type UpdateSessionNotesResponse, type UpdateTrainingPartnerPermissionsRequest, type UpsertRoutineTrainingBlockRequest, type UpsertSetLogRequest, type UpsertSetLogResponse, type UserId, type UserProfile, type UserSearchResponse, type VolumeTrendPoint, type VolumeTrendQuery, type VolumeTrendResponse, type VolumeTrendSeries, WEIGHT_UNITS, WORKOUT_SESSION_STATUSES, type WarmUpEquipment, type WarmUpLoad, type WarmUpRamp, type WarmUpSet, type WarmUpStep, type WeightUnit, type WorkoutAnalyticsStatus, type WorkoutPeriod, type WorkoutProgressQuery, type WorkoutProgressResponse, type WorkoutSession, type WorkoutSessionId, type WorkoutSessionListResponse, type WorkoutSessionRecap, type WorkoutSessionSnapshotV1, type WorkoutSessionStatus, type WorkoutSessionSummary, type WorkoutSignal, type WorkoutStatsQuery, type WorkoutStatsResponse, accountExportFileName, applyDeload, buildWarmUpRamp, calculatePlateLoading, countsAsWork, countsForProgression, customExerciseProblem, defaultWarmUpEquipment, deloadLengthDays, exerciseNameKey, followWorkingLoad, isBarLoaded, isSetKind, isWithinQuietHours, leadWorkingWeight, matchesDeletionConfirmation, normalizeExerciseName, primaryEquipment, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, trainingBlockCovers, warmUpLoad };
3825
+ export { ACCOUNT_EXPORT_FORMAT, ACCOUNT_EXPORT_VERSION, ACHIEVEMENT_CATEGORIES, ACHIEVEMENT_DEFINITIONS, ACTIVITY_CAPS, ACTIVITY_COMMENTS_PAGE_SIZE, ACTIVITY_COMMENTS_PER_DAY_MAX, ACTIVITY_COMMENT_MAX_LENGTH, ACTIVITY_DEFAULT_AUDIENCE, ACTIVITY_ENTRY_ID_MAX_LENGTH, ACTIVITY_FEED_FOLLOWED_MAX, ACTIVITY_PAGE_DEFAULT_LIMIT, ACTIVITY_PAGE_MAX_LIMIT, ACTIVITY_PREVIEW_AUDIENCES, ACTIVITY_REACTIONS, ACTIVITY_TYPES, ACTIVITY_TYPE_SECTIONS, type AccountExportBodyMeasurement, type AccountExportGoal, type AccountExportMember, type AccountExportPersonalRecord, type AccountExportRoutine, type AccountExportScheduleOverride, type AccountExportTrainingEvent, type AccountExportTrainingLocation, type AccountExportV1, type AchievementActivity, type AchievementCategory, type AchievementCategoryProgress, type AchievementDefinition, type AchievementNotification, type AchievementUnlockedEventPayload, type AchievementsResponse, type ActivityAudience, type ActivityCap, type ActivityComment, type ActivityCommentNotification, type ActivityCommentSummary, type ActivityCommentsQuery, type ActivityCommentsResponse, type ActivityEntry, type ActivityEntrySharing, type ActivityFeedResponse, type ActivityLink, type ActivityPage, type ActivityPageQuery, type ActivityPreviewAudience, type ActivityPreviewQuery, type ActivityReaction, type ActivityReactionSummary, type ActivitySection, type ActivitySharingSettings, type ActivityType, type AppNotification, BAR_CHOICES_KG, BAR_WARM_UP_STEPS, BLOCKED_MEMBERS_MAX, BODY_MEASUREMENT_FIELDS, BODY_MEASUREMENT_FIELD_KEYS, BODY_PROGRESS_RANGES, type BlockComparisonLift, type BlockComparisonLiftBest, type BlockComparisonPeriod, type BlockComparisonPeriodKind, type BlockedMember, type BlockedMembersResponse, type BodyFieldSummary, type BodyMeasurement, type BodyMeasurementField, type BodyMeasurementProblem, type BodyMeasurementValues, type BodyProgressRange, type BodyProgressResponse, type Brand, CLONE_ROUTINE_REFUSALS, COMEBACK_MIN_INACTIVE_DAYS, COMEBACK_RECOGNITION_LIMIT, COMEBACK_REQUIRED_ACTIVE_DAYS, COMEBACK_SESSION_LOOKBACK, COMEBACK_WINDOW_DAYS, CUSTOM_EXERCISES_MAX, CUSTOM_EXERCISE_NAME_MAX, CUSTOM_EXERCISE_NOTE_MAX, CUSTOM_EXERCISE_PROBLEM_MESSAGES, CUSTOM_EXERCISE_REFUSALS, type CalendarDate, type CloneRoutineRefusal, type CloneRoutineRequest, type ComebackActivity, type ComebackRecognition, type ComebackRecognitionSummary, type CorrectSessionRequest, type CorrectSessionResponse, type CorrectSessionSetRequest, type CreateActivityCommentRequest, type CreateActivityCommentResponse, type CreateDeloadRequest, type CreateReportRequest, type CreateReportResponse, type CreateRoutineDayInput, type CreateRoutineExerciseInput, type CreateRoutineRequest, type CreateRoutineVersionRequest, type CreateSessionShareRequest, type CustomExerciseInput, type CustomExerciseProblem, type CustomExerciseRefusal, DELOAD_DEFAULT_DAYS, DELOAD_DEFAULT_LOAD_REDUCTION, DELOAD_DEFAULT_SET_MODE, DELOAD_LOAD_REDUCTIONS, DELOAD_MAX_DAYS, DELOAD_NOT_LIGHTER, DELOAD_SET_MODES, DELOAD_SUGGESTION_COOLDOWN_DAYS, DELOAD_SUGGESTION_EARLIER_DAYS, DELOAD_SUGGESTION_MIN_MARKED_TODAY, DELOAD_SUGGESTION_ROUTINE_DAYS, DELOAD_SUGGESTION_SIGNALS, type DeclineSignal, type DecliningLift, type DecliningLiftSession, type DeleteAccountRequest, type DeleteAccountResponse, type DeleteActivityCommentResponse, type DeletePushSubscriptionRequest, type DeloadLoadReduction, type DeloadOptions, type DeloadSetMode, type DeloadSuggestion, type DeloadSuggestionEvidence, type DeloadSuggestionResponse, type DeloadSuggestionSignal, type DeloadSuggestionUnavailableReason, type DiscoverableRoutine, EXERCISE_EQUIPMENT, EXERCISE_GROUP_KIND_LABELS, EXERCISE_GROUP_MAX, EXERCISE_MECHANICS, type EarnedAchievement, type EarnedPersonalRecord, type EffortPeriod, type EffortSignal, type Exercise, type ExerciseEquipment, type ExerciseGroup, type ExerciseGroupKind, type ExerciseGroupPosition, type ExerciseId, type ExerciseMechanic, type ExercisePerformanceHistoryQuery, type ExercisePerformanceHistoryResponse, type ExercisePerformancePrescription, type ExercisePerformancePrescriptionSet, type ExercisePerformanceSession, type ExercisePerformanceSet, type ExercisePerformanceSummary, type ExercisePlateau, type ExerciseStrengthSummary, type ExerciseStrengthTrendPoint, type ExerciseStrengthTrendQuery, type ExerciseStrengthTrendResponse, FEATURED_PROFILE_ITEMS_MAX, FEATURED_PROFILE_ITEM_KINDS, FEATURED_PROFILE_REFERENCE_MAX_LENGTH, FOLLOW_SUGGESTIONS_DEFAULT_LIMIT, FOLLOW_SUGGESTIONS_MAX_LIMIT, FOLLOW_SUGGESTION_REASONS, type FeaturedProfileAchievementItem, type FeaturedProfileItem, type FeaturedProfileItemKind, type FeaturedProfileRankItem, type FeaturedProfileRecordItem, type FeaturedProfileRoutineItem, type FeaturedProfileSelection, type FeaturedProfileSelectionInput, type FeaturedProfileSelectionsResponse, type FinishStatus, type FinishWorkoutRequest, type FinishWorkoutResponse, type FollowSuggestion, type FollowSuggestionReason, type FollowSuggestionsResponse, type IsoDateString, LIMITED_SHORTFALL_KG, type ListSessionsParams, MAX_SETS_PER_EXERCISE, MEASURABLE_GOALS_MAX, MEASURABLE_GOAL_DIRECTIONS, MEASURABLE_GOAL_TYPES, MINUTES_IN_DAY, MODERATION_ACTION_KINDS, MODERATION_HISTORY_PAGE_SIZE, MODERATION_NOTE_MAX_LENGTH, MODERATION_QUEUE_PAGE_SIZE, MOVEMENT_PATTERNS, MUSCLE_GROUPS, type MarkNotificationsReadRequest, type MarkNotificationsReadResponse, type MeasurableGoal, type MeasurableGoalDirection, type MeasurableGoalExercise, type MeasurableGoalInput, type MeasurableGoalType, type MemberActivityResponse, type MemberModerationState, type MemberRoutinesResponse, type ModerationActionKind, type ModerationActionRecord, type ModerationHistoryQuery, type ModerationHistoryResponse, type ModerationQueueQuery, type ModerationQueueResponse, type ModerationReport, type ModeratorState, type MoveOccurrenceRequest, type MovementPattern, type MuscleGroup, type MuscleGroupHeatmapQuery, type MuscleGroupHeatmapResponse, type MuscleGroupHeatmapValue, type MuscleGroupHeatmapWeek, type MuscleVolumeTrendSeries, NOTIFICATIONS_LIST_LIMIT, NOTIFICATIONS_LOOKBACK_DAYS, NOTIFICATIONS_RETENTION_DAYS, NOTIFICATION_CATEGORIES, NOTIFICATION_KINDS, type NewFollowerNotification, type NotificationCategory, type NotificationKind, type NotificationPreferences, type NotificationPreferencesResponse, type NotificationsResponse, OTHER_WARM_UP_STEPS, type OwnActivityEntry, type OwnActivityResponse, PLATEAU_MIN_DAYS_SINCE_BEST, PLATEAU_MIN_SESSIONS, PLATEAU_MIN_SESSIONS_MAX, PLATEAU_MIN_SESSIONS_MIN, PLATEAU_RECENT_DAYS, PLATEAU_WINDOW_DAYS, PLATE_SETS, PREFERRED_TRAINING_STYLE_VALUES, PROFILE_BIO_MAX_LENGTH, PROFILE_FAVORITE_EXERCISES_MAX, PROFILE_LOCATION_MAX_LENGTH, PROFILE_TRAINING_DISCIPLINES_MAX, PROFILE_TRAINING_GOALS_MAX, PROFILE_VISIBILITY_VALUES, PROGRESSION_SCHEMES, PROGRESS_TIMELINE_EVENT_TYPES, PUSH_PAYLOAD_KINDS, PUSH_SUBSCRIPTIONS_MAX, type PaginatedResponse, type PersonalGoalProgress, type PersonalGoalsResponse, type PersonalRecordActivity, type PersonalRecordEntry, type PersonalRecordKind, type PlannedReminder, type PlateLoadingItem, type PlateLoadingResult, type PlatePairInventory, type PlateSetChoice, type PlateauPreferences, type PlateauSet, type PlateausResponse, type PreferredTrainingStyle, type PreviousPerformanceResponse, type PreviousSessionRecap, type PreviousSetPerformance, type ProfileDiscoverySettings, type ProfileFavoriteExercise, type ProfilePrivacySettings, type ProfileViewerAccess, type ProfileVisibility, type ProgressTimelineEventType, type ProgressTimelineItem, type ProgressTimelinePersonalRecordItem, type ProgressTimelineProgressionItem, type ProgressTimelineQuery, type ProgressTimelineRecordPerformance, type ProgressTimelineRecordReason, type ProgressTimelineResponse, type ProgressTimelineSessionContext, type ProgressionActivity, type ProgressionChange, type ProgressionRule, type ProgressionScheme, type ProgressionSetChange, type PublicBodyMetrics, type PublicProfileAchievements, type PublicTrainingSummary, type PublicUserProfile, type PushPayload, type PushPayloadKind, type PushSubscriptionKeys, type PushSubscriptionSummary, type PushSubscriptionsResponse, type QuietHours, RELATIONSHIP_LIST_DEFAULT_LIMIT, RELATIONSHIP_LIST_KINDS, RELATIONSHIP_LIST_MAX_LIMIT, RENAISSANCE_RANK_DEFINITIONS, REPORTS_PER_DAY_MAX, REPORT_DETAILS_MAX_LENGTH, REPORT_REASONS, REPORT_STATUSES, REPORT_SUBJECT_KINDS, REP_TYPES, RESERVED_USERNAMES, REST_ALERT_MAX_LEAD_SECONDS, REST_ALERT_MIN_LEAD_SECONDS, REST_ALERT_REFUSALS, ROUTINE_DAYS_MAX, ROUTINE_DAY_NAME_MAX, ROUTINE_DISCOVERY_DEFAULT_LIMIT, ROUTINE_DISCOVERY_MAX_LIMIT, ROUTINE_DISCOVERY_SCAN_LIMIT, ROUTINE_DURATION_BANDS, ROUTINE_DURATION_BAND_MAX_MINUTES, ROUTINE_SCHEDULE_MODES, ROUTINE_SHARE_MAX_ACTIVE_LINKS, ROUTINE_TRAINING_BLOCKS_MAX, ROUTINE_TRAINING_BLOCK_NAME_MAX, ROUTINE_TRAINING_BLOCK_REVISIONS_MAX, ROUTINE_TRAINING_BLOCK_SOURCE_KINDS, ROUTINE_TRAINING_BLOCK_STATES, ROUTINE_VERSIONS_MAX, ROUTINE_VERSION_KINDS, ROUTINE_VERSION_NAME_MAX, ROUTINE_VISIBILITY_VALUES, type RecentActivityEntry, type RegisterPushSubscriptionRequest, type RelationshipListKind, type RelationshipListQuery, type RelationshipListResponse, type RelationshipMember, type RenaissanceRankDefinition, type RenaissanceRankProgress, type RepTargetPeriod, type RepTargetSignal, type RepType, type ReplaceFeaturedProfileItemsRequest, type ReplaceMeasurableGoalsRequest, type ReplaceTrainingLocationsRequest, type ReportReason, type ReportStatus, type ReportSubjectKind, type ReportSubjectPreview, type ResolvedRoutinePlan, type RestAlertPushPayload, type RestAlertRefusal, type RestoreRoutineVersionResponse, type ReviewReportRequest, type ReviewReportResponse, type Routine, type RoutineClassification, type RoutineDay, type RoutineDayId, type RoutineDiscoveryQuery, type RoutineDiscoveryResponse, type RoutineDurationBand, type RoutineExercise, type RoutineFacets, type RoutineId, type RoutineLineage, type RoutinePlanSource, type RoutineScheduleMode, type RoutineSet, type RoutineShare, type RoutineShareListResponse, type RoutineSharedActivity, type RoutineTemporaryOverride, type RoutineTemporaryOverridePlan, type RoutineTemporaryOverridesResponse, type RoutineTrainingBlock, type RoutineTrainingBlockPlan, type RoutineTrainingBlockRevision, type RoutineTrainingBlockRevisionsResponse, type RoutineTrainingBlockSource, type RoutineTrainingBlockSourceKind, type RoutineTrainingBlockState, type RoutineTrainingBlocksResponse, type RoutineVersion, type RoutineVersionDay, type RoutineVersionExercise, type RoutineVersionKind, type RoutineVersionSetup, type RoutineVersionsResponse, type RoutineVisibility, SCHEDULE_MOVE_MAX_DAYS, SCHEDULE_OVERRIDES_MAX_RANGE_DAYS, SCHEDULE_OVERRIDE_KINDS, SCHEDULE_SKIP_PAST_DAYS, SESSION_CORRECTIONS_MAX, SESSION_CORRECTION_LIMITS, SESSION_CORRECTION_WINDOW_HOURS, SESSION_EXERCISE_NOTE_MAX_LENGTH, SESSION_NOTE_MAX_LENGTH, SESSION_SHARE_DEFAULT_FIELDS, SESSION_SHARE_FIELDS, SESSION_SHARE_MAX_ACTIVE_LINKS, SET_KINDS, SET_KIND_LABELS, SEXES, SHARED_ROUTINE_SOURCES, STARRED_EXERCISES_MAX, STREAK_MAX_GAP_DAYS, type ScheduleOverride, type ScheduleOverrideKind, type ScheduleOverridesQuery, type ScheduleOverridesResponse, type ScheduleRestAlertRequest, type ScheduleRestAlertResponse, type SendTrainingPartnerEncouragementRequest, type SendTrainingPartnerEncouragementResponse, type SessionComparisonExercise, type SessionComparisonQuery, type SessionComparisonResponse, type SessionComparisonRoutineDay, type SessionComparisonSession, type SessionComparisonSet, type SessionCompletedActivity, type SessionCorrection, type SessionCorrectionClosedReason, type SessionCorrectionWindow, type SessionCorrectionsResponse, type SessionExerciseNote, type SessionExerciseSubstitution, type SessionProgressNotification, type SessionRecapExerciseNote, type SessionRecapRecord, type SessionSetCorrection, type SessionShare, type SessionShareField, type SessionShareListResponse, type SessionTemporaryOverride, type SessionTrainingBlock, type SetAccountTimeZoneRequest, type SetActivityEntryAudienceRequest, type SetActivityEntryAudienceResponse, type SetActivityReactionRequest, type SetActivityReactionResponse, type SetKind, type SetLog, type SetLogValues, type Sex, type SharedRoutine, type SharedRoutineOwner, type SharedRoutineSource, type SharedRoutineSummary, type SharedSessionOwner, type SharedSessionRecap, type SkipOccurrenceRequest, type StarredExercise, type StarredExercisesResponse, type StartWorkoutRequest, type StartWorkoutResponse, type StreakAtRiskPushPayload, type StreakMilestoneActivity, type StreakMilestoneEventPayload, type SubstituteSessionExerciseRequest, type SubstituteSessionExerciseResponse, type SupabaseAuthResponse, type SupabaseAuthUser, type SupabaseMigrationResponse, TEMPORARY_OVERRIDE_KINDS, TEMPORARY_OVERRIDE_SOURCE_KINDS, TRAINING_BLOCK_COMPARISON_MAX_DAYS, TRAINING_DISCIPLINE_VALUES, TRAINING_EVENT_TYPES, TRAINING_EXPERIENCE_LEVEL_VALUES, TRAINING_GOAL_VALUES, TRAINING_PARTNERSHIP_STATUSES, TRAINING_PARTNERS_MAX, TRAINING_PARTNER_ENCOURAGEMENTS_PER_24_HOURS_MAX, TRAINING_PARTNER_ENCOURAGEMENT_KINDS, TRAINING_PARTNER_PERMISSION_KEYS, TRAINING_PARTNER_REQUESTS_PER_DAY_MAX, TRAINING_SIGNAL_DECLINES_MAX, TRAINING_SIGNAL_DECLINE_SESSIONS, TRAINING_SIGNAL_MIN_DECLINE, TRAINING_SIGNAL_MIN_RPE_SETS, TRAINING_SIGNAL_MIN_SHORT_SETS, TRAINING_SIGNAL_MIN_TARGET_SETS, TRAINING_SIGNAL_PERIOD_DAYS, TRAINING_SIGNAL_RPE_RISE, TRAINING_SIGNAL_SHORT_LIFTS_MAX, TRAINING_SIGNAL_SHORT_POINTS_RISE, TRAINING_SIGNAL_WORKOUT_DROP, type TemporaryOverrideKind, type TemporaryOverrideSource, type TemporaryOverrideSourceKind, type TrainingBlockComparisonResponse, type TrainingDiscipline, type TrainingEventType, type TrainingExperienceLevel, type TrainingGoal, type TrainingIdentity, type TrainingLocationPreference, type TrainingLocationPreferenceInput, type TrainingPartnerAchievementNotification, type TrainingPartnerAchievementPushPayload, type TrainingPartnerEncouragementKind, type TrainingPartnerEncouragementNotification, type TrainingPartnerPermissions, type TrainingPartnerScheduleDay, type TrainingPartnerScheduleResponse, type TrainingPartnerSessionNotification, type TrainingPartnerSessionPushPayload, type TrainingPartnership, type TrainingPartnershipStatus, type TrainingPartnershipsResponse, type TrainingReminderPreference, type TrainingReminderPushPayload, type TrainingSignalPeriod, type TrainingSignalsResponse, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, USERNAME_PATTERN_SOURCE, type UpdateActivitySharingRequest, type UpdateCustomExerciseRequest, type UpdateNotificationPreferencesRequest, type UpdateProfileDiscoveryRequest, type UpdateProfilePrivacyRequest, type UpdateProfileRequest, type UpdateRoutineRequest, type UpdateRoutineVisibilityRequest, type UpdateSessionNotesRequest, type UpdateSessionNotesResponse, type UpdateTrainingPartnerPermissionsRequest, type UpsertBodyMeasurementRequest, type UpsertRoutineTrainingBlockRequest, type UpsertSetLogRequest, type UpsertSetLogResponse, type UserId, type UserProfile, type UserSearchResponse, type VolumeTrendPoint, type VolumeTrendQuery, type VolumeTrendResponse, type VolumeTrendSeries, WEIGHT_UNITS, WORKOUT_SESSION_STATUSES, type WarmUpEquipment, type WarmUpLoad, type WarmUpRamp, type WarmUpSet, type WarmUpStep, type WeightUnit, type WorkoutAnalyticsStatus, type WorkoutPeriod, type WorkoutProgressQuery, type WorkoutProgressResponse, type WorkoutSession, type WorkoutSessionId, type WorkoutSessionListResponse, type WorkoutSessionRecap, type WorkoutSessionSnapshotV1, type WorkoutSessionStatus, type WorkoutSessionSummary, type WorkoutSignal, type WorkoutStatsQuery, type WorkoutStatsResponse, accountExportFileName, applyDeload, bodyMeasurementProblems, bodyProgressRangeStart, buildWarmUpRamp, calculatePlateLoading, canLinkToNext, countsAsWork, countsForProgression, customExerciseProblem, defaultWarmUpEquipment, deloadLengthDays, exerciseGroupLabel, exerciseGroupPosition, exerciseGroups, exerciseNameKey, followWorkingLoad, hasOversizedGroup, isBarLoaded, isBodyMeasurementDate, isSetKind, isWithinQuietHours, latestBodyWeight, leadWorkingWeight, matchesDeletionConfirmation, normalizeExerciseLinks, normalizeExerciseName, primaryEquipment, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, summarizeBodyProgress, trainingBlockCovers, warmUpLoad };
package/dist/index.d.ts CHANGED
@@ -406,6 +406,11 @@ interface RoutineExercise {
406
406
  minWeightIncrement: number;
407
407
  /** LIVE-20: warm-ups with a share follow the first working set. */
408
408
  warmUpsFollowLoad?: boolean;
409
+ /**
410
+ * ROUT-12: done in rounds with the next exercise of the day (a superset,
411
+ * or a circuit of three to six); see `exerciseGroups`.
412
+ */
413
+ linkedToNext?: boolean;
409
414
  exercise: {
410
415
  id: string;
411
416
  name: string;
@@ -423,6 +428,11 @@ interface CreateRoutineExerciseInput {
423
428
  minWeightIncrement: number;
424
429
  /** LIVE-20: warm-ups with a share follow the first working set. */
425
430
  warmUpsFollowLoad?: boolean;
431
+ /**
432
+ * ROUT-12: done in rounds with the next exercise of the day (a superset,
433
+ * or a circuit of three to six); see `exerciseGroups`.
434
+ */
435
+ linkedToNext?: boolean;
426
436
  sets: RoutineSet[];
427
437
  }
428
438
  interface RoutineDay {
@@ -553,6 +563,11 @@ interface RoutineVersionExercise {
553
563
  minWeightIncrement: number;
554
564
  /** LIVE-20; absent in setups captured before it. */
555
565
  warmUpsFollowLoad?: boolean;
566
+ /**
567
+ * ROUT-12: done in rounds with the next exercise of the day (a superset,
568
+ * or a circuit of three to six); see `exerciseGroups`.
569
+ */
570
+ linkedToNext?: boolean;
556
571
  sets: RoutineSet[];
557
572
  }
558
573
  interface RoutineVersionDay {
@@ -754,6 +769,8 @@ interface WorkoutSession {
754
769
  note?: string | null;
755
770
  progressionScheme: ProgressionScheme;
756
771
  minWeightIncrement: number;
772
+ /** ROUT-12: done in rounds with the next exercise of the day. */
773
+ linkedToNext?: boolean;
757
774
  exercise: {
758
775
  id: string;
759
776
  name: string;
@@ -1756,6 +1773,8 @@ interface ProfilePrivacySettings {
1756
1773
  routines: ProfileVisibility;
1757
1774
  achievements: ProfileVisibility;
1758
1775
  bodyMetrics: ProfileVisibility;
1776
+ /** PROG-12: the dated weight and measurement history, separate from bodyMetrics. */
1777
+ bodyProgress: ProfileVisibility;
1759
1778
  }
1760
1779
  interface ProfileDiscoverySettings {
1761
1780
  discoverableByName: boolean;
@@ -1771,6 +1790,7 @@ interface ProfileViewerAccess {
1771
1790
  routines: boolean;
1772
1791
  achievements: boolean;
1773
1792
  bodyMetrics: boolean;
1793
+ bodyProgress: boolean;
1774
1794
  }
1775
1795
  interface PublicTrainingSummary {
1776
1796
  completedWorkouts: number;
@@ -1912,8 +1932,13 @@ interface UpdateProfileRequest {
1912
1932
  weight?: number | null;
1913
1933
  height?: number | null;
1914
1934
  weightUnit?: WeightUnit;
1935
+ /**
1936
+ * PROG-12: the member's local date (YYYY-MM-DD). A changed weight is also
1937
+ * recorded as that date's body measurement; without it the server uses UTC.
1938
+ */
1939
+ localDate?: string;
1915
1940
  }
1916
- type UpdateProfilePrivacyRequest = Omit<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity'> & Partial<Pick<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity'>>;
1941
+ type UpdateProfilePrivacyRequest = Omit<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity' | 'bodyProgress'> & Partial<Pick<ProfilePrivacySettings, 'biography' | 'location' | 'trainingIdentity' | 'bodyProgress'>>;
1917
1942
  type UpdateProfileDiscoveryRequest = ProfileDiscoverySettings;
1918
1943
  interface PlatePairInventory {
1919
1944
  weightKg: number;
@@ -2171,6 +2196,108 @@ interface PersonalGoalsResponse {
2171
2196
  goals: PersonalGoalProgress[];
2172
2197
  }
2173
2198
 
2199
+ /**
2200
+ * PROG-12: dated body weight and measurements. One entry per member per local
2201
+ * date; every value is optional but an entry holds at least one. Weight is
2202
+ * kilograms whatever unit the account displays, lengths are centimetres.
2203
+ */
2204
+ declare const BODY_MEASUREMENT_FIELDS: readonly [{
2205
+ readonly key: "weightKg";
2206
+ readonly label: "Weight";
2207
+ readonly unit: "kg";
2208
+ readonly min: 20;
2209
+ readonly max: 1000;
2210
+ }, {
2211
+ readonly key: "waistCm";
2212
+ readonly label: "Waist";
2213
+ readonly unit: "cm";
2214
+ readonly min: 10;
2215
+ readonly max: 300;
2216
+ }, {
2217
+ readonly key: "hipsCm";
2218
+ readonly label: "Hips";
2219
+ readonly unit: "cm";
2220
+ readonly min: 10;
2221
+ readonly max: 300;
2222
+ }, {
2223
+ readonly key: "chestCm";
2224
+ readonly label: "Chest";
2225
+ readonly unit: "cm";
2226
+ readonly min: 10;
2227
+ readonly max: 300;
2228
+ }, {
2229
+ readonly key: "armCm";
2230
+ readonly label: "Arm";
2231
+ readonly unit: "cm";
2232
+ readonly min: 10;
2233
+ readonly max: 300;
2234
+ }, {
2235
+ readonly key: "thighCm";
2236
+ readonly label: "Thigh";
2237
+ readonly unit: "cm";
2238
+ readonly min: 10;
2239
+ readonly max: 300;
2240
+ }, {
2241
+ readonly key: "bodyFatPercent";
2242
+ readonly label: "Body fat";
2243
+ readonly unit: "%";
2244
+ readonly min: 2;
2245
+ readonly max: 75;
2246
+ }];
2247
+ type BodyMeasurementField = (typeof BODY_MEASUREMENT_FIELDS)[number]["key"];
2248
+ declare const BODY_MEASUREMENT_FIELD_KEYS: readonly BodyMeasurementField[];
2249
+ type BodyMeasurementValues = {
2250
+ [K in BodyMeasurementField]: number | null;
2251
+ };
2252
+ interface BodyMeasurement extends BodyMeasurementValues {
2253
+ /** The member's local date, YYYY-MM-DD. */
2254
+ date: string;
2255
+ updatedAt: IsoDateString;
2256
+ }
2257
+ /** PUT /body-measurements/:date. A missing or null value clears that field. */
2258
+ type UpsertBodyMeasurementRequest = Partial<BodyMeasurementValues>;
2259
+ declare const BODY_PROGRESS_RANGES: readonly ["30D", "90D", "1Y", "ALL"];
2260
+ type BodyProgressRange = (typeof BODY_PROGRESS_RANGES)[number];
2261
+ interface BodyFieldSummary {
2262
+ field: BodyMeasurementField;
2263
+ /** The most recent value ever recorded, and its date. */
2264
+ latest: number | null;
2265
+ latestDate: string | null;
2266
+ /**
2267
+ * Latest minus the first value recorded inside the range, when both exist
2268
+ * on different dates inside it; otherwise null.
2269
+ */
2270
+ change: number | null;
2271
+ changeSince: string | null;
2272
+ }
2273
+ /**
2274
+ * GET /body-measurements (the owner) and
2275
+ * GET /users/:identifier/body-measurements (another member, when their
2276
+ * `bodyProgress` visibility allows it). Entries are the range's, oldest first.
2277
+ */
2278
+ interface BodyProgressResponse {
2279
+ range: BodyProgressRange;
2280
+ rangeStart: string | null;
2281
+ entries: BodyMeasurement[];
2282
+ summary: BodyFieldSummary[];
2283
+ }
2284
+ declare function isBodyMeasurementDate(value: string): boolean;
2285
+ /** The first date a range covers, counting today; null for ALL. */
2286
+ declare function bodyProgressRangeStart(range: BodyProgressRange, today: string): string | null;
2287
+ /** The field a value is out of bounds for, with the reason in words. */
2288
+ interface BodyMeasurementProblem {
2289
+ field: BodyMeasurementField | null;
2290
+ message: string;
2291
+ }
2292
+ declare function bodyMeasurementProblems(input: UpsertBodyMeasurementRequest): BodyMeasurementProblem[];
2293
+ /**
2294
+ * Per field: the latest value ever recorded and its change over the range.
2295
+ * `entries` is every entry the member has, in any order.
2296
+ */
2297
+ declare function summarizeBodyProgress(entries: ReadonlyArray<Pick<BodyMeasurement, "date"> & BodyMeasurementValues>, rangeStart: string | null): BodyFieldSummary[];
2298
+ /** The date `User.weight` follows: the latest entry that records a weight. */
2299
+ declare function latestBodyWeight(entries: ReadonlyArray<Pick<BodyMeasurement, "date" | "weightKg">>): number | null;
2300
+
2174
2301
  interface PlateLoadingItem {
2175
2302
  weightKg: number;
2176
2303
  platesPerSide: number;
@@ -2267,6 +2394,41 @@ declare function leadWorkingWeight(sets: readonly FollowingSet[]): number | null
2267
2394
  */
2268
2395
  declare function followWorkingLoad<T extends FollowingSet>(sets: readonly T[], equipment: WarmUpEquipment): T[];
2269
2396
 
2397
+ /** Two linked exercises are a superset; three to this many, a circuit. */
2398
+ declare const EXERCISE_GROUP_MAX = 6;
2399
+ type ExerciseGroupKind = 'SUPERSET' | 'CIRCUIT';
2400
+ declare const EXERCISE_GROUP_KIND_LABELS: Record<ExerciseGroupKind, string>;
2401
+ type Linkable = {
2402
+ linkedToNext?: boolean | null;
2403
+ };
2404
+ interface ExerciseGroup {
2405
+ /** A, B, C… in the order the groups appear in the day. */
2406
+ letter: string;
2407
+ kind: ExerciseGroupKind;
2408
+ /** Positions of the members in the day's exercise list, in order. */
2409
+ indices: number[];
2410
+ }
2411
+ /**
2412
+ * The day's groups, in order. An exercise linked to nothing, and the link of
2413
+ * a day's last exercise, belong to no group.
2414
+ */
2415
+ declare function exerciseGroups(exercises: readonly Linkable[]): ExerciseGroup[];
2416
+ interface ExerciseGroupPosition {
2417
+ group: ExerciseGroup;
2418
+ /** 1-based place in the round: A1, A2… */
2419
+ position: number;
2420
+ }
2421
+ /** Where one exercise of the day stands, or null when it is on its own. */
2422
+ declare function exerciseGroupPosition(exercises: readonly Linkable[], index: number): ExerciseGroupPosition | null;
2423
+ /** "Superset A1", "Circuit B3". */
2424
+ declare const exerciseGroupLabel: ({ group, position }: ExerciseGroupPosition) => string;
2425
+ /** Whether linking exercise `index` to the next would make a group too large. */
2426
+ declare function canLinkToNext(exercises: readonly Linkable[], index: number): boolean;
2427
+ /** A day's links as they may be stored: the last exercise never links. */
2428
+ declare function normalizeExerciseLinks<T extends Linkable>(exercises: readonly T[]): T[];
2429
+ /** A group larger than `EXERCISE_GROUP_MAX`, which no day may hold. */
2430
+ declare function hasOversizedGroup(exercises: readonly Linkable[]): boolean;
2431
+
2270
2432
  /**
2271
2433
  * INTEL-02: a lighter period proposed from the signals `PROG-10` states. The
2272
2434
  * suggestion acts on evidence only -- it names what was marked and when, never
@@ -3529,6 +3691,12 @@ interface AccountExportTrainingEvent {
3529
3691
  schemaVersion: number;
3530
3692
  payload: unknown;
3531
3693
  }
3694
+ /** Weight in kilograms, lengths in centimetres. */
3695
+ interface AccountExportBodyMeasurement extends BodyMeasurementValues {
3696
+ date: string;
3697
+ createdAt: IsoDateString;
3698
+ updatedAt: IsoDateString;
3699
+ }
3532
3700
  interface AccountExportGoal {
3533
3701
  type: string;
3534
3702
  direction: string;
@@ -3588,6 +3756,8 @@ interface AccountExportV1 {
3588
3756
  personalRecords: AccountExportPersonalRecord[];
3589
3757
  trainingEvents: AccountExportTrainingEvent[];
3590
3758
  goals: AccountExportGoal[];
3759
+ /** PROG-12: every dated body weight and measurement entry. */
3760
+ bodyMeasurements?: AccountExportBodyMeasurement[];
3591
3761
  trainingLocations: AccountExportTrainingLocation[];
3592
3762
  scheduleOverrides: AccountExportScheduleOverride[];
3593
3763
  exercises: {
@@ -3652,4 +3822,4 @@ interface AccountExportV1 {
3652
3822
  /** The file name a download of the export is saved under. */
3653
3823
  declare function accountExportFileName(username: string, exportedAt: string): string;
3654
3824
 
3655
- export { ACCOUNT_EXPORT_FORMAT, ACCOUNT_EXPORT_VERSION, ACHIEVEMENT_CATEGORIES, ACHIEVEMENT_DEFINITIONS, ACTIVITY_CAPS, ACTIVITY_COMMENTS_PAGE_SIZE, ACTIVITY_COMMENTS_PER_DAY_MAX, ACTIVITY_COMMENT_MAX_LENGTH, ACTIVITY_DEFAULT_AUDIENCE, ACTIVITY_ENTRY_ID_MAX_LENGTH, ACTIVITY_FEED_FOLLOWED_MAX, ACTIVITY_PAGE_DEFAULT_LIMIT, ACTIVITY_PAGE_MAX_LIMIT, ACTIVITY_PREVIEW_AUDIENCES, ACTIVITY_REACTIONS, ACTIVITY_TYPES, ACTIVITY_TYPE_SECTIONS, type AccountExportGoal, type AccountExportMember, type AccountExportPersonalRecord, type AccountExportRoutine, type AccountExportScheduleOverride, type AccountExportTrainingEvent, type AccountExportTrainingLocation, type AccountExportV1, type AchievementActivity, type AchievementCategory, type AchievementCategoryProgress, type AchievementDefinition, type AchievementNotification, type AchievementUnlockedEventPayload, type AchievementsResponse, type ActivityAudience, type ActivityCap, type ActivityComment, type ActivityCommentNotification, type ActivityCommentSummary, type ActivityCommentsQuery, type ActivityCommentsResponse, type ActivityEntry, type ActivityEntrySharing, type ActivityFeedResponse, type ActivityLink, type ActivityPage, type ActivityPageQuery, type ActivityPreviewAudience, type ActivityPreviewQuery, type ActivityReaction, type ActivityReactionSummary, type ActivitySection, type ActivitySharingSettings, type ActivityType, type AppNotification, BAR_CHOICES_KG, BAR_WARM_UP_STEPS, BLOCKED_MEMBERS_MAX, type BlockComparisonLift, type BlockComparisonLiftBest, type BlockComparisonPeriod, type BlockComparisonPeriodKind, type BlockedMember, type BlockedMembersResponse, type Brand, CLONE_ROUTINE_REFUSALS, COMEBACK_MIN_INACTIVE_DAYS, COMEBACK_RECOGNITION_LIMIT, COMEBACK_REQUIRED_ACTIVE_DAYS, COMEBACK_SESSION_LOOKBACK, COMEBACK_WINDOW_DAYS, CUSTOM_EXERCISES_MAX, CUSTOM_EXERCISE_NAME_MAX, CUSTOM_EXERCISE_NOTE_MAX, CUSTOM_EXERCISE_PROBLEM_MESSAGES, CUSTOM_EXERCISE_REFUSALS, type CalendarDate, type CloneRoutineRefusal, type CloneRoutineRequest, type ComebackActivity, type ComebackRecognition, type ComebackRecognitionSummary, type CorrectSessionRequest, type CorrectSessionResponse, type CorrectSessionSetRequest, type CreateActivityCommentRequest, type CreateActivityCommentResponse, type CreateDeloadRequest, type CreateReportRequest, type CreateReportResponse, type CreateRoutineDayInput, type CreateRoutineExerciseInput, type CreateRoutineRequest, type CreateRoutineVersionRequest, type CreateSessionShareRequest, type CustomExerciseInput, type CustomExerciseProblem, type CustomExerciseRefusal, DELOAD_DEFAULT_DAYS, DELOAD_DEFAULT_LOAD_REDUCTION, DELOAD_DEFAULT_SET_MODE, DELOAD_LOAD_REDUCTIONS, DELOAD_MAX_DAYS, DELOAD_NOT_LIGHTER, DELOAD_SET_MODES, DELOAD_SUGGESTION_COOLDOWN_DAYS, DELOAD_SUGGESTION_EARLIER_DAYS, DELOAD_SUGGESTION_MIN_MARKED_TODAY, DELOAD_SUGGESTION_ROUTINE_DAYS, DELOAD_SUGGESTION_SIGNALS, type DeclineSignal, type DecliningLift, type DecliningLiftSession, type DeleteAccountRequest, type DeleteAccountResponse, type DeleteActivityCommentResponse, type DeletePushSubscriptionRequest, type DeloadLoadReduction, type DeloadOptions, type DeloadSetMode, type DeloadSuggestion, type DeloadSuggestionEvidence, type DeloadSuggestionResponse, type DeloadSuggestionSignal, type DeloadSuggestionUnavailableReason, type DiscoverableRoutine, EXERCISE_EQUIPMENT, EXERCISE_MECHANICS, type EarnedAchievement, type EarnedPersonalRecord, type EffortPeriod, type EffortSignal, type Exercise, type ExerciseEquipment, type ExerciseId, type ExerciseMechanic, type ExercisePerformanceHistoryQuery, type ExercisePerformanceHistoryResponse, type ExercisePerformancePrescription, type ExercisePerformancePrescriptionSet, type ExercisePerformanceSession, type ExercisePerformanceSet, type ExercisePerformanceSummary, type ExercisePlateau, type ExerciseStrengthSummary, type ExerciseStrengthTrendPoint, type ExerciseStrengthTrendQuery, type ExerciseStrengthTrendResponse, FEATURED_PROFILE_ITEMS_MAX, FEATURED_PROFILE_ITEM_KINDS, FEATURED_PROFILE_REFERENCE_MAX_LENGTH, FOLLOW_SUGGESTIONS_DEFAULT_LIMIT, FOLLOW_SUGGESTIONS_MAX_LIMIT, FOLLOW_SUGGESTION_REASONS, type FeaturedProfileAchievementItem, type FeaturedProfileItem, type FeaturedProfileItemKind, type FeaturedProfileRankItem, type FeaturedProfileRecordItem, type FeaturedProfileRoutineItem, type FeaturedProfileSelection, type FeaturedProfileSelectionInput, type FeaturedProfileSelectionsResponse, type FinishStatus, type FinishWorkoutRequest, type FinishWorkoutResponse, type FollowSuggestion, type FollowSuggestionReason, type FollowSuggestionsResponse, type IsoDateString, LIMITED_SHORTFALL_KG, type ListSessionsParams, MAX_SETS_PER_EXERCISE, MEASURABLE_GOALS_MAX, MEASURABLE_GOAL_DIRECTIONS, MEASURABLE_GOAL_TYPES, MINUTES_IN_DAY, MODERATION_ACTION_KINDS, MODERATION_HISTORY_PAGE_SIZE, MODERATION_NOTE_MAX_LENGTH, MODERATION_QUEUE_PAGE_SIZE, MOVEMENT_PATTERNS, MUSCLE_GROUPS, type MarkNotificationsReadRequest, type MarkNotificationsReadResponse, type MeasurableGoal, type MeasurableGoalDirection, type MeasurableGoalExercise, type MeasurableGoalInput, type MeasurableGoalType, type MemberActivityResponse, type MemberModerationState, type MemberRoutinesResponse, type ModerationActionKind, type ModerationActionRecord, type ModerationHistoryQuery, type ModerationHistoryResponse, type ModerationQueueQuery, type ModerationQueueResponse, type ModerationReport, type ModeratorState, type MoveOccurrenceRequest, type MovementPattern, type MuscleGroup, type MuscleGroupHeatmapQuery, type MuscleGroupHeatmapResponse, type MuscleGroupHeatmapValue, type MuscleGroupHeatmapWeek, type MuscleVolumeTrendSeries, NOTIFICATIONS_LIST_LIMIT, NOTIFICATIONS_LOOKBACK_DAYS, NOTIFICATIONS_RETENTION_DAYS, NOTIFICATION_CATEGORIES, NOTIFICATION_KINDS, type NewFollowerNotification, type NotificationCategory, type NotificationKind, type NotificationPreferences, type NotificationPreferencesResponse, type NotificationsResponse, OTHER_WARM_UP_STEPS, type OwnActivityEntry, type OwnActivityResponse, PLATEAU_MIN_DAYS_SINCE_BEST, PLATEAU_MIN_SESSIONS, PLATEAU_MIN_SESSIONS_MAX, PLATEAU_MIN_SESSIONS_MIN, PLATEAU_RECENT_DAYS, PLATEAU_WINDOW_DAYS, PLATE_SETS, PREFERRED_TRAINING_STYLE_VALUES, PROFILE_BIO_MAX_LENGTH, PROFILE_FAVORITE_EXERCISES_MAX, PROFILE_LOCATION_MAX_LENGTH, PROFILE_TRAINING_DISCIPLINES_MAX, PROFILE_TRAINING_GOALS_MAX, PROFILE_VISIBILITY_VALUES, PROGRESSION_SCHEMES, PROGRESS_TIMELINE_EVENT_TYPES, PUSH_PAYLOAD_KINDS, PUSH_SUBSCRIPTIONS_MAX, type PaginatedResponse, type PersonalGoalProgress, type PersonalGoalsResponse, type PersonalRecordActivity, type PersonalRecordEntry, type PersonalRecordKind, type PlannedReminder, type PlateLoadingItem, type PlateLoadingResult, type PlatePairInventory, type PlateSetChoice, type PlateauPreferences, type PlateauSet, type PlateausResponse, type PreferredTrainingStyle, type PreviousPerformanceResponse, type PreviousSessionRecap, type PreviousSetPerformance, type ProfileDiscoverySettings, type ProfileFavoriteExercise, type ProfilePrivacySettings, type ProfileViewerAccess, type ProfileVisibility, type ProgressTimelineEventType, type ProgressTimelineItem, type ProgressTimelinePersonalRecordItem, type ProgressTimelineProgressionItem, type ProgressTimelineQuery, type ProgressTimelineRecordPerformance, type ProgressTimelineRecordReason, type ProgressTimelineResponse, type ProgressTimelineSessionContext, type ProgressionActivity, type ProgressionChange, type ProgressionRule, type ProgressionScheme, type ProgressionSetChange, type PublicBodyMetrics, type PublicProfileAchievements, type PublicTrainingSummary, type PublicUserProfile, type PushPayload, type PushPayloadKind, type PushSubscriptionKeys, type PushSubscriptionSummary, type PushSubscriptionsResponse, type QuietHours, RELATIONSHIP_LIST_DEFAULT_LIMIT, RELATIONSHIP_LIST_KINDS, RELATIONSHIP_LIST_MAX_LIMIT, RENAISSANCE_RANK_DEFINITIONS, REPORTS_PER_DAY_MAX, REPORT_DETAILS_MAX_LENGTH, REPORT_REASONS, REPORT_STATUSES, REPORT_SUBJECT_KINDS, REP_TYPES, RESERVED_USERNAMES, REST_ALERT_MAX_LEAD_SECONDS, REST_ALERT_MIN_LEAD_SECONDS, REST_ALERT_REFUSALS, ROUTINE_DAYS_MAX, ROUTINE_DAY_NAME_MAX, ROUTINE_DISCOVERY_DEFAULT_LIMIT, ROUTINE_DISCOVERY_MAX_LIMIT, ROUTINE_DISCOVERY_SCAN_LIMIT, ROUTINE_DURATION_BANDS, ROUTINE_DURATION_BAND_MAX_MINUTES, ROUTINE_SCHEDULE_MODES, ROUTINE_SHARE_MAX_ACTIVE_LINKS, ROUTINE_TRAINING_BLOCKS_MAX, ROUTINE_TRAINING_BLOCK_NAME_MAX, ROUTINE_TRAINING_BLOCK_REVISIONS_MAX, ROUTINE_TRAINING_BLOCK_SOURCE_KINDS, ROUTINE_TRAINING_BLOCK_STATES, ROUTINE_VERSIONS_MAX, ROUTINE_VERSION_KINDS, ROUTINE_VERSION_NAME_MAX, ROUTINE_VISIBILITY_VALUES, type RecentActivityEntry, type RegisterPushSubscriptionRequest, type RelationshipListKind, type RelationshipListQuery, type RelationshipListResponse, type RelationshipMember, type RenaissanceRankDefinition, type RenaissanceRankProgress, type RepTargetPeriod, type RepTargetSignal, type RepType, type ReplaceFeaturedProfileItemsRequest, type ReplaceMeasurableGoalsRequest, type ReplaceTrainingLocationsRequest, type ReportReason, type ReportStatus, type ReportSubjectKind, type ReportSubjectPreview, type ResolvedRoutinePlan, type RestAlertPushPayload, type RestAlertRefusal, type RestoreRoutineVersionResponse, type ReviewReportRequest, type ReviewReportResponse, type Routine, type RoutineClassification, type RoutineDay, type RoutineDayId, type RoutineDiscoveryQuery, type RoutineDiscoveryResponse, type RoutineDurationBand, type RoutineExercise, type RoutineFacets, type RoutineId, type RoutineLineage, type RoutinePlanSource, type RoutineScheduleMode, type RoutineSet, type RoutineShare, type RoutineShareListResponse, type RoutineSharedActivity, type RoutineTemporaryOverride, type RoutineTemporaryOverridePlan, type RoutineTemporaryOverridesResponse, type RoutineTrainingBlock, type RoutineTrainingBlockPlan, type RoutineTrainingBlockRevision, type RoutineTrainingBlockRevisionsResponse, type RoutineTrainingBlockSource, type RoutineTrainingBlockSourceKind, type RoutineTrainingBlockState, type RoutineTrainingBlocksResponse, type RoutineVersion, type RoutineVersionDay, type RoutineVersionExercise, type RoutineVersionKind, type RoutineVersionSetup, type RoutineVersionsResponse, type RoutineVisibility, SCHEDULE_MOVE_MAX_DAYS, SCHEDULE_OVERRIDES_MAX_RANGE_DAYS, SCHEDULE_OVERRIDE_KINDS, SCHEDULE_SKIP_PAST_DAYS, SESSION_CORRECTIONS_MAX, SESSION_CORRECTION_LIMITS, SESSION_CORRECTION_WINDOW_HOURS, SESSION_EXERCISE_NOTE_MAX_LENGTH, SESSION_NOTE_MAX_LENGTH, SESSION_SHARE_DEFAULT_FIELDS, SESSION_SHARE_FIELDS, SESSION_SHARE_MAX_ACTIVE_LINKS, SET_KINDS, SET_KIND_LABELS, SEXES, SHARED_ROUTINE_SOURCES, STARRED_EXERCISES_MAX, STREAK_MAX_GAP_DAYS, type ScheduleOverride, type ScheduleOverrideKind, type ScheduleOverridesQuery, type ScheduleOverridesResponse, type ScheduleRestAlertRequest, type ScheduleRestAlertResponse, type SendTrainingPartnerEncouragementRequest, type SendTrainingPartnerEncouragementResponse, type SessionComparisonExercise, type SessionComparisonQuery, type SessionComparisonResponse, type SessionComparisonRoutineDay, type SessionComparisonSession, type SessionComparisonSet, type SessionCompletedActivity, type SessionCorrection, type SessionCorrectionClosedReason, type SessionCorrectionWindow, type SessionCorrectionsResponse, type SessionExerciseNote, type SessionExerciseSubstitution, type SessionProgressNotification, type SessionRecapExerciseNote, type SessionRecapRecord, type SessionSetCorrection, type SessionShare, type SessionShareField, type SessionShareListResponse, type SessionTemporaryOverride, type SessionTrainingBlock, type SetAccountTimeZoneRequest, type SetActivityEntryAudienceRequest, type SetActivityEntryAudienceResponse, type SetActivityReactionRequest, type SetActivityReactionResponse, type SetKind, type SetLog, type SetLogValues, type Sex, type SharedRoutine, type SharedRoutineOwner, type SharedRoutineSource, type SharedRoutineSummary, type SharedSessionOwner, type SharedSessionRecap, type SkipOccurrenceRequest, type StarredExercise, type StarredExercisesResponse, type StartWorkoutRequest, type StartWorkoutResponse, type StreakAtRiskPushPayload, type StreakMilestoneActivity, type StreakMilestoneEventPayload, type SubstituteSessionExerciseRequest, type SubstituteSessionExerciseResponse, type SupabaseAuthResponse, type SupabaseAuthUser, type SupabaseMigrationResponse, TEMPORARY_OVERRIDE_KINDS, TEMPORARY_OVERRIDE_SOURCE_KINDS, TRAINING_BLOCK_COMPARISON_MAX_DAYS, TRAINING_DISCIPLINE_VALUES, TRAINING_EVENT_TYPES, TRAINING_EXPERIENCE_LEVEL_VALUES, TRAINING_GOAL_VALUES, TRAINING_PARTNERSHIP_STATUSES, TRAINING_PARTNERS_MAX, TRAINING_PARTNER_ENCOURAGEMENTS_PER_24_HOURS_MAX, TRAINING_PARTNER_ENCOURAGEMENT_KINDS, TRAINING_PARTNER_PERMISSION_KEYS, TRAINING_PARTNER_REQUESTS_PER_DAY_MAX, TRAINING_SIGNAL_DECLINES_MAX, TRAINING_SIGNAL_DECLINE_SESSIONS, TRAINING_SIGNAL_MIN_DECLINE, TRAINING_SIGNAL_MIN_RPE_SETS, TRAINING_SIGNAL_MIN_SHORT_SETS, TRAINING_SIGNAL_MIN_TARGET_SETS, TRAINING_SIGNAL_PERIOD_DAYS, TRAINING_SIGNAL_RPE_RISE, TRAINING_SIGNAL_SHORT_LIFTS_MAX, TRAINING_SIGNAL_SHORT_POINTS_RISE, TRAINING_SIGNAL_WORKOUT_DROP, type TemporaryOverrideKind, type TemporaryOverrideSource, type TemporaryOverrideSourceKind, type TrainingBlockComparisonResponse, type TrainingDiscipline, type TrainingEventType, type TrainingExperienceLevel, type TrainingGoal, type TrainingIdentity, type TrainingLocationPreference, type TrainingLocationPreferenceInput, type TrainingPartnerAchievementNotification, type TrainingPartnerAchievementPushPayload, type TrainingPartnerEncouragementKind, type TrainingPartnerEncouragementNotification, type TrainingPartnerPermissions, type TrainingPartnerScheduleDay, type TrainingPartnerScheduleResponse, type TrainingPartnerSessionNotification, type TrainingPartnerSessionPushPayload, type TrainingPartnership, type TrainingPartnershipStatus, type TrainingPartnershipsResponse, type TrainingReminderPreference, type TrainingReminderPushPayload, type TrainingSignalPeriod, type TrainingSignalsResponse, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, USERNAME_PATTERN_SOURCE, type UpdateActivitySharingRequest, type UpdateCustomExerciseRequest, type UpdateNotificationPreferencesRequest, type UpdateProfileDiscoveryRequest, type UpdateProfilePrivacyRequest, type UpdateProfileRequest, type UpdateRoutineRequest, type UpdateRoutineVisibilityRequest, type UpdateSessionNotesRequest, type UpdateSessionNotesResponse, type UpdateTrainingPartnerPermissionsRequest, type UpsertRoutineTrainingBlockRequest, type UpsertSetLogRequest, type UpsertSetLogResponse, type UserId, type UserProfile, type UserSearchResponse, type VolumeTrendPoint, type VolumeTrendQuery, type VolumeTrendResponse, type VolumeTrendSeries, WEIGHT_UNITS, WORKOUT_SESSION_STATUSES, type WarmUpEquipment, type WarmUpLoad, type WarmUpRamp, type WarmUpSet, type WarmUpStep, type WeightUnit, type WorkoutAnalyticsStatus, type WorkoutPeriod, type WorkoutProgressQuery, type WorkoutProgressResponse, type WorkoutSession, type WorkoutSessionId, type WorkoutSessionListResponse, type WorkoutSessionRecap, type WorkoutSessionSnapshotV1, type WorkoutSessionStatus, type WorkoutSessionSummary, type WorkoutSignal, type WorkoutStatsQuery, type WorkoutStatsResponse, accountExportFileName, applyDeload, buildWarmUpRamp, calculatePlateLoading, countsAsWork, countsForProgression, customExerciseProblem, defaultWarmUpEquipment, deloadLengthDays, exerciseNameKey, followWorkingLoad, isBarLoaded, isSetKind, isWithinQuietHours, leadWorkingWeight, matchesDeletionConfirmation, normalizeExerciseName, primaryEquipment, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, trainingBlockCovers, warmUpLoad };
3825
+ export { ACCOUNT_EXPORT_FORMAT, ACCOUNT_EXPORT_VERSION, ACHIEVEMENT_CATEGORIES, ACHIEVEMENT_DEFINITIONS, ACTIVITY_CAPS, ACTIVITY_COMMENTS_PAGE_SIZE, ACTIVITY_COMMENTS_PER_DAY_MAX, ACTIVITY_COMMENT_MAX_LENGTH, ACTIVITY_DEFAULT_AUDIENCE, ACTIVITY_ENTRY_ID_MAX_LENGTH, ACTIVITY_FEED_FOLLOWED_MAX, ACTIVITY_PAGE_DEFAULT_LIMIT, ACTIVITY_PAGE_MAX_LIMIT, ACTIVITY_PREVIEW_AUDIENCES, ACTIVITY_REACTIONS, ACTIVITY_TYPES, ACTIVITY_TYPE_SECTIONS, type AccountExportBodyMeasurement, type AccountExportGoal, type AccountExportMember, type AccountExportPersonalRecord, type AccountExportRoutine, type AccountExportScheduleOverride, type AccountExportTrainingEvent, type AccountExportTrainingLocation, type AccountExportV1, type AchievementActivity, type AchievementCategory, type AchievementCategoryProgress, type AchievementDefinition, type AchievementNotification, type AchievementUnlockedEventPayload, type AchievementsResponse, type ActivityAudience, type ActivityCap, type ActivityComment, type ActivityCommentNotification, type ActivityCommentSummary, type ActivityCommentsQuery, type ActivityCommentsResponse, type ActivityEntry, type ActivityEntrySharing, type ActivityFeedResponse, type ActivityLink, type ActivityPage, type ActivityPageQuery, type ActivityPreviewAudience, type ActivityPreviewQuery, type ActivityReaction, type ActivityReactionSummary, type ActivitySection, type ActivitySharingSettings, type ActivityType, type AppNotification, BAR_CHOICES_KG, BAR_WARM_UP_STEPS, BLOCKED_MEMBERS_MAX, BODY_MEASUREMENT_FIELDS, BODY_MEASUREMENT_FIELD_KEYS, BODY_PROGRESS_RANGES, type BlockComparisonLift, type BlockComparisonLiftBest, type BlockComparisonPeriod, type BlockComparisonPeriodKind, type BlockedMember, type BlockedMembersResponse, type BodyFieldSummary, type BodyMeasurement, type BodyMeasurementField, type BodyMeasurementProblem, type BodyMeasurementValues, type BodyProgressRange, type BodyProgressResponse, type Brand, CLONE_ROUTINE_REFUSALS, COMEBACK_MIN_INACTIVE_DAYS, COMEBACK_RECOGNITION_LIMIT, COMEBACK_REQUIRED_ACTIVE_DAYS, COMEBACK_SESSION_LOOKBACK, COMEBACK_WINDOW_DAYS, CUSTOM_EXERCISES_MAX, CUSTOM_EXERCISE_NAME_MAX, CUSTOM_EXERCISE_NOTE_MAX, CUSTOM_EXERCISE_PROBLEM_MESSAGES, CUSTOM_EXERCISE_REFUSALS, type CalendarDate, type CloneRoutineRefusal, type CloneRoutineRequest, type ComebackActivity, type ComebackRecognition, type ComebackRecognitionSummary, type CorrectSessionRequest, type CorrectSessionResponse, type CorrectSessionSetRequest, type CreateActivityCommentRequest, type CreateActivityCommentResponse, type CreateDeloadRequest, type CreateReportRequest, type CreateReportResponse, type CreateRoutineDayInput, type CreateRoutineExerciseInput, type CreateRoutineRequest, type CreateRoutineVersionRequest, type CreateSessionShareRequest, type CustomExerciseInput, type CustomExerciseProblem, type CustomExerciseRefusal, DELOAD_DEFAULT_DAYS, DELOAD_DEFAULT_LOAD_REDUCTION, DELOAD_DEFAULT_SET_MODE, DELOAD_LOAD_REDUCTIONS, DELOAD_MAX_DAYS, DELOAD_NOT_LIGHTER, DELOAD_SET_MODES, DELOAD_SUGGESTION_COOLDOWN_DAYS, DELOAD_SUGGESTION_EARLIER_DAYS, DELOAD_SUGGESTION_MIN_MARKED_TODAY, DELOAD_SUGGESTION_ROUTINE_DAYS, DELOAD_SUGGESTION_SIGNALS, type DeclineSignal, type DecliningLift, type DecliningLiftSession, type DeleteAccountRequest, type DeleteAccountResponse, type DeleteActivityCommentResponse, type DeletePushSubscriptionRequest, type DeloadLoadReduction, type DeloadOptions, type DeloadSetMode, type DeloadSuggestion, type DeloadSuggestionEvidence, type DeloadSuggestionResponse, type DeloadSuggestionSignal, type DeloadSuggestionUnavailableReason, type DiscoverableRoutine, EXERCISE_EQUIPMENT, EXERCISE_GROUP_KIND_LABELS, EXERCISE_GROUP_MAX, EXERCISE_MECHANICS, type EarnedAchievement, type EarnedPersonalRecord, type EffortPeriod, type EffortSignal, type Exercise, type ExerciseEquipment, type ExerciseGroup, type ExerciseGroupKind, type ExerciseGroupPosition, type ExerciseId, type ExerciseMechanic, type ExercisePerformanceHistoryQuery, type ExercisePerformanceHistoryResponse, type ExercisePerformancePrescription, type ExercisePerformancePrescriptionSet, type ExercisePerformanceSession, type ExercisePerformanceSet, type ExercisePerformanceSummary, type ExercisePlateau, type ExerciseStrengthSummary, type ExerciseStrengthTrendPoint, type ExerciseStrengthTrendQuery, type ExerciseStrengthTrendResponse, FEATURED_PROFILE_ITEMS_MAX, FEATURED_PROFILE_ITEM_KINDS, FEATURED_PROFILE_REFERENCE_MAX_LENGTH, FOLLOW_SUGGESTIONS_DEFAULT_LIMIT, FOLLOW_SUGGESTIONS_MAX_LIMIT, FOLLOW_SUGGESTION_REASONS, type FeaturedProfileAchievementItem, type FeaturedProfileItem, type FeaturedProfileItemKind, type FeaturedProfileRankItem, type FeaturedProfileRecordItem, type FeaturedProfileRoutineItem, type FeaturedProfileSelection, type FeaturedProfileSelectionInput, type FeaturedProfileSelectionsResponse, type FinishStatus, type FinishWorkoutRequest, type FinishWorkoutResponse, type FollowSuggestion, type FollowSuggestionReason, type FollowSuggestionsResponse, type IsoDateString, LIMITED_SHORTFALL_KG, type ListSessionsParams, MAX_SETS_PER_EXERCISE, MEASURABLE_GOALS_MAX, MEASURABLE_GOAL_DIRECTIONS, MEASURABLE_GOAL_TYPES, MINUTES_IN_DAY, MODERATION_ACTION_KINDS, MODERATION_HISTORY_PAGE_SIZE, MODERATION_NOTE_MAX_LENGTH, MODERATION_QUEUE_PAGE_SIZE, MOVEMENT_PATTERNS, MUSCLE_GROUPS, type MarkNotificationsReadRequest, type MarkNotificationsReadResponse, type MeasurableGoal, type MeasurableGoalDirection, type MeasurableGoalExercise, type MeasurableGoalInput, type MeasurableGoalType, type MemberActivityResponse, type MemberModerationState, type MemberRoutinesResponse, type ModerationActionKind, type ModerationActionRecord, type ModerationHistoryQuery, type ModerationHistoryResponse, type ModerationQueueQuery, type ModerationQueueResponse, type ModerationReport, type ModeratorState, type MoveOccurrenceRequest, type MovementPattern, type MuscleGroup, type MuscleGroupHeatmapQuery, type MuscleGroupHeatmapResponse, type MuscleGroupHeatmapValue, type MuscleGroupHeatmapWeek, type MuscleVolumeTrendSeries, NOTIFICATIONS_LIST_LIMIT, NOTIFICATIONS_LOOKBACK_DAYS, NOTIFICATIONS_RETENTION_DAYS, NOTIFICATION_CATEGORIES, NOTIFICATION_KINDS, type NewFollowerNotification, type NotificationCategory, type NotificationKind, type NotificationPreferences, type NotificationPreferencesResponse, type NotificationsResponse, OTHER_WARM_UP_STEPS, type OwnActivityEntry, type OwnActivityResponse, PLATEAU_MIN_DAYS_SINCE_BEST, PLATEAU_MIN_SESSIONS, PLATEAU_MIN_SESSIONS_MAX, PLATEAU_MIN_SESSIONS_MIN, PLATEAU_RECENT_DAYS, PLATEAU_WINDOW_DAYS, PLATE_SETS, PREFERRED_TRAINING_STYLE_VALUES, PROFILE_BIO_MAX_LENGTH, PROFILE_FAVORITE_EXERCISES_MAX, PROFILE_LOCATION_MAX_LENGTH, PROFILE_TRAINING_DISCIPLINES_MAX, PROFILE_TRAINING_GOALS_MAX, PROFILE_VISIBILITY_VALUES, PROGRESSION_SCHEMES, PROGRESS_TIMELINE_EVENT_TYPES, PUSH_PAYLOAD_KINDS, PUSH_SUBSCRIPTIONS_MAX, type PaginatedResponse, type PersonalGoalProgress, type PersonalGoalsResponse, type PersonalRecordActivity, type PersonalRecordEntry, type PersonalRecordKind, type PlannedReminder, type PlateLoadingItem, type PlateLoadingResult, type PlatePairInventory, type PlateSetChoice, type PlateauPreferences, type PlateauSet, type PlateausResponse, type PreferredTrainingStyle, type PreviousPerformanceResponse, type PreviousSessionRecap, type PreviousSetPerformance, type ProfileDiscoverySettings, type ProfileFavoriteExercise, type ProfilePrivacySettings, type ProfileViewerAccess, type ProfileVisibility, type ProgressTimelineEventType, type ProgressTimelineItem, type ProgressTimelinePersonalRecordItem, type ProgressTimelineProgressionItem, type ProgressTimelineQuery, type ProgressTimelineRecordPerformance, type ProgressTimelineRecordReason, type ProgressTimelineResponse, type ProgressTimelineSessionContext, type ProgressionActivity, type ProgressionChange, type ProgressionRule, type ProgressionScheme, type ProgressionSetChange, type PublicBodyMetrics, type PublicProfileAchievements, type PublicTrainingSummary, type PublicUserProfile, type PushPayload, type PushPayloadKind, type PushSubscriptionKeys, type PushSubscriptionSummary, type PushSubscriptionsResponse, type QuietHours, RELATIONSHIP_LIST_DEFAULT_LIMIT, RELATIONSHIP_LIST_KINDS, RELATIONSHIP_LIST_MAX_LIMIT, RENAISSANCE_RANK_DEFINITIONS, REPORTS_PER_DAY_MAX, REPORT_DETAILS_MAX_LENGTH, REPORT_REASONS, REPORT_STATUSES, REPORT_SUBJECT_KINDS, REP_TYPES, RESERVED_USERNAMES, REST_ALERT_MAX_LEAD_SECONDS, REST_ALERT_MIN_LEAD_SECONDS, REST_ALERT_REFUSALS, ROUTINE_DAYS_MAX, ROUTINE_DAY_NAME_MAX, ROUTINE_DISCOVERY_DEFAULT_LIMIT, ROUTINE_DISCOVERY_MAX_LIMIT, ROUTINE_DISCOVERY_SCAN_LIMIT, ROUTINE_DURATION_BANDS, ROUTINE_DURATION_BAND_MAX_MINUTES, ROUTINE_SCHEDULE_MODES, ROUTINE_SHARE_MAX_ACTIVE_LINKS, ROUTINE_TRAINING_BLOCKS_MAX, ROUTINE_TRAINING_BLOCK_NAME_MAX, ROUTINE_TRAINING_BLOCK_REVISIONS_MAX, ROUTINE_TRAINING_BLOCK_SOURCE_KINDS, ROUTINE_TRAINING_BLOCK_STATES, ROUTINE_VERSIONS_MAX, ROUTINE_VERSION_KINDS, ROUTINE_VERSION_NAME_MAX, ROUTINE_VISIBILITY_VALUES, type RecentActivityEntry, type RegisterPushSubscriptionRequest, type RelationshipListKind, type RelationshipListQuery, type RelationshipListResponse, type RelationshipMember, type RenaissanceRankDefinition, type RenaissanceRankProgress, type RepTargetPeriod, type RepTargetSignal, type RepType, type ReplaceFeaturedProfileItemsRequest, type ReplaceMeasurableGoalsRequest, type ReplaceTrainingLocationsRequest, type ReportReason, type ReportStatus, type ReportSubjectKind, type ReportSubjectPreview, type ResolvedRoutinePlan, type RestAlertPushPayload, type RestAlertRefusal, type RestoreRoutineVersionResponse, type ReviewReportRequest, type ReviewReportResponse, type Routine, type RoutineClassification, type RoutineDay, type RoutineDayId, type RoutineDiscoveryQuery, type RoutineDiscoveryResponse, type RoutineDurationBand, type RoutineExercise, type RoutineFacets, type RoutineId, type RoutineLineage, type RoutinePlanSource, type RoutineScheduleMode, type RoutineSet, type RoutineShare, type RoutineShareListResponse, type RoutineSharedActivity, type RoutineTemporaryOverride, type RoutineTemporaryOverridePlan, type RoutineTemporaryOverridesResponse, type RoutineTrainingBlock, type RoutineTrainingBlockPlan, type RoutineTrainingBlockRevision, type RoutineTrainingBlockRevisionsResponse, type RoutineTrainingBlockSource, type RoutineTrainingBlockSourceKind, type RoutineTrainingBlockState, type RoutineTrainingBlocksResponse, type RoutineVersion, type RoutineVersionDay, type RoutineVersionExercise, type RoutineVersionKind, type RoutineVersionSetup, type RoutineVersionsResponse, type RoutineVisibility, SCHEDULE_MOVE_MAX_DAYS, SCHEDULE_OVERRIDES_MAX_RANGE_DAYS, SCHEDULE_OVERRIDE_KINDS, SCHEDULE_SKIP_PAST_DAYS, SESSION_CORRECTIONS_MAX, SESSION_CORRECTION_LIMITS, SESSION_CORRECTION_WINDOW_HOURS, SESSION_EXERCISE_NOTE_MAX_LENGTH, SESSION_NOTE_MAX_LENGTH, SESSION_SHARE_DEFAULT_FIELDS, SESSION_SHARE_FIELDS, SESSION_SHARE_MAX_ACTIVE_LINKS, SET_KINDS, SET_KIND_LABELS, SEXES, SHARED_ROUTINE_SOURCES, STARRED_EXERCISES_MAX, STREAK_MAX_GAP_DAYS, type ScheduleOverride, type ScheduleOverrideKind, type ScheduleOverridesQuery, type ScheduleOverridesResponse, type ScheduleRestAlertRequest, type ScheduleRestAlertResponse, type SendTrainingPartnerEncouragementRequest, type SendTrainingPartnerEncouragementResponse, type SessionComparisonExercise, type SessionComparisonQuery, type SessionComparisonResponse, type SessionComparisonRoutineDay, type SessionComparisonSession, type SessionComparisonSet, type SessionCompletedActivity, type SessionCorrection, type SessionCorrectionClosedReason, type SessionCorrectionWindow, type SessionCorrectionsResponse, type SessionExerciseNote, type SessionExerciseSubstitution, type SessionProgressNotification, type SessionRecapExerciseNote, type SessionRecapRecord, type SessionSetCorrection, type SessionShare, type SessionShareField, type SessionShareListResponse, type SessionTemporaryOverride, type SessionTrainingBlock, type SetAccountTimeZoneRequest, type SetActivityEntryAudienceRequest, type SetActivityEntryAudienceResponse, type SetActivityReactionRequest, type SetActivityReactionResponse, type SetKind, type SetLog, type SetLogValues, type Sex, type SharedRoutine, type SharedRoutineOwner, type SharedRoutineSource, type SharedRoutineSummary, type SharedSessionOwner, type SharedSessionRecap, type SkipOccurrenceRequest, type StarredExercise, type StarredExercisesResponse, type StartWorkoutRequest, type StartWorkoutResponse, type StreakAtRiskPushPayload, type StreakMilestoneActivity, type StreakMilestoneEventPayload, type SubstituteSessionExerciseRequest, type SubstituteSessionExerciseResponse, type SupabaseAuthResponse, type SupabaseAuthUser, type SupabaseMigrationResponse, TEMPORARY_OVERRIDE_KINDS, TEMPORARY_OVERRIDE_SOURCE_KINDS, TRAINING_BLOCK_COMPARISON_MAX_DAYS, TRAINING_DISCIPLINE_VALUES, TRAINING_EVENT_TYPES, TRAINING_EXPERIENCE_LEVEL_VALUES, TRAINING_GOAL_VALUES, TRAINING_PARTNERSHIP_STATUSES, TRAINING_PARTNERS_MAX, TRAINING_PARTNER_ENCOURAGEMENTS_PER_24_HOURS_MAX, TRAINING_PARTNER_ENCOURAGEMENT_KINDS, TRAINING_PARTNER_PERMISSION_KEYS, TRAINING_PARTNER_REQUESTS_PER_DAY_MAX, TRAINING_SIGNAL_DECLINES_MAX, TRAINING_SIGNAL_DECLINE_SESSIONS, TRAINING_SIGNAL_MIN_DECLINE, TRAINING_SIGNAL_MIN_RPE_SETS, TRAINING_SIGNAL_MIN_SHORT_SETS, TRAINING_SIGNAL_MIN_TARGET_SETS, TRAINING_SIGNAL_PERIOD_DAYS, TRAINING_SIGNAL_RPE_RISE, TRAINING_SIGNAL_SHORT_LIFTS_MAX, TRAINING_SIGNAL_SHORT_POINTS_RISE, TRAINING_SIGNAL_WORKOUT_DROP, type TemporaryOverrideKind, type TemporaryOverrideSource, type TemporaryOverrideSourceKind, type TrainingBlockComparisonResponse, type TrainingDiscipline, type TrainingEventType, type TrainingExperienceLevel, type TrainingGoal, type TrainingIdentity, type TrainingLocationPreference, type TrainingLocationPreferenceInput, type TrainingPartnerAchievementNotification, type TrainingPartnerAchievementPushPayload, type TrainingPartnerEncouragementKind, type TrainingPartnerEncouragementNotification, type TrainingPartnerPermissions, type TrainingPartnerScheduleDay, type TrainingPartnerScheduleResponse, type TrainingPartnerSessionNotification, type TrainingPartnerSessionPushPayload, type TrainingPartnership, type TrainingPartnershipStatus, type TrainingPartnershipsResponse, type TrainingReminderPreference, type TrainingReminderPushPayload, type TrainingSignalPeriod, type TrainingSignalsResponse, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, USERNAME_PATTERN_SOURCE, type UpdateActivitySharingRequest, type UpdateCustomExerciseRequest, type UpdateNotificationPreferencesRequest, type UpdateProfileDiscoveryRequest, type UpdateProfilePrivacyRequest, type UpdateProfileRequest, type UpdateRoutineRequest, type UpdateRoutineVisibilityRequest, type UpdateSessionNotesRequest, type UpdateSessionNotesResponse, type UpdateTrainingPartnerPermissionsRequest, type UpsertBodyMeasurementRequest, type UpsertRoutineTrainingBlockRequest, type UpsertSetLogRequest, type UpsertSetLogResponse, type UserId, type UserProfile, type UserSearchResponse, type VolumeTrendPoint, type VolumeTrendQuery, type VolumeTrendResponse, type VolumeTrendSeries, WEIGHT_UNITS, WORKOUT_SESSION_STATUSES, type WarmUpEquipment, type WarmUpLoad, type WarmUpRamp, type WarmUpSet, type WarmUpStep, type WeightUnit, type WorkoutAnalyticsStatus, type WorkoutPeriod, type WorkoutProgressQuery, type WorkoutProgressResponse, type WorkoutSession, type WorkoutSessionId, type WorkoutSessionListResponse, type WorkoutSessionRecap, type WorkoutSessionSnapshotV1, type WorkoutSessionStatus, type WorkoutSessionSummary, type WorkoutSignal, type WorkoutStatsQuery, type WorkoutStatsResponse, accountExportFileName, applyDeload, bodyMeasurementProblems, bodyProgressRangeStart, buildWarmUpRamp, calculatePlateLoading, canLinkToNext, countsAsWork, countsForProgression, customExerciseProblem, defaultWarmUpEquipment, deloadLengthDays, exerciseGroupLabel, exerciseGroupPosition, exerciseGroups, exerciseNameKey, followWorkingLoad, hasOversizedGroup, isBarLoaded, isBodyMeasurementDate, isSetKind, isWithinQuietHours, latestBodyWeight, leadWorkingWeight, matchesDeletionConfirmation, normalizeExerciseLinks, normalizeExerciseName, primaryEquipment, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, summarizeBodyProgress, trainingBlockCovers, warmUpLoad };
package/dist/index.js CHANGED
@@ -264,6 +264,92 @@ var MEASURABLE_GOAL_TYPES = [
264
264
  var MEASURABLE_GOAL_DIRECTIONS = ["AT_LEAST", "AT_MOST"];
265
265
  var MEASURABLE_GOALS_MAX = 8;
266
266
 
267
+ // src/body-measurements.ts
268
+ var BODY_MEASUREMENT_FIELDS = [
269
+ { key: "weightKg", label: "Weight", unit: "kg", min: 20, max: 1e3 },
270
+ { key: "waistCm", label: "Waist", unit: "cm", min: 10, max: 300 },
271
+ { key: "hipsCm", label: "Hips", unit: "cm", min: 10, max: 300 },
272
+ { key: "chestCm", label: "Chest", unit: "cm", min: 10, max: 300 },
273
+ { key: "armCm", label: "Arm", unit: "cm", min: 10, max: 300 },
274
+ { key: "thighCm", label: "Thigh", unit: "cm", min: 10, max: 300 },
275
+ { key: "bodyFatPercent", label: "Body fat", unit: "%", min: 2, max: 75 }
276
+ ];
277
+ var BODY_MEASUREMENT_FIELD_KEYS = BODY_MEASUREMENT_FIELDS.map((field) => field.key);
278
+ var BODY_PROGRESS_RANGES = ["30D", "90D", "1Y", "ALL"];
279
+ var DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
280
+ function isBodyMeasurementDate(value) {
281
+ const match = DATE_PATTERN.exec(value);
282
+ if (!match) return false;
283
+ const date = /* @__PURE__ */ new Date(`${value}T00:00:00Z`);
284
+ return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
285
+ }
286
+ function shiftDate(date, days) {
287
+ const shifted = /* @__PURE__ */ new Date(`${date}T00:00:00Z`);
288
+ shifted.setUTCDate(shifted.getUTCDate() + days);
289
+ return shifted.toISOString().slice(0, 10);
290
+ }
291
+ function bodyProgressRangeStart(range, today) {
292
+ switch (range) {
293
+ case "30D":
294
+ return shiftDate(today, -29);
295
+ case "90D":
296
+ return shiftDate(today, -89);
297
+ case "1Y":
298
+ return shiftDate(today, -364);
299
+ case "ALL":
300
+ return null;
301
+ }
302
+ }
303
+ function bodyMeasurementProblems(input) {
304
+ const problems = [];
305
+ let values = 0;
306
+ for (const field of BODY_MEASUREMENT_FIELDS) {
307
+ const value = input[field.key];
308
+ if (value === void 0 || value === null) continue;
309
+ if (typeof value !== "number" || !Number.isFinite(value)) {
310
+ problems.push({ field: field.key, message: `${field.label} must be a number` });
311
+ continue;
312
+ }
313
+ values += 1;
314
+ if (value < field.min || value > field.max) {
315
+ problems.push({
316
+ field: field.key,
317
+ message: `${field.label} must be between ${field.min} and ${field.max} ${field.unit}`
318
+ });
319
+ }
320
+ }
321
+ if (values === 0 && problems.length === 0) {
322
+ problems.push({ field: null, message: "Add at least one measurement" });
323
+ }
324
+ return problems;
325
+ }
326
+ function summarizeBodyProgress(entries, rangeStart) {
327
+ const ordered = [...entries].sort((a, b) => a.date.localeCompare(b.date));
328
+ return BODY_MEASUREMENT_FIELD_KEYS.map((field) => {
329
+ const recorded = ordered.filter((entry) => entry[field] !== null);
330
+ const latestEntry = recorded[recorded.length - 1] ?? null;
331
+ const firstInRange = recorded.find((entry) => rangeStart === null || entry.date >= rangeStart) ?? null;
332
+ const hasChange = latestEntry !== null && firstInRange !== null && firstInRange.date !== latestEntry.date;
333
+ return {
334
+ field,
335
+ latest: latestEntry?.[field] ?? null,
336
+ latestDate: latestEntry?.date ?? null,
337
+ change: hasChange ? Math.round((latestEntry[field] - firstInRange[field]) * 100) / 100 : null,
338
+ changeSince: hasChange ? firstInRange.date : null
339
+ };
340
+ });
341
+ }
342
+ function latestBodyWeight(entries) {
343
+ let latest = null;
344
+ for (const entry of entries) {
345
+ if (entry.weightKg === null) continue;
346
+ if (latest === null || entry.date > latest.date) {
347
+ latest = { date: entry.date, weightKg: entry.weightKg };
348
+ }
349
+ }
350
+ return latest?.weightKg ?? null;
351
+ }
352
+
267
353
  // src/achievements.ts
268
354
  var ACHIEVEMENT_CATEGORIES = [
269
355
  "SESSIONS",
@@ -646,6 +732,59 @@ function followWorkingLoad(sets, equipment) {
646
732
  );
647
733
  }
648
734
 
735
+ // src/exercise-groups.ts
736
+ var EXERCISE_GROUP_MAX = 6;
737
+ var EXERCISE_GROUP_KIND_LABELS = {
738
+ SUPERSET: "Superset",
739
+ CIRCUIT: "Circuit"
740
+ };
741
+ var letterFor = (index) => index < 26 ? String.fromCharCode(65 + index) : letterFor(Math.floor(index / 26) - 1) + letterFor(index % 26);
742
+ function exerciseGroups(exercises) {
743
+ const groups = [];
744
+ let index = 0;
745
+ while (index < exercises.length) {
746
+ const indices = [index];
747
+ while (exercises[indices[indices.length - 1]].linkedToNext && indices[indices.length - 1] + 1 < exercises.length) {
748
+ indices.push(indices[indices.length - 1] + 1);
749
+ }
750
+ if (indices.length > 1) {
751
+ groups.push({
752
+ letter: letterFor(groups.length),
753
+ kind: indices.length === 2 ? "SUPERSET" : "CIRCUIT",
754
+ indices
755
+ });
756
+ }
757
+ index = indices[indices.length - 1] + 1;
758
+ }
759
+ return groups;
760
+ }
761
+ function exerciseGroupPosition(exercises, index) {
762
+ for (const group of exerciseGroups(exercises)) {
763
+ const at = group.indices.indexOf(index);
764
+ if (at >= 0) return { group, position: at + 1 };
765
+ }
766
+ return null;
767
+ }
768
+ var exerciseGroupLabel = ({ group, position }) => `${EXERCISE_GROUP_KIND_LABELS[group.kind]} ${group.letter}${position}`;
769
+ function canLinkToNext(exercises, index) {
770
+ if (index < 0 || index >= exercises.length - 1) return false;
771
+ let start = index;
772
+ while (start > 0 && exercises[start - 1].linkedToNext) start -= 1;
773
+ let end = index + 1;
774
+ while (end < exercises.length - 1 && exercises[end].linkedToNext) end += 1;
775
+ return end - start + 1 <= EXERCISE_GROUP_MAX;
776
+ }
777
+ function normalizeExerciseLinks(exercises) {
778
+ return exercises.map(
779
+ (exercise, index) => exercise.linkedToNext && index === exercises.length - 1 ? { ...exercise, linkedToNext: false } : exercise
780
+ );
781
+ }
782
+ function hasOversizedGroup(exercises) {
783
+ return exerciseGroups(exercises).some(
784
+ (group) => group.indices.length > EXERCISE_GROUP_MAX
785
+ );
786
+ }
787
+
649
788
  // src/routine.ts
650
789
  var ROUTINE_SCHEDULE_MODES = ["WEEKLY", "ROTATION"];
651
790
  var ROUTINE_DAYS_MAX = 7;
@@ -1073,6 +1212,9 @@ export {
1073
1212
  BAR_CHOICES_KG,
1074
1213
  BAR_WARM_UP_STEPS,
1075
1214
  BLOCKED_MEMBERS_MAX,
1215
+ BODY_MEASUREMENT_FIELDS,
1216
+ BODY_MEASUREMENT_FIELD_KEYS,
1217
+ BODY_PROGRESS_RANGES,
1076
1218
  CLONE_ROUTINE_REFUSALS,
1077
1219
  COMEBACK_MIN_INACTIVE_DAYS,
1078
1220
  COMEBACK_RECOGNITION_LIMIT,
@@ -1097,6 +1239,8 @@ export {
1097
1239
  DELOAD_SUGGESTION_ROUTINE_DAYS,
1098
1240
  DELOAD_SUGGESTION_SIGNALS,
1099
1241
  EXERCISE_EQUIPMENT,
1242
+ EXERCISE_GROUP_KIND_LABELS,
1243
+ EXERCISE_GROUP_MAX,
1100
1244
  EXERCISE_MECHANICS,
1101
1245
  FEATURED_PROFILE_ITEMS_MAX,
1102
1246
  FEATURED_PROFILE_ITEM_KINDS,
@@ -1221,20 +1365,30 @@ export {
1221
1365
  WORKOUT_SESSION_STATUSES,
1222
1366
  accountExportFileName,
1223
1367
  applyDeload,
1368
+ bodyMeasurementProblems,
1369
+ bodyProgressRangeStart,
1224
1370
  buildWarmUpRamp,
1225
1371
  calculatePlateLoading,
1372
+ canLinkToNext,
1226
1373
  countsAsWork,
1227
1374
  countsForProgression,
1228
1375
  customExerciseProblem,
1229
1376
  defaultWarmUpEquipment,
1230
1377
  deloadLengthDays,
1378
+ exerciseGroupLabel,
1379
+ exerciseGroupPosition,
1380
+ exerciseGroups,
1231
1381
  exerciseNameKey,
1232
1382
  followWorkingLoad,
1383
+ hasOversizedGroup,
1233
1384
  isBarLoaded,
1385
+ isBodyMeasurementDate,
1234
1386
  isSetKind,
1235
1387
  isWithinQuietHours,
1388
+ latestBodyWeight,
1236
1389
  leadWorkingWeight,
1237
1390
  matchesDeletionConfirmation,
1391
+ normalizeExerciseLinks,
1238
1392
  normalizeExerciseName,
1239
1393
  primaryEquipment,
1240
1394
  requiredToFinish,
@@ -1244,6 +1398,7 @@ export {
1244
1398
  sessionCorrectionWindow,
1245
1399
  setKindOf,
1246
1400
  setLogValuesDiffer,
1401
+ summarizeBodyProgress,
1247
1402
  trainingBlockCovers,
1248
1403
  warmUpLoad
1249
1404
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunsteel/contracts",
3
- "version": "0.72.0",
3
+ "version": "0.74.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ezee969/sunsteel-contracts.git"