@aneuhold/core-ts-db-lib 4.1.15 → 5.0.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.
Files changed (26) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/lib/ctos/workout/WorkoutExerciseCTO.d.ts +2 -2
  3. package/lib/ctos/workout/WorkoutExerciseCTO.d.ts.map +1 -1
  4. package/lib/ctos/workout/WorkoutExerciseCTO.js +5 -6
  5. package/lib/ctos/workout/WorkoutExerciseCTO.js.map +1 -1
  6. package/lib/ctos/workout/WorkoutExerciseCTO.ts +5 -6
  7. package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts +14 -8
  8. package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts.map +1 -1
  9. package/lib/services/workout/Exercise/WorkoutExerciseService.js +38 -15
  10. package/lib/services/workout/Exercise/WorkoutExerciseService.js.map +1 -1
  11. package/lib/services/workout/Exercise/WorkoutExerciseService.ts +45 -22
  12. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts.map +1 -1
  13. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js +6 -8
  14. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js.map +1 -1
  15. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.ts +7 -17
  16. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts +13 -8
  17. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts.map +1 -1
  18. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js +30 -9
  19. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js.map +1 -1
  20. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.ts +42 -14
  21. package/lib/services/workout/Set/WorkoutSetService.d.ts +4 -3
  22. package/lib/services/workout/Set/WorkoutSetService.d.ts.map +1 -1
  23. package/lib/services/workout/Set/WorkoutSetService.js +24 -18
  24. package/lib/services/workout/Set/WorkoutSetService.js.map +1 -1
  25. package/lib/services/workout/Set/WorkoutSetService.ts +25 -19
  26. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## 🔖 [5.0.0] (2026-03-13)
9
+
10
+ ### 🏗️ Changed
11
+
12
+ - _Breaking Change:_ `WorkoutExerciseCTO.lastFirstSet` (nullable `WorkoutSet`) replaced by `lastSessionSets` (array of `WorkoutSet`).
13
+ - _Breaking Change:_ `WorkoutExerciseService.calculateTargetRepsAndWeightForFirstSet` parameter `previousFirstSet?: WorkoutSet` replaced by `previousSets: WorkoutSet[]`.
14
+ - Autoregulation now averages surplus across all sets in a session exercise instead of using only the first set, providing a more representative performance signal.
15
+ - `WorkoutSessionExerciseService.calculateSetSurplus` is now private; the new public `calculateAverageSurplus(sets)` method handles multi-set aggregation.
16
+ - `WorkoutMesocycleService` performance-drop detection now averages surplus across all sets rather than using only the first set.
17
+ - `WorkoutSetService` now retrieves all sets from the previous microcycle for autoregulation instead of only the first set.
18
+ - Rep progression severe underperformance (average surplus < -3) now also reduces weight by one equipment increment.
19
+
8
20
  ## 🔖 [4.1.15] (2026-03-12)
9
21
 
10
22
  ### 🏗️ Changed
@@ -384,7 +396,7 @@ Updated dependency: now requires `@aneuhold/core-ts-lib@^2.3.11`.
384
396
  - Updated workflow permissions to allow repository write access
385
397
 
386
398
  <!-- Link References -->
387
-
399
+ [5.0.0]: https://github.com/aneuhold/ts-libs/compare/core-ts-db-lib-v4.1.15...core-ts-db-lib-v5.0.0
388
400
  [4.1.15]: https://github.com/aneuhold/ts-libs/compare/core-ts-db-lib-v4.1.14...core-ts-db-lib-v4.1.15
389
401
  [4.1.14]: https://github.com/aneuhold/ts-libs/compare/core-ts-db-lib-v4.1.13...core-ts-db-lib-v4.1.14
390
402
  [4.1.13]: https://github.com/aneuhold/ts-libs/compare/core-ts-db-lib-v4.1.12...core-ts-db-lib-v4.1.13
@@ -71,7 +71,7 @@ export declare const WorkoutExerciseCTOSchema: z.ZodObject<{
71
71
  _id: z.ZodPipe<z.ZodDefault<z.ZodUUID>, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
72
72
  userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
73
73
  }, z.core.$strip>>;
74
- lastFirstSet: z.ZodNullable<z.ZodObject<{
74
+ lastSessionSets: z.ZodDefault<z.ZodArray<z.ZodObject<{
75
75
  docType: z.ZodDefault<z.ZodLiteral<"workoutSet">>;
76
76
  workoutExerciseId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
77
77
  workoutSessionId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
@@ -87,7 +87,7 @@ export declare const WorkoutExerciseCTOSchema: z.ZodObject<{
87
87
  lastUpdatedDate: z.ZodDefault<z.ZodDate>;
88
88
  _id: z.ZodPipe<z.ZodDefault<z.ZodUUID>, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
89
89
  userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
90
- }, z.core.$strip>>;
90
+ }, z.core.$strip>>>;
91
91
  docType: z.ZodDefault<z.ZodLiteral<"workoutExercise">>;
92
92
  exerciseName: z.ZodString;
93
93
  workoutEquipmentTypeId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutExerciseCTO.d.ts","sourceRoot":"","sources":["../../../src/ctos/workout/WorkoutExerciseCTO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+CnC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"WorkoutExerciseCTO.d.ts","sourceRoot":"","sources":["../../../src/ctos/workout/WorkoutExerciseCTO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8CnC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -46,13 +46,12 @@ export const WorkoutExerciseCTOSchema = z.object({
46
46
  */
47
47
  lastSessionExercise: WorkoutSessionExerciseSchema.nullable(),
48
48
  /**
49
- * The first WorkoutSet from the lastSessionExercise's setOrder.
50
- * This is the "anchor" set that progression calculations use since
51
- * subsequent sets are derived from the first via intra-session fatigue
52
- * drops.
49
+ * All WorkoutSets from the lastSessionExercise's setOrder. Surplus is
50
+ * averaged across all sets for a holistic performance signal during
51
+ * autoregulation (the first set alone can mask poor later-set performance).
53
52
  *
54
- * Null if no previous accumulation performance exists.
53
+ * Empty array if no previous accumulation performance exists.
55
54
  */
56
- lastFirstSet: WorkoutSetSchema.nullable()
55
+ lastSessionSets: z.array(WorkoutSetSchema).default([])
57
56
  });
58
57
  //# sourceMappingURL=WorkoutExerciseCTO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutExerciseCTO.js","sourceRoot":"","sources":["../../../src/ctos/workout/WorkoutExerciseCTO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAAE,4BAA4B,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,GAAG,qBAAqB,CAAC,KAAK;IAE9B;;;OAGG;IACH,aAAa,EAAE,0BAA0B;IAEzC;;;;OAIG;IACH,eAAe,EAAE,gCAAgC,CAAC,QAAQ,EAAE;IAE5D;;;;;;;OAOG;IACH,OAAO,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IAEpC;;;;;;;;;OASG;IACH,mBAAmB,EAAE,4BAA4B,CAAC,QAAQ,EAAE;IAE5D;;;;;;;OAOG;IACH,YAAY,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC"}
1
+ {"version":3,"file":"WorkoutExerciseCTO.js","sourceRoot":"","sources":["../../../src/ctos/workout/WorkoutExerciseCTO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAAE,4BAA4B,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,GAAG,qBAAqB,CAAC,KAAK;IAE9B;;;OAGG;IACH,aAAa,EAAE,0BAA0B;IAEzC;;;;OAIG;IACH,eAAe,EAAE,gCAAgC,CAAC,QAAQ,EAAE;IAE5D;;;;;;;OAOG;IACH,OAAO,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IAEpC;;;;;;;;;OASG;IACH,mBAAmB,EAAE,4BAA4B,CAAC,QAAQ,EAAE;IAE5D;;;;;;OAMG;IACH,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC,CAAC"}
@@ -52,14 +52,13 @@ export const WorkoutExerciseCTOSchema = z.object({
52
52
  lastSessionExercise: WorkoutSessionExerciseSchema.nullable(),
53
53
 
54
54
  /**
55
- * The first WorkoutSet from the lastSessionExercise's setOrder.
56
- * This is the "anchor" set that progression calculations use since
57
- * subsequent sets are derived from the first via intra-session fatigue
58
- * drops.
55
+ * All WorkoutSets from the lastSessionExercise's setOrder. Surplus is
56
+ * averaged across all sets for a holistic performance signal during
57
+ * autoregulation (the first set alone can mask poor later-set performance).
59
58
  *
60
- * Null if no previous accumulation performance exists.
59
+ * Empty array if no previous accumulation performance exists.
61
60
  */
62
- lastFirstSet: WorkoutSetSchema.nullable()
61
+ lastSessionSets: z.array(WorkoutSetSchema).default([])
63
62
  });
64
63
 
65
64
  /**
@@ -29,11 +29,12 @@ export default class WorkoutExerciseService {
29
29
  /**
30
30
  * Calculates the target weight and reps for the FIRST set of an exercise.
31
31
  *
32
- * When a `previousFirstSet` is provided (completed or planned-only), autoregulation
33
- * computes a surplus and applies progression. Planned-only sets are forecasted with
34
- * surplus = 0 so the plan progresses smoothly without falling back to calibration.
32
+ * When `previousSets` are provided (completed or planned-only), autoregulation
33
+ * computes an average surplus across all sets and applies progression. Planned-only
34
+ * sets are forecasted with surplus = 0 so the plan progresses smoothly without
35
+ * falling back to calibration.
35
36
  *
36
- * When no previous set exists (first mesocycle or new exercise), the calibration-based
37
+ * When no previous sets exist (first mesocycle or new exercise), the calibration-based
37
38
  * formula computes initial targets from the exercise's 1RM and rep range.
38
39
  */
39
40
  static calculateTargetRepsAndWeightForFirstSet(params: {
@@ -41,24 +42,29 @@ export default class WorkoutExerciseService {
41
42
  calibration: WorkoutExerciseCalibration;
42
43
  equipment: WorkoutEquipmentType;
43
44
  firstMicrocycleRir: number;
44
- previousFirstSet?: WorkoutSet;
45
+ previousSets: WorkoutSet[];
45
46
  }): {
46
47
  targetWeight: number;
47
48
  targetReps: number;
48
49
  };
49
50
  /**
50
- * Calculates targets using auto-regulation based on actual performance from a previous set.
51
+ * Calculates targets using auto-regulation based on actual performance from previous sets.
52
+ * Surplus is averaged across all sets for a more representative performance signal.
53
+ * Previously only the first set's surplus was used, which masked poor performance
54
+ * on later sets (e.g., first set hits target but second set falls far short).
51
55
  */
52
56
  private static calculateAutoRegulatedTargets;
53
57
  /**
54
- * Auto-regulated rep progression. Weight stays the same, reps adjust based on surplus.
58
+ * Auto-regulated rep progression. Attempts to increase reps until hitting rep range max,
59
+ * then resets reps and increases weight.
55
60
  *
56
61
  * | Surplus | Action |
57
62
  * |---:|---|
58
63
  * | >= 3 | Accelerate: actualReps + 2 (progress from actual, not planned) |
59
64
  * | 0 to 2 | Normal: plannedReps + 2 |
60
65
  * | -1 to -2 | Hold: plannedReps (don't add reps) |
61
- * | <= -3 | Regress: actualReps (use actual as new baseline) |
66
+ * | -3 | Regress: actualReps (use actual as new baseline) |
67
+ * | < -3 | Severe regress: actualReps + reduce weight (weight is too heavy for rep range) |
62
68
  */
63
69
  private static calculateAutoRegulatedRepTargets;
64
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutExerciseService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Exercise/WorkoutExerciseService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAEL,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0DAA0D,CAAC;AAC3G,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAMhG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAWlF;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAIzD;;;;;;;;;OASG;IACH,MAAM,CAAC,uCAAuC,CAAC,MAAM,EAAE;QACrD,QAAQ,EAAE,eAAe,CAAC;QAC1B,WAAW,EAAE,0BAA0B,CAAC;QACxC,SAAS,EAAE,oBAAoB,CAAC;QAChC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,gBAAgB,CAAC,EAAE,UAAU,CAAC;KAC/B,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAuChD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAsB5C;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;IA4C/C;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,iCAAiC;IA2ChD;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAmB7B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;IA2C/C,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAgBxC"}
1
+ {"version":3,"file":"WorkoutExerciseService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Exercise/WorkoutExerciseService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAEL,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0DAA0D,CAAC;AAC3G,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAMhG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAWlF;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAIzD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,uCAAuC,CAAC,MAAM,EAAE;QACrD,QAAQ,EAAE,eAAe,CAAC;QAC1B,WAAW,EAAE,0BAA0B,CAAC;QACxC,SAAS,EAAE,oBAAoB,CAAC;QAChC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;KAC5B,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IA0ChD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAuB5C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;IAyD/C;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,iCAAiC;IA2ChD;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAmB7B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;IA2C/C,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAgBxC"}
@@ -37,15 +37,16 @@ export default class WorkoutExerciseService {
37
37
  /**
38
38
  * Calculates the target weight and reps for the FIRST set of an exercise.
39
39
  *
40
- * When a `previousFirstSet` is provided (completed or planned-only), autoregulation
41
- * computes a surplus and applies progression. Planned-only sets are forecasted with
42
- * surplus = 0 so the plan progresses smoothly without falling back to calibration.
40
+ * When `previousSets` are provided (completed or planned-only), autoregulation
41
+ * computes an average surplus across all sets and applies progression. Planned-only
42
+ * sets are forecasted with surplus = 0 so the plan progresses smoothly without
43
+ * falling back to calibration.
43
44
  *
44
- * When no previous set exists (first mesocycle or new exercise), the calibration-based
45
+ * When no previous sets exist (first mesocycle or new exercise), the calibration-based
45
46
  * formula computes initial targets from the exercise's 1RM and rep range.
46
47
  */
47
48
  static calculateTargetRepsAndWeightForFirstSet(params) {
48
- const { exercise, calibration, equipment, firstMicrocycleRir, previousFirstSet } = params;
49
+ const { exercise, calibration, equipment, firstMicrocycleRir, previousSets } = params;
49
50
  // Validate equipment has weight options
50
51
  if (!equipment.weightOptions || equipment.weightOptions.length === 0) {
51
52
  throw new Error(`No weight options defined for equipment type ${equipment._id}, ${equipment.title}`);
@@ -53,16 +54,18 @@ export default class WorkoutExerciseService {
53
54
  // Get rep range for this exercise
54
55
  const repRange = this.getRepRangeValues(exercise.repRange);
55
56
  const repRangeMidpoint = Math.floor((repRange.min + repRange.max) / 2);
56
- // When a previous set is available, use autoregulation for progression.
57
+ // Convert all previous sets to completed sets (forecasting planned → actual if needed).
57
58
  // toCompletedSet returns the real data when actual performance exists, or
58
59
  // forecasts by copying planned values into actuals (surplus = 0) so the
59
60
  // plan progresses smoothly from the planned baseline.
60
- const completedPreviousSet = this.toCompletedSet(previousFirstSet);
61
- if (completedPreviousSet) {
61
+ const completedSets = previousSets
62
+ .map((set) => this.toCompletedSet(set))
63
+ .filter((set) => set !== null);
64
+ if (completedSets.length > 0) {
62
65
  return this.calculateAutoRegulatedTargets({
63
66
  exercise,
64
67
  equipment,
65
- previousFirstSet: completedPreviousSet,
68
+ previousSets: completedSets,
66
69
  repRange
67
70
  });
68
71
  }
@@ -77,25 +80,35 @@ export default class WorkoutExerciseService {
77
80
  });
78
81
  }
79
82
  /**
80
- * Calculates targets using auto-regulation based on actual performance from a previous set.
83
+ * Calculates targets using auto-regulation based on actual performance from previous sets.
84
+ * Surplus is averaged across all sets for a more representative performance signal.
85
+ * Previously only the first set's surplus was used, which masked poor performance
86
+ * on later sets (e.g., first set hits target but second set falls far short).
81
87
  */
82
88
  static calculateAutoRegulatedTargets(params) {
83
- const { exercise, equipment, previousFirstSet, repRange } = params;
84
- const surplus = WorkoutSessionExerciseService.calculateSetSurplus(previousFirstSet.actualReps, previousFirstSet.plannedReps, previousFirstSet.rir, previousFirstSet.plannedRir);
89
+ const { exercise, equipment, previousSets, repRange } = params;
90
+ // The first set is the reference for rep/weight targets (subsequent sets are
91
+ // derived from the first via intra-session fatigue drops).
92
+ const previousFirstSet = previousSets[0];
93
+ // Average surplus across all sets for a holistic performance signal.
94
+ // previousSets are CompletedWorkoutSets (all fields non-null), so this always returns a number.
95
+ const surplus = WorkoutSessionExerciseService.calculateAverageSurplus(previousSets) ?? 0;
85
96
  if (exercise.preferredProgressionType === ExerciseProgressionType.Rep) {
86
97
  return this.calculateAutoRegulatedRepTargets(previousFirstSet, surplus, repRange, equipment);
87
98
  }
88
99
  return this.calculateAutoRegulatedLoadTargets(previousFirstSet, surplus, repRange, equipment);
89
100
  }
90
101
  /**
91
- * Auto-regulated rep progression. Weight stays the same, reps adjust based on surplus.
102
+ * Auto-regulated rep progression. Attempts to increase reps until hitting rep range max,
103
+ * then resets reps and increases weight.
92
104
  *
93
105
  * | Surplus | Action |
94
106
  * |---:|---|
95
107
  * | >= 3 | Accelerate: actualReps + 2 (progress from actual, not planned) |
96
108
  * | 0 to 2 | Normal: plannedReps + 2 |
97
109
  * | -1 to -2 | Hold: plannedReps (don't add reps) |
98
- * | <= -3 | Regress: actualReps (use actual as new baseline) |
110
+ * | -3 | Regress: actualReps (use actual as new baseline) |
111
+ * | < -3 | Severe regress: actualReps + reduce weight (weight is too heavy for rep range) |
99
112
  */
100
113
  static calculateAutoRegulatedRepTargets(previousSet, surplus, repRange, equipment) {
101
114
  let targetReps;
@@ -109,14 +122,24 @@ export default class WorkoutExerciseService {
109
122
  else if (surplus >= -2) {
110
123
  targetReps = previousSet.plannedReps;
111
124
  }
125
+ else if (surplus >= -3) {
126
+ targetReps = previousSet.actualReps;
127
+ }
112
128
  else {
129
+ // Severe underperformance: the weight is too heavy for this rep range.
130
+ // Reduce weight by one equipment increment so the user can actually
131
+ // train in the target rep range.
113
132
  targetReps = previousSet.actualReps;
133
+ const reducedWeight = WorkoutEquipmentTypeService.findNearestWeight(equipment, targetWeight - 0.01, 'down');
134
+ if (reducedWeight !== null) {
135
+ targetWeight = reducedWeight;
136
+ }
114
137
  }
115
138
  // Clamp to rep range floor (never target below min, even if actual was 0)
116
139
  targetReps = Math.max(targetReps, repRange.min);
117
140
  // Handle rep range ceiling: if target exceeds max, reset and bump weight
118
141
  if (targetReps > repRange.max) {
119
- targetReps = repRange.max;
142
+ targetReps = Math.floor((repRange.min + repRange.max) / 2);
120
143
  const nextWeight = this.findNextTwoPercentWeight(targetWeight, equipment);
121
144
  if (nextWeight !== null) {
122
145
  targetWeight = nextWeight;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutExerciseService.js","sourceRoot":"","sources":["../../../../src/services/workout/Exercise/WorkoutExerciseService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkoutExerciseService.js","sourceRoot":"","sources":["../../../../src/services/workout/Exercise/WorkoutExerciseService.ts"],"names":[],"mappings":"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"}
@@ -47,11 +47,12 @@ export default class WorkoutExerciseService {
47
47
  /**
48
48
  * Calculates the target weight and reps for the FIRST set of an exercise.
49
49
  *
50
- * When a `previousFirstSet` is provided (completed or planned-only), autoregulation
51
- * computes a surplus and applies progression. Planned-only sets are forecasted with
52
- * surplus = 0 so the plan progresses smoothly without falling back to calibration.
50
+ * When `previousSets` are provided (completed or planned-only), autoregulation
51
+ * computes an average surplus across all sets and applies progression. Planned-only
52
+ * sets are forecasted with surplus = 0 so the plan progresses smoothly without
53
+ * falling back to calibration.
53
54
  *
54
- * When no previous set exists (first mesocycle or new exercise), the calibration-based
55
+ * When no previous sets exist (first mesocycle or new exercise), the calibration-based
55
56
  * formula computes initial targets from the exercise's 1RM and rep range.
56
57
  */
57
58
  static calculateTargetRepsAndWeightForFirstSet(params: {
@@ -59,9 +60,9 @@ export default class WorkoutExerciseService {
59
60
  calibration: WorkoutExerciseCalibration;
60
61
  equipment: WorkoutEquipmentType;
61
62
  firstMicrocycleRir: number;
62
- previousFirstSet?: WorkoutSet;
63
+ previousSets: WorkoutSet[];
63
64
  }): { targetWeight: number; targetReps: number } {
64
- const { exercise, calibration, equipment, firstMicrocycleRir, previousFirstSet } = params;
65
+ const { exercise, calibration, equipment, firstMicrocycleRir, previousSets } = params;
65
66
 
66
67
  // Validate equipment has weight options
67
68
  if (!equipment.weightOptions || equipment.weightOptions.length === 0) {
@@ -74,16 +75,19 @@ export default class WorkoutExerciseService {
74
75
  const repRange = this.getRepRangeValues(exercise.repRange);
75
76
  const repRangeMidpoint = Math.floor((repRange.min + repRange.max) / 2);
76
77
 
77
- // When a previous set is available, use autoregulation for progression.
78
+ // Convert all previous sets to completed sets (forecasting planned → actual if needed).
78
79
  // toCompletedSet returns the real data when actual performance exists, or
79
80
  // forecasts by copying planned values into actuals (surplus = 0) so the
80
81
  // plan progresses smoothly from the planned baseline.
81
- const completedPreviousSet = this.toCompletedSet(previousFirstSet);
82
- if (completedPreviousSet) {
82
+ const completedSets = previousSets
83
+ .map((set) => this.toCompletedSet(set))
84
+ .filter((set): set is CompletedWorkoutSet => set !== null);
85
+
86
+ if (completedSets.length > 0) {
83
87
  return this.calculateAutoRegulatedTargets({
84
88
  exercise,
85
89
  equipment,
86
- previousFirstSet: completedPreviousSet,
90
+ previousSets: completedSets,
87
91
  repRange
88
92
  });
89
93
  }
@@ -100,22 +104,26 @@ export default class WorkoutExerciseService {
100
104
  }
101
105
 
102
106
  /**
103
- * Calculates targets using auto-regulation based on actual performance from a previous set.
107
+ * Calculates targets using auto-regulation based on actual performance from previous sets.
108
+ * Surplus is averaged across all sets for a more representative performance signal.
109
+ * Previously only the first set's surplus was used, which masked poor performance
110
+ * on later sets (e.g., first set hits target but second set falls far short).
104
111
  */
105
112
  private static calculateAutoRegulatedTargets(params: {
106
113
  exercise: WorkoutExercise;
107
114
  equipment: WorkoutEquipmentType;
108
- previousFirstSet: CompletedWorkoutSet;
115
+ previousSets: CompletedWorkoutSet[];
109
116
  repRange: { min: number; max: number };
110
117
  }): { targetWeight: number; targetReps: number } {
111
- const { exercise, equipment, previousFirstSet, repRange } = params;
118
+ const { exercise, equipment, previousSets, repRange } = params;
112
119
 
113
- const surplus = WorkoutSessionExerciseService.calculateSetSurplus(
114
- previousFirstSet.actualReps,
115
- previousFirstSet.plannedReps,
116
- previousFirstSet.rir,
117
- previousFirstSet.plannedRir
118
- );
120
+ // The first set is the reference for rep/weight targets (subsequent sets are
121
+ // derived from the first via intra-session fatigue drops).
122
+ const previousFirstSet = previousSets[0];
123
+
124
+ // Average surplus across all sets for a holistic performance signal.
125
+ // previousSets are CompletedWorkoutSets (all fields non-null), so this always returns a number.
126
+ const surplus = WorkoutSessionExerciseService.calculateAverageSurplus(previousSets) ?? 0;
119
127
 
120
128
  if (exercise.preferredProgressionType === ExerciseProgressionType.Rep) {
121
129
  return this.calculateAutoRegulatedRepTargets(previousFirstSet, surplus, repRange, equipment);
@@ -125,14 +133,16 @@ export default class WorkoutExerciseService {
125
133
  }
126
134
 
127
135
  /**
128
- * Auto-regulated rep progression. Weight stays the same, reps adjust based on surplus.
136
+ * Auto-regulated rep progression. Attempts to increase reps until hitting rep range max,
137
+ * then resets reps and increases weight.
129
138
  *
130
139
  * | Surplus | Action |
131
140
  * |---:|---|
132
141
  * | >= 3 | Accelerate: actualReps + 2 (progress from actual, not planned) |
133
142
  * | 0 to 2 | Normal: plannedReps + 2 |
134
143
  * | -1 to -2 | Hold: plannedReps (don't add reps) |
135
- * | <= -3 | Regress: actualReps (use actual as new baseline) |
144
+ * | -3 | Regress: actualReps (use actual as new baseline) |
145
+ * | < -3 | Severe regress: actualReps + reduce weight (weight is too heavy for rep range) |
136
146
  */
137
147
  private static calculateAutoRegulatedRepTargets(
138
148
  previousSet: CompletedWorkoutSet,
@@ -149,8 +159,21 @@ export default class WorkoutExerciseService {
149
159
  targetReps = previousSet.plannedReps + 2;
150
160
  } else if (surplus >= -2) {
151
161
  targetReps = previousSet.plannedReps;
162
+ } else if (surplus >= -3) {
163
+ targetReps = previousSet.actualReps;
152
164
  } else {
165
+ // Severe underperformance: the weight is too heavy for this rep range.
166
+ // Reduce weight by one equipment increment so the user can actually
167
+ // train in the target rep range.
153
168
  targetReps = previousSet.actualReps;
169
+ const reducedWeight = WorkoutEquipmentTypeService.findNearestWeight(
170
+ equipment,
171
+ targetWeight - 0.01,
172
+ 'down'
173
+ );
174
+ if (reducedWeight !== null) {
175
+ targetWeight = reducedWeight;
176
+ }
154
177
  }
155
178
 
156
179
  // Clamp to rep range floor (never target below min, even if actual was 0)
@@ -158,7 +181,7 @@ export default class WorkoutExerciseService {
158
181
 
159
182
  // Handle rep range ceiling: if target exceeds max, reset and bump weight
160
183
  if (targetReps > repRange.max) {
161
- targetReps = repRange.max;
184
+ targetReps = Math.floor((repRange.min + repRange.max) / 2);
162
185
  const nextWeight = this.findNextTwoPercentWeight(targetWeight, equipment);
163
186
  if (nextWeight !== null) {
164
187
  targetWeight = nextWeight;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutMesocycleService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Mesocycle/WorkoutMesocycleService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkoutMesocycleService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Mesocycle/WorkoutMesocycleService.ts"],"names":[],"mappings":"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"}
@@ -379,17 +379,15 @@ export default class WorkoutMesocycleService {
379
379
  consecutiveDrops = 0;
380
380
  continue;
381
381
  }
382
- const firstSetId = se.setOrder[0];
383
- const firstSet = setMap.get(firstSetId);
384
- if (!firstSet ||
385
- firstSet.actualReps == null ||
386
- firstSet.plannedReps == null ||
387
- firstSet.rir == null ||
388
- firstSet.plannedRir == null) {
382
+ // Average surplus across all completed sets for a holistic performance signal.
383
+ const sets = se.setOrder
384
+ .map((setId) => setMap.get(setId))
385
+ .filter((s) => s != null);
386
+ const surplus = WorkoutSessionExerciseService.calculateAverageSurplus(sets);
387
+ if (surplus == null) {
389
388
  consecutiveDrops = 0;
390
389
  continue;
391
390
  }
392
- const surplus = WorkoutSessionExerciseService.calculateSetSurplus(firstSet.actualReps, firstSet.plannedReps, firstSet.rir, firstSet.plannedRir);
393
391
  if (surplus <= this.PERFORMANCE_DROP_SURPLUS_THRESHOLD) {
394
392
  consecutiveDrops++;
395
393
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutMesocycleService.js","sourceRoot":"","sources":["../../../../src/services/workout/Mesocycle/WorkoutMesocycleService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkoutMesocycleService.js","sourceRoot":"","sources":["../../../../src/services/workout/Mesocycle/WorkoutMesocycleService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKpD,OAAO,EAAE,SAAS,EAAyB,MAAM,gDAAgD,CAAC;AAElG,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAK1F,OAAO,wBAAwB,MAAM,2CAA2C,CAAC;AACjF,OAAO,6BAA6B,MAAM,qDAAqD,CAAC;AAChG,OAAO,2BAA2B,MAAM,kCAAkC,CAAC;AAE3E,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C,4EAA4E;IACpE,MAAM,CAAU,+BAA+B,GAAG,CAAC,CAAC;IAE5D,0DAA0D;IAClD,MAAM,CAAU,0BAA0B,GAAG,GAAG,CAAC;IAEzD,8DAA8D;IACtD,MAAM,CAAU,wBAAwB,GAAG,GAAG,CAAC;IAEvD,mEAAmE;IAC3D,MAAM,CAAU,kCAAkC,GAAG,CAAC,CAAC,CAAC;IAEhE,0EAA0E;IAClE,MAAM,CAAU,0BAA0B,GAAG,CAAC,CAAC;IAEvD,kFAAkF;IAC1E,MAAM,CAAU,oCAAoC,GAAG,CAAC,CAAC;IAEjE;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,yBAAyB,CAC9B,SAA2B,EAC3B,YAAkC,EAClC,aAA4C,EAAE,EAC9C,sBAA2C,EAAE,EAC7C,mBAAqC,EAAE,EACvC,2BAAqD,EAAE,EACvD,eAA6B,EAAE,EAC/B,SAAgB;QAQhB,4FAA4F;QAC5F,6FAA6F;QAC7F,+BAA+B;QAC/B,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,iEAAiE;QACjE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,CAAC,YAAY,MAAM,GAAG,CAAC,GAAG,yFAAyF,CACpI,CAAC;YACJ,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CACrD,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,CACb,CAAC;QAEF,4CAA4C;QAC5C,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAC1D,CAAC;QACF,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CACvD,CAAC;QACF,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,MAAM,CAC3D,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CACjE,CAAC;QACF,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1F,0CAA0C;QAC1C,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAC7C,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,SAAS,CACV,CAAC;QAEF,2EAA2E;QAC3E,mEAAmE;QACnE,OAAO,CAAC,6BAA6B,CACnC,wBAAwB,CAAC,iCAAiC,CACxD,SAAS,CAAC,gCAAgC,EAC1C,YAAY,CACb,CACF,CAAC;QAEF,6FAA6F;QAC7F,MAAM,gBAAgB,GAAG,SAAS,CAAC,sBAAsB,IAAI,CAAC,CAAC;QAC/D,MAAM,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAE7E,0CAA0C;QAC1C,MAAM,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC/D,IAAI,WAAiB,CAAC;QAEtB,IAAI,oBAAoB,KAAK,CAAC,EAAE,CAAC;YAC/B,WAAW,GAAG,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,yDAAyD;YACzD,MAAM,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;YACpF,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC;QAC/C,CAAC;QAED,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;QAEvC,iCAAiC;QACjC,KACE,IAAI,eAAe,GAAG,oBAAoB,EAC1C,eAAe,GAAG,gBAAgB,EAClC,eAAe,EAAE,EACjB,CAAC;YACD,MAAM,kBAAkB,GAAG,eAAe,KAAK,qBAAqB,CAAC;YAErE,+EAA+E;YAC/E,yFAAyF;YACzF,yCAAyC;YACzC,MAAM,gBAAgB,GACpB,OAAO,CAAC,mBAAmB,KAAK,CAAC;gBAC/B,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAE/D,oBAAoB;YACpB,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC;gBAC/C,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,kBAAkB,EAAE,SAAS,CAAC,GAAG;gBACjC,SAAS,EAAE,WAAW;gBACtB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,6BAA6B,CAAC;aACnF,CAAC,CAAC;YACH,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAElC,wBAAwB,CAAC,6BAA6B,CAAC;gBACrD,OAAO;gBACP,eAAe;gBACf,SAAS;gBACT,kBAAkB;aACnB,CAAC,CAAC;YAEH,0BAA0B;YAC1B,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,CAAC;QAED,OAAO;YACL,eAAe,EAAE,SAAS;YAC1B,WAAW,EAAE;gBACX,MAAM,EAAE,OAAO,CAAC,mBAAmB;gBACnC,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,aAAa,CAAC,mBAAmB;aAC1C;YACD,QAAQ,EAAE;gBACR,MAAM,EAAE,OAAO,CAAC,gBAAgB;gBAChC,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,aAAa,CAAC,gBAAgB;aACvC;YACD,gBAAgB,EAAE;gBAChB,MAAM,EAAE,OAAO,CAAC,wBAAwB;gBACxC,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,aAAa,CAAC,wBAAwB;aAC/C;YACD,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE;SACvF,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,qBAAqB,CAC1B,SAA2B,EAC3B,WAAgC;QAEhC,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC,SAAS,CAAC;QAC7B,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9F,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,mBAAmB,CACxB,SAA2B,EAC3B,WAAgC;QAEhC,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAE9F,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACrE,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,sBAAsB,IAAI,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAAC,6BAA6B,CAAC;QAC7E,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,mBAAmB,CACxB,SAA2B,EAC3B,WAAgC,EAChC,QAA0B,EAC1B,SAAiB;QAEjB,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;YAChC,SAAS,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,UAAU,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC5E,UAAU,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1E,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,sBAAsB,CAC3B,UAA8B,EAC9B,yBAAyD;QAEzD,MAAM,gBAAgB,GAAwB,EAAE,CAAC;QAEjD,MAAM,MAAM,GAAgD,EAAE,CAAC;QAC/D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACjE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC7D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;oBACxD,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvE,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,2BAA2B,CAChC,kBAAsC,EACtC,yBAAyD;QAEzD,IAAI,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE3B,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;YAC3C,IAAI,SAAS,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;gBACpC,SAAS;YACX,CAAC;YACD,MAAM,WAAW,GAAG,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACvE,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACtE,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBACzE,SAAS,GAAG,YAAY,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,wBAAwB,CAC7B,SAA2B,EAC3B,YAAkC,EAClC,mBAAyB,EACzB,mBAAwC,EACxC,gBAAkC,EAClC,wBAAkD,EAClD,YAA0B;QAE1B,MAAM,QAAQ,GAAgC;YAC5C,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,qBAAqB,CAAC,IAAI;YACpC,cAAc,EAAE,EAAE;SACnB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAC7C,SAAS,EACT,YAAY,EACZ,EAAE,EACF,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,CACb,CAAC;QAEF,gCAAgC;QAChC,MAAM,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC,SAAS,CACjE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,mBAAmB,CACvC,CAAC;QAEF,qEAAqE;QACrE,IAAI,sBAAsB,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;YAClE,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,sBAAsB,KAAK,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1F,IAAI,gBAAgB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,8DAA8D;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,KAAK,CACxD,UAAU,EACV,sBAAsB,GAAG,CAAC,CAC3B,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3E,MAAM,sBAAsB,GAAG,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;YACpF,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;YAC5D,OAAO,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAA+B,EAAE,CAAC;QACtD,IAAI,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;QAClD,IAAI,mBAAmB,GAAG,qBAAqB,CAAC,IAAI,CAAC;QAErD,6CAA6C;QAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,gCAAgC,CAC1D,sBAAsB,EACtB,OAAO,CAAC,WAAW,CACpB,CAAC;QACF,IAAI,cAAc,KAAK,qBAAqB,CAAC,IAAI,EAAE,CAAC;YAClD,cAAc,CAAC,IAAI,CAAC,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;YACvE,gBAAgB,GAAG,cAAc,CAAC;QACpC,CAAC;QAED,gDAAgD;QAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,mCAAmC,CAChE,sBAAsB,EACtB,OAAO,CAAC,MAAM,CACf,CAAC;QACF,IAAI,iBAAiB,KAAK,qBAAqB,CAAC,IAAI,EAAE,CAAC;YACrD,cAAc,CAAC,IAAI,CAAC,wBAAwB,CAAC,0BAA0B,CAAC,CAAC;YACzE,mBAAmB,GAAG,iBAAiB,CAAC;QAC1C,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,8BAA8B;QAC9B,IAAI,QAA+B,CAAC;QACpC,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,QAAQ;gBACN,gBAAgB,KAAK,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC7F,CAAC;QAED,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ;YACR,cAAc;SACf,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,gCAAgC,CAC7C,sBAAgD,EAChD,WAA+C;QAE/C,qEAAqE;QACrE,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAQ,CAAC;QAC9C,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gBAChD,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,qBAAqB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,qBAAqB,CAAC,IAAI,CAAC;QACpC,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAQ,CAAC;QAC7C,KAAK,MAAM,eAAe,IAAI,sBAAsB,EAAE,CAAC;YACrD,IAAI,eAAe,CAAC,kBAAkB,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;gBACpE,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;wBAChD,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC;QAErE,IAAI,KAAK,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC5C,OAAO,qBAAqB,CAAC,WAAW,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC3C,OAAO,qBAAqB,CAAC,SAAS,CAAC;QACzC,CAAC;QACD,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACpC,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,mCAAmC,CAChD,sBAAgD,EAChD,MAAqC;QAErC,yCAAyC;QACzC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkC,CAAC;QACjE,KAAK,MAAM,EAAE,IAAI,sBAAsB,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;YAC1D,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,IAAI,uBAAuB,GAAG,CAAC,CAAC;QAEhC,KAAK,MAAM,CAAC,EAAE,gBAAgB,CAAC,IAAI,cAAc,EAAE,CAAC;YAClD,qDAAqD;YACrD,MAAM,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,CAC5D,CAAC;YAEF,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,IAAI,mBAAmB,GAAG,KAAK,CAAC;YAEhC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;gBACxB,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7B,gBAAgB,GAAG,CAAC,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAED,+EAA+E;gBAC/E,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ;qBACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;qBACjC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,6BAA6B,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;gBAE5E,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,gBAAgB,GAAG,CAAC,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAED,IAAI,OAAO,IAAI,IAAI,CAAC,kCAAkC,EAAE,CAAC;oBACvD,gBAAgB,EAAE,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,gBAAgB,GAAG,CAAC,CAAC;gBACvB,CAAC;gBAED,IAAI,gBAAgB,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;oBACxD,mBAAmB,GAAG,IAAI,CAAC;oBAC3B,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,mBAAmB,EAAE,CAAC;gBACxB,uBAAuB,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,uBAAuB,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,qBAAqB,CAAC,IAAI,CAAC;QACpC,CAAC;QAED,IAAI,uBAAuB,IAAI,IAAI,CAAC,oCAAoC,EAAE,CAAC;YACzE,OAAO,qBAAqB,CAAC,WAAW,CAAC;QAC3C,CAAC;QACD,OAAO,qBAAqB,CAAC,SAAS,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,4BAA4B,CACzC,SAA2B,EAC3B,mBAAwC,EACxC,gBAAkC,EAClC,wBAAkD,EAClD,YAA0B;QAO1B,MAAM,mBAAmB,GAAW,EAAE,CAAC;QACvC,MAAM,gBAAgB,GAAW,EAAE,CAAC;QACpC,MAAM,wBAAwB,GAAW,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAW,EAAE,CAAC;QAEhC,sCAAsC;QACtC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,IAAI,CACtD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CACxD,CAAC;QAEF,mCAAmC;QACnC,IAAI,8BAA8B,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,MAAM,UAAU,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,8CAA8C;gBAC9C,8BAA8B,GAAG,CAAC,CAAC;gBACnC,MAAM;YACR,CAAC;YAED,oCAAoC;YACpC,MAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClF,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;YAC1E,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;gBAC3B,8BAA8B,GAAG,CAAC,CAAC;gBACnC,MAAM;YACR,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,8BAA8B,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,YAAY,EAAE,CAAC;QAC3F,CAAC;QAED,MAAM,yBAAyB,GAAG,uBAAuB,CAAC,8BAA8B,CAAC,CAAC;QAE1F,0EAA0E;QAC1E,IAAI,yBAAyB,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,cAAc,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;YAC5E,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,iDAAiD,SAAS,CAAC,GAAG,yBAAyB,8BAA8B,+HAA+H,CACrP,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qFAAqF;QACrF,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC5F,mBAAmB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAErE,2FAA2F;QAC3F,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,mBAAmB,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC5F,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrD,KAAK,MAAM,eAAe,IAAI,wBAAwB,EAAE,CAAC;YACvD,IAAI,kBAAkB,CAAC,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC7D,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACrE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBACjE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,YAAY,EAAE,CAAC;IAC3F,CAAC"}
@@ -550,27 +550,17 @@ export default class WorkoutMesocycleService {
550
550
  continue;
551
551
  }
552
552
 
553
- const firstSetId = se.setOrder[0];
554
- const firstSet = setMap.get(firstSetId);
555
-
556
- if (
557
- !firstSet ||
558
- firstSet.actualReps == null ||
559
- firstSet.plannedReps == null ||
560
- firstSet.rir == null ||
561
- firstSet.plannedRir == null
562
- ) {
553
+ // Average surplus across all completed sets for a holistic performance signal.
554
+ const sets = se.setOrder
555
+ .map((setId) => setMap.get(setId))
556
+ .filter((s): s is WorkoutSet => s != null);
557
+ const surplus = WorkoutSessionExerciseService.calculateAverageSurplus(sets);
558
+
559
+ if (surplus == null) {
563
560
  consecutiveDrops = 0;
564
561
  continue;
565
562
  }
566
563
 
567
- const surplus = WorkoutSessionExerciseService.calculateSetSurplus(
568
- firstSet.actualReps,
569
- firstSet.plannedReps,
570
- firstSet.rir,
571
- firstSet.plannedRir
572
- );
573
-
574
564
  if (surplus <= this.PERFORMANCE_DROP_SURPLUS_THRESHOLD) {
575
565
  consecutiveDrops++;
576
566
  } else {
@@ -37,17 +37,15 @@ export default class WorkoutSessionExerciseService {
37
37
  */
38
38
  static getPerformanceScore(sets: WorkoutSet[]): number | null;
39
39
  /**
40
- * Calculates the surplus for a single set: how much the user exceeded or
41
- * fell short of the plan. Positive means exceeded, negative means fell short.
40
+ * Calculates the average surplus across an array of sets. Sets missing
41
+ * required planned/actual data are skipped. Returns null if no sets
42
+ * have complete data.
42
43
  *
43
- * Formula: `(actualReps - plannedReps) + (rir - plannedRir)`
44
+ * Surplus formula per set: `(actualReps - plannedReps) + (rir - plannedRir)`
44
45
  *
45
- * @param actualReps The actual reps performed.
46
- * @param plannedReps The planned reps.
47
- * @param rir The actual RIR (reps in reserve).
48
- * @param plannedRir The planned RIR.
46
+ * @param sets The sets to calculate average surplus for.
49
47
  */
50
- static calculateSetSurplus(actualReps: number, plannedReps: number, rir: number, plannedRir: number): number;
48
+ static calculateAverageSurplus(sets: WorkoutSet[]): number | null;
51
49
  /**
52
50
  * Uses the soreness/performance table from the workout model notes to recommend whether to add
53
51
  * sets next microcycle or employ recovery sessions.
@@ -85,5 +83,12 @@ export default class WorkoutSessionExerciseService {
85
83
  * and sorenessScore. Deload exercises are always considered filled.
86
84
  */
87
85
  static hasAllSessionMetricsFilled(sessionExercise: WorkoutSessionExercise, exerciseSets: WorkoutSet[]): boolean;
86
+ /**
87
+ * Calculates the surplus for a single set: how much the user exceeded or
88
+ * fell short of the plan. Positive means exceeded, negative means fell short.
89
+ *
90
+ * Formula: `(actualReps - plannedReps) + (rir - plannedRir)`
91
+ */
92
+ private static calculateSetSurplus;
88
93
  }
89
94
  //# sourceMappingURL=WorkoutSessionExerciseService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutSessionExerciseService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAG3E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAChD;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI1E;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI9E;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAIrE;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IA0C7D;;;;;;;;;;OAUG;IACH,MAAM,CAAC,mBAAmB,CACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,MAAM;IAIT;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,oCAAoC,CACzC,sBAAsB,EAAE,sBAAsB,GAC7C,MAAM,GAAG,IAAI;IAsBhB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;IAUV;;;;OAIG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;CAYX"}
1
+ {"version":3,"file":"WorkoutSessionExerciseService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAG3E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAChD;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI1E;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI9E;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAIrE;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IA0C7D;;;;;;;;OAQG;IACH,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IAwBjE;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,oCAAoC,CACzC,sBAAsB,EAAE,sBAAsB,GAC7C,MAAM,GAAG,IAAI;IAsBhB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;IAUV;;;;OAIG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;IAaV;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAQnC"}
@@ -71,18 +71,30 @@ export default class WorkoutSessionExerciseService {
71
71
  return Math.round(average);
72
72
  }
73
73
  /**
74
- * Calculates the surplus for a single set: how much the user exceeded or
75
- * fell short of the plan. Positive means exceeded, negative means fell short.
74
+ * Calculates the average surplus across an array of sets. Sets missing
75
+ * required planned/actual data are skipped. Returns null if no sets
76
+ * have complete data.
76
77
  *
77
- * Formula: `(actualReps - plannedReps) + (rir - plannedRir)`
78
+ * Surplus formula per set: `(actualReps - plannedReps) + (rir - plannedRir)`
78
79
  *
79
- * @param actualReps The actual reps performed.
80
- * @param plannedReps The planned reps.
81
- * @param rir The actual RIR (reps in reserve).
82
- * @param plannedRir The planned RIR.
80
+ * @param sets The sets to calculate average surplus for.
83
81
  */
84
- static calculateSetSurplus(actualReps, plannedReps, rir, plannedRir) {
85
- return actualReps - plannedReps + (rir - plannedRir);
82
+ static calculateAverageSurplus(sets) {
83
+ let totalSurplus = 0;
84
+ let completedCount = 0;
85
+ for (const set of sets) {
86
+ if (set.actualReps == null ||
87
+ set.plannedReps == null ||
88
+ set.rir == null ||
89
+ set.plannedRir == null) {
90
+ continue;
91
+ }
92
+ totalSurplus += this.calculateSetSurplus(set.actualReps, set.plannedReps, set.rir, set.plannedRir);
93
+ completedCount++;
94
+ }
95
+ if (completedCount === 0)
96
+ return null;
97
+ return totalSurplus / completedCount;
86
98
  }
87
99
  /**
88
100
  * Uses the soreness/performance table from the workout model notes to recommend whether to add
@@ -158,5 +170,14 @@ export default class WorkoutSessionExerciseService {
158
170
  sessionExercise.fatigue.perceivedEffort != null &&
159
171
  sessionExercise.sorenessScore != null);
160
172
  }
173
+ /**
174
+ * Calculates the surplus for a single set: how much the user exceeded or
175
+ * fell short of the plan. Positive means exceeded, negative means fell short.
176
+ *
177
+ * Formula: `(actualReps - plannedReps) + (rir - plannedRir)`
178
+ */
179
+ static calculateSetSurplus(actualReps, plannedReps, rir, plannedRir) {
180
+ return actualReps - plannedReps + (rir - plannedRir);
181
+ }
161
182
  }
162
183
  //# sourceMappingURL=WorkoutSessionExerciseService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutSessionExerciseService.js","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkoutSessionExerciseService.js","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"AAEA,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AAEjE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAChD;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,eAAuC;QACxD,OAAO,iBAAiB,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,eAAuC;QAC5D,OAAO,iBAAiB,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,eAAuC;QACnD,OAAO,iBAAiB,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAChF,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAkB;QAC3C,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IACE,GAAG,CAAC,WAAW,IAAI,IAAI;gBACvB,GAAG,CAAC,UAAU,IAAI,IAAI;gBACtB,GAAG,CAAC,UAAU,IAAI,IAAI;gBACtB,GAAG,CAAC,GAAG,IAAI,IAAI,EACf,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CACtC,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,UAAU,CACf,CAAC;YAEF,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACxB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;QACpF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,uBAAuB,CAAC,IAAkB;QAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IACE,GAAG,CAAC,UAAU,IAAI,IAAI;gBACtB,GAAG,CAAC,WAAW,IAAI,IAAI;gBACvB,GAAG,CAAC,GAAG,IAAI,IAAI;gBACf,GAAG,CAAC,UAAU,IAAI,IAAI,EACtB,CAAC;gBACD,SAAS;YACX,CAAC;YACD,YAAY,IAAI,IAAI,CAAC,mBAAmB,CACtC,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,UAAU,CACf,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,cAAc,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,YAAY,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,oCAAoC,CACzC,sBAA8C;QAE9C,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,GAAG,sBAAsB,CAAC;QACnE,IAAI,aAAa,IAAI,IAAI,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gEAAgE;QAChE,0FAA0F;QAC1F,MAAM,KAAK,GAAe;YACxB,uDAAuD;YACvD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACb,uDAAuD;YACvD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACb,6DAA6D;YAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACb,6DAA6D;YAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACd,CAAC;QAEF,OAAO,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAA0B;QAChD,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;IACpF,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAuC,EACvC,YAA0B;QAE1B,IAAI,6BAA6B,CAAC,gBAAgB,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9E,OAAO,CACL,eAAe,CAAC,GAAG,EAAE,oBAAoB,IAAI,IAAI;YACjD,eAAe,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI;YAChC,eAAe,CAAC,OAAO,EAAE,uBAAuB,IAAI,IAAI;YACxD,eAAe,CAAC,gBAAgB,IAAI,IAAI,CACzC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAuC,EACvC,YAA0B;QAE1B,IAAI,CAAC,6BAA6B,CAAC,0BAA0B,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,CAAC;YAC7F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,6BAA6B,CAAC,gBAAgB,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9E,OAAO,CACL,eAAe,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI;YACvC,eAAe,CAAC,OAAO,EAAE,wBAAwB,IAAI,IAAI;YACzD,eAAe,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI;YAC/C,eAAe,CAAC,aAAa,IAAI,IAAI,CACtC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,mBAAmB,CAChC,UAAkB,EAClB,WAAmB,EACnB,GAAW,EACX,UAAkB;QAElB,OAAO,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -89,23 +89,36 @@ export default class WorkoutSessionExerciseService {
89
89
  }
90
90
 
91
91
  /**
92
- * Calculates the surplus for a single set: how much the user exceeded or
93
- * fell short of the plan. Positive means exceeded, negative means fell short.
92
+ * Calculates the average surplus across an array of sets. Sets missing
93
+ * required planned/actual data are skipped. Returns null if no sets
94
+ * have complete data.
94
95
  *
95
- * Formula: `(actualReps - plannedReps) + (rir - plannedRir)`
96
+ * Surplus formula per set: `(actualReps - plannedReps) + (rir - plannedRir)`
96
97
  *
97
- * @param actualReps The actual reps performed.
98
- * @param plannedReps The planned reps.
99
- * @param rir The actual RIR (reps in reserve).
100
- * @param plannedRir The planned RIR.
98
+ * @param sets The sets to calculate average surplus for.
101
99
  */
102
- static calculateSetSurplus(
103
- actualReps: number,
104
- plannedReps: number,
105
- rir: number,
106
- plannedRir: number
107
- ): number {
108
- return actualReps - plannedReps + (rir - plannedRir);
100
+ static calculateAverageSurplus(sets: WorkoutSet[]): number | null {
101
+ let totalSurplus = 0;
102
+ let completedCount = 0;
103
+ for (const set of sets) {
104
+ if (
105
+ set.actualReps == null ||
106
+ set.plannedReps == null ||
107
+ set.rir == null ||
108
+ set.plannedRir == null
109
+ ) {
110
+ continue;
111
+ }
112
+ totalSurplus += this.calculateSetSurplus(
113
+ set.actualReps,
114
+ set.plannedReps,
115
+ set.rir,
116
+ set.plannedRir
117
+ );
118
+ completedCount++;
119
+ }
120
+ if (completedCount === 0) return null;
121
+ return totalSurplus / completedCount;
109
122
  }
110
123
 
111
124
  /**
@@ -197,4 +210,19 @@ export default class WorkoutSessionExerciseService {
197
210
  sessionExercise.sorenessScore != null
198
211
  );
199
212
  }
213
+
214
+ /**
215
+ * Calculates the surplus for a single set: how much the user exceeded or
216
+ * fell short of the plan. Positive means exceeded, negative means fell short.
217
+ *
218
+ * Formula: `(actualReps - plannedReps) + (rir - plannedRir)`
219
+ */
220
+ private static calculateSetSurplus(
221
+ actualReps: number,
222
+ plannedReps: number,
223
+ rir: number,
224
+ plannedRir: number
225
+ ): number {
226
+ return actualReps - plannedReps + (rir - plannedRir);
227
+ }
200
228
  }
@@ -31,18 +31,19 @@ export default class WorkoutSetService {
31
31
  */
32
32
  static isCompleted(set: WorkoutSet): boolean;
33
33
  /**
34
- * Finds the previous microcycle's first set for an exercise to use for autoregulation.
34
+ * Finds all sets from the previous microcycle's session exercise to use for autoregulation.
35
+ * Returns all sets in order so surplus can be averaged across the full exercise performance.
35
36
  *
36
37
  * Uses the mesocycle's fixed exercise-to-session mapping to go directly to the
37
38
  * correct session and exercise position rather than iterating all sessions.
38
39
  *
39
- * Returns undefined if the previous microcycle doesn't exist or has no sessions
40
+ * Returns an empty array if the previous microcycle doesn't exist or has no sessions
40
41
  * (the context may not have full history). Throws if the structure is present but
41
42
  * inconsistent with the mesocycle plan.
42
43
  *
43
44
  * @throws {Error} If the session/exercise structure doesn't match the plan.
44
45
  */
45
- private static findPreviousFirstSet;
46
+ private static findPreviousSets;
46
47
  /**
47
48
  * Generates the planned reps and weight for a specific set within a session exercise, only
48
49
  * taking into account simple -2 reps drop per set logic, and deload modifications.
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutSetService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Set/WorkoutSetService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAG7F,OAAO,KAAK,2BAA2B,MAAM,6CAA6C,CAAC;AAE3F,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC;;;;;;;;OAQG;IACH,MAAM,CAAC,8BAA8B,CAAC,EACpC,OAAO,EACP,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,kBAAkB,EACnB,EAAE;QACD,OAAO,EAAE,2BAA2B,CAAC;QACrC,WAAW,EAAE,kBAAkB,CAAC;QAChC,OAAO,EAAE,cAAc,CAAC;QACxB,eAAe,EAAE,sBAAsB,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,GAAG,IAAI;IA4DR;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAQ5C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAmEnC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAuDxC"}
1
+ {"version":3,"file":"WorkoutSetService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Set/WorkoutSetService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAG7F,OAAO,KAAK,2BAA2B,MAAM,6CAA6C,CAAC;AAE3F,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC;;;;;;;;OAQG;IACH,MAAM,CAAC,8BAA8B,CAAC,EACpC,OAAO,EACP,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,kBAAkB,EACnB,EAAE;QACD,OAAO,EAAE,2BAA2B,CAAC;QACrC,WAAW,EAAE,kBAAkB,CAAC;QAChC,OAAO,EAAE,cAAc,CAAC;QACxB,eAAe,EAAE,sBAAsB,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,GAAG,IAAI;IA6DR;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAQ5C;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAuE/B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAuDxC"}
@@ -18,19 +18,20 @@ export default class WorkoutSetService {
18
18
  }
19
19
  const sets = [];
20
20
  // For the first microcycle, use the CTO's previous performance data.
21
- // For subsequent microcycles, look up the previous microcycle's first set from the context.
22
- const previousFirstSet = microcycleIndex === 0
23
- ? (exerciseCTO.lastFirstSet ?? undefined)
24
- : this.findPreviousFirstSet(context, exerciseCTO._id, microcycleIndex);
21
+ // For subsequent microcycles, look up all previous sets from the context.
22
+ const previousSets = microcycleIndex === 0
23
+ ? exerciseCTO.lastSessionSets
24
+ : this.findPreviousSets(context, exerciseCTO._id, microcycleIndex);
25
25
  // Calculate progressed targets for the first set.
26
- // Autoregulation/forecasting handles progression from the previous set's data.
26
+ // Autoregulation/forecasting handles progression from the previous sets' data.
27
+ // Surplus is averaged across all sets for a holistic performance signal.
27
28
  // Calibration is only used when no previous set exists (first microcycle ever).
28
29
  const { targetReps: firstSetReps, targetWeight: firstSetWeight } = WorkoutExerciseService.calculateTargetRepsAndWeightForFirstSet({
29
30
  exercise: exerciseCTO,
30
31
  calibration: bestCalibration,
31
32
  equipment: equipmentType,
32
33
  firstMicrocycleRir: context.firstMicrocycleRir,
33
- previousFirstSet
34
+ previousSets
34
35
  });
35
36
  for (let setIndex = 0; setIndex < setCount; setIndex++) {
36
37
  const { plannedReps, plannedWeight } = this.generateSetRepsAndWeight(sets[setIndex - 1]?.plannedReps || firstSetReps, sets[setIndex - 1]?.plannedWeight || firstSetWeight, setIndex, exerciseCTO.repRange, equipmentType, {
@@ -63,24 +64,25 @@ export default class WorkoutSetService {
63
64
  (set.rir != null || set.plannedRir == null));
64
65
  }
65
66
  /**
66
- * Finds the previous microcycle's first set for an exercise to use for autoregulation.
67
+ * Finds all sets from the previous microcycle's session exercise to use for autoregulation.
68
+ * Returns all sets in order so surplus can be averaged across the full exercise performance.
67
69
  *
68
70
  * Uses the mesocycle's fixed exercise-to-session mapping to go directly to the
69
71
  * correct session and exercise position rather than iterating all sessions.
70
72
  *
71
- * Returns undefined if the previous microcycle doesn't exist or has no sessions
73
+ * Returns an empty array if the previous microcycle doesn't exist or has no sessions
72
74
  * (the context may not have full history). Throws if the structure is present but
73
75
  * inconsistent with the mesocycle plan.
74
76
  *
75
77
  * @throws {Error} If the session/exercise structure doesn't match the plan.
76
78
  */
77
- static findPreviousFirstSet(context, exerciseId, microcycleIndex) {
79
+ static findPreviousSets(context, exerciseId, microcycleIndex) {
78
80
  if (microcycleIndex <= 0) {
79
- return undefined;
81
+ return [];
80
82
  }
81
83
  const previousMicrocycle = context.microcyclesInOrder[microcycleIndex - 1];
82
84
  if (!previousMicrocycle || previousMicrocycle.sessionOrder.length === 0) {
83
- return undefined;
85
+ return [];
84
86
  }
85
87
  // Exercise-to-session mapping is fixed for the mesocycle — look up directly
86
88
  const sessionIndex = context.exerciseIdToSessionIndex?.get(exerciseId);
@@ -91,7 +93,7 @@ export default class WorkoutSetService {
91
93
  if (!sessionId) {
92
94
  // The previous microcycle may have fewer sessions than the plan (e.g. pruned
93
95
  // during early deload). Treat as missing history rather than a structural error.
94
- return undefined;
96
+ return [];
95
97
  }
96
98
  const session = context.sessionMap.get(sessionId);
97
99
  if (!session) {
@@ -114,15 +116,19 @@ export default class WorkoutSetService {
114
116
  if (!sessionExercise) {
115
117
  throw new Error(`Session exercise ${seId} not found in context`);
116
118
  }
117
- const firstSetId = sessionExercise.setOrder[0];
118
- if (!firstSetId) {
119
+ if (sessionExercise.setOrder.length === 0) {
119
120
  throw new Error(`Session exercise ${seId} for exercise ${exerciseId} has no sets`);
120
121
  }
121
- const set = context.setMap.get(firstSetId);
122
- if (!set) {
123
- throw new Error(`Set ${firstSetId} not found in context`);
122
+ // Return all sets in order
123
+ const sets = [];
124
+ for (const setId of sessionExercise.setOrder) {
125
+ const set = context.setMap.get(setId);
126
+ if (!set) {
127
+ throw new Error(`Set ${setId} not found in context`);
128
+ }
129
+ sets.push(set);
124
130
  }
125
- return set;
131
+ return sets;
126
132
  }
127
133
  /**
128
134
  * Generates the planned reps and weight for a specific set within a session exercise, only
@@ -1 +1 @@
1
- {"version":3,"file":"WorkoutSetService.js","sourceRoot":"","sources":["../../../../src/services/workout/Set/WorkoutSetService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkoutSetService.js","sourceRoot":"","sources":["../../../../src/services/workout/Set/WorkoutSetService.ts"],"names":[],"mappings":"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"}
@@ -50,14 +50,15 @@ export default class WorkoutSetService {
50
50
  const sets: WorkoutSet[] = [];
51
51
 
52
52
  // For the first microcycle, use the CTO's previous performance data.
53
- // For subsequent microcycles, look up the previous microcycle's first set from the context.
54
- const previousFirstSet =
53
+ // For subsequent microcycles, look up all previous sets from the context.
54
+ const previousSets =
55
55
  microcycleIndex === 0
56
- ? (exerciseCTO.lastFirstSet ?? undefined)
57
- : this.findPreviousFirstSet(context, exerciseCTO._id, microcycleIndex);
56
+ ? exerciseCTO.lastSessionSets
57
+ : this.findPreviousSets(context, exerciseCTO._id, microcycleIndex);
58
58
 
59
59
  // Calculate progressed targets for the first set.
60
- // Autoregulation/forecasting handles progression from the previous set's data.
60
+ // Autoregulation/forecasting handles progression from the previous sets' data.
61
+ // Surplus is averaged across all sets for a holistic performance signal.
61
62
  // Calibration is only used when no previous set exists (first microcycle ever).
62
63
  const { targetReps: firstSetReps, targetWeight: firstSetWeight } =
63
64
  WorkoutExerciseService.calculateTargetRepsAndWeightForFirstSet({
@@ -65,7 +66,7 @@ export default class WorkoutSetService {
65
66
  calibration: bestCalibration,
66
67
  equipment: equipmentType,
67
68
  firstMicrocycleRir: context.firstMicrocycleRir,
68
- previousFirstSet
69
+ previousSets
69
70
  });
70
71
 
71
72
  for (let setIndex = 0; setIndex < setCount; setIndex++) {
@@ -113,29 +114,30 @@ export default class WorkoutSetService {
113
114
  }
114
115
 
115
116
  /**
116
- * Finds the previous microcycle's first set for an exercise to use for autoregulation.
117
+ * Finds all sets from the previous microcycle's session exercise to use for autoregulation.
118
+ * Returns all sets in order so surplus can be averaged across the full exercise performance.
117
119
  *
118
120
  * Uses the mesocycle's fixed exercise-to-session mapping to go directly to the
119
121
  * correct session and exercise position rather than iterating all sessions.
120
122
  *
121
- * Returns undefined if the previous microcycle doesn't exist or has no sessions
123
+ * Returns an empty array if the previous microcycle doesn't exist or has no sessions
122
124
  * (the context may not have full history). Throws if the structure is present but
123
125
  * inconsistent with the mesocycle plan.
124
126
  *
125
127
  * @throws {Error} If the session/exercise structure doesn't match the plan.
126
128
  */
127
- private static findPreviousFirstSet(
129
+ private static findPreviousSets(
128
130
  context: WorkoutMesocyclePlanContext,
129
131
  exerciseId: UUID,
130
132
  microcycleIndex: number
131
- ): WorkoutSet | undefined {
133
+ ): WorkoutSet[] {
132
134
  if (microcycleIndex <= 0) {
133
- return undefined;
135
+ return [];
134
136
  }
135
137
 
136
138
  const previousMicrocycle = context.microcyclesInOrder[microcycleIndex - 1];
137
139
  if (!previousMicrocycle || previousMicrocycle.sessionOrder.length === 0) {
138
- return undefined;
140
+ return [];
139
141
  }
140
142
 
141
143
  // Exercise-to-session mapping is fixed for the mesocycle — look up directly
@@ -148,7 +150,7 @@ export default class WorkoutSetService {
148
150
  if (!sessionId) {
149
151
  // The previous microcycle may have fewer sessions than the plan (e.g. pruned
150
152
  // during early deload). Treat as missing history rather than a structural error.
151
- return undefined;
153
+ return [];
152
154
  }
153
155
 
154
156
  const session = context.sessionMap.get(sessionId);
@@ -179,16 +181,20 @@ export default class WorkoutSetService {
179
181
  throw new Error(`Session exercise ${seId} not found in context`);
180
182
  }
181
183
 
182
- const firstSetId = sessionExercise.setOrder[0];
183
- if (!firstSetId) {
184
+ if (sessionExercise.setOrder.length === 0) {
184
185
  throw new Error(`Session exercise ${seId} for exercise ${exerciseId} has no sets`);
185
186
  }
186
187
 
187
- const set = context.setMap.get(firstSetId);
188
- if (!set) {
189
- throw new Error(`Set ${firstSetId} not found in context`);
188
+ // Return all sets in order
189
+ const sets: WorkoutSet[] = [];
190
+ for (const setId of sessionExercise.setOrder) {
191
+ const set = context.setMap.get(setId);
192
+ if (!set) {
193
+ throw new Error(`Set ${setId} not found in context`);
194
+ }
195
+ sets.push(set);
190
196
  }
191
- return set;
197
+ return sets;
192
198
  }
193
199
 
194
200
  /**
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@aneuhold/core-ts-db-lib",
3
3
  "author": "Anton G. Neuhold Jr.",
4
4
  "license": "MIT",
5
- "version": "4.1.15",
5
+ "version": "5.0.0",
6
6
  "description": "A core database library used for personal projects",
7
7
  "packageManager": "pnpm@10.25.0",
8
8
  "type": "module",
@@ -72,12 +72,12 @@
72
72
  "Node.js"
73
73
  ],
74
74
  "dependencies": {
75
- "@aneuhold/core-ts-lib": "^2.4.1",
75
+ "@aneuhold/core-ts-lib": "^2.4.2",
76
76
  "uuid": "^13.0.0",
77
77
  "zod": "^4.1.13"
78
78
  },
79
79
  "devDependencies": {
80
- "@aneuhold/local-npm-registry": "^0.2.28",
80
+ "@aneuhold/local-npm-registry": "^0.2.29",
81
81
  "@aneuhold/main-scripts": "^2.8.3",
82
82
  "@types/node": "^25.0.2",
83
83
  "eslint": "^9.39.2",
@@ -88,4 +88,4 @@
88
88
  "typescript": "^5.9.3",
89
89
  "vitest": "^4.0.15"
90
90
  }
91
- }
91
+ }