@sunsteel/contracts 0.70.0 → 0.71.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
@@ -37,6 +37,8 @@ __export(index_exports, {
37
37
  ACTIVITY_REACTIONS: () => ACTIVITY_REACTIONS,
38
38
  ACTIVITY_TYPES: () => ACTIVITY_TYPES,
39
39
  ACTIVITY_TYPE_SECTIONS: () => ACTIVITY_TYPE_SECTIONS,
40
+ BAR_CHOICES_KG: () => BAR_CHOICES_KG,
41
+ BAR_WARM_UP_STEPS: () => BAR_WARM_UP_STEPS,
40
42
  BLOCKED_MEMBERS_MAX: () => BLOCKED_MEMBERS_MAX,
41
43
  CLONE_ROUTINE_REFUSALS: () => CLONE_ROUTINE_REFUSALS,
42
44
  COMEBACK_MIN_INACTIVE_DAYS: () => COMEBACK_MIN_INACTIVE_DAYS,
@@ -64,6 +66,8 @@ __export(index_exports, {
64
66
  FOLLOW_SUGGESTIONS_DEFAULT_LIMIT: () => FOLLOW_SUGGESTIONS_DEFAULT_LIMIT,
65
67
  FOLLOW_SUGGESTIONS_MAX_LIMIT: () => FOLLOW_SUGGESTIONS_MAX_LIMIT,
66
68
  FOLLOW_SUGGESTION_REASONS: () => FOLLOW_SUGGESTION_REASONS,
69
+ LIMITED_SHORTFALL_KG: () => LIMITED_SHORTFALL_KG,
70
+ MAX_SETS_PER_EXERCISE: () => MAX_SETS_PER_EXERCISE,
67
71
  MEASURABLE_GOALS_MAX: () => MEASURABLE_GOALS_MAX,
68
72
  MEASURABLE_GOAL_DIRECTIONS: () => MEASURABLE_GOAL_DIRECTIONS,
69
73
  MEASURABLE_GOAL_TYPES: () => MEASURABLE_GOAL_TYPES,
@@ -79,12 +83,14 @@ __export(index_exports, {
79
83
  NOTIFICATIONS_RETENTION_DAYS: () => NOTIFICATIONS_RETENTION_DAYS,
80
84
  NOTIFICATION_CATEGORIES: () => NOTIFICATION_CATEGORIES,
81
85
  NOTIFICATION_KINDS: () => NOTIFICATION_KINDS,
86
+ OTHER_WARM_UP_STEPS: () => OTHER_WARM_UP_STEPS,
82
87
  PLATEAU_MIN_DAYS_SINCE_BEST: () => PLATEAU_MIN_DAYS_SINCE_BEST,
83
88
  PLATEAU_MIN_SESSIONS: () => PLATEAU_MIN_SESSIONS,
84
89
  PLATEAU_MIN_SESSIONS_MAX: () => PLATEAU_MIN_SESSIONS_MAX,
85
90
  PLATEAU_MIN_SESSIONS_MIN: () => PLATEAU_MIN_SESSIONS_MIN,
86
91
  PLATEAU_RECENT_DAYS: () => PLATEAU_RECENT_DAYS,
87
92
  PLATEAU_WINDOW_DAYS: () => PLATEAU_WINDOW_DAYS,
93
+ PLATE_SETS: () => PLATE_SETS,
88
94
  PREFERRED_TRAINING_STYLE_VALUES: () => PREFERRED_TRAINING_STYLE_VALUES,
89
95
  PROFILE_BIO_MAX_LENGTH: () => PROFILE_BIO_MAX_LENGTH,
90
96
  PROFILE_FAVORITE_EXERCISES_MAX: () => PROFILE_FAVORITE_EXERCISES_MAX,
@@ -177,11 +183,17 @@ __export(index_exports, {
177
183
  WORKOUT_SESSION_STATUSES: () => WORKOUT_SESSION_STATUSES,
178
184
  accountExportFileName: () => accountExportFileName,
179
185
  applyDeload: () => applyDeload,
186
+ buildWarmUpRamp: () => buildWarmUpRamp,
187
+ calculatePlateLoading: () => calculatePlateLoading,
180
188
  countsAsWork: () => countsAsWork,
181
189
  countsForProgression: () => countsForProgression,
190
+ defaultWarmUpEquipment: () => defaultWarmUpEquipment,
182
191
  deloadLengthDays: () => deloadLengthDays,
192
+ followWorkingLoad: () => followWorkingLoad,
193
+ isBarLoaded: () => isBarLoaded,
183
194
  isSetKind: () => isSetKind,
184
195
  isWithinQuietHours: () => isWithinQuietHours,
196
+ leadWorkingWeight: () => leadWorkingWeight,
185
197
  matchesDeletionConfirmation: () => matchesDeletionConfirmation,
186
198
  requiredToFinish: () => requiredToFinish,
187
199
  resolveActiveTrainingBlock: () => resolveActiveTrainingBlock,
@@ -190,7 +202,8 @@ __export(index_exports, {
190
202
  sessionCorrectionWindow: () => sessionCorrectionWindow,
191
203
  setKindOf: () => setKindOf,
192
204
  setLogValuesDiffer: () => setLogValuesDiffer,
193
- trainingBlockCovers: () => trainingBlockCovers
205
+ trainingBlockCovers: () => trainingBlockCovers,
206
+ warmUpLoad: () => warmUpLoad
194
207
  });
195
208
  module.exports = __toCommonJS(index_exports);
196
209
 
@@ -544,6 +557,257 @@ function requiredToFinish(kind) {
544
557
  return k === "WORKING" || k === "DROP";
545
558
  }
546
559
 
560
+ // src/plate-loading.ts
561
+ var CANONICAL_SCALE = 1e4;
562
+ var DENSE_CAPACITY_LIMIT = 2e5;
563
+ var toCanonicalUnits = (weightKg) => Math.round(weightKg * CANONICAL_SCALE);
564
+ var fromCanonicalUnits = (units) => units / CANONICAL_SCALE;
565
+ var greatestCommonDivisor = (left, right) => {
566
+ let a = Math.abs(left);
567
+ let b = Math.abs(right);
568
+ while (b > 0) {
569
+ const remainder = a % b;
570
+ a = b;
571
+ b = remainder;
572
+ }
573
+ return a;
574
+ };
575
+ var buildChunks = (plates, divisor) => {
576
+ const chunks = [];
577
+ plates.forEach((plate, plateIndex) => {
578
+ const pairValue = Math.round(
579
+ toCanonicalUnits(plate.weightKg) * 2 / divisor
580
+ );
581
+ let remaining = plate.pairCount;
582
+ let chunkSize = 1;
583
+ while (remaining > 0) {
584
+ const quantity = Math.min(chunkSize, remaining);
585
+ chunks.push({
586
+ plateIndex,
587
+ quantity,
588
+ value: pairValue * quantity
589
+ });
590
+ remaining -= quantity;
591
+ chunkSize *= 2;
592
+ }
593
+ });
594
+ return chunks;
595
+ };
596
+ var reconstructSelection = (best, chunks, previousSum, previousChunk, plateCount) => {
597
+ const selection = Array.from({ length: plateCount }, () => 0);
598
+ let current = best;
599
+ while (current > 0) {
600
+ const chunkIndex = previousChunk(current);
601
+ if (chunkIndex < 0) break;
602
+ const chunk = chunks[chunkIndex];
603
+ selection[chunk.plateIndex] += chunk.quantity;
604
+ current = previousSum(current);
605
+ }
606
+ return selection;
607
+ };
608
+ var solveDense = (capacity, chunks, plateCount) => {
609
+ const reachable = new Uint8Array(capacity + 1);
610
+ const previousSum = new Int32Array(capacity + 1);
611
+ const previousChunk = new Int16Array(capacity + 1);
612
+ previousSum.fill(-1);
613
+ previousChunk.fill(-1);
614
+ reachable[0] = 1;
615
+ chunks.forEach((chunk, chunkIndex) => {
616
+ for (let sum = capacity; sum >= chunk.value; sum -= 1) {
617
+ if (!reachable[sum] && reachable[sum - chunk.value]) {
618
+ reachable[sum] = 1;
619
+ previousSum[sum] = sum - chunk.value;
620
+ previousChunk[sum] = chunkIndex;
621
+ }
622
+ }
623
+ });
624
+ let best = capacity;
625
+ while (best > 0 && !reachable[best]) best -= 1;
626
+ return {
627
+ best,
628
+ selection: reconstructSelection(
629
+ best,
630
+ chunks,
631
+ (sum) => previousSum[sum],
632
+ (sum) => previousChunk[sum],
633
+ plateCount
634
+ )
635
+ };
636
+ };
637
+ var solveSparse = (capacity, chunks, plateCount) => {
638
+ const reachable = /* @__PURE__ */ new Map();
639
+ reachable.set(0, { previous: -1, chunkIndex: -1 });
640
+ chunks.forEach((chunk, chunkIndex) => {
641
+ const currentSums = Array.from(reachable.keys());
642
+ for (const sum of currentSums) {
643
+ const next = sum + chunk.value;
644
+ if (next <= capacity && !reachable.has(next)) {
645
+ reachable.set(next, { previous: sum, chunkIndex });
646
+ }
647
+ }
648
+ });
649
+ let best = 0;
650
+ for (const sum of reachable.keys()) {
651
+ if (sum > best) best = sum;
652
+ }
653
+ return {
654
+ best,
655
+ selection: reconstructSelection(
656
+ best,
657
+ chunks,
658
+ (sum) => reachable.get(sum)?.previous ?? -1,
659
+ (sum) => reachable.get(sum)?.chunkIndex ?? -1,
660
+ plateCount
661
+ )
662
+ };
663
+ };
664
+ var heaviestFirst = (target, pairValues, counts) => {
665
+ let remaining = target;
666
+ const selection = pairValues.map((value, index) => {
667
+ const take = Math.min(counts[index], Math.floor(remaining / value));
668
+ remaining -= take * value;
669
+ return take;
670
+ });
671
+ return remaining === 0 ? selection : null;
672
+ };
673
+ var plateTotal = (selection) => selection.reduce((total, count) => total + count, 0);
674
+ var calculatePlateLoading = (targetWeightKg, barWeightKg, availablePlatePairs) => {
675
+ const targetUnits = Math.max(0, toCanonicalUnits(targetWeightKg));
676
+ const barUnits = Math.max(0, toCanonicalUnits(barWeightKg));
677
+ if (targetUnits < barUnits) {
678
+ return {
679
+ targetWeightKg: fromCanonicalUnits(targetUnits),
680
+ loadedWeightKg: fromCanonicalUnits(barUnits),
681
+ differenceKg: fromCanonicalUnits(barUnits - targetUnits),
682
+ status: "over",
683
+ platesPerSide: []
684
+ };
685
+ }
686
+ const plates = availablePlatePairs.filter((plate) => plate.weightKg > 0 && plate.pairCount > 0).sort((left, right) => right.weightKg - left.weightKg);
687
+ const pairValues = plates.map((plate) => toCanonicalUnits(plate.weightKg) * 2);
688
+ const divisor = pairValues.reduce(greatestCommonDivisor, 0) || 1;
689
+ const residualUnits = targetUnits - barUnits;
690
+ const requestedCapacity = Math.floor(residualUnits / divisor);
691
+ const inventoryCapacity = pairValues.reduce(
692
+ (total, value, index) => total + value / divisor * plates[index].pairCount,
693
+ 0
694
+ );
695
+ const capacity = Math.min(requestedCapacity, inventoryCapacity);
696
+ const chunks = buildChunks(plates, divisor);
697
+ const solution = capacity <= DENSE_CAPACITY_LIMIT ? solveDense(capacity, chunks, plates.length) : solveSparse(capacity, chunks, plates.length);
698
+ const greedy = heaviestFirst(
699
+ solution.best,
700
+ pairValues.map((value) => value / divisor),
701
+ plates.map((plate) => plate.pairCount)
702
+ );
703
+ const selection = greedy && plateTotal(greedy) <= plateTotal(solution.selection) ? greedy : solution.selection;
704
+ const plateUnits = solution.best * divisor;
705
+ const loadedUnits = barUnits + plateUnits;
706
+ const differenceUnits = targetUnits - loadedUnits;
707
+ return {
708
+ targetWeightKg: fromCanonicalUnits(targetUnits),
709
+ loadedWeightKg: fromCanonicalUnits(loadedUnits),
710
+ differenceKg: fromCanonicalUnits(differenceUnits),
711
+ status: differenceUnits === 0 ? "exact" : "short",
712
+ platesPerSide: plates.flatMap(
713
+ (plate, index) => selection[index] > 0 ? [
714
+ {
715
+ weightKg: plate.weightKg,
716
+ platesPerSide: selection[index]
717
+ }
718
+ ] : []
719
+ )
720
+ };
721
+ };
722
+
723
+ // src/warm-ups.ts
724
+ var MAX_SETS_PER_EXERCISE = 10;
725
+ var BAR_WARM_UP_STEPS = [
726
+ { share: 0, reps: 10 },
727
+ { share: 0.4, reps: 5 },
728
+ { share: 0.6, reps: 3 },
729
+ { share: 0.8, reps: 2 }
730
+ ];
731
+ var OTHER_WARM_UP_STEPS = [
732
+ { share: 0.5, reps: 8 },
733
+ { share: 0.75, reps: 3 }
734
+ ];
735
+ var BAR_LOADED = /* @__PURE__ */ new Set(["barbell", "ez-bar", "smith-machine"]);
736
+ var isBarLoaded = (equipmentRequired) => (equipmentRequired ?? []).some((item) => BAR_LOADED.has(item));
737
+ var POUNDS_PER_KILOGRAM = 2.2046226218;
738
+ var lb = (pounds) => pounds / POUNDS_PER_KILOGRAM;
739
+ var BAR_CHOICES_KG = {
740
+ KG: [20, 15, 10],
741
+ LB: [lb(45), lb(35), lb(15)]
742
+ };
743
+ var pairs = (weights, heaviestPairs) => weights.map((weightKg, index) => ({
744
+ weightKg,
745
+ pairCount: index === 0 ? heaviestPairs : 2
746
+ }));
747
+ var PLATE_SETS = {
748
+ KG: {
749
+ STANDARD: pairs([25, 20, 15, 10, 5, 2.5, 1.25], 4),
750
+ LIGHT: pairs([20, 15, 10, 5, 2.5, 1.25], 2)
751
+ },
752
+ LB: {
753
+ STANDARD: pairs([45, 35, 25, 10, 5, 2.5].map(lb), 4),
754
+ LIGHT: pairs([25, 10, 5, 2.5].map(lb), 2)
755
+ }
756
+ };
757
+ var LIMITED_SHORTFALL_KG = 2.5;
758
+ var defaultWarmUpEquipment = (unit) => ({
759
+ barWeightKg: BAR_CHOICES_KG[unit][0],
760
+ platePairs: PLATE_SETS[unit].STANDARD
761
+ });
762
+ var round = (value) => Math.round(value * 1e4) / 1e4;
763
+ function warmUpLoad(share, workingWeightKg, equipment) {
764
+ const target = share * workingWeightKg;
765
+ if (equipment.barLoaded) {
766
+ const loading = calculatePlateLoading(
767
+ Math.max(target, equipment.barWeightKg),
768
+ equipment.barWeightKg,
769
+ [...equipment.platePairs]
770
+ );
771
+ return {
772
+ weightKg: round(loading.loadedWeightKg),
773
+ platesPerSide: loading.platesPerSide,
774
+ limited: share > 0 && loading.status === "short" && loading.differenceKg >= LIMITED_SHORTFALL_KG - 1e-9
775
+ };
776
+ }
777
+ const increment = equipment.incrementKg > 0 ? equipment.incrementKg : 2.5;
778
+ return {
779
+ weightKg: round(Math.floor(target / increment + 1e-9) * increment),
780
+ limited: false
781
+ };
782
+ }
783
+ function buildWarmUpRamp(input) {
784
+ const work = input.workingWeightKg;
785
+ if (!(work > 0)) return { sets: [], leftOut: 0 };
786
+ const steps = input.barLoaded ? BAR_WARM_UP_STEPS : OTHER_WARM_UP_STEPS;
787
+ const sets = [];
788
+ for (const step of steps) {
789
+ const load = warmUpLoad(step.share, work, input);
790
+ const previous = sets[sets.length - 1];
791
+ if (load.weightKg <= 0 || load.weightKg >= work - 1e-9) continue;
792
+ if (previous && load.weightKg <= previous.weightKg + 1e-9) continue;
793
+ sets.push({ ...load, reps: step.reps, share: step.share });
794
+ }
795
+ const room = Math.max(0, input.room);
796
+ const kept = sets.slice(Math.max(0, sets.length - room));
797
+ return { sets: kept, leftOut: sets.length - kept.length };
798
+ }
799
+ function leadWorkingWeight(sets) {
800
+ const lead = sets.find((set) => countsForProgression(set.kind));
801
+ return typeof lead?.weight === "number" && lead.weight > 0 ? lead.weight : null;
802
+ }
803
+ function followWorkingLoad(sets, equipment) {
804
+ const work = leadWorkingWeight(sets);
805
+ if (work === null) return [...sets];
806
+ return sets.map(
807
+ (set) => set.kind === "WARMUP" && typeof set.warmUpShare === "number" ? { ...set, weight: warmUpLoad(set.warmUpShare, work, equipment).weightKg } : set
808
+ );
809
+ }
810
+
547
811
  // src/routine.ts
548
812
  var ROUTINE_SCHEDULE_MODES = ["WEEKLY", "ROTATION"];
549
813
  var ROUTINE_DAYS_MAX = 7;
@@ -969,6 +1233,8 @@ function accountExportFileName(username, exportedAt) {
969
1233
  ACTIVITY_REACTIONS,
970
1234
  ACTIVITY_TYPES,
971
1235
  ACTIVITY_TYPE_SECTIONS,
1236
+ BAR_CHOICES_KG,
1237
+ BAR_WARM_UP_STEPS,
972
1238
  BLOCKED_MEMBERS_MAX,
973
1239
  CLONE_ROUTINE_REFUSALS,
974
1240
  COMEBACK_MIN_INACTIVE_DAYS,
@@ -996,6 +1262,8 @@ function accountExportFileName(username, exportedAt) {
996
1262
  FOLLOW_SUGGESTIONS_DEFAULT_LIMIT,
997
1263
  FOLLOW_SUGGESTIONS_MAX_LIMIT,
998
1264
  FOLLOW_SUGGESTION_REASONS,
1265
+ LIMITED_SHORTFALL_KG,
1266
+ MAX_SETS_PER_EXERCISE,
999
1267
  MEASURABLE_GOALS_MAX,
1000
1268
  MEASURABLE_GOAL_DIRECTIONS,
1001
1269
  MEASURABLE_GOAL_TYPES,
@@ -1011,12 +1279,14 @@ function accountExportFileName(username, exportedAt) {
1011
1279
  NOTIFICATIONS_RETENTION_DAYS,
1012
1280
  NOTIFICATION_CATEGORIES,
1013
1281
  NOTIFICATION_KINDS,
1282
+ OTHER_WARM_UP_STEPS,
1014
1283
  PLATEAU_MIN_DAYS_SINCE_BEST,
1015
1284
  PLATEAU_MIN_SESSIONS,
1016
1285
  PLATEAU_MIN_SESSIONS_MAX,
1017
1286
  PLATEAU_MIN_SESSIONS_MIN,
1018
1287
  PLATEAU_RECENT_DAYS,
1019
1288
  PLATEAU_WINDOW_DAYS,
1289
+ PLATE_SETS,
1020
1290
  PREFERRED_TRAINING_STYLE_VALUES,
1021
1291
  PROFILE_BIO_MAX_LENGTH,
1022
1292
  PROFILE_FAVORITE_EXERCISES_MAX,
@@ -1109,11 +1379,17 @@ function accountExportFileName(username, exportedAt) {
1109
1379
  WORKOUT_SESSION_STATUSES,
1110
1380
  accountExportFileName,
1111
1381
  applyDeload,
1382
+ buildWarmUpRamp,
1383
+ calculatePlateLoading,
1112
1384
  countsAsWork,
1113
1385
  countsForProgression,
1386
+ defaultWarmUpEquipment,
1114
1387
  deloadLengthDays,
1388
+ followWorkingLoad,
1389
+ isBarLoaded,
1115
1390
  isSetKind,
1116
1391
  isWithinQuietHours,
1392
+ leadWorkingWeight,
1117
1393
  matchesDeletionConfirmation,
1118
1394
  requiredToFinish,
1119
1395
  resolveActiveTrainingBlock,
@@ -1122,5 +1398,6 @@ function accountExportFileName(username, exportedAt) {
1122
1398
  sessionCorrectionWindow,
1123
1399
  setKindOf,
1124
1400
  setLogValuesDiffer,
1125
- trainingBlockCovers
1401
+ trainingBlockCovers,
1402
+ warmUpLoad
1126
1403
  });
package/dist/index.d.cts CHANGED
@@ -390,6 +390,12 @@ interface RoutineSet {
390
390
  rir?: number | null;
391
391
  /** LIVE-12; absent means a working set. */
392
392
  kind?: SetKind;
393
+ /**
394
+ * LIVE-20: a generated warm-up's share of the first working set (0 is the
395
+ * empty bar). With the exercise following its load, the warm-up's weight
396
+ * is recalculated from it.
397
+ */
398
+ warmUpShare?: number | null;
393
399
  }
394
400
  interface RoutineExercise {
395
401
  id: string;
@@ -398,6 +404,8 @@ interface RoutineExercise {
398
404
  note?: string | null;
399
405
  progressionScheme: ProgressionScheme;
400
406
  minWeightIncrement: number;
407
+ /** LIVE-20: warm-ups with a share follow the first working set. */
408
+ warmUpsFollowLoad?: boolean;
401
409
  exercise: {
402
410
  id: string;
403
411
  name: string;
@@ -413,6 +421,8 @@ interface CreateRoutineExerciseInput {
413
421
  note?: string;
414
422
  progressionScheme: ProgressionScheme;
415
423
  minWeightIncrement: number;
424
+ /** LIVE-20: warm-ups with a share follow the first working set. */
425
+ warmUpsFollowLoad?: boolean;
416
426
  sets: RoutineSet[];
417
427
  }
418
428
  interface RoutineDay {
@@ -541,6 +551,8 @@ interface RoutineVersionExercise {
541
551
  note: string | null;
542
552
  progressionScheme: ProgressionScheme;
543
553
  minWeightIncrement: number;
554
+ /** LIVE-20; absent in setups captured before it. */
555
+ warmUpsFollowLoad?: boolean;
544
556
  sets: RoutineSet[];
545
557
  }
546
558
  interface RoutineVersionDay {
@@ -2099,6 +2111,102 @@ interface PersonalGoalsResponse {
2099
2111
  goals: PersonalGoalProgress[];
2100
2112
  }
2101
2113
 
2114
+ interface PlateLoadingItem {
2115
+ weightKg: number;
2116
+ platesPerSide: number;
2117
+ }
2118
+ interface PlateLoadingResult {
2119
+ targetWeightKg: number;
2120
+ loadedWeightKg: number;
2121
+ differenceKg: number;
2122
+ status: 'exact' | 'short' | 'over';
2123
+ platesPerSide: PlateLoadingItem[];
2124
+ }
2125
+ declare const calculatePlateLoading: (targetWeightKg: number, barWeightKg: number, availablePlatePairs: PlatePairInventory[]) => PlateLoadingResult;
2126
+
2127
+ /** An exercise holds at most this many sets, warm-ups included. */
2128
+ declare const MAX_SETS_PER_EXERCISE = 10;
2129
+ interface WarmUpStep {
2130
+ /** Share of the working load; 0 is the empty bar. */
2131
+ share: number;
2132
+ reps: number;
2133
+ }
2134
+ /** Plate-loaded work: the empty bar, then 40, 60 and 80 %. */
2135
+ declare const BAR_WARM_UP_STEPS: readonly WarmUpStep[];
2136
+ /** Dumbbells, machines and cables: 50 and 75 %. */
2137
+ declare const OTHER_WARM_UP_STEPS: readonly WarmUpStep[];
2138
+ /** Whether an exercise is loaded with a bar and plates. */
2139
+ declare const isBarLoaded: (equipmentRequired: readonly string[] | undefined) => boolean;
2140
+ /** Bars offered when no gym is saved, in the account's unit. */
2141
+ declare const BAR_CHOICES_KG: Record<WeightUnit, number[]>;
2142
+ type PlateSetChoice = 'STANDARD' | 'LIGHT';
2143
+ /** The two plate sets offered when none are saved, in the account's unit. */
2144
+ declare const PLATE_SETS: Record<WeightUnit, Record<PlateSetChoice, PlatePairInventory[]>>;
2145
+ /**
2146
+ * A set is "the closest you can load" when the plates fall this far short of
2147
+ * its target: the step a standard set of plates (1.25 kg pairs) always makes.
2148
+ */
2149
+ declare const LIMITED_SHORTFALL_KG = 2.5;
2150
+ /** What a warm-up load is made from. */
2151
+ interface WarmUpEquipment {
2152
+ barLoaded: boolean;
2153
+ barWeightKg: number;
2154
+ platePairs: readonly PlatePairInventory[];
2155
+ /** The exercise's own weight step, for anything not bar-loaded. */
2156
+ incrementKg: number;
2157
+ }
2158
+ /**
2159
+ * The equipment assumed when a member has no gym saved: a standard bar and
2160
+ * plate set in their unit. The builder asks instead; the server, which
2161
+ * cannot ask, uses this.
2162
+ */
2163
+ declare const defaultWarmUpEquipment: (unit: WeightUnit) => {
2164
+ barWeightKg: number;
2165
+ platePairs: PlatePairInventory[];
2166
+ };
2167
+ interface WarmUpLoad {
2168
+ weightKg: number;
2169
+ /** Bar-loaded only: what goes on each side. */
2170
+ platesPerSide?: PlateLoadingItem[];
2171
+ /** The plates fell short of the target by a standard small step or more. */
2172
+ limited: boolean;
2173
+ }
2174
+ /** One step's load: rounded down to what the bar and plates, or the step, make. */
2175
+ declare function warmUpLoad(share: number, workingWeightKg: number, equipment: WarmUpEquipment): WarmUpLoad;
2176
+ interface WarmUpSet extends WarmUpLoad {
2177
+ reps: number;
2178
+ /** The step's share of the working load, kept so the set can follow it. */
2179
+ share: number;
2180
+ }
2181
+ interface WarmUpRamp {
2182
+ sets: WarmUpSet[];
2183
+ /** Steps left out because the exercise had no room for them. */
2184
+ leftOut: number;
2185
+ }
2186
+ /**
2187
+ * The warm-up sets for a working load: each step rounded down to a load that
2188
+ * can be made, a step no heavier than the one before or reaching the working
2189
+ * load dropped, and the heaviest kept when there is no room for all of them.
2190
+ */
2191
+ declare function buildWarmUpRamp(input: WarmUpEquipment & {
2192
+ workingWeightKg: number;
2193
+ room: number;
2194
+ }): WarmUpRamp;
2195
+ type FollowingSet = {
2196
+ weight?: number | null;
2197
+ kind?: SetKind | null;
2198
+ warmUpShare?: number | null;
2199
+ };
2200
+ /** The load a following warm-up is a share of: the first working or optional set. */
2201
+ declare function leadWorkingWeight(sets: readonly FollowingSet[]): number | null;
2202
+ /**
2203
+ * LIVE-20: the sets with every warm-up that carries a share recalculated from
2204
+ * the exercise's first working set. Nothing else changes, a warm-up without a
2205
+ * share keeps its load, and without a working load the sets come back as they
2206
+ * were.
2207
+ */
2208
+ declare function followWorkingLoad<T extends FollowingSet>(sets: readonly T[], equipment: WarmUpEquipment): T[];
2209
+
2102
2210
  /**
2103
2211
  * INTEL-02: a lighter period proposed from the signals `PROG-10` states. The
2104
2212
  * suggestion acts on evidence only -- it names what was marked and when, never
@@ -3471,4 +3579,4 @@ interface AccountExportV1 {
3471
3579
  /** The file name a download of the export is saved under. */
3472
3580
  declare function accountExportFileName(username: string, exportedAt: string): string;
3473
3581
 
3474
- 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, 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, 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, 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, type ListSessionsParams, 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, 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, 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 PlatePairInventory, 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 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 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, countsAsWork, countsForProgression, deloadLengthDays, isSetKind, isWithinQuietHours, matchesDeletionConfirmation, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, trainingBlockCovers };
3582
+ 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, 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, 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 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, defaultWarmUpEquipment, deloadLengthDays, followWorkingLoad, isBarLoaded, isSetKind, isWithinQuietHours, leadWorkingWeight, matchesDeletionConfirmation, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, trainingBlockCovers, warmUpLoad };
package/dist/index.d.ts CHANGED
@@ -390,6 +390,12 @@ interface RoutineSet {
390
390
  rir?: number | null;
391
391
  /** LIVE-12; absent means a working set. */
392
392
  kind?: SetKind;
393
+ /**
394
+ * LIVE-20: a generated warm-up's share of the first working set (0 is the
395
+ * empty bar). With the exercise following its load, the warm-up's weight
396
+ * is recalculated from it.
397
+ */
398
+ warmUpShare?: number | null;
393
399
  }
394
400
  interface RoutineExercise {
395
401
  id: string;
@@ -398,6 +404,8 @@ interface RoutineExercise {
398
404
  note?: string | null;
399
405
  progressionScheme: ProgressionScheme;
400
406
  minWeightIncrement: number;
407
+ /** LIVE-20: warm-ups with a share follow the first working set. */
408
+ warmUpsFollowLoad?: boolean;
401
409
  exercise: {
402
410
  id: string;
403
411
  name: string;
@@ -413,6 +421,8 @@ interface CreateRoutineExerciseInput {
413
421
  note?: string;
414
422
  progressionScheme: ProgressionScheme;
415
423
  minWeightIncrement: number;
424
+ /** LIVE-20: warm-ups with a share follow the first working set. */
425
+ warmUpsFollowLoad?: boolean;
416
426
  sets: RoutineSet[];
417
427
  }
418
428
  interface RoutineDay {
@@ -541,6 +551,8 @@ interface RoutineVersionExercise {
541
551
  note: string | null;
542
552
  progressionScheme: ProgressionScheme;
543
553
  minWeightIncrement: number;
554
+ /** LIVE-20; absent in setups captured before it. */
555
+ warmUpsFollowLoad?: boolean;
544
556
  sets: RoutineSet[];
545
557
  }
546
558
  interface RoutineVersionDay {
@@ -2099,6 +2111,102 @@ interface PersonalGoalsResponse {
2099
2111
  goals: PersonalGoalProgress[];
2100
2112
  }
2101
2113
 
2114
+ interface PlateLoadingItem {
2115
+ weightKg: number;
2116
+ platesPerSide: number;
2117
+ }
2118
+ interface PlateLoadingResult {
2119
+ targetWeightKg: number;
2120
+ loadedWeightKg: number;
2121
+ differenceKg: number;
2122
+ status: 'exact' | 'short' | 'over';
2123
+ platesPerSide: PlateLoadingItem[];
2124
+ }
2125
+ declare const calculatePlateLoading: (targetWeightKg: number, barWeightKg: number, availablePlatePairs: PlatePairInventory[]) => PlateLoadingResult;
2126
+
2127
+ /** An exercise holds at most this many sets, warm-ups included. */
2128
+ declare const MAX_SETS_PER_EXERCISE = 10;
2129
+ interface WarmUpStep {
2130
+ /** Share of the working load; 0 is the empty bar. */
2131
+ share: number;
2132
+ reps: number;
2133
+ }
2134
+ /** Plate-loaded work: the empty bar, then 40, 60 and 80 %. */
2135
+ declare const BAR_WARM_UP_STEPS: readonly WarmUpStep[];
2136
+ /** Dumbbells, machines and cables: 50 and 75 %. */
2137
+ declare const OTHER_WARM_UP_STEPS: readonly WarmUpStep[];
2138
+ /** Whether an exercise is loaded with a bar and plates. */
2139
+ declare const isBarLoaded: (equipmentRequired: readonly string[] | undefined) => boolean;
2140
+ /** Bars offered when no gym is saved, in the account's unit. */
2141
+ declare const BAR_CHOICES_KG: Record<WeightUnit, number[]>;
2142
+ type PlateSetChoice = 'STANDARD' | 'LIGHT';
2143
+ /** The two plate sets offered when none are saved, in the account's unit. */
2144
+ declare const PLATE_SETS: Record<WeightUnit, Record<PlateSetChoice, PlatePairInventory[]>>;
2145
+ /**
2146
+ * A set is "the closest you can load" when the plates fall this far short of
2147
+ * its target: the step a standard set of plates (1.25 kg pairs) always makes.
2148
+ */
2149
+ declare const LIMITED_SHORTFALL_KG = 2.5;
2150
+ /** What a warm-up load is made from. */
2151
+ interface WarmUpEquipment {
2152
+ barLoaded: boolean;
2153
+ barWeightKg: number;
2154
+ platePairs: readonly PlatePairInventory[];
2155
+ /** The exercise's own weight step, for anything not bar-loaded. */
2156
+ incrementKg: number;
2157
+ }
2158
+ /**
2159
+ * The equipment assumed when a member has no gym saved: a standard bar and
2160
+ * plate set in their unit. The builder asks instead; the server, which
2161
+ * cannot ask, uses this.
2162
+ */
2163
+ declare const defaultWarmUpEquipment: (unit: WeightUnit) => {
2164
+ barWeightKg: number;
2165
+ platePairs: PlatePairInventory[];
2166
+ };
2167
+ interface WarmUpLoad {
2168
+ weightKg: number;
2169
+ /** Bar-loaded only: what goes on each side. */
2170
+ platesPerSide?: PlateLoadingItem[];
2171
+ /** The plates fell short of the target by a standard small step or more. */
2172
+ limited: boolean;
2173
+ }
2174
+ /** One step's load: rounded down to what the bar and plates, or the step, make. */
2175
+ declare function warmUpLoad(share: number, workingWeightKg: number, equipment: WarmUpEquipment): WarmUpLoad;
2176
+ interface WarmUpSet extends WarmUpLoad {
2177
+ reps: number;
2178
+ /** The step's share of the working load, kept so the set can follow it. */
2179
+ share: number;
2180
+ }
2181
+ interface WarmUpRamp {
2182
+ sets: WarmUpSet[];
2183
+ /** Steps left out because the exercise had no room for them. */
2184
+ leftOut: number;
2185
+ }
2186
+ /**
2187
+ * The warm-up sets for a working load: each step rounded down to a load that
2188
+ * can be made, a step no heavier than the one before or reaching the working
2189
+ * load dropped, and the heaviest kept when there is no room for all of them.
2190
+ */
2191
+ declare function buildWarmUpRamp(input: WarmUpEquipment & {
2192
+ workingWeightKg: number;
2193
+ room: number;
2194
+ }): WarmUpRamp;
2195
+ type FollowingSet = {
2196
+ weight?: number | null;
2197
+ kind?: SetKind | null;
2198
+ warmUpShare?: number | null;
2199
+ };
2200
+ /** The load a following warm-up is a share of: the first working or optional set. */
2201
+ declare function leadWorkingWeight(sets: readonly FollowingSet[]): number | null;
2202
+ /**
2203
+ * LIVE-20: the sets with every warm-up that carries a share recalculated from
2204
+ * the exercise's first working set. Nothing else changes, a warm-up without a
2205
+ * share keeps its load, and without a working load the sets come back as they
2206
+ * were.
2207
+ */
2208
+ declare function followWorkingLoad<T extends FollowingSet>(sets: readonly T[], equipment: WarmUpEquipment): T[];
2209
+
2102
2210
  /**
2103
2211
  * INTEL-02: a lighter period proposed from the signals `PROG-10` states. The
2104
2212
  * suggestion acts on evidence only -- it names what was marked and when, never
@@ -3471,4 +3579,4 @@ interface AccountExportV1 {
3471
3579
  /** The file name a download of the export is saved under. */
3472
3580
  declare function accountExportFileName(username: string, exportedAt: string): string;
3473
3581
 
3474
- 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, 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, 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, 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, type ListSessionsParams, 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, 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, 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 PlatePairInventory, 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 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 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, countsAsWork, countsForProgression, deloadLengthDays, isSetKind, isWithinQuietHours, matchesDeletionConfirmation, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, trainingBlockCovers };
3582
+ 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, 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, 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 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, defaultWarmUpEquipment, deloadLengthDays, followWorkingLoad, isBarLoaded, isSetKind, isWithinQuietHours, leadWorkingWeight, matchesDeletionConfirmation, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, routineDayLabel, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, trainingBlockCovers, warmUpLoad };
package/dist/index.js CHANGED
@@ -348,6 +348,257 @@ function requiredToFinish(kind) {
348
348
  return k === "WORKING" || k === "DROP";
349
349
  }
350
350
 
351
+ // src/plate-loading.ts
352
+ var CANONICAL_SCALE = 1e4;
353
+ var DENSE_CAPACITY_LIMIT = 2e5;
354
+ var toCanonicalUnits = (weightKg) => Math.round(weightKg * CANONICAL_SCALE);
355
+ var fromCanonicalUnits = (units) => units / CANONICAL_SCALE;
356
+ var greatestCommonDivisor = (left, right) => {
357
+ let a = Math.abs(left);
358
+ let b = Math.abs(right);
359
+ while (b > 0) {
360
+ const remainder = a % b;
361
+ a = b;
362
+ b = remainder;
363
+ }
364
+ return a;
365
+ };
366
+ var buildChunks = (plates, divisor) => {
367
+ const chunks = [];
368
+ plates.forEach((plate, plateIndex) => {
369
+ const pairValue = Math.round(
370
+ toCanonicalUnits(plate.weightKg) * 2 / divisor
371
+ );
372
+ let remaining = plate.pairCount;
373
+ let chunkSize = 1;
374
+ while (remaining > 0) {
375
+ const quantity = Math.min(chunkSize, remaining);
376
+ chunks.push({
377
+ plateIndex,
378
+ quantity,
379
+ value: pairValue * quantity
380
+ });
381
+ remaining -= quantity;
382
+ chunkSize *= 2;
383
+ }
384
+ });
385
+ return chunks;
386
+ };
387
+ var reconstructSelection = (best, chunks, previousSum, previousChunk, plateCount) => {
388
+ const selection = Array.from({ length: plateCount }, () => 0);
389
+ let current = best;
390
+ while (current > 0) {
391
+ const chunkIndex = previousChunk(current);
392
+ if (chunkIndex < 0) break;
393
+ const chunk = chunks[chunkIndex];
394
+ selection[chunk.plateIndex] += chunk.quantity;
395
+ current = previousSum(current);
396
+ }
397
+ return selection;
398
+ };
399
+ var solveDense = (capacity, chunks, plateCount) => {
400
+ const reachable = new Uint8Array(capacity + 1);
401
+ const previousSum = new Int32Array(capacity + 1);
402
+ const previousChunk = new Int16Array(capacity + 1);
403
+ previousSum.fill(-1);
404
+ previousChunk.fill(-1);
405
+ reachable[0] = 1;
406
+ chunks.forEach((chunk, chunkIndex) => {
407
+ for (let sum = capacity; sum >= chunk.value; sum -= 1) {
408
+ if (!reachable[sum] && reachable[sum - chunk.value]) {
409
+ reachable[sum] = 1;
410
+ previousSum[sum] = sum - chunk.value;
411
+ previousChunk[sum] = chunkIndex;
412
+ }
413
+ }
414
+ });
415
+ let best = capacity;
416
+ while (best > 0 && !reachable[best]) best -= 1;
417
+ return {
418
+ best,
419
+ selection: reconstructSelection(
420
+ best,
421
+ chunks,
422
+ (sum) => previousSum[sum],
423
+ (sum) => previousChunk[sum],
424
+ plateCount
425
+ )
426
+ };
427
+ };
428
+ var solveSparse = (capacity, chunks, plateCount) => {
429
+ const reachable = /* @__PURE__ */ new Map();
430
+ reachable.set(0, { previous: -1, chunkIndex: -1 });
431
+ chunks.forEach((chunk, chunkIndex) => {
432
+ const currentSums = Array.from(reachable.keys());
433
+ for (const sum of currentSums) {
434
+ const next = sum + chunk.value;
435
+ if (next <= capacity && !reachable.has(next)) {
436
+ reachable.set(next, { previous: sum, chunkIndex });
437
+ }
438
+ }
439
+ });
440
+ let best = 0;
441
+ for (const sum of reachable.keys()) {
442
+ if (sum > best) best = sum;
443
+ }
444
+ return {
445
+ best,
446
+ selection: reconstructSelection(
447
+ best,
448
+ chunks,
449
+ (sum) => reachable.get(sum)?.previous ?? -1,
450
+ (sum) => reachable.get(sum)?.chunkIndex ?? -1,
451
+ plateCount
452
+ )
453
+ };
454
+ };
455
+ var heaviestFirst = (target, pairValues, counts) => {
456
+ let remaining = target;
457
+ const selection = pairValues.map((value, index) => {
458
+ const take = Math.min(counts[index], Math.floor(remaining / value));
459
+ remaining -= take * value;
460
+ return take;
461
+ });
462
+ return remaining === 0 ? selection : null;
463
+ };
464
+ var plateTotal = (selection) => selection.reduce((total, count) => total + count, 0);
465
+ var calculatePlateLoading = (targetWeightKg, barWeightKg, availablePlatePairs) => {
466
+ const targetUnits = Math.max(0, toCanonicalUnits(targetWeightKg));
467
+ const barUnits = Math.max(0, toCanonicalUnits(barWeightKg));
468
+ if (targetUnits < barUnits) {
469
+ return {
470
+ targetWeightKg: fromCanonicalUnits(targetUnits),
471
+ loadedWeightKg: fromCanonicalUnits(barUnits),
472
+ differenceKg: fromCanonicalUnits(barUnits - targetUnits),
473
+ status: "over",
474
+ platesPerSide: []
475
+ };
476
+ }
477
+ const plates = availablePlatePairs.filter((plate) => plate.weightKg > 0 && plate.pairCount > 0).sort((left, right) => right.weightKg - left.weightKg);
478
+ const pairValues = plates.map((plate) => toCanonicalUnits(plate.weightKg) * 2);
479
+ const divisor = pairValues.reduce(greatestCommonDivisor, 0) || 1;
480
+ const residualUnits = targetUnits - barUnits;
481
+ const requestedCapacity = Math.floor(residualUnits / divisor);
482
+ const inventoryCapacity = pairValues.reduce(
483
+ (total, value, index) => total + value / divisor * plates[index].pairCount,
484
+ 0
485
+ );
486
+ const capacity = Math.min(requestedCapacity, inventoryCapacity);
487
+ const chunks = buildChunks(plates, divisor);
488
+ const solution = capacity <= DENSE_CAPACITY_LIMIT ? solveDense(capacity, chunks, plates.length) : solveSparse(capacity, chunks, plates.length);
489
+ const greedy = heaviestFirst(
490
+ solution.best,
491
+ pairValues.map((value) => value / divisor),
492
+ plates.map((plate) => plate.pairCount)
493
+ );
494
+ const selection = greedy && plateTotal(greedy) <= plateTotal(solution.selection) ? greedy : solution.selection;
495
+ const plateUnits = solution.best * divisor;
496
+ const loadedUnits = barUnits + plateUnits;
497
+ const differenceUnits = targetUnits - loadedUnits;
498
+ return {
499
+ targetWeightKg: fromCanonicalUnits(targetUnits),
500
+ loadedWeightKg: fromCanonicalUnits(loadedUnits),
501
+ differenceKg: fromCanonicalUnits(differenceUnits),
502
+ status: differenceUnits === 0 ? "exact" : "short",
503
+ platesPerSide: plates.flatMap(
504
+ (plate, index) => selection[index] > 0 ? [
505
+ {
506
+ weightKg: plate.weightKg,
507
+ platesPerSide: selection[index]
508
+ }
509
+ ] : []
510
+ )
511
+ };
512
+ };
513
+
514
+ // src/warm-ups.ts
515
+ var MAX_SETS_PER_EXERCISE = 10;
516
+ var BAR_WARM_UP_STEPS = [
517
+ { share: 0, reps: 10 },
518
+ { share: 0.4, reps: 5 },
519
+ { share: 0.6, reps: 3 },
520
+ { share: 0.8, reps: 2 }
521
+ ];
522
+ var OTHER_WARM_UP_STEPS = [
523
+ { share: 0.5, reps: 8 },
524
+ { share: 0.75, reps: 3 }
525
+ ];
526
+ var BAR_LOADED = /* @__PURE__ */ new Set(["barbell", "ez-bar", "smith-machine"]);
527
+ var isBarLoaded = (equipmentRequired) => (equipmentRequired ?? []).some((item) => BAR_LOADED.has(item));
528
+ var POUNDS_PER_KILOGRAM = 2.2046226218;
529
+ var lb = (pounds) => pounds / POUNDS_PER_KILOGRAM;
530
+ var BAR_CHOICES_KG = {
531
+ KG: [20, 15, 10],
532
+ LB: [lb(45), lb(35), lb(15)]
533
+ };
534
+ var pairs = (weights, heaviestPairs) => weights.map((weightKg, index) => ({
535
+ weightKg,
536
+ pairCount: index === 0 ? heaviestPairs : 2
537
+ }));
538
+ var PLATE_SETS = {
539
+ KG: {
540
+ STANDARD: pairs([25, 20, 15, 10, 5, 2.5, 1.25], 4),
541
+ LIGHT: pairs([20, 15, 10, 5, 2.5, 1.25], 2)
542
+ },
543
+ LB: {
544
+ STANDARD: pairs([45, 35, 25, 10, 5, 2.5].map(lb), 4),
545
+ LIGHT: pairs([25, 10, 5, 2.5].map(lb), 2)
546
+ }
547
+ };
548
+ var LIMITED_SHORTFALL_KG = 2.5;
549
+ var defaultWarmUpEquipment = (unit) => ({
550
+ barWeightKg: BAR_CHOICES_KG[unit][0],
551
+ platePairs: PLATE_SETS[unit].STANDARD
552
+ });
553
+ var round = (value) => Math.round(value * 1e4) / 1e4;
554
+ function warmUpLoad(share, workingWeightKg, equipment) {
555
+ const target = share * workingWeightKg;
556
+ if (equipment.barLoaded) {
557
+ const loading = calculatePlateLoading(
558
+ Math.max(target, equipment.barWeightKg),
559
+ equipment.barWeightKg,
560
+ [...equipment.platePairs]
561
+ );
562
+ return {
563
+ weightKg: round(loading.loadedWeightKg),
564
+ platesPerSide: loading.platesPerSide,
565
+ limited: share > 0 && loading.status === "short" && loading.differenceKg >= LIMITED_SHORTFALL_KG - 1e-9
566
+ };
567
+ }
568
+ const increment = equipment.incrementKg > 0 ? equipment.incrementKg : 2.5;
569
+ return {
570
+ weightKg: round(Math.floor(target / increment + 1e-9) * increment),
571
+ limited: false
572
+ };
573
+ }
574
+ function buildWarmUpRamp(input) {
575
+ const work = input.workingWeightKg;
576
+ if (!(work > 0)) return { sets: [], leftOut: 0 };
577
+ const steps = input.barLoaded ? BAR_WARM_UP_STEPS : OTHER_WARM_UP_STEPS;
578
+ const sets = [];
579
+ for (const step of steps) {
580
+ const load = warmUpLoad(step.share, work, input);
581
+ const previous = sets[sets.length - 1];
582
+ if (load.weightKg <= 0 || load.weightKg >= work - 1e-9) continue;
583
+ if (previous && load.weightKg <= previous.weightKg + 1e-9) continue;
584
+ sets.push({ ...load, reps: step.reps, share: step.share });
585
+ }
586
+ const room = Math.max(0, input.room);
587
+ const kept = sets.slice(Math.max(0, sets.length - room));
588
+ return { sets: kept, leftOut: sets.length - kept.length };
589
+ }
590
+ function leadWorkingWeight(sets) {
591
+ const lead = sets.find((set) => countsForProgression(set.kind));
592
+ return typeof lead?.weight === "number" && lead.weight > 0 ? lead.weight : null;
593
+ }
594
+ function followWorkingLoad(sets, equipment) {
595
+ const work = leadWorkingWeight(sets);
596
+ if (work === null) return [...sets];
597
+ return sets.map(
598
+ (set) => set.kind === "WARMUP" && typeof set.warmUpShare === "number" ? { ...set, weight: warmUpLoad(set.warmUpShare, work, equipment).weightKg } : set
599
+ );
600
+ }
601
+
351
602
  // src/routine.ts
352
603
  var ROUTINE_SCHEDULE_MODES = ["WEEKLY", "ROTATION"];
353
604
  var ROUTINE_DAYS_MAX = 7;
@@ -772,6 +1023,8 @@ export {
772
1023
  ACTIVITY_REACTIONS,
773
1024
  ACTIVITY_TYPES,
774
1025
  ACTIVITY_TYPE_SECTIONS,
1026
+ BAR_CHOICES_KG,
1027
+ BAR_WARM_UP_STEPS,
775
1028
  BLOCKED_MEMBERS_MAX,
776
1029
  CLONE_ROUTINE_REFUSALS,
777
1030
  COMEBACK_MIN_INACTIVE_DAYS,
@@ -799,6 +1052,8 @@ export {
799
1052
  FOLLOW_SUGGESTIONS_DEFAULT_LIMIT,
800
1053
  FOLLOW_SUGGESTIONS_MAX_LIMIT,
801
1054
  FOLLOW_SUGGESTION_REASONS,
1055
+ LIMITED_SHORTFALL_KG,
1056
+ MAX_SETS_PER_EXERCISE,
802
1057
  MEASURABLE_GOALS_MAX,
803
1058
  MEASURABLE_GOAL_DIRECTIONS,
804
1059
  MEASURABLE_GOAL_TYPES,
@@ -814,12 +1069,14 @@ export {
814
1069
  NOTIFICATIONS_RETENTION_DAYS,
815
1070
  NOTIFICATION_CATEGORIES,
816
1071
  NOTIFICATION_KINDS,
1072
+ OTHER_WARM_UP_STEPS,
817
1073
  PLATEAU_MIN_DAYS_SINCE_BEST,
818
1074
  PLATEAU_MIN_SESSIONS,
819
1075
  PLATEAU_MIN_SESSIONS_MAX,
820
1076
  PLATEAU_MIN_SESSIONS_MIN,
821
1077
  PLATEAU_RECENT_DAYS,
822
1078
  PLATEAU_WINDOW_DAYS,
1079
+ PLATE_SETS,
823
1080
  PREFERRED_TRAINING_STYLE_VALUES,
824
1081
  PROFILE_BIO_MAX_LENGTH,
825
1082
  PROFILE_FAVORITE_EXERCISES_MAX,
@@ -912,11 +1169,17 @@ export {
912
1169
  WORKOUT_SESSION_STATUSES,
913
1170
  accountExportFileName,
914
1171
  applyDeload,
1172
+ buildWarmUpRamp,
1173
+ calculatePlateLoading,
915
1174
  countsAsWork,
916
1175
  countsForProgression,
1176
+ defaultWarmUpEquipment,
917
1177
  deloadLengthDays,
1178
+ followWorkingLoad,
1179
+ isBarLoaded,
918
1180
  isSetKind,
919
1181
  isWithinQuietHours,
1182
+ leadWorkingWeight,
920
1183
  matchesDeletionConfirmation,
921
1184
  requiredToFinish,
922
1185
  resolveActiveTrainingBlock,
@@ -925,5 +1188,6 @@ export {
925
1188
  sessionCorrectionWindow,
926
1189
  setKindOf,
927
1190
  setLogValuesDiffer,
928
- trainingBlockCovers
1191
+ trainingBlockCovers,
1192
+ warmUpLoad
929
1193
  };
package/package.json CHANGED
@@ -1,40 +1,40 @@
1
- {
2
- "name": "@sunsteel/contracts",
3
- "version": "0.70.0",
4
- "repository": {
5
- "type": "git",
6
- "url": "git+https://github.com/ezee969/sunsteel-contracts.git"
7
- },
8
- "private": false,
9
- "engines": {
10
- "node": ">=20.11"
11
- },
12
- "type": "module",
13
- "sideEffects": false,
14
- "main": "./dist/index.cjs",
15
- "module": "./dist/index.js",
16
- "types": "./dist/index.d.ts",
17
- "exports": {
18
- ".": {
19
- "types": "./dist/index.d.ts",
20
- "import": "./dist/index.js",
21
- "require": "./dist/index.cjs"
22
- }
23
- },
24
- "files": [
25
- "dist"
26
- ],
27
- "scripts": {
28
- "build": "tsup src/index.ts --format esm,cjs --dts --clean",
29
- "dev": "tsup src/index.ts --format esm,cjs --dts --watch",
30
- "typecheck": "tsc --noEmit",
31
- "lint": "npm run typecheck",
32
- "verify": "npm run typecheck && npm run build",
33
- "verify:security": "npm audit",
34
- "prepublishOnly": "npm run build"
35
- },
36
- "devDependencies": {
37
- "tsup": "^8.3.5",
38
- "typescript": "^5.7.3"
39
- }
40
- }
1
+ {
2
+ "name": "@sunsteel/contracts",
3
+ "version": "0.71.0",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/ezee969/sunsteel-contracts.git"
7
+ },
8
+ "private": false,
9
+ "engines": {
10
+ "node": ">=20.11"
11
+ },
12
+ "type": "module",
13
+ "sideEffects": false,
14
+ "main": "./dist/index.cjs",
15
+ "module": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "require": "./dist/index.cjs"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsup src/index.ts --format esm,cjs --dts --clean",
29
+ "dev": "tsup src/index.ts --format esm,cjs --dts --watch",
30
+ "typecheck": "tsc --noEmit",
31
+ "lint": "npm run typecheck",
32
+ "verify": "npm run typecheck && npm run build",
33
+ "verify:security": "npm audit",
34
+ "prepublishOnly": "npm run build"
35
+ },
36
+ "devDependencies": {
37
+ "tsup": "^8.3.5",
38
+ "typescript": "^5.7.3"
39
+ }
40
+ }