@aneuhold/core-ts-db-lib 5.0.8 → 5.0.9

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 (128) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/browser.d.ts +14 -14
  3. package/lib/browser.d.ts.map +1 -1
  4. package/lib/browser.js +12 -12
  5. package/lib/browser.js.map +1 -1
  6. package/lib/browser.ts +14 -14
  7. package/lib/documents/BaseDocument.js +1 -1
  8. package/lib/documents/BaseDocument.js.map +1 -1
  9. package/lib/documents/BaseDocument.ts +1 -1
  10. package/lib/documents/dashboard/Task.d.ts +1 -1
  11. package/lib/documents/dashboard/Task.d.ts.map +1 -1
  12. package/lib/documents/dashboard/Task.ts +1 -1
  13. package/lib/schemas/UUIDSchema.js +1 -1
  14. package/lib/schemas/UUIDSchema.js.map +1 -1
  15. package/lib/schemas/UUIDSchema.ts +1 -1
  16. package/lib/services/{DocumentService.d.ts → Document.service.d.ts} +1 -1
  17. package/lib/services/Document.service.d.ts.map +1 -0
  18. package/lib/services/{DocumentService.js → Document.service.js} +1 -1
  19. package/lib/services/Document.service.js.map +1 -0
  20. package/lib/services/dashboard/Task/{TaskService.d.ts → Task.service.d.ts} +2 -10
  21. package/lib/services/dashboard/Task/Task.service.d.ts.map +1 -0
  22. package/lib/services/dashboard/Task/{TaskService.js → Task.service.js} +8 -8
  23. package/lib/services/dashboard/Task/Task.service.js.map +1 -0
  24. package/lib/services/dashboard/Task/{TaskService.ts → Task.service.ts} +8 -8
  25. package/lib/services/dashboard/Task/{TaskFilterService.d.ts → TaskFilter.service.d.ts} +1 -1
  26. package/lib/services/dashboard/Task/TaskFilter.service.d.ts.map +1 -0
  27. package/lib/services/dashboard/Task/{TaskFilterService.js → TaskFilter.service.js} +1 -1
  28. package/lib/services/dashboard/Task/TaskFilter.service.js.map +1 -0
  29. package/lib/services/dashboard/Task/{TaskRecurrenceService.d.ts → TaskRecurrence.service.d.ts} +2 -9
  30. package/lib/services/dashboard/Task/TaskRecurrence.service.d.ts.map +1 -0
  31. package/lib/services/dashboard/Task/{TaskRecurrenceService.js → TaskRecurrence.service.js} +6 -6
  32. package/lib/services/dashboard/Task/TaskRecurrence.service.js.map +1 -0
  33. package/lib/services/dashboard/Task/{TaskRecurrenceService.ts → TaskRecurrence.service.ts} +5 -8
  34. package/lib/services/dashboard/Task/{TaskSortService.d.ts → TaskSort.service.d.ts} +2 -42
  35. package/lib/services/dashboard/Task/TaskSort.service.d.ts.map +1 -0
  36. package/lib/services/dashboard/Task/{TaskSortService.js → TaskSort.service.js} +12 -12
  37. package/lib/services/dashboard/Task/TaskSort.service.js.map +1 -0
  38. package/lib/services/dashboard/Task/{TaskSortService.ts → TaskSort.service.ts} +11 -11
  39. package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.d.ts → WorkoutEquipmentType.service.d.ts} +1 -1
  40. package/lib/services/workout/EquipmentType/WorkoutEquipmentType.service.d.ts.map +1 -0
  41. package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.js → WorkoutEquipmentType.service.js} +1 -1
  42. package/lib/services/workout/EquipmentType/WorkoutEquipmentType.service.js.map +1 -0
  43. package/lib/services/workout/Exercise/WorkoutExercise.service.d.ts +52 -0
  44. package/lib/services/workout/Exercise/WorkoutExercise.service.d.ts.map +1 -0
  45. package/lib/services/workout/Exercise/{WorkoutExerciseService.js → WorkoutExercise.service.js} +18 -18
  46. package/lib/services/workout/Exercise/WorkoutExercise.service.js.map +1 -0
  47. package/lib/services/workout/Exercise/{WorkoutExerciseService.ts → WorkoutExercise.service.ts} +17 -17
  48. package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.d.ts → WorkoutExerciseCalibration.service.d.ts} +2 -12
  49. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.d.ts.map +1 -0
  50. package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.js → WorkoutExerciseCalibration.service.js} +10 -7
  51. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.js.map +1 -0
  52. package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.ts → WorkoutExerciseCalibration.service.ts} +10 -7
  53. package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.d.ts → WorkoutMesocycle.service.d.ts} +3 -41
  54. package/lib/services/workout/Mesocycle/WorkoutMesocycle.service.d.ts.map +1 -0
  55. package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.js → WorkoutMesocycle.service.js} +21 -21
  56. package/lib/services/workout/Mesocycle/WorkoutMesocycle.service.js.map +1 -0
  57. package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.ts → WorkoutMesocycle.service.ts} +21 -21
  58. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts +1 -10
  59. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts.map +1 -1
  60. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js +3 -3
  61. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js.map +1 -1
  62. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.ts +3 -3
  63. package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.d.ts → WorkoutMicrocycle.service.d.ts} +1 -1
  64. package/lib/services/workout/Microcycle/WorkoutMicrocycle.service.d.ts.map +1 -0
  65. package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.js → WorkoutMicrocycle.service.js} +4 -4
  66. package/lib/services/workout/Microcycle/WorkoutMicrocycle.service.js.map +1 -0
  67. package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.ts → WorkoutMicrocycle.service.ts} +3 -3
  68. package/lib/services/workout/Session/{WorkoutSessionService.d.ts → WorkoutSession.service.d.ts} +2 -6
  69. package/lib/services/workout/Session/WorkoutSession.service.d.ts.map +1 -0
  70. package/lib/services/workout/Session/{WorkoutSessionService.js → WorkoutSession.service.js} +5 -5
  71. package/lib/services/workout/Session/WorkoutSession.service.js.map +1 -0
  72. package/lib/services/workout/Session/{WorkoutSessionService.ts → WorkoutSession.service.ts} +4 -4
  73. package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.d.ts → WorkoutSessionExercise.service.d.ts} +2 -8
  74. package/lib/services/workout/SessionExercise/WorkoutSessionExercise.service.d.ts.map +1 -0
  75. package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.js → WorkoutSessionExercise.service.js} +5 -5
  76. package/lib/services/workout/SessionExercise/WorkoutSessionExercise.service.js.map +1 -0
  77. package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.ts → WorkoutSessionExercise.service.ts} +4 -4
  78. package/lib/services/workout/Set/{WorkoutSetService.d.ts → WorkoutSet.service.d.ts} +2 -23
  79. package/lib/services/workout/Set/WorkoutSet.service.d.ts.map +1 -0
  80. package/lib/services/workout/Set/{WorkoutSetService.js → WorkoutSet.service.js} +7 -7
  81. package/lib/services/workout/Set/WorkoutSet.service.js.map +1 -0
  82. package/lib/services/workout/Set/{WorkoutSetService.ts → WorkoutSet.service.ts} +6 -6
  83. package/lib/services/workout/util/SFR/{WorkoutSFRService.d.ts → WorkoutSFR.service.d.ts} +1 -1
  84. package/lib/services/workout/util/SFR/WorkoutSFR.service.d.ts.map +1 -0
  85. package/lib/services/workout/util/SFR/{WorkoutSFRService.js → WorkoutSFR.service.js} +1 -1
  86. package/lib/services/workout/util/SFR/WorkoutSFR.service.js.map +1 -0
  87. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.d.ts +53 -0
  88. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.d.ts.map +1 -0
  89. package/lib/services/workout/util/VolumePlanning/{WorkoutVolumePlanningService.js → WorkoutVolumePlanning.service.js} +53 -53
  90. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.js.map +1 -0
  91. package/lib/services/workout/util/VolumePlanning/{WorkoutVolumePlanningService.ts → WorkoutVolumePlanning.service.ts} +52 -52
  92. package/package.json +4 -4
  93. package/lib/services/DocumentService.d.ts.map +0 -1
  94. package/lib/services/DocumentService.js.map +0 -1
  95. package/lib/services/dashboard/Task/TaskFilterService.d.ts.map +0 -1
  96. package/lib/services/dashboard/Task/TaskFilterService.js.map +0 -1
  97. package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts.map +0 -1
  98. package/lib/services/dashboard/Task/TaskRecurrenceService.js.map +0 -1
  99. package/lib/services/dashboard/Task/TaskService.d.ts.map +0 -1
  100. package/lib/services/dashboard/Task/TaskService.js.map +0 -1
  101. package/lib/services/dashboard/Task/TaskSortService.d.ts.map +0 -1
  102. package/lib/services/dashboard/Task/TaskSortService.js.map +0 -1
  103. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.d.ts.map +0 -1
  104. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.js.map +0 -1
  105. package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts +0 -99
  106. package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts.map +0 -1
  107. package/lib/services/workout/Exercise/WorkoutExerciseService.js.map +0 -1
  108. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts.map +0 -1
  109. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js.map +0 -1
  110. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts.map +0 -1
  111. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js.map +0 -1
  112. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts.map +0 -1
  113. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js.map +0 -1
  114. package/lib/services/workout/Session/WorkoutSessionService.d.ts.map +0 -1
  115. package/lib/services/workout/Session/WorkoutSessionService.js.map +0 -1
  116. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts.map +0 -1
  117. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js.map +0 -1
  118. package/lib/services/workout/Set/WorkoutSetService.d.ts.map +0 -1
  119. package/lib/services/workout/Set/WorkoutSetService.js.map +0 -1
  120. package/lib/services/workout/util/SFR/WorkoutSFRService.d.ts.map +0 -1
  121. package/lib/services/workout/util/SFR/WorkoutSFRService.js.map +0 -1
  122. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts +0 -198
  123. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts.map +0 -1
  124. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js.map +0 -1
  125. /package/lib/services/{DocumentService.ts → Document.service.ts} +0 -0
  126. /package/lib/services/dashboard/Task/{TaskFilterService.ts → TaskFilter.service.ts} +0 -0
  127. /package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.ts → WorkoutEquipmentType.service.ts} +0 -0
  128. /package/lib/services/workout/util/SFR/{WorkoutSFRService.ts → WorkoutSFR.service.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import WorkoutSessionExerciseService from '../../SessionExercise/WorkoutSessionExerciseService.js';
1
+ import WorkoutSessionExerciseService from '../../SessionExercise/WorkoutSessionExercise.service.js';
2
2
  /**
3
3
  * A service for handling volume planning operations across microcycles.
4
4
  *
@@ -31,22 +31,22 @@ export default class WorkoutVolumePlanningService {
31
31
  * established, the flag and legacy path should be removed.
32
32
  */
33
33
  static USE_VOLUME_LANDMARK_PROGRESSION = false;
34
- static MAX_SETS_PER_EXERCISE = 8;
35
- static MAX_SETS_PER_MUSCLE_GROUP_PER_SESSION = 10;
34
+ static #MAX_SETS_PER_EXERCISE = 8;
35
+ static #MAX_SETS_PER_MUSCLE_GROUP_PER_SESSION = 10;
36
36
  /** Minimum average RSM required for a mesocycle to count toward MEV estimation. */
37
- static MEV_RSM_THRESHOLD = 4;
37
+ static #MEV_RSM_THRESHOLD = 4;
38
38
  /** Default estimated MEV when no qualifying mesocycle history exists. Per-exercise value. */
39
- static DEFAULT_MEV_PER_EXERCISE = 2;
39
+ static #DEFAULT_MEV_PER_EXERCISE = 2;
40
40
  /** Minimum average performance score (or recovery presence) to count a mesocycle toward MRV estimation. */
41
- static MRV_PERFORMANCE_THRESHOLD = 2.5;
41
+ static #MRV_PERFORMANCE_THRESHOLD = 2.5;
42
42
  /** Extra sets added above the historical peak when no stressed mesocycles exist, to estimate MRV. */
43
- static MRV_HEADROOM = 2;
43
+ static #MRV_HEADROOM = 2;
44
44
  /** Default estimated MRV when no mesocycle history exists at all. Per-exercise value. */
45
- static DEFAULT_MRV_PER_EXERCISE = 8;
45
+ static #DEFAULT_MRV_PER_EXERCISE = 8;
46
46
  /** Maximum sets that can be added to a single exercise in one progression step. */
47
- static MAX_SET_ADDITION_PER_EXERCISE = 2;
47
+ static #MAX_SET_ADDITION_PER_EXERCISE = 2;
48
48
  /** Maximum total sets to distribute across a muscle group in one progression step. */
49
- static MAX_TOTAL_SET_ADDITIONS = 3;
49
+ static #MAX_TOTAL_SET_ADDITIONS = 3;
50
50
  /**
51
51
  * Calculates the set plan for an entire microcycle.
52
52
  */
@@ -57,7 +57,7 @@ export default class WorkoutVolumePlanningService {
57
57
  const exerciseIdToSetCount = new Map();
58
58
  const recoveryExerciseIds = new Set();
59
59
  context.muscleGroupToExerciseCTOsMap.values().forEach((muscleGroupExerciseCTOs) => {
60
- const result = this.calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex, muscleGroupExerciseCTOs, isDeloadMicrocycle);
60
+ const result = this.#calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex, muscleGroupExerciseCTOs, isDeloadMicrocycle);
61
61
  for (const [workoutExerciseId, setCount] of result.exerciseIdToSetCount) {
62
62
  exerciseIdToSetCount.set(workoutExerciseId, setCount);
63
63
  }
@@ -78,7 +78,7 @@ export default class WorkoutVolumePlanningService {
78
78
  const { mesocycleHistory } = volumeCTO;
79
79
  // Estimated MEV
80
80
  let estimatedMev;
81
- const effectiveMesocycles = mesocycleHistory.filter((m) => m.avgRsm !== null && m.avgRsm >= this.MEV_RSM_THRESHOLD);
81
+ const effectiveMesocycles = mesocycleHistory.filter((m) => m.avgRsm !== null && m.avgRsm >= this.#MEV_RSM_THRESHOLD);
82
82
  if (effectiveMesocycles.length > 0) {
83
83
  estimatedMev =
84
84
  effectiveMesocycles.reduce((sum, m) => sum + m.startingSetCount, 0) /
@@ -89,12 +89,12 @@ export default class WorkoutVolumePlanningService {
89
89
  estimatedMev = Math.min(...mesocycleHistory.map((m) => m.startingSetCount));
90
90
  }
91
91
  else {
92
- estimatedMev = this.DEFAULT_MEV_PER_EXERCISE;
92
+ estimatedMev = this.#DEFAULT_MEV_PER_EXERCISE;
93
93
  }
94
94
  // Estimated MRV
95
95
  let estimatedMrv;
96
96
  const stressedMesocycles = mesocycleHistory.filter((m) => (m.avgPerformanceScore !== null &&
97
- m.avgPerformanceScore >= this.MRV_PERFORMANCE_THRESHOLD) ||
97
+ m.avgPerformanceScore >= this.#MRV_PERFORMANCE_THRESHOLD) ||
98
98
  m.recoverySessionCount > 0);
99
99
  if (stressedMesocycles.length > 0) {
100
100
  estimatedMrv =
@@ -102,10 +102,10 @@ export default class WorkoutVolumePlanningService {
102
102
  estimatedMrv = Math.round(estimatedMrv);
103
103
  }
104
104
  else if (mesocycleHistory.length > 0) {
105
- estimatedMrv = Math.max(...mesocycleHistory.map((m) => m.peakSetCount)) + this.MRV_HEADROOM;
105
+ estimatedMrv = Math.max(...mesocycleHistory.map((m) => m.peakSetCount)) + this.#MRV_HEADROOM;
106
106
  }
107
107
  else {
108
- estimatedMrv = this.DEFAULT_MRV_PER_EXERCISE;
108
+ estimatedMrv = this.#DEFAULT_MRV_PER_EXERCISE;
109
109
  }
110
110
  // Ensure MRV > MEV
111
111
  if (estimatedMrv <= estimatedMev) {
@@ -127,7 +127,7 @@ export default class WorkoutVolumePlanningService {
127
127
  *
128
128
  * Falls back to baseline when no previous microcycle data exists.
129
129
  */
130
- static calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex, muscleGroupExerciseCTOs, isDeloadMicrocycle) {
130
+ static #calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex, muscleGroupExerciseCTOs, isDeloadMicrocycle) {
131
131
  const exerciseIdToSetCount = new Map();
132
132
  const recoveryExerciseIds = new Set();
133
133
  const sessionIndexToExerciseIds = new Map();
@@ -137,12 +137,12 @@ export default class WorkoutVolumePlanningService {
137
137
  const volumeLandmark = primaryMuscleGroupId
138
138
  ? context.muscleGroupToVolumeLandmarkMap.get(primaryMuscleGroupId)
139
139
  : undefined;
140
- const { startVolume, endVolume } = this.getVolumeTargetsForMuscleGroup(volumeLandmark, muscleGroupExerciseCTOs.length, progressionInterval);
140
+ const { startVolume, endVolume } = this.#getVolumeTargetsForMuscleGroup(volumeLandmark, muscleGroupExerciseCTOs.length, progressionInterval);
141
141
  // 2. Calculate baseline set counts for all exercises in the muscle group
142
- const baselineCounts = this.calculateBaselineSetCounts(microcycleIndex, context.accumulationMicrocycleCount, muscleGroupExerciseCTOs.length, startVolume, endVolume, isDeloadMicrocycle, progressionInterval);
142
+ const baselineCounts = this.#calculateBaselineSetCounts(microcycleIndex, context.accumulationMicrocycleCount, muscleGroupExerciseCTOs.length, startVolume, endVolume, isDeloadMicrocycle, progressionInterval);
143
143
  // 3. Assign baselines and build session-to-exercise index
144
144
  muscleGroupExerciseCTOs.forEach((cto, index) => {
145
- exerciseIdToSetCount.set(cto._id, Math.min(baselineCounts[index], this.MAX_SETS_PER_EXERCISE));
145
+ exerciseIdToSetCount.set(cto._id, Math.min(baselineCounts[index], this.#MAX_SETS_PER_EXERCISE));
146
146
  if (!context.exerciseIdToSessionIndex)
147
147
  return;
148
148
  const exerciseSessionIndex = context.exerciseIdToSessionIndex.get(cto._id);
@@ -154,22 +154,22 @@ export default class WorkoutVolumePlanningService {
154
154
  });
155
155
  // 4. Resolve historical data — returns null if no usable history exists
156
156
  const exerciseIds = new Set(muscleGroupExerciseCTOs.map((cto) => cto._id));
157
- const historicalData = this.resolveHistoricalExerciseData(context, microcycleIndex, exerciseIds);
157
+ const historicalData = this.#resolveHistoricalExerciseData(context, microcycleIndex, exerciseIds);
158
158
  if (!historicalData)
159
159
  return { exerciseIdToSetCount, recoveryExerciseIds };
160
160
  // 5. Apply historical set counts (overrides baselines)
161
- this.applyHistoricalSetCounts(muscleGroupExerciseCTOs, historicalData.exerciseIdToPrevSessionExercise, historicalData.exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, isDeloadMicrocycle, volumeLandmark);
161
+ this.#applyHistoricalSetCounts(muscleGroupExerciseCTOs, historicalData.exerciseIdToPrevSessionExercise, historicalData.exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, isDeloadMicrocycle, volumeLandmark);
162
162
  // Deload microcycles and zero-progression cycles (Resensitization) skip SFR-based set additions
163
163
  if (isDeloadMicrocycle || progressionInterval === 0) {
164
164
  return { exerciseIdToSetCount, recoveryExerciseIds };
165
165
  }
166
166
  // 6. Evaluate SFR recommendations (per-exercise SFR + recovery detection)
167
- const { totalSetsToAdd, candidates } = this.evaluateSfrRecommendations(context, muscleGroupExerciseCTOs, historicalData.exerciseIdToPrevSessionExercise, historicalData.exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, recoveryExerciseIds, sessionIndexToExerciseIds);
167
+ const { totalSetsToAdd, candidates } = this.#evaluateSfrRecommendations(context, muscleGroupExerciseCTOs, historicalData.exerciseIdToPrevSessionExercise, historicalData.exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, recoveryExerciseIds, sessionIndexToExerciseIds);
168
168
  if (totalSetsToAdd === 0 || candidates.length === 0) {
169
169
  return { exerciseIdToSetCount, recoveryExerciseIds };
170
170
  }
171
171
  // 7. Distribute added sets to candidates by SFR quality
172
- this.distributeSetsToExercises(candidates, totalSetsToAdd, exerciseIdToSetCount, context.exerciseIdToSessionIndex, sessionIndexToExerciseIds);
172
+ this.#distributeSetsToExercises(candidates, totalSetsToAdd, exerciseIdToSetCount, context.exerciseIdToSessionIndex, sessionIndexToExerciseIds);
173
173
  return { exerciseIdToSetCount, recoveryExerciseIds };
174
174
  }
175
175
  /**
@@ -180,12 +180,12 @@ export default class WorkoutVolumePlanningService {
180
180
  * @param exerciseCount Number of exercises in the muscle group.
181
181
  * @param progressionInterval Cycle-type progression interval (1=MuscleGain, 2=Cut, 0=Resensitization).
182
182
  */
183
- static getVolumeTargetsForMuscleGroup(volumeLandmark, exerciseCount, progressionInterval) {
183
+ static #getVolumeTargetsForMuscleGroup(volumeLandmark, exerciseCount, progressionInterval) {
184
184
  // Resensitization (interval=0): flat at estimated MEV (or default when no history)
185
185
  if (progressionInterval === 0) {
186
186
  const flatVolume = volumeLandmark && volumeLandmark.mesocycleCount > 0
187
187
  ? volumeLandmark.estimatedMev
188
- : this.DEFAULT_MEV_PER_EXERCISE * exerciseCount;
188
+ : this.#DEFAULT_MEV_PER_EXERCISE * exerciseCount;
189
189
  return { startVolume: flatVolume, endVolume: flatVolume };
190
190
  }
191
191
  // With historical volume landmarks
@@ -199,8 +199,8 @@ export default class WorkoutVolumePlanningService {
199
199
  return { startVolume, endVolume };
200
200
  }
201
201
  // No history: use per-exercise defaults
202
- const startVolume = this.DEFAULT_MEV_PER_EXERCISE * exerciseCount;
203
- const mrvTotal = this.DEFAULT_MRV_PER_EXERCISE * exerciseCount;
202
+ const startVolume = this.#DEFAULT_MEV_PER_EXERCISE * exerciseCount;
203
+ const mrvTotal = this.#DEFAULT_MRV_PER_EXERCISE * exerciseCount;
204
204
  // Cut: target MAV (midpoint), not MRV
205
205
  const endVolume = progressionInterval === 2 ? Math.ceil((startVolume + mrvTotal) / 2) : mrvTotal;
206
206
  return { startVolume, endVolume };
@@ -222,9 +222,9 @@ export default class WorkoutVolumePlanningService {
222
222
  * @param isDeloadMicrocycle Whether this is a deload microcycle.
223
223
  * @param progressionInterval Microcycles between each set addition (0 = no progression).
224
224
  */
225
- static calculateBaselineSetCounts(microcycleIndex, accumulationMicrocycleCount, exerciseCount, startVolume, endVolume, isDeloadMicrocycle, progressionInterval) {
225
+ static #calculateBaselineSetCounts(microcycleIndex, accumulationMicrocycleCount, exerciseCount, startVolume, endVolume, isDeloadMicrocycle, progressionInterval) {
226
226
  if (isDeloadMicrocycle) {
227
- const lastAccumulationCounts = this.calculateBaselineSetCounts(microcycleIndex - 1, accumulationMicrocycleCount, exerciseCount, startVolume, endVolume, false, progressionInterval);
227
+ const lastAccumulationCounts = this.#calculateBaselineSetCounts(microcycleIndex - 1, accumulationMicrocycleCount, exerciseCount, startVolume, endVolume, false, progressionInterval);
228
228
  return lastAccumulationCounts.map((count) => Math.max(1, Math.floor(count / 2)));
229
229
  }
230
230
  let totalSets;
@@ -243,7 +243,7 @@ export default class WorkoutVolumePlanningService {
243
243
  const progressionSets = progressionInterval === 0 ? 0 : Math.ceil(microcycleIndex / progressionInterval);
244
244
  totalSets = startVolume + progressionSets;
245
245
  }
246
- return this.distributeEvenly(totalSets, exerciseCount);
246
+ return this.#distributeEvenly(totalSets, exerciseCount);
247
247
  }
248
248
  /**
249
249
  * Distributes a total evenly across N slots, with remainder going to earlier slots.
@@ -251,7 +251,7 @@ export default class WorkoutVolumePlanningService {
251
251
  * @param total The total to distribute.
252
252
  * @param slots The number of slots to distribute across.
253
253
  */
254
- static distributeEvenly(total, slots) {
254
+ static #distributeEvenly(total, slots) {
255
255
  const base = Math.floor(total / slots);
256
256
  const remainder = total % slots;
257
257
  return Array.from({ length: slots }, (_, i) => (i < remainder ? base + 1 : base));
@@ -267,7 +267,7 @@ export default class WorkoutVolumePlanningService {
267
267
  * @param microcycleIndex The current microcycle index.
268
268
  * @param exerciseIds The exercise IDs to search for.
269
269
  */
270
- static resolveHistoricalExerciseData(context, microcycleIndex, exerciseIds) {
270
+ static #resolveHistoricalExerciseData(context, microcycleIndex, exerciseIds) {
271
271
  let previousMicrocycleIndex = microcycleIndex - 1;
272
272
  let previousMicrocycle = context.microcyclesInOrder[previousMicrocycleIndex];
273
273
  if (!previousMicrocycle)
@@ -324,13 +324,13 @@ export default class WorkoutVolumePlanningService {
324
324
  * @param isDeloadMicrocycle Whether this is a deload microcycle.
325
325
  * @param volumeLandmark Volume landmark estimate for the primary muscle group, if available.
326
326
  */
327
- static applyHistoricalSetCounts(muscleGroupExerciseCTOs, exerciseIdToPrevSessionExercise, exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, isDeloadMicrocycle, volumeLandmark) {
327
+ static #applyHistoricalSetCounts(muscleGroupExerciseCTOs, exerciseIdToPrevSessionExercise, exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, isDeloadMicrocycle, volumeLandmark) {
328
328
  // Pre-compute per-exercise MAV distribution for exercises returning from recovery.
329
329
  // Uses floor-based even distribution (conservative) per the source material's guidance
330
330
  // to err on the lighter side when returning from recovery.
331
331
  const hasExerciseReturningFromRecovery = muscleGroupExerciseCTOs.some((cto) => exercisesThatWerePreviouslyInRecovery.has(cto._id));
332
332
  const mavDistribution = hasExerciseReturningFromRecovery && volumeLandmark
333
- ? this.distributeEvenly(volumeLandmark.estimatedMav, muscleGroupExerciseCTOs.length)
333
+ ? this.#distributeEvenly(volumeLandmark.estimatedMav, muscleGroupExerciseCTOs.length)
334
334
  : undefined;
335
335
  muscleGroupExerciseCTOs.forEach((cto, index) => {
336
336
  const previousSessionExercise = exerciseIdToPrevSessionExercise.get(cto._id);
@@ -339,11 +339,11 @@ export default class WorkoutVolumePlanningService {
339
339
  let setCount;
340
340
  if (exercisesThatWerePreviouslyInRecovery.has(cto._id) && mavDistribution) {
341
341
  // Returning from recovery — resume at conservatively distributed MAV
342
- setCount = Math.min(mavDistribution[index], this.MAX_SETS_PER_EXERCISE);
342
+ setCount = Math.min(mavDistribution[index], this.#MAX_SETS_PER_EXERCISE);
343
343
  }
344
344
  else {
345
345
  // Carry forward last microcycle's set count
346
- setCount = Math.min(previousSessionExercise.setOrder.length, this.MAX_SETS_PER_EXERCISE);
346
+ setCount = Math.min(previousSessionExercise.setOrder.length, this.#MAX_SETS_PER_EXERCISE);
347
347
  }
348
348
  if (isDeloadMicrocycle) {
349
349
  // Deload: halve volume, minimum 1 set
@@ -364,7 +364,7 @@ export default class WorkoutVolumePlanningService {
364
364
  * @param recoveryExerciseIds Set of exercise IDs flagged for recovery (mutated).
365
365
  * @param sessionIndexToExerciseIds Map from session index to exercise IDs in that session.
366
366
  */
367
- static evaluateSfrRecommendations(context, muscleGroupExerciseCTOs, exerciseIdToPrevSessionExercise, exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, recoveryExerciseIds, sessionIndexToExerciseIds) {
367
+ static #evaluateSfrRecommendations(context, muscleGroupExerciseCTOs, exerciseIdToPrevSessionExercise, exercisesThatWerePreviouslyInRecovery, exerciseIdToSetCount, recoveryExerciseIds, sessionIndexToExerciseIds) {
368
368
  let totalSetsToAdd = 0;
369
369
  const candidates = [];
370
370
  muscleGroupExerciseCTOs.forEach((cto, muscleGroupIndex) => {
@@ -392,8 +392,8 @@ export default class WorkoutVolumePlanningService {
392
392
  // Accumulate SFR-recommended additions into shared total
393
393
  totalSetsToAdd += recommendation;
394
394
  // Only exercises below per-exercise cap and in uncapped sessions are candidates
395
- if (previousSessionExercise.setOrder.length < this.MAX_SETS_PER_EXERCISE &&
396
- !this.sessionIsCapped(cto._id, context.exerciseIdToSessionIndex, sessionIndexToExerciseIds, exerciseIdToPrevSessionExercise)) {
395
+ if (previousSessionExercise.setOrder.length < this.#MAX_SETS_PER_EXERCISE &&
396
+ !this.#sessionIsCapped(cto._id, context.exerciseIdToSessionIndex, sessionIndexToExerciseIds, exerciseIdToPrevSessionExercise)) {
397
397
  candidates.push({
398
398
  exerciseId: cto._id,
399
399
  // Don't error if SFR is null for now, just treat as very low
@@ -417,18 +417,18 @@ export default class WorkoutVolumePlanningService {
417
417
  * @param exerciseIdToSessionIndex Map from exercise ID to its session index.
418
418
  * @param sessionIndexToExerciseIds Map from session index to exercise IDs in that session.
419
419
  */
420
- static distributeSetsToExercises(candidates, totalSetsToAdd, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds) {
420
+ static #distributeSetsToExercises(candidates, totalSetsToAdd, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds) {
421
421
  // Prioritize exercises with highest SFR (best stimulus-to-fatigue ratio)
422
422
  candidates.sort((candidateA, candidateB) => candidateA.sfr !== candidateB.sfr
423
423
  ? candidateB.sfr - candidateA.sfr
424
424
  : candidateA.muscleGroupIndex - candidateB.muscleGroupIndex);
425
425
  // Cap total additions at MAX_TOTAL_SET_ADDITIONS regardless of raw recommendation
426
- let setsRemaining = totalSetsToAdd >= this.MAX_TOTAL_SET_ADDITIONS
427
- ? this.MAX_TOTAL_SET_ADDITIONS
426
+ let setsRemaining = totalSetsToAdd >= this.#MAX_TOTAL_SET_ADDITIONS
427
+ ? this.#MAX_TOTAL_SET_ADDITIONS
428
428
  : totalSetsToAdd;
429
429
  // Distribute sets one candidate at a time until budget is exhausted
430
430
  for (const candidate of candidates) {
431
- const added = this.addSetsToExercise(candidate.exerciseId, setsRemaining, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds);
431
+ const added = this.#addSetsToExercise(candidate.exerciseId, setsRemaining, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds);
432
432
  setsRemaining -= added;
433
433
  if (setsRemaining === 0)
434
434
  break;
@@ -443,7 +443,7 @@ export default class WorkoutVolumePlanningService {
443
443
  * @param sessionIndexToExerciseIds Map from session index to exercise IDs in that session.
444
444
  * @param exerciseIdToPrevSessionExercise Map from exercise ID to its previous session exercise.
445
445
  */
446
- static sessionIsCapped(exerciseId, exerciseIdToSessionIndex, sessionIndexToExerciseIds, exerciseIdToPrevSessionExercise) {
446
+ static #sessionIsCapped(exerciseId, exerciseIdToSessionIndex, sessionIndexToExerciseIds, exerciseIdToPrevSessionExercise) {
447
447
  if (!exerciseIdToSessionIndex) {
448
448
  throw new Error('WorkoutMesocyclePlanContext.exerciseIdToSessionIndex is not initialized. This should be set during mesocycle planning.');
449
449
  }
@@ -457,7 +457,7 @@ export default class WorkoutVolumePlanningService {
457
457
  exerciseIdsInSession.forEach((id) => {
458
458
  totalSetsInSession += exerciseIdToPrevSessionExercise.get(id)?.setOrder.length || 0;
459
459
  });
460
- return totalSetsInSession >= this.MAX_SETS_PER_MUSCLE_GROUP_PER_SESSION;
460
+ return totalSetsInSession >= this.#MAX_SETS_PER_MUSCLE_GROUP_PER_SESSION;
461
461
  }
462
462
  /**
463
463
  * Gets the total sets currently planned for a session containing the given exercise.
@@ -467,7 +467,7 @@ export default class WorkoutVolumePlanningService {
467
467
  * @param exerciseIdToSessionIndex Map from exercise ID to its session index.
468
468
  * @param sessionIndexToExerciseIds Map from session index to exercise IDs in that session.
469
469
  */
470
- static getSessionSetTotal(exerciseId, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds) {
470
+ static #getSessionSetTotal(exerciseId, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds) {
471
471
  if (!exerciseIdToSessionIndex)
472
472
  return 0;
473
473
  const sessionIndex = exerciseIdToSessionIndex.get(exerciseId);
@@ -493,17 +493,17 @@ export default class WorkoutVolumePlanningService {
493
493
  * @param sessionIndexToExerciseIds Map from session index to exercise IDs in that session.
494
494
  * @returns The number of sets actually added.
495
495
  */
496
- static addSetsToExercise(exerciseId, setsToAdd, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds) {
496
+ static #addSetsToExercise(exerciseId, setsToAdd, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds) {
497
497
  const currentSets = exerciseIdToSetCount.get(exerciseId) || 0;
498
- const sessionTotal = this.getSessionSetTotal(exerciseId, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds);
498
+ const sessionTotal = this.#getSessionSetTotal(exerciseId, exerciseIdToSetCount, exerciseIdToSessionIndex, sessionIndexToExerciseIds);
499
499
  // Respect all caps: per-exercise max, per-session max, and per-addition max
500
- const maxDueToExerciseLimit = this.MAX_SETS_PER_EXERCISE - currentSets;
501
- const maxDueToSessionLimit = this.MAX_SETS_PER_MUSCLE_GROUP_PER_SESSION - sessionTotal;
502
- const maxAddable = Math.min(setsToAdd, maxDueToExerciseLimit, maxDueToSessionLimit, this.MAX_SET_ADDITION_PER_EXERCISE);
500
+ const maxDueToExerciseLimit = this.#MAX_SETS_PER_EXERCISE - currentSets;
501
+ const maxDueToSessionLimit = this.#MAX_SETS_PER_MUSCLE_GROUP_PER_SESSION - sessionTotal;
502
+ const maxAddable = Math.min(setsToAdd, maxDueToExerciseLimit, maxDueToSessionLimit, this.#MAX_SET_ADDITION_PER_EXERCISE);
503
503
  if (maxAddable > 0) {
504
504
  exerciseIdToSetCount.set(exerciseId, currentSets + maxAddable);
505
505
  }
506
506
  return maxAddable;
507
507
  }
508
508
  }
509
- //# sourceMappingURL=WorkoutVolumePlanningService.js.map
509
+ //# sourceMappingURL=WorkoutVolumePlanning.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkoutVolumePlanning.service.js","sourceRoot":"","sources":["../../../../../src/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.ts"],"names":[],"mappings":"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"}