@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.
- package/CHANGELOG.md +8 -0
- package/lib/browser.d.ts +14 -14
- package/lib/browser.d.ts.map +1 -1
- package/lib/browser.js +12 -12
- package/lib/browser.js.map +1 -1
- package/lib/browser.ts +14 -14
- package/lib/documents/BaseDocument.js +1 -1
- package/lib/documents/BaseDocument.js.map +1 -1
- package/lib/documents/BaseDocument.ts +1 -1
- package/lib/documents/dashboard/Task.d.ts +1 -1
- package/lib/documents/dashboard/Task.d.ts.map +1 -1
- package/lib/documents/dashboard/Task.ts +1 -1
- package/lib/schemas/UUIDSchema.js +1 -1
- package/lib/schemas/UUIDSchema.js.map +1 -1
- package/lib/schemas/UUIDSchema.ts +1 -1
- package/lib/services/{DocumentService.d.ts → Document.service.d.ts} +1 -1
- package/lib/services/Document.service.d.ts.map +1 -0
- package/lib/services/{DocumentService.js → Document.service.js} +1 -1
- package/lib/services/Document.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskService.d.ts → Task.service.d.ts} +2 -10
- package/lib/services/dashboard/Task/Task.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskService.js → Task.service.js} +8 -8
- package/lib/services/dashboard/Task/Task.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskService.ts → Task.service.ts} +8 -8
- package/lib/services/dashboard/Task/{TaskFilterService.d.ts → TaskFilter.service.d.ts} +1 -1
- package/lib/services/dashboard/Task/TaskFilter.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskFilterService.js → TaskFilter.service.js} +1 -1
- package/lib/services/dashboard/Task/TaskFilter.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskRecurrenceService.d.ts → TaskRecurrence.service.d.ts} +2 -9
- package/lib/services/dashboard/Task/TaskRecurrence.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskRecurrenceService.js → TaskRecurrence.service.js} +6 -6
- package/lib/services/dashboard/Task/TaskRecurrence.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskRecurrenceService.ts → TaskRecurrence.service.ts} +5 -8
- package/lib/services/dashboard/Task/{TaskSortService.d.ts → TaskSort.service.d.ts} +2 -42
- package/lib/services/dashboard/Task/TaskSort.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskSortService.js → TaskSort.service.js} +12 -12
- package/lib/services/dashboard/Task/TaskSort.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskSortService.ts → TaskSort.service.ts} +11 -11
- package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.d.ts → WorkoutEquipmentType.service.d.ts} +1 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentType.service.d.ts.map +1 -0
- package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.js → WorkoutEquipmentType.service.js} +1 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentType.service.js.map +1 -0
- package/lib/services/workout/Exercise/WorkoutExercise.service.d.ts +52 -0
- package/lib/services/workout/Exercise/WorkoutExercise.service.d.ts.map +1 -0
- package/lib/services/workout/Exercise/{WorkoutExerciseService.js → WorkoutExercise.service.js} +18 -18
- package/lib/services/workout/Exercise/WorkoutExercise.service.js.map +1 -0
- package/lib/services/workout/Exercise/{WorkoutExerciseService.ts → WorkoutExercise.service.ts} +17 -17
- package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.d.ts → WorkoutExerciseCalibration.service.d.ts} +2 -12
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.d.ts.map +1 -0
- package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.js → WorkoutExerciseCalibration.service.js} +10 -7
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.js.map +1 -0
- package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.ts → WorkoutExerciseCalibration.service.ts} +10 -7
- package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.d.ts → WorkoutMesocycle.service.d.ts} +3 -41
- package/lib/services/workout/Mesocycle/WorkoutMesocycle.service.d.ts.map +1 -0
- package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.js → WorkoutMesocycle.service.js} +21 -21
- package/lib/services/workout/Mesocycle/WorkoutMesocycle.service.js.map +1 -0
- package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.ts → WorkoutMesocycle.service.ts} +21 -21
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts +1 -10
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js +3 -3
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.ts +3 -3
- package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.d.ts → WorkoutMicrocycle.service.d.ts} +1 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycle.service.d.ts.map +1 -0
- package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.js → WorkoutMicrocycle.service.js} +4 -4
- package/lib/services/workout/Microcycle/WorkoutMicrocycle.service.js.map +1 -0
- package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.ts → WorkoutMicrocycle.service.ts} +3 -3
- package/lib/services/workout/Session/{WorkoutSessionService.d.ts → WorkoutSession.service.d.ts} +2 -6
- package/lib/services/workout/Session/WorkoutSession.service.d.ts.map +1 -0
- package/lib/services/workout/Session/{WorkoutSessionService.js → WorkoutSession.service.js} +5 -5
- package/lib/services/workout/Session/WorkoutSession.service.js.map +1 -0
- package/lib/services/workout/Session/{WorkoutSessionService.ts → WorkoutSession.service.ts} +4 -4
- package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.d.ts → WorkoutSessionExercise.service.d.ts} +2 -8
- package/lib/services/workout/SessionExercise/WorkoutSessionExercise.service.d.ts.map +1 -0
- package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.js → WorkoutSessionExercise.service.js} +5 -5
- package/lib/services/workout/SessionExercise/WorkoutSessionExercise.service.js.map +1 -0
- package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.ts → WorkoutSessionExercise.service.ts} +4 -4
- package/lib/services/workout/Set/{WorkoutSetService.d.ts → WorkoutSet.service.d.ts} +2 -23
- package/lib/services/workout/Set/WorkoutSet.service.d.ts.map +1 -0
- package/lib/services/workout/Set/{WorkoutSetService.js → WorkoutSet.service.js} +7 -7
- package/lib/services/workout/Set/WorkoutSet.service.js.map +1 -0
- package/lib/services/workout/Set/{WorkoutSetService.ts → WorkoutSet.service.ts} +6 -6
- package/lib/services/workout/util/SFR/{WorkoutSFRService.d.ts → WorkoutSFR.service.d.ts} +1 -1
- package/lib/services/workout/util/SFR/WorkoutSFR.service.d.ts.map +1 -0
- package/lib/services/workout/util/SFR/{WorkoutSFRService.js → WorkoutSFR.service.js} +1 -1
- package/lib/services/workout/util/SFR/WorkoutSFR.service.js.map +1 -0
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.d.ts +53 -0
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.d.ts.map +1 -0
- package/lib/services/workout/util/VolumePlanning/{WorkoutVolumePlanningService.js → WorkoutVolumePlanning.service.js} +53 -53
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.js.map +1 -0
- package/lib/services/workout/util/VolumePlanning/{WorkoutVolumePlanningService.ts → WorkoutVolumePlanning.service.ts} +52 -52
- package/package.json +4 -4
- package/lib/services/DocumentService.d.ts.map +0 -1
- package/lib/services/DocumentService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskFilterService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskFilterService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskRecurrenceService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskSortService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskSortService.js.map +0 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.d.ts.map +0 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.js.map +0 -1
- package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts +0 -99
- package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts.map +0 -1
- package/lib/services/workout/Exercise/WorkoutExerciseService.js.map +0 -1
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts.map +0 -1
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js.map +0 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts.map +0 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js.map +0 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts.map +0 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js.map +0 -1
- package/lib/services/workout/Session/WorkoutSessionService.d.ts.map +0 -1
- package/lib/services/workout/Session/WorkoutSessionService.js.map +0 -1
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts.map +0 -1
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js.map +0 -1
- package/lib/services/workout/Set/WorkoutSetService.d.ts.map +0 -1
- package/lib/services/workout/Set/WorkoutSetService.js.map +0 -1
- package/lib/services/workout/util/SFR/WorkoutSFRService.d.ts.map +0 -1
- package/lib/services/workout/util/SFR/WorkoutSFRService.js.map +0 -1
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts +0 -198
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts.map +0 -1
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js.map +0 -1
- /package/lib/services/{DocumentService.ts → Document.service.ts} +0 -0
- /package/lib/services/dashboard/Task/{TaskFilterService.ts → TaskFilter.service.ts} +0 -0
- /package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.ts → WorkoutEquipmentType.service.ts} +0 -0
- /package/lib/services/workout/util/SFR/{WorkoutSFRService.ts → WorkoutSFR.service.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import WorkoutSessionExerciseService from '../../SessionExercise/
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
105
|
+
estimatedMrv = Math.max(...mesocycleHistory.map((m) => m.peakSetCount)) + this.#MRV_HEADROOM;
|
|
106
106
|
}
|
|
107
107
|
else {
|
|
108
|
-
estimatedMrv = this
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
203
|
-
const mrvTotal = this
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
396
|
-
!this
|
|
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
|
|
427
|
-
? this
|
|
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
|
|
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
|
|
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
|
|
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
|
|
501
|
-
const maxDueToSessionLimit = this
|
|
502
|
-
const maxAddable = Math.min(setsToAdd, maxDueToExerciseLimit, maxDueToSessionLimit, this
|
|
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=
|
|
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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"}
|