@sunsteel/contracts 0.90.0 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -75,251 +75,6 @@ interface UpdateLocaleRequest {
75
75
  locale: AppLocale | null;
76
76
  }
77
77
 
78
- /**
79
- * Who may start a conversation with a member. `FOLLOWED`: members they follow.
80
- * `EVERYONE` (MSG-02): members they follow reach the inbox, anyone else lands
81
- * in Requests. `NOBODY`: no one may start a new one.
82
- */
83
- declare const MESSAGE_PERMISSIONS: readonly ["FOLLOWED", "EVERYONE", "NOBODY"];
84
- type MessagePermission = (typeof MESSAGE_PERMISSIONS)[number];
85
- declare const DEFAULT_MESSAGE_PERMISSION: MessagePermission;
86
- /** Characters in one message, counted as code points. */
87
- declare const MESSAGE_BODY_MAX = 2000;
88
- /** Messages one member may send in a rolling minute. */
89
- declare const MESSAGES_PER_MINUTE_MAX = 30;
90
- /** Conversations one member may start in a rolling day. */
91
- declare const NEW_CONVERSATIONS_PER_DAY_MAX = 20;
92
- declare const CONVERSATIONS_PAGE_SIZE = 20;
93
- declare const MESSAGES_PAGE_SIZE = 30;
94
- /** Length as a reader counts it: an emoji is one character, not two. */
95
- declare function messageBodyLength(body: string): number;
96
- /**
97
- * The stored form of a typed message: line endings made `\n` and the ends
98
- * trimmed, the lines in between kept as written. Null when it is empty or too
99
- * long -- it is refused rather than cut, because a message clipped mid-sentence
100
- * would misrepresent its author.
101
- */
102
- declare function normalizeMessageBody(body: string): string | null;
103
- /** The other participant, or null once their account was deleted. */
104
- interface ConversationMember {
105
- id: string;
106
- username: string;
107
- name: string;
108
- avatarUrl: string | null;
109
- }
110
- interface ConversationMessage {
111
- id: string;
112
- sentByMe: boolean;
113
- /**
114
- * Null once its author deleted it; the place stays as "Message deleted".
115
- * Also null for the other participant while moderation hides it (MSG-09).
116
- */
117
- body: string | null;
118
- deleted: boolean;
119
- /**
120
- * MSG-09: a moderator hid this message from the other participant. They read
121
- * "Removed by moderation" in its place; its author still reads the text and
122
- * is told it is hidden.
123
- */
124
- hiddenByModeration: boolean;
125
- createdAt: IsoDateString;
126
- }
127
- /**
128
- * MSG-02: a conversation that is still a request. `INCOMING`: the viewer may
129
- * accept, decline or block. `OUTGOING`: the viewer sent it and waits -- told
130
- * neither whether it was seen nor whether it was declined.
131
- */
132
- interface ConversationRequest {
133
- direction: "INCOMING" | "OUTGOING";
134
- }
135
- interface ConversationSummary {
136
- id: string;
137
- /** Null when the other member deleted their account ("Deleted member"). */
138
- counterpart: ConversationMember | null;
139
- /** The newest message the viewer can see, or null when there is none. */
140
- lastMessage: ConversationMessage | null;
141
- lastMessageAt: IsoDateString | null;
142
- /**
143
- * Whether the viewer may write in it now. False when the other member's
144
- * account is gone, or the viewer's own messaging is unavailable or
145
- * restricted.
146
- */
147
- canSend: boolean;
148
- /**
149
- * MSG-09: a moderator restricted the viewer's messaging, which is why they
150
- * cannot write. Only ever about the viewer: nobody else is told.
151
- */
152
- messagingRestricted: boolean;
153
- /**
154
- * MSG-03: the other member wrote something the viewer has not seen -- a
155
- * message after the viewer's read position that is neither deleted nor
156
- * removed for them. The viewer's own messages never count.
157
- */
158
- unread: boolean;
159
- /**
160
- * MSG-03: the viewer's read position, where "new since you last looked"
161
- * starts. Null when they have never read the conversation. It is the
162
- * viewer's alone: no read receipts, so a sender never learns it.
163
- */
164
- lastReadAt: IsoDateString | null;
165
- /** MSG-02: null once accepted, or for a conversation that never was a request. */
166
- request: ConversationRequest | null;
167
- }
168
- /**
169
- * MSG-02: GET /conversations?box=. The inbox holds accepted conversations
170
- * and the viewer's own requests; Requests holds the ones waiting for them.
171
- */
172
- declare const CONVERSATION_BOXES: readonly ["INBOX", "REQUESTS"];
173
- type ConversationBox = (typeof CONVERSATION_BOXES)[number];
174
- /**
175
- * MSG-02: after a decline, the same member's new request is refused for this
176
- * many days, unless the recipient follows them or writes first.
177
- */
178
- declare const MESSAGE_REQUEST_DECLINE_COOLDOWN_DAYS = 30;
179
- /** GET /conversations, newest activity first. */
180
- interface ConversationsResponse {
181
- conversations: ConversationSummary[];
182
- nextCursor: string | null;
183
- /** MSG-09: the viewer's own messaging is restricted by moderation. */
184
- messagingRestricted: boolean;
185
- }
186
- /**
187
- * MSG-09: a report of a message captures it and at most this many messages
188
- * before it in its conversation, as the reporter could see them then.
189
- */
190
- declare const MESSAGE_REPORT_CONTEXT_BEFORE = 5;
191
- /**
192
- * MSG-03: POST /conversations/:id/read. Moves the viewer's read position to
193
- * the message they have seen (`through`, the newest one on their screen),
194
- * never backwards, so a message that arrived after it stays unread.
195
- */
196
- interface MarkConversationReadRequest {
197
- through: string;
198
- }
199
- /** MSG-03: GET /conversations/unread, for the navigation's count. */
200
- interface UnreadConversationsResponse {
201
- /** Conversations with something new, not messages (owner, 2026-10-06). */
202
- unreadConversations: number;
203
- /**
204
- * MSG-02: requests waiting for the viewer. For the Requests tab only: they
205
- * never count in the navigation (owner, 2026-10-06).
206
- */
207
- requests: number;
208
- }
209
- /** GET /conversations/:id/messages, newest first; `cursor` pages older. */
210
- interface ConversationMessagesResponse {
211
- conversation: ConversationSummary;
212
- messages: ConversationMessage[];
213
- nextCursor: string | null;
214
- }
215
- /**
216
- * POST /conversations. Starts a conversation with its first message, so an
217
- * empty conversation never exists; when one with this member already exists
218
- * the message is sent there instead. `recipient` is a username or an id.
219
- */
220
- interface StartConversationRequest {
221
- recipient: string;
222
- body: string;
223
- }
224
- /** POST /conversations/:id/messages. */
225
- interface SendMessageRequest {
226
- body: string;
227
- }
228
- interface SendMessageResponse {
229
- conversation: ConversationSummary;
230
- message: ConversationMessage;
231
- }
232
- /** PUT /users/preferences/messages. */
233
- interface UpdateMessagePermissionRequest {
234
- messagePermission: MessagePermission;
235
- }
236
- /**
237
- * On the authenticated member profile only: whether the viewer may start a
238
- * conversation, and the one they already have. The server decides; a viewer
239
- * who may not is told nothing more.
240
- */
241
- interface MemberMessagingState {
242
- canStart: boolean;
243
- conversationId: string | null;
244
- /** MSG-02: a first message would land in their Requests. */
245
- asRequest: boolean;
246
- }
247
- declare function isMessagePermission(value: unknown): value is MessagePermission;
248
-
249
- /** A step id as the registry names it: lowercase words joined by hyphens. */
250
- declare const ONBOARDING_STEP_ID_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,39}$";
251
- declare const ONBOARDING_STEPS_MAX = 30;
252
- declare const ONBOARDING_VERSION_MAX = 1000;
253
- interface OnboardingState {
254
- /**
255
- * The registry version the account completed. A new account starts at 0;
256
- * accounts that existed when onboarding shipped start at 1, so they are
257
- * offered only steps added later.
258
- */
259
- completedVersion: number;
260
- /** Steps answered or skipped since that version, so the flow resumes. */
261
- stepsDone: string[];
262
- /** When the flow first opened by itself; it never does again. */
263
- offeredAt: IsoDateString | null;
264
- }
265
- /**
266
- * PUT /users/preferences/onboarding. Partial: `stepsDone` is added to what is
267
- * stored (two devices never undo each other), `completedVersion` only ever
268
- * rises and clears the steps, and `offered` records the first opening once.
269
- */
270
- interface UpdateOnboardingRequest {
271
- stepsDone?: string[];
272
- completedVersion?: number;
273
- offered?: true;
274
- }
275
- declare function isOnboardingStepId(value: unknown): value is string;
276
-
277
- /**
278
- * The weekday a week starts on, as `Date.getDay()` numbers it: 1 Monday, 0
279
- * Sunday. Monday is everyone's default, so nothing changes until a member
280
- * chooses. **The rank never follows it**: its active weeks are Monday weeks
281
- * for every member, because a rank is public and must mean the same on every
282
- * profile.
283
- */
284
- declare const WEEK_STARTS: readonly [1, 0];
285
- type WeekStartsOn = (typeof WEEK_STARTS)[number];
286
- declare const DEFAULT_WEEK_STARTS_ON: WeekStartsOn;
287
- declare function isWeekStartsOn(value: unknown): value is WeekStartsOn;
288
- /**
289
- * The first day of the week a `YYYY-MM-DD` calendar date belongs to, as a
290
- * `YYYY-MM-DD` date, for a week starting on `weekStartsOn`. Calendar
291
- * arithmetic only: no time zone, so a daylight-saving change cannot move it.
292
- */
293
- declare function weekStartOf(dateKey: string, weekStartsOn?: WeekStartsOn): string;
294
- /** PUT /users/preferences/week-start */
295
- interface UpdateWeekStartRequest {
296
- weekStartsOn: WeekStartsOn;
297
- }
298
- /**
299
- * How lengths are shown and typed: centimetres, or inches (a height in feet
300
- * and inches). Every length is **stored in centimetres**, as weights are
301
- * stored in kilograms; the unit is only the display and entry boundary.
302
- */
303
- declare const LENGTH_UNITS: readonly ["CM", "IN"];
304
- type LengthUnit = (typeof LENGTH_UNITS)[number];
305
- declare const CM_PER_INCH = 2.54;
306
- declare const INCHES_PER_FOOT = 12;
307
- /** Centimetres as inches, to two decimals. */
308
- declare function cmToInches(cm: number): number;
309
- /** Inches as centimetres, to two decimals. */
310
- declare function inchesToCm(inches: number): number;
311
- /**
312
- * A height in centimetres as whole feet and inches to one decimal. The total
313
- * is rounded before it is split, so 71.98 in reads as 6 ft 0 in, never as
314
- * 5 ft 12 in.
315
- */
316
- declare function cmToFeetInches(cm: number): {
317
- feet: number;
318
- inches: number;
319
- };
320
- /** Feet and inches as centimetres, to two decimals. */
321
- declare function feetInchesToCm(feet: number, inches: number): number;
322
-
323
78
  declare const SET_KINDS: readonly ["WORKING", "WARMUP", "DROP", "OPTIONAL"];
324
79
  type SetKind = (typeof SET_KINDS)[number];
325
80
  declare const SET_KIND_LABELS: Record<SetKind, string>;
@@ -606,18 +361,103 @@ interface SkipOccurrenceRequest {
606
361
  date: CalendarDate;
607
362
  }
608
363
 
609
- /** One routine may have this many current, non-overlapping planned blocks. */
610
- declare const ROUTINE_TRAINING_BLOCKS_MAX = 24;
611
- /** A started block keeps at most this many immutable revisions. */
612
- declare const ROUTINE_TRAINING_BLOCK_REVISIONS_MAX = 20;
613
- declare const ROUTINE_TRAINING_BLOCK_NAME_MAX = 60;
614
- declare const ROUTINE_TRAINING_BLOCK_STATES: readonly ["FUTURE", "ACTIVE", "COMPLETE"];
615
- type RoutineTrainingBlockState = (typeof ROUTINE_TRAINING_BLOCK_STATES)[number];
616
- declare const ROUTINE_TRAINING_BLOCK_SOURCE_KINDS: readonly ["CURRENT_ROUTINE", "SAVED_VERSION"];
617
- type RoutineTrainingBlockSourceKind = (typeof ROUTINE_TRAINING_BLOCK_SOURCE_KINDS)[number];
618
- /**
619
- * The origin is snapshotted so a later routine edit or ROUT-08 version
620
- * deletion cannot change what this block says it was authored from.
364
+ /** The longest deload, inclusive of both ends. */
365
+ declare const DELOAD_MAX_DAYS = 14;
366
+ /** The length a new deload is offered with. */
367
+ declare const DELOAD_DEFAULT_DAYS = 7;
368
+ /** How much lighter each set's load is, in percent. */
369
+ declare const DELOAD_LOAD_REDUCTIONS: readonly [0, 10, 20, 30, 40];
370
+ type DeloadLoadReduction = (typeof DELOAD_LOAD_REDUCTIONS)[number];
371
+ declare const DELOAD_DEFAULT_LOAD_REDUCTION: DeloadLoadReduction;
372
+ /** `HALF` keeps the first half of each exercise's sets, rounded up. */
373
+ declare const DELOAD_SET_MODES: readonly ["ALL", "HALF"];
374
+ type DeloadSetMode = (typeof DELOAD_SET_MODES)[number];
375
+ declare const DELOAD_DEFAULT_SET_MODE: DeloadSetMode;
376
+ declare const TEMPORARY_OVERRIDE_KINDS: readonly ["DELOAD"];
377
+ type TemporaryOverrideKind = (typeof TEMPORARY_OVERRIDE_KINDS)[number];
378
+ declare const TEMPORARY_OVERRIDE_SOURCE_KINDS: readonly ["BASELINE", "TRAINING_BLOCK"];
379
+ type TemporaryOverrideSourceKind = (typeof TEMPORARY_OVERRIDE_SOURCE_KINDS)[number];
380
+ interface DeloadOptions {
381
+ loadReductionPercent: DeloadLoadReduction;
382
+ setMode: DeloadSetMode;
383
+ }
384
+ /** Why a deload cannot be made from a prescription with these options. */
385
+ declare const DELOAD_NOT_LIGHTER = "Those options leave every set as it is: choose a lighter load or fewer sets";
386
+ declare function applyDeload(setup: RoutineVersionSetup, options: DeloadOptions): RoutineVersionSetup | null;
387
+ /** Days from `start` to `end`, both included. */
388
+ declare function deloadLengthDays(startDate: CalendarDate, endDate: CalendarDate): number;
389
+ /** Where a deload's prescription was copied from. */
390
+ interface TemporaryOverrideSource {
391
+ kind: TemporaryOverrideSourceKind;
392
+ trainingBlockId: string | null;
393
+ trainingBlockName: string | null;
394
+ }
395
+ /** One deload of a routine. State is relative to `today`. */
396
+ interface RoutineTemporaryOverride {
397
+ id: string;
398
+ routineId: string;
399
+ kind: TemporaryOverrideKind;
400
+ startDate: CalendarDate;
401
+ /** Moves to the day before it was ended when it is ended early. */
402
+ endDate: CalendarDate;
403
+ loadReductionPercent: DeloadLoadReduction;
404
+ setMode: DeloadSetMode;
405
+ source: TemporaryOverrideSource;
406
+ /** The prescription in force when the deload was created. */
407
+ originalSetup: RoutineVersionSetup;
408
+ /** The lighter prescription the deload trains. */
409
+ setup: RoutineVersionSetup;
410
+ endedEarlyAt: IsoDateString | null;
411
+ createdAt: IsoDateString;
412
+ state: 'FUTURE' | 'ACTIVE' | 'COMPLETE';
413
+ }
414
+ /** `GET /routines/:id/deloads`, newest start first. */
415
+ interface RoutineTemporaryOverridesResponse {
416
+ overrides: RoutineTemporaryOverride[];
417
+ maxDays: number;
418
+ /** The owner's local date every state is relative to. */
419
+ today: CalendarDate;
420
+ }
421
+ /** `POST /routines/:id/deloads` */
422
+ interface CreateDeloadRequest extends DeloadOptions {
423
+ startDate: CalendarDate;
424
+ endDate: CalendarDate;
425
+ }
426
+ /**
427
+ * A deload as a plan the resolver can place: its working-copy days (real ids,
428
+ * apart from the baseline and from any block) and the schedule of the plan it
429
+ * lightened. Owner-only, on `Routine.temporaryOverrides`.
430
+ */
431
+ interface RoutineTemporaryOverridePlan {
432
+ id: string;
433
+ kind: TemporaryOverrideKind;
434
+ startDate: CalendarDate;
435
+ endDate: CalendarDate;
436
+ scheduleMode: RoutineScheduleMode;
437
+ restDays: number[];
438
+ rotationWeekdays: number[];
439
+ /** ROTATION only: the underlying plan's next day, in this copy. */
440
+ nextRotationDayId: string | null;
441
+ days: RoutineDay[];
442
+ }
443
+ /** ROUT-16: the temporary override a session trained, copied onto it. */
444
+ interface SessionTemporaryOverride {
445
+ id: string;
446
+ kind: TemporaryOverrideKind;
447
+ }
448
+
449
+ /** One routine may have this many current, non-overlapping planned blocks. */
450
+ declare const ROUTINE_TRAINING_BLOCKS_MAX = 24;
451
+ /** A started block keeps at most this many immutable revisions. */
452
+ declare const ROUTINE_TRAINING_BLOCK_REVISIONS_MAX = 20;
453
+ declare const ROUTINE_TRAINING_BLOCK_NAME_MAX = 60;
454
+ declare const ROUTINE_TRAINING_BLOCK_STATES: readonly ["FUTURE", "ACTIVE", "COMPLETE"];
455
+ type RoutineTrainingBlockState = (typeof ROUTINE_TRAINING_BLOCK_STATES)[number];
456
+ declare const ROUTINE_TRAINING_BLOCK_SOURCE_KINDS: readonly ["CURRENT_ROUTINE", "SAVED_VERSION"];
457
+ type RoutineTrainingBlockSourceKind = (typeof ROUTINE_TRAINING_BLOCK_SOURCE_KINDS)[number];
458
+ /**
459
+ * The origin is snapshotted so a later routine edit or ROUT-08 version
460
+ * deletion cannot change what this block says it was authored from.
621
461
  */
622
462
  interface RoutineTrainingBlockSource {
623
463
  kind: RoutineTrainingBlockSourceKind;
@@ -762,110 +602,6 @@ interface RoutinePlanSource<D> {
762
602
  */
763
603
  declare function resolveRoutinePlan<D>(routine: RoutinePlanSource<D>, date: CalendarDate): ResolvedRoutinePlan<D>;
764
604
 
765
- /**
766
- * Per-routine visibility. The account-level `PROF-06` routines rule is the
767
- * upper bound: a routine marked `PUBLIC` inside an account whose routines are
768
- * `FOLLOWERS` is visible to followers only, the same way `SOC-04` bounds
769
- * activity by the profile section it comes from.
770
- */
771
- declare const ROUTINE_VISIBILITY_VALUES: readonly ["PRIVATE", "FOLLOWERS", "PUBLIC"];
772
- type RoutineVisibility = (typeof ROUTINE_VISIBILITY_VALUES)[number];
773
- /** One routine keeps at most this many active links. */
774
- declare const ROUTINE_SHARE_MAX_ACTIVE_LINKS = 10;
775
- /** PUT /routines/:id/visibility */
776
- interface UpdateRoutineVisibilityRequest {
777
- visibility: RoutineVisibility;
778
- }
779
- /** An active share link, visible only to the routine's owner. */
780
- interface RoutineShare {
781
- id: string;
782
- routineId: string;
783
- /** Unguessable identifier used in the public `/shared/routines/:token` URL. */
784
- token: string;
785
- createdAt: IsoDateString;
786
- }
787
- /** Stable successful response of GET /routines/:id/shares. */
788
- interface RoutineShareListResponse {
789
- items: RoutineShare[];
790
- }
791
- interface SharedRoutineOwner {
792
- username: string;
793
- name: string;
794
- lastName?: string | null;
795
- avatarUrl?: string | null;
796
- }
797
- /**
798
- * How a reader reached a routine. A link is the owner's explicit consent for
799
- * that one routine and ignores visibility; a visibility read is governed by
800
- * both the routine's own rule and the account's.
801
- */
802
- declare const SHARED_ROUTINE_SOURCES: readonly ["LINK", "VISIBILITY"];
803
- type SharedRoutineSource = (typeof SHARED_ROUTINE_SOURCES)[number];
804
- /**
805
- * Stable successful response of the unauthenticated
806
- * GET /shared/routines/:token, and of the authenticated member read.
807
- */
808
- interface SharedRoutine {
809
- /** Kept so a future clone (`ROUT-05`) can record what it came from. */
810
- routineId: string;
811
- setup: RoutineVersionSetup;
812
- owner: SharedRoutineOwner;
813
- source: SharedRoutineSource;
814
- /** When the routine was last changed, not when it was shared. */
815
- updatedAt: IsoDateString;
816
- }
817
- /**
818
- * ROUT-06. Where a cloned routine came from. It is recorded on the clone and
819
- * never on the source, so a routine cannot learn who copied it. It is served
820
- * only to a viewer who could read the source anyway: lineage must not become
821
- * a way to discover that a private routine exists.
822
- */
823
- interface RoutineLineage {
824
- /** The routine this one was cloned from, when the viewer may read it. */
825
- sourceRoutineId: string | null;
826
- /** The original author's public identity, when they still have one. */
827
- author: SharedRoutineOwner | null;
828
- /**
829
- * True when the source exists but this viewer may not read it, or its author
830
- * is gone. The clone still says it was cloned; it just cannot say from what.
831
- */
832
- isSourceHidden: boolean;
833
- clonedAt: IsoDateString;
834
- }
835
- /** A routine in a member's visible list, without loading its whole setup. */
836
- interface SharedRoutineSummary {
837
- routineId: string;
838
- name: string;
839
- description: string | null;
840
- scheduleMode: RoutineScheduleMode;
841
- dayCount: number;
842
- exerciseCount: number;
843
- updatedAt: IsoDateString;
844
- }
845
- /** Stable successful response of GET /users/:identifier/routines. */
846
- interface MemberRoutinesResponse {
847
- routines: SharedRoutineSummary[];
848
- }
849
- /**
850
- * POST /routines/clones. Exactly one source, matching the two ways a routine
851
- * can be read: `token` for a private link, `routineId` for one the viewer may
852
- * already see. Sending both, or neither, is refused.
853
- */
854
- interface CloneRoutineRequest {
855
- /** The `/shared/routines/:token` link the reader followed. */
856
- token?: string;
857
- /** A routine the viewer may read under `ROUT-04` visibility. */
858
- routineId?: string;
859
- }
860
- /** The refusals a clone states by name rather than as a bare 4xx. */
861
- declare const CLONE_ROUTINE_REFUSALS: {
862
- /** Neither `token` nor `routineId`, or both at once. */
863
- readonly SOURCE_REQUIRED: "SOURCE_REQUIRED";
864
- /** An exercise the routine programs is no longer in the catalog. */
865
- readonly UNKNOWN_EXERCISE: "UNKNOWN_EXERCISE";
866
- };
867
- type CloneRoutineRefusal = (typeof CLONE_ROUTINE_REFUSALS)[keyof typeof CLONE_ROUTINE_REFUSALS];
868
-
869
605
  /**
870
606
  * ROUT-11: a WEEKLY routine ties each day to a weekday; a ROTATION routine
871
607
  * runs its days in `order`, each after the last completed one, whatever the
@@ -1087,141 +823,448 @@ interface RoutineVersionExercise {
1087
823
  */
1088
824
  linkedToNext?: boolean;
1089
825
  /**
1090
- * ROUT-17: on a `LINEAR_PERIODIZATION` exercise, where the slot is in its
1091
- * block. Null on any other scheme, and on an LP exercise nobody has given
1092
- * a reference max yet (a shared or cloned routine drops the owner's).
826
+ * ROUT-17: on a `LINEAR_PERIODIZATION` exercise, where the slot is in its
827
+ * block. Null on any other scheme, and on an LP exercise nobody has given
828
+ * a reference max yet (a shared or cloned routine drops the owner's).
829
+ */
830
+ linearPeriodization?: LinearPeriodizationState | null;
831
+ sets: RoutineSet[];
832
+ }
833
+ interface RoutineVersionDay {
834
+ dayOfWeek: number | null;
835
+ name: string | null;
836
+ order: number;
837
+ exercises: RoutineVersionExercise[];
838
+ }
839
+ /** Everything a routine edit can change, as it was when the version was saved. */
840
+ interface RoutineVersionSetup {
841
+ name: string;
842
+ description: string | null;
843
+ scheduleMode: RoutineScheduleMode;
844
+ restDays: number[];
845
+ /** SCHED-06; absent in versions saved before it, which means none. */
846
+ rotationWeekdays?: number[];
847
+ days: RoutineVersionDay[];
848
+ }
849
+ interface RoutineVersion {
850
+ id: string;
851
+ routineId: string;
852
+ /** 1, 2, 3… per routine, never reused after a deletion. */
853
+ number: number;
854
+ name: string | null;
855
+ kind: RoutineVersionKind;
856
+ /** BEFORE_RESTORE only: the number of the version that was restored. */
857
+ restoredVersionNumber: number | null;
858
+ createdAt: IsoDateString;
859
+ setup: RoutineVersionSetup;
860
+ }
861
+ /** `GET /routines/:id/versions`, newest first. */
862
+ interface RoutineVersionsResponse {
863
+ versions: RoutineVersion[];
864
+ max: number;
865
+ }
866
+ /** `POST /routines/:id/versions` */
867
+ interface CreateRoutineVersionRequest {
868
+ name?: string | null;
869
+ }
870
+ /** `POST /routines/:id/versions/:versionId/restore` */
871
+ interface RestoreRoutineVersionResponse {
872
+ routine: Routine;
873
+ /** The replaced setup, saved as a BEFORE_RESTORE version. */
874
+ savedVersion: RoutineVersion;
875
+ }
876
+
877
+ /**
878
+ * Per-routine visibility. The account-level `PROF-06` routines rule is the
879
+ * upper bound: a routine marked `PUBLIC` inside an account whose routines are
880
+ * `FOLLOWERS` is visible to followers only, the same way `SOC-04` bounds
881
+ * activity by the profile section it comes from.
882
+ */
883
+ declare const ROUTINE_VISIBILITY_VALUES: readonly ["PRIVATE", "FOLLOWERS", "PUBLIC"];
884
+ type RoutineVisibility = (typeof ROUTINE_VISIBILITY_VALUES)[number];
885
+ /** One routine keeps at most this many active links. */
886
+ declare const ROUTINE_SHARE_MAX_ACTIVE_LINKS = 10;
887
+ /** PUT /routines/:id/visibility */
888
+ interface UpdateRoutineVisibilityRequest {
889
+ visibility: RoutineVisibility;
890
+ }
891
+ /** An active share link, visible only to the routine's owner. */
892
+ interface RoutineShare {
893
+ id: string;
894
+ routineId: string;
895
+ /** Unguessable identifier used in the public `/shared/routines/:token` URL. */
896
+ token: string;
897
+ createdAt: IsoDateString;
898
+ }
899
+ /** Stable successful response of GET /routines/:id/shares. */
900
+ interface RoutineShareListResponse {
901
+ items: RoutineShare[];
902
+ }
903
+ interface SharedRoutineOwner {
904
+ username: string;
905
+ name: string;
906
+ lastName?: string | null;
907
+ avatarUrl?: string | null;
908
+ }
909
+ /**
910
+ * How a reader reached a routine. A link is the owner's explicit consent for
911
+ * that one routine and ignores visibility; a visibility read is governed by
912
+ * both the routine's own rule and the account's. A message (MSG-07) is the
913
+ * sender's consent to its other participant, until it is deleted.
914
+ */
915
+ declare const SHARED_ROUTINE_SOURCES: readonly ["LINK", "VISIBILITY", "MESSAGE"];
916
+ type SharedRoutineSource = (typeof SHARED_ROUTINE_SOURCES)[number];
917
+ /**
918
+ * Stable successful response of the unauthenticated
919
+ * GET /shared/routines/:token, and of the authenticated member read.
920
+ */
921
+ interface SharedRoutine {
922
+ /** Kept so a future clone (`ROUT-05`) can record what it came from. */
923
+ routineId: string;
924
+ setup: RoutineVersionSetup;
925
+ owner: SharedRoutineOwner;
926
+ source: SharedRoutineSource;
927
+ /** When the routine was last changed, not when it was shared. */
928
+ updatedAt: IsoDateString;
929
+ }
930
+ /**
931
+ * ROUT-06. Where a cloned routine came from. It is recorded on the clone and
932
+ * never on the source, so a routine cannot learn who copied it. It is served
933
+ * only to a viewer who could read the source anyway: lineage must not become
934
+ * a way to discover that a private routine exists.
935
+ */
936
+ interface RoutineLineage {
937
+ /** The routine this one was cloned from, when the viewer may read it. */
938
+ sourceRoutineId: string | null;
939
+ /** The original author's public identity, when they still have one. */
940
+ author: SharedRoutineOwner | null;
941
+ /**
942
+ * True when the source exists but this viewer may not read it, or its author
943
+ * is gone. The clone still says it was cloned; it just cannot say from what.
944
+ */
945
+ isSourceHidden: boolean;
946
+ clonedAt: IsoDateString;
947
+ }
948
+ /** A routine in a member's visible list, without loading its whole setup. */
949
+ interface SharedRoutineSummary {
950
+ routineId: string;
951
+ name: string;
952
+ description: string | null;
953
+ scheduleMode: RoutineScheduleMode;
954
+ dayCount: number;
955
+ exerciseCount: number;
956
+ updatedAt: IsoDateString;
957
+ }
958
+ /** Stable successful response of GET /users/:identifier/routines. */
959
+ interface MemberRoutinesResponse {
960
+ routines: SharedRoutineSummary[];
961
+ }
962
+ /**
963
+ * POST /routines/clones. Exactly one source, matching the two ways a routine
964
+ * can be read: `token` for a private link, `routineId` for one the viewer may
965
+ * already see. Sending both, or neither, is refused.
966
+ */
967
+ interface CloneRoutineRequest {
968
+ /** The `/shared/routines/:token` link the reader followed. */
969
+ token?: string;
970
+ /** A routine the viewer may read under `ROUT-04` visibility. */
971
+ routineId?: string;
972
+ /** MSG-07: a message that shared the routine with the viewer. */
973
+ messageId?: string;
974
+ }
975
+ /** The refusals a clone states by name rather than as a bare 4xx. */
976
+ declare const CLONE_ROUTINE_REFUSALS: {
977
+ /** Neither `token` nor `routineId`, or both at once. */
978
+ readonly SOURCE_REQUIRED: "SOURCE_REQUIRED";
979
+ /** An exercise the routine programs is no longer in the catalog. */
980
+ readonly UNKNOWN_EXERCISE: "UNKNOWN_EXERCISE";
981
+ };
982
+ type CloneRoutineRefusal = (typeof CLONE_ROUTINE_REFUSALS)[keyof typeof CLONE_ROUTINE_REFUSALS];
983
+
984
+ /**
985
+ * Who may start a conversation with a member. `FOLLOWED`: members they follow.
986
+ * `EVERYONE` (MSG-02): members they follow reach the inbox, anyone else lands
987
+ * in Requests. `NOBODY`: no one may start a new one.
988
+ */
989
+ declare const MESSAGE_PERMISSIONS: readonly ["FOLLOWED", "EVERYONE", "NOBODY"];
990
+ type MessagePermission = (typeof MESSAGE_PERMISSIONS)[number];
991
+ declare const DEFAULT_MESSAGE_PERMISSION: MessagePermission;
992
+ /** Characters in one message, counted as code points. */
993
+ declare const MESSAGE_BODY_MAX = 2000;
994
+ /** Messages one member may send in a rolling minute. */
995
+ declare const MESSAGES_PER_MINUTE_MAX = 30;
996
+ /** Conversations one member may start in a rolling day. */
997
+ declare const NEW_CONVERSATIONS_PER_DAY_MAX = 20;
998
+ declare const CONVERSATIONS_PAGE_SIZE = 20;
999
+ declare const MESSAGES_PAGE_SIZE = 30;
1000
+ /** Length as a reader counts it: an emoji is one character, not two. */
1001
+ declare function messageBodyLength(body: string): number;
1002
+ /**
1003
+ * The stored form of a typed message: line endings made `\n` and the ends
1004
+ * trimmed, the lines in between kept as written. Null when it is empty or too
1005
+ * long -- it is refused rather than cut, because a message clipped mid-sentence
1006
+ * would misrepresent its author.
1007
+ */
1008
+ declare function normalizeMessageBody(body: string): string | null;
1009
+ /**
1010
+ * MSG-07: what a message, its text left empty or not, may carry. A routine
1011
+ * travels with an optional note.
1012
+ */
1013
+ declare const MESSAGE_ATTACHMENT_KINDS: readonly ["ROUTINE"];
1014
+ type MessageAttachmentKind = (typeof MESSAGE_ATTACHMENT_KINDS)[number];
1015
+ /**
1016
+ * MSG-07: a routine in a message, as it is now. `routine` is null once it is
1017
+ * no longer available -- deleted, or hidden by moderation -- and the card
1018
+ * says so rather than showing what it once was.
1019
+ */
1020
+ interface MessageRoutineAttachment {
1021
+ kind: "ROUTINE";
1022
+ routine: SharedRoutineSummary | null;
1023
+ }
1024
+ type MessageAttachment = MessageRoutineAttachment;
1025
+ /**
1026
+ * MSG-07: the stored text of a message. A message with a routine may leave it
1027
+ * empty (null); one without must say something. Undefined when the text is
1028
+ * refused: empty with nothing attached, or too long.
1029
+ */
1030
+ declare function messageNote(body: string | undefined | null, hasAttachment: boolean): string | null | undefined;
1031
+ /** The other participant, or null once their account was deleted. */
1032
+ interface ConversationMember {
1033
+ id: string;
1034
+ username: string;
1035
+ name: string;
1036
+ avatarUrl: string | null;
1037
+ }
1038
+ interface ConversationMessage {
1039
+ id: string;
1040
+ sentByMe: boolean;
1041
+ /**
1042
+ * Null once its author deleted it; the place stays as "Message deleted".
1043
+ * Also null for the other participant while moderation hides it (MSG-09),
1044
+ * and for a routine sent without a note (MSG-07).
1045
+ */
1046
+ body: string | null;
1047
+ deleted: boolean;
1048
+ /**
1049
+ * MSG-09: a moderator hid this message from the other participant. They read
1050
+ * "Removed by moderation" in its place; its author still reads the text and
1051
+ * is told it is hidden.
1052
+ */
1053
+ hiddenByModeration: boolean;
1054
+ /**
1055
+ * MSG-07: a routine it carries, resolved as it is now. Null when it carries
1056
+ * none, and whenever the text is withheld (deleted, or hidden from the
1057
+ * viewer by moderation).
1058
+ */
1059
+ attachment: MessageAttachment | null;
1060
+ createdAt: IsoDateString;
1061
+ }
1062
+ /**
1063
+ * MSG-02: a conversation that is still a request. `INCOMING`: the viewer may
1064
+ * accept, decline or block. `OUTGOING`: the viewer sent it and waits -- told
1065
+ * neither whether it was seen nor whether it was declined.
1066
+ */
1067
+ interface ConversationRequest {
1068
+ direction: "INCOMING" | "OUTGOING";
1069
+ }
1070
+ interface ConversationSummary {
1071
+ id: string;
1072
+ /** Null when the other member deleted their account ("Deleted member"). */
1073
+ counterpart: ConversationMember | null;
1074
+ /** The newest message the viewer can see, or null when there is none. */
1075
+ lastMessage: ConversationMessage | null;
1076
+ lastMessageAt: IsoDateString | null;
1077
+ /**
1078
+ * Whether the viewer may write in it now. False when the other member's
1079
+ * account is gone, or the viewer's own messaging is unavailable or
1080
+ * restricted.
1081
+ */
1082
+ canSend: boolean;
1083
+ /**
1084
+ * MSG-09: a moderator restricted the viewer's messaging, which is why they
1085
+ * cannot write. Only ever about the viewer: nobody else is told.
1086
+ */
1087
+ messagingRestricted: boolean;
1088
+ /**
1089
+ * MSG-03: the other member wrote something the viewer has not seen -- a
1090
+ * message after the viewer's read position that is neither deleted nor
1091
+ * removed for them. The viewer's own messages never count.
1092
+ */
1093
+ unread: boolean;
1094
+ /**
1095
+ * MSG-03: the viewer's read position, where "new since you last looked"
1096
+ * starts. Null when they have never read the conversation. It is the
1097
+ * viewer's alone: no read receipts, so a sender never learns it.
1098
+ */
1099
+ lastReadAt: IsoDateString | null;
1100
+ /** MSG-02: null once accepted, or for a conversation that never was a request. */
1101
+ request: ConversationRequest | null;
1102
+ }
1103
+ /**
1104
+ * MSG-02: GET /conversations?box=. The inbox holds accepted conversations
1105
+ * and the viewer's own requests; Requests holds the ones waiting for them.
1106
+ */
1107
+ declare const CONVERSATION_BOXES: readonly ["INBOX", "REQUESTS"];
1108
+ type ConversationBox = (typeof CONVERSATION_BOXES)[number];
1109
+ /**
1110
+ * MSG-02: after a decline, the same member's new request is refused for this
1111
+ * many days, unless the recipient follows them or writes first.
1112
+ */
1113
+ declare const MESSAGE_REQUEST_DECLINE_COOLDOWN_DAYS = 30;
1114
+ /**
1115
+ * MSG-08: a message push waits this long and is dropped if the conversation
1116
+ * was read meanwhile, so two members talking live do not buzz each other.
1117
+ */
1118
+ declare const MESSAGE_PUSH_DELAY_SECONDS = 30;
1119
+ /** GET /conversations, newest activity first. */
1120
+ interface ConversationsResponse {
1121
+ conversations: ConversationSummary[];
1122
+ nextCursor: string | null;
1123
+ /** MSG-09: the viewer's own messaging is restricted by moderation. */
1124
+ messagingRestricted: boolean;
1125
+ }
1126
+ /**
1127
+ * MSG-09: a report of a message captures it and at most this many messages
1128
+ * before it in its conversation, as the reporter could see them then.
1129
+ */
1130
+ declare const MESSAGE_REPORT_CONTEXT_BEFORE = 5;
1131
+ /**
1132
+ * MSG-03: POST /conversations/:id/read. Moves the viewer's read position to
1133
+ * the message they have seen (`through`, the newest one on their screen),
1134
+ * never backwards, so a message that arrived after it stays unread.
1135
+ */
1136
+ interface MarkConversationReadRequest {
1137
+ through: string;
1138
+ }
1139
+ /** MSG-03: GET /conversations/unread, for the navigation's count. */
1140
+ interface UnreadConversationsResponse {
1141
+ /** Conversations with something new, not messages (owner, 2026-10-06). */
1142
+ unreadConversations: number;
1143
+ /**
1144
+ * MSG-02: requests waiting for the viewer. For the Requests tab only: they
1145
+ * never count in the navigation (owner, 2026-10-06).
1093
1146
  */
1094
- linearPeriodization?: LinearPeriodizationState | null;
1095
- sets: RoutineSet[];
1147
+ requests: number;
1096
1148
  }
1097
- interface RoutineVersionDay {
1098
- dayOfWeek: number | null;
1099
- name: string | null;
1100
- order: number;
1101
- exercises: RoutineVersionExercise[];
1149
+ /** GET /conversations/:id/messages, newest first; `cursor` pages older. */
1150
+ interface ConversationMessagesResponse {
1151
+ conversation: ConversationSummary;
1152
+ messages: ConversationMessage[];
1153
+ nextCursor: string | null;
1102
1154
  }
1103
- /** Everything a routine edit can change, as it was when the version was saved. */
1104
- interface RoutineVersionSetup {
1105
- name: string;
1106
- description: string | null;
1107
- scheduleMode: RoutineScheduleMode;
1108
- restDays: number[];
1109
- /** SCHED-06; absent in versions saved before it, which means none. */
1110
- rotationWeekdays?: number[];
1111
- days: RoutineVersionDay[];
1155
+ /**
1156
+ * POST /conversations. Starts a conversation with its first message, so an
1157
+ * empty conversation never exists; when one with this member already exists
1158
+ * the message is sent there instead. `recipient` is a username or an id.
1159
+ */
1160
+ interface StartConversationRequest {
1161
+ recipient: string;
1162
+ /** Optional when the message carries a routine (MSG-07). */
1163
+ body?: string;
1164
+ /** MSG-07: one of the sender's own routines. */
1165
+ routineId?: string;
1112
1166
  }
1113
- interface RoutineVersion {
1114
- id: string;
1115
- routineId: string;
1116
- /** 1, 2, 3… per routine, never reused after a deletion. */
1117
- number: number;
1118
- name: string | null;
1119
- kind: RoutineVersionKind;
1120
- /** BEFORE_RESTORE only: the number of the version that was restored. */
1121
- restoredVersionNumber: number | null;
1122
- createdAt: IsoDateString;
1123
- setup: RoutineVersionSetup;
1167
+ /** POST /conversations/:id/messages. */
1168
+ interface SendMessageRequest {
1169
+ /** Optional when the message carries a routine (MSG-07). */
1170
+ body?: string;
1171
+ /** MSG-07: one of the sender's own routines. */
1172
+ routineId?: string;
1124
1173
  }
1125
- /** `GET /routines/:id/versions`, newest first. */
1126
- interface RoutineVersionsResponse {
1127
- versions: RoutineVersion[];
1128
- max: number;
1174
+ interface SendMessageResponse {
1175
+ conversation: ConversationSummary;
1176
+ message: ConversationMessage;
1129
1177
  }
1130
- /** `POST /routines/:id/versions` */
1131
- interface CreateRoutineVersionRequest {
1132
- name?: string | null;
1178
+ /** PUT /users/preferences/messages. */
1179
+ interface UpdateMessagePermissionRequest {
1180
+ messagePermission: MessagePermission;
1133
1181
  }
1134
- /** `POST /routines/:id/versions/:versionId/restore` */
1135
- interface RestoreRoutineVersionResponse {
1136
- routine: Routine;
1137
- /** The replaced setup, saved as a BEFORE_RESTORE version. */
1138
- savedVersion: RoutineVersion;
1182
+ /**
1183
+ * On the authenticated member profile only: whether the viewer may start a
1184
+ * conversation, and the one they already have. The server decides; a viewer
1185
+ * who may not is told nothing more.
1186
+ */
1187
+ interface MemberMessagingState {
1188
+ canStart: boolean;
1189
+ conversationId: string | null;
1190
+ /** MSG-02: a first message would land in their Requests. */
1191
+ asRequest: boolean;
1139
1192
  }
1193
+ declare function isMessagePermission(value: unknown): value is MessagePermission;
1140
1194
 
1141
- /** The longest deload, inclusive of both ends. */
1142
- declare const DELOAD_MAX_DAYS = 14;
1143
- /** The length a new deload is offered with. */
1144
- declare const DELOAD_DEFAULT_DAYS = 7;
1145
- /** How much lighter each set's load is, in percent. */
1146
- declare const DELOAD_LOAD_REDUCTIONS: readonly [0, 10, 20, 30, 40];
1147
- type DeloadLoadReduction = (typeof DELOAD_LOAD_REDUCTIONS)[number];
1148
- declare const DELOAD_DEFAULT_LOAD_REDUCTION: DeloadLoadReduction;
1149
- /** `HALF` keeps the first half of each exercise's sets, rounded up. */
1150
- declare const DELOAD_SET_MODES: readonly ["ALL", "HALF"];
1151
- type DeloadSetMode = (typeof DELOAD_SET_MODES)[number];
1152
- declare const DELOAD_DEFAULT_SET_MODE: DeloadSetMode;
1153
- declare const TEMPORARY_OVERRIDE_KINDS: readonly ["DELOAD"];
1154
- type TemporaryOverrideKind = (typeof TEMPORARY_OVERRIDE_KINDS)[number];
1155
- declare const TEMPORARY_OVERRIDE_SOURCE_KINDS: readonly ["BASELINE", "TRAINING_BLOCK"];
1156
- type TemporaryOverrideSourceKind = (typeof TEMPORARY_OVERRIDE_SOURCE_KINDS)[number];
1157
- interface DeloadOptions {
1158
- loadReductionPercent: DeloadLoadReduction;
1159
- setMode: DeloadSetMode;
1160
- }
1161
- /** Why a deload cannot be made from a prescription with these options. */
1162
- declare const DELOAD_NOT_LIGHTER = "Those options leave every set as it is: choose a lighter load or fewer sets";
1163
- declare function applyDeload(setup: RoutineVersionSetup, options: DeloadOptions): RoutineVersionSetup | null;
1164
- /** Days from `start` to `end`, both included. */
1165
- declare function deloadLengthDays(startDate: CalendarDate, endDate: CalendarDate): number;
1166
- /** Where a deload's prescription was copied from. */
1167
- interface TemporaryOverrideSource {
1168
- kind: TemporaryOverrideSourceKind;
1169
- trainingBlockId: string | null;
1170
- trainingBlockName: string | null;
1171
- }
1172
- /** One deload of a routine. State is relative to `today`. */
1173
- interface RoutineTemporaryOverride {
1174
- id: string;
1175
- routineId: string;
1176
- kind: TemporaryOverrideKind;
1177
- startDate: CalendarDate;
1178
- /** Moves to the day before it was ended when it is ended early. */
1179
- endDate: CalendarDate;
1180
- loadReductionPercent: DeloadLoadReduction;
1181
- setMode: DeloadSetMode;
1182
- source: TemporaryOverrideSource;
1183
- /** The prescription in force when the deload was created. */
1184
- originalSetup: RoutineVersionSetup;
1185
- /** The lighter prescription the deload trains. */
1186
- setup: RoutineVersionSetup;
1187
- endedEarlyAt: IsoDateString | null;
1188
- createdAt: IsoDateString;
1189
- state: 'FUTURE' | 'ACTIVE' | 'COMPLETE';
1190
- }
1191
- /** `GET /routines/:id/deloads`, newest start first. */
1192
- interface RoutineTemporaryOverridesResponse {
1193
- overrides: RoutineTemporaryOverride[];
1194
- maxDays: number;
1195
- /** The owner's local date every state is relative to. */
1196
- today: CalendarDate;
1197
- }
1198
- /** `POST /routines/:id/deloads` */
1199
- interface CreateDeloadRequest extends DeloadOptions {
1200
- startDate: CalendarDate;
1201
- endDate: CalendarDate;
1195
+ /** A step id as the registry names it: lowercase words joined by hyphens. */
1196
+ declare const ONBOARDING_STEP_ID_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,39}$";
1197
+ declare const ONBOARDING_STEPS_MAX = 30;
1198
+ declare const ONBOARDING_VERSION_MAX = 1000;
1199
+ interface OnboardingState {
1200
+ /**
1201
+ * The registry version the account completed. A new account starts at 0;
1202
+ * accounts that existed when onboarding shipped start at 1, so they are
1203
+ * offered only steps added later.
1204
+ */
1205
+ completedVersion: number;
1206
+ /** Steps answered or skipped since that version, so the flow resumes. */
1207
+ stepsDone: string[];
1208
+ /** When the flow first opened by itself; it never does again. */
1209
+ offeredAt: IsoDateString | null;
1202
1210
  }
1203
1211
  /**
1204
- * A deload as a plan the resolver can place: its working-copy days (real ids,
1205
- * apart from the baseline and from any block) and the schedule of the plan it
1206
- * lightened. Owner-only, on `Routine.temporaryOverrides`.
1212
+ * PUT /users/preferences/onboarding. Partial: `stepsDone` is added to what is
1213
+ * stored (two devices never undo each other), `completedVersion` only ever
1214
+ * rises and clears the steps, and `offered` records the first opening once.
1207
1215
  */
1208
- interface RoutineTemporaryOverridePlan {
1209
- id: string;
1210
- kind: TemporaryOverrideKind;
1211
- startDate: CalendarDate;
1212
- endDate: CalendarDate;
1213
- scheduleMode: RoutineScheduleMode;
1214
- restDays: number[];
1215
- rotationWeekdays: number[];
1216
- /** ROTATION only: the underlying plan's next day, in this copy. */
1217
- nextRotationDayId: string | null;
1218
- days: RoutineDay[];
1216
+ interface UpdateOnboardingRequest {
1217
+ stepsDone?: string[];
1218
+ completedVersion?: number;
1219
+ offered?: true;
1219
1220
  }
1220
- /** ROUT-16: the temporary override a session trained, copied onto it. */
1221
- interface SessionTemporaryOverride {
1222
- id: string;
1223
- kind: TemporaryOverrideKind;
1221
+ declare function isOnboardingStepId(value: unknown): value is string;
1222
+
1223
+ /**
1224
+ * The weekday a week starts on, as `Date.getDay()` numbers it: 1 Monday, 0
1225
+ * Sunday. Monday is everyone's default, so nothing changes until a member
1226
+ * chooses. **The rank never follows it**: its active weeks are Monday weeks
1227
+ * for every member, because a rank is public and must mean the same on every
1228
+ * profile.
1229
+ */
1230
+ declare const WEEK_STARTS: readonly [1, 0];
1231
+ type WeekStartsOn = (typeof WEEK_STARTS)[number];
1232
+ declare const DEFAULT_WEEK_STARTS_ON: WeekStartsOn;
1233
+ declare function isWeekStartsOn(value: unknown): value is WeekStartsOn;
1234
+ /**
1235
+ * The first day of the week a `YYYY-MM-DD` calendar date belongs to, as a
1236
+ * `YYYY-MM-DD` date, for a week starting on `weekStartsOn`. Calendar
1237
+ * arithmetic only: no time zone, so a daylight-saving change cannot move it.
1238
+ */
1239
+ declare function weekStartOf(dateKey: string, weekStartsOn?: WeekStartsOn): string;
1240
+ /** PUT /users/preferences/week-start */
1241
+ interface UpdateWeekStartRequest {
1242
+ weekStartsOn: WeekStartsOn;
1224
1243
  }
1244
+ /**
1245
+ * How lengths are shown and typed: centimetres, or inches (a height in feet
1246
+ * and inches). Every length is **stored in centimetres**, as weights are
1247
+ * stored in kilograms; the unit is only the display and entry boundary.
1248
+ */
1249
+ declare const LENGTH_UNITS: readonly ["CM", "IN"];
1250
+ type LengthUnit = (typeof LENGTH_UNITS)[number];
1251
+ declare const CM_PER_INCH = 2.54;
1252
+ declare const INCHES_PER_FOOT = 12;
1253
+ /** Centimetres as inches, to two decimals. */
1254
+ declare function cmToInches(cm: number): number;
1255
+ /** Inches as centimetres, to two decimals. */
1256
+ declare function inchesToCm(inches: number): number;
1257
+ /**
1258
+ * A height in centimetres as whole feet and inches to one decimal. The total
1259
+ * is rounded before it is split, so 71.98 in reads as 6 ft 0 in, never as
1260
+ * 5 ft 12 in.
1261
+ */
1262
+ declare function cmToFeetInches(cm: number): {
1263
+ feet: number;
1264
+ inches: number;
1265
+ };
1266
+ /** Feet and inches as centimetres, to two decimals. */
1267
+ declare function feetInchesToCm(feet: number, inches: number): number;
1225
1268
 
1226
1269
  interface SetLog {
1227
1270
  id: string;
@@ -2243,6 +2286,11 @@ interface CapturedMessage {
2243
2286
  deleted: boolean;
2244
2287
  /** The message the report is about; always the last one. */
2245
2288
  isReported: boolean;
2289
+ /**
2290
+ * MSG-07: the routine it carried, by the name the reporter saw, or null when
2291
+ * it carried none. Its name and nothing of the routine itself.
2292
+ */
2293
+ routineName?: string | null;
2246
2294
  createdAt: IsoDateString;
2247
2295
  }
2248
2296
  /**
@@ -4205,7 +4253,7 @@ interface DeletePushSubscriptionRequest {
4205
4253
  * What a delivered push asks the service worker to show. `kind` exists so the
4206
4254
  * worker can branch without guessing from the copy.
4207
4255
  */
4208
- declare const PUSH_PAYLOAD_KINDS: readonly ["REST_ALERT", "TRAINING_REMINDER", "STREAK_AT_RISK", "TRAINING_PARTNER_SESSION", "TRAINING_PARTNER_ACHIEVEMENT"];
4256
+ declare const PUSH_PAYLOAD_KINDS: readonly ["REST_ALERT", "TRAINING_REMINDER", "STREAK_AT_RISK", "TRAINING_PARTNER_SESSION", "TRAINING_PARTNER_ACHIEVEMENT", "MESSAGE"];
4209
4257
  type PushPayloadKind = (typeof PUSH_PAYLOAD_KINDS)[number];
4210
4258
  interface RestAlertPushPayload {
4211
4259
  kind: 'REST_ALERT';
@@ -4257,7 +4305,20 @@ interface TrainingPartnerAchievementPushPayload {
4257
4305
  url: string;
4258
4306
  tag: string;
4259
4307
  }
4260
- type PushPayload = RestAlertPushPayload | TrainingReminderPushPayload | StreakAtRiskPushPayload | TrainingPartnerSessionPushPayload | TrainingPartnerAchievementPushPayload;
4308
+ /**
4309
+ * MSG-08. Names the sender only ("Ana sent you a message"); the text stays in
4310
+ * the app (the owner's decision 9), and a request never pushes. One per
4311
+ * conversation until it is read, collapsed by `tag`.
4312
+ */
4313
+ interface MessagePushPayload {
4314
+ kind: 'MESSAGE';
4315
+ title: string;
4316
+ body: string;
4317
+ url: string;
4318
+ tag: string;
4319
+ conversationId: string;
4320
+ }
4321
+ type PushPayload = RestAlertPushPayload | TrainingReminderPushPayload | StreakAtRiskPushPayload | TrainingPartnerSessionPushPayload | TrainingPartnerAchievementPushPayload | MessagePushPayload;
4261
4322
  /** A rest alert is refused beyond this far ahead. */
4262
4323
  declare const REST_ALERT_MAX_LEAD_SECONDS = 3600;
4263
4324
  /**
@@ -4295,7 +4356,7 @@ type RestAlertRefusal = (typeof REST_ALERT_REFUSALS)[number];
4295
4356
  * govern their corresponding in-app rows; every earlier NOTIF-01 source stays
4296
4357
  * gathered independently of these delivery controls.
4297
4358
  */
4298
- declare const NOTIFICATION_CATEGORIES: readonly ["REST_ALERT", "TRAINING_REMINDER", "STREAK_AT_RISK", "TRAINING_PARTNER_SESSION", "TRAINING_PARTNER_ACHIEVEMENT"];
4359
+ declare const NOTIFICATION_CATEGORIES: readonly ["REST_ALERT", "TRAINING_REMINDER", "STREAK_AT_RISK", "TRAINING_PARTNER_SESSION", "TRAINING_PARTNER_ACHIEVEMENT", "MESSAGE"];
4299
4360
  type NotificationCategory = (typeof NOTIFICATION_CATEGORIES)[number];
4300
4361
  /**
4301
4362
  * A local-clock window in which nothing is delivered, as minutes from
@@ -4596,7 +4657,10 @@ interface AccountExportV1 {
4596
4657
  messagesSent?: Array<{
4597
4658
  to: AccountExportMember | null;
4598
4659
  conversationId: string;
4660
+ /** Empty when a routine was sent without a note (MSG-07). */
4599
4661
  body: string;
4662
+ /** MSG-07: the member's own routine the message shared, by id. */
4663
+ routineId?: string;
4600
4664
  createdAt: IsoDateString;
4601
4665
  }>;
4602
4666
  reportsFiled: Array<{
@@ -4674,7 +4738,7 @@ declare const API_ERROR_MESSAGES: {
4674
4738
  readonly EXERCISE_GROUP_TOO_LARGE: "A superset or circuit has at most {max} exercises";
4675
4739
  readonly ROUTINE_ACTIVE_SESSION: "Finish the active session before changing the routine structure";
4676
4740
  readonly ROUTINE_SHARE_LINKS_MAX: "A routine keeps at most {max} active links.";
4677
- readonly CLONE_SOURCE_REQUIRED: "SOURCE_REQUIRED: send either a share token or a routine id";
4741
+ readonly CLONE_SOURCE_REQUIRED: "SOURCE_REQUIRED: send one of a share token, a routine id or a message id";
4678
4742
  readonly CLONE_UNKNOWN_EXERCISE: "UNKNOWN_EXERCISE: an exercise in this routine is no longer in the catalog";
4679
4743
  readonly ROUTINE_VERSIONS_MAX: "A routine keeps at most {max} versions; delete one first";
4680
4744
  readonly ROUTINE_VERSION_EXERCISE_GONE: "An exercise in this version is no longer in the catalog";
@@ -4965,4 +5029,4 @@ declare function isRealtimeTopic(value: unknown): value is RealtimeTopic;
4965
5029
  /** The event in one `data:` payload, or null for anything else. */
4966
5030
  declare function parseRealtimeEvent(data: string): RealtimeEvent | null;
4967
5031
 
4968
- export { ACCOUNT_EXPORT_FORMAT, ACCOUNT_EXPORT_VERSION, ACHIEVEMENT_CATEGORIES, ACHIEVEMENT_DEFINITIONS, ACTIVITY_CAPS, ACTIVITY_COMMENTS_PAGE_SIZE, ACTIVITY_COMMENTS_PER_DAY_MAX, ACTIVITY_COMMENT_MAX_LENGTH, ACTIVITY_DEFAULT_AUDIENCE, ACTIVITY_ENTRY_ID_MAX_LENGTH, ACTIVITY_FEED_FOLLOWED_MAX, ACTIVITY_PAGE_DEFAULT_LIMIT, ACTIVITY_PAGE_MAX_LIMIT, ACTIVITY_PREVIEW_AUDIENCES, ACTIVITY_REACTIONS, ACTIVITY_TYPES, ACTIVITY_TYPE_SECTIONS, API_ERROR_CODES, API_ERROR_MESSAGES, type AccountExportBodyMeasurement, type AccountExportGoal, type AccountExportMember, type AccountExportPersonalRecord, type AccountExportRoutine, type AccountExportScheduleOverride, type AccountExportTrainingEvent, type AccountExportTrainingLocation, type AccountExportV1, type AchievementActivity, type AchievementCategory, type AchievementCategoryProgress, type AchievementDefinition, type AchievementNotification, type AchievementUnlockedEventPayload, type AchievementsResponse, type ActivityAudience, type ActivityCap, type ActivityComment, type ActivityCommentNotification, type ActivityCommentSummary, type ActivityCommentsQuery, type ActivityCommentsResponse, type ActivityEntry, type ActivityEntrySharing, type ActivityFeedResponse, type ActivityLink, type ActivityPage, type ActivityPageQuery, type ActivityPreviewAudience, type ActivityPreviewQuery, type ActivityReaction, type ActivityReactionSummary, type ActivitySection, type ActivitySharingSettings, type ActivityType, type ApiErrorBody, type ApiErrorCode, type ApiErrorParams, type AppLocale, type AppNotification, BAR_CHOICES_KG, BAR_WARM_UP_STEPS, BLOCKED_MEMBERS_MAX, BODY_MEASUREMENT_FIELDS, BODY_MEASUREMENT_FIELD_KEYS, BODY_PROGRESS_RANGES, type BlockComparisonLift, type BlockComparisonLiftBest, type BlockComparisonPeriod, type BlockComparisonPeriodKind, type BlockedMember, type BlockedMembersResponse, type BodyFieldSummary, type BodyMeasurement, type BodyMeasurementField, type BodyMeasurementProblem, type BodyMeasurementValues, type BodyProgressRange, type BodyProgressResponse, type Brand, CLONE_ROUTINE_REFUSALS, CM_PER_INCH, COMEBACK_MIN_INACTIVE_DAYS, COMEBACK_RECOGNITION_LIMIT, COMEBACK_REQUIRED_ACTIVE_DAYS, COMEBACK_SESSION_LOOKBACK, COMEBACK_WINDOW_DAYS, CONVERSATIONS_PAGE_SIZE, CONVERSATION_BOXES, CUSTOM_EXERCISES_MAX, CUSTOM_EXERCISE_NAME_MAX, CUSTOM_EXERCISE_NOTE_MAX, CUSTOM_EXERCISE_PROBLEM_MESSAGES, CUSTOM_EXERCISE_REFUSALS, type CalendarDate, type CapturedMessage, type CloneRoutineRefusal, type CloneRoutineRequest, type ComebackActivity, type ComebackRecognition, type ComebackRecognitionSummary, type ContinueLinearBlockRequest, type ConversationBox, type ConversationMember, type ConversationMessage, type ConversationMessagesResponse, type ConversationRequest, type ConversationSummary, type ConversationsResponse, type CorrectSessionRequest, type CorrectSessionResponse, type CorrectSessionSetRequest, type CreateActivityCommentRequest, type CreateActivityCommentResponse, type CreateDeloadRequest, type CreateReportRequest, type CreateReportResponse, type CreateRoutineDayInput, type CreateRoutineExerciseInput, type CreateRoutineRequest, type CreateRoutineVersionRequest, type CreateSessionShareRequest, type CustomExerciseInput, type CustomExerciseProblem, type CustomExerciseRefusal, DASHBOARD_SECTION_IDS, DEFAULT_DASHBOARD_LAYOUT, DEFAULT_LOCALE, DEFAULT_MESSAGE_PERMISSION, DEFAULT_WEEK_STARTS_ON, DELOAD_DEFAULT_DAYS, DELOAD_DEFAULT_LOAD_REDUCTION, DELOAD_DEFAULT_SET_MODE, DELOAD_LOAD_REDUCTIONS, DELOAD_MAX_DAYS, DELOAD_NOT_LIGHTER, DELOAD_SET_MODES, DELOAD_SUGGESTION_COOLDOWN_DAYS, DELOAD_SUGGESTION_EARLIER_DAYS, DELOAD_SUGGESTION_MIN_MARKED_TODAY, DELOAD_SUGGESTION_ROUTINE_DAYS, DELOAD_SUGGESTION_SIGNALS, type DashboardLayout, type DashboardLayoutEntry, type DashboardSectionId, type DeclineSignal, type DecliningLift, type DecliningLiftSession, type DeleteAccountRequest, type DeleteAccountResponse, type DeleteActivityCommentResponse, type DeletePushSubscriptionRequest, type DeloadLoadReduction, type DeloadOptions, type DeloadSetMode, type DeloadSuggestion, type DeloadSuggestionEvidence, type DeloadSuggestionResponse, type DeloadSuggestionSignal, type DeloadSuggestionUnavailableReason, type DiscoverableRoutine, type DismissGoalSuggestionRequest, EXERCISE_EQUIPMENT, EXERCISE_GROUP_KIND_LABELS, EXERCISE_GROUP_MAX, EXERCISE_MECHANICS, type EarnedAchievement, type EarnedPersonalRecord, type EffortPeriod, type EffortSignal, type Exercise, type ExerciseEquipment, type ExerciseGroup, type ExerciseGroupKind, type ExerciseGroupPosition, type ExerciseId, type ExerciseMechanic, type ExercisePerformanceHistoryQuery, type ExercisePerformanceHistoryResponse, type ExercisePerformancePrescription, type ExercisePerformancePrescriptionSet, type ExercisePerformanceSession, type ExercisePerformanceSet, type ExercisePerformanceSummary, type ExercisePlateau, type ExerciseStrengthSummary, type ExerciseStrengthTrendPoint, type ExerciseStrengthTrendQuery, type ExerciseStrengthTrendResponse, FEATURED_PROFILE_ITEMS_MAX, FEATURED_PROFILE_ITEM_KINDS, FEATURED_PROFILE_REFERENCE_MAX_LENGTH, FOLLOW_SUGGESTIONS_DEFAULT_LIMIT, FOLLOW_SUGGESTIONS_MAX_LIMIT, FOLLOW_SUGGESTION_REASONS, type FeaturedProfileAchievementItem, type FeaturedProfileItem, type FeaturedProfileItemKind, type FeaturedProfileRankItem, type FeaturedProfileRecordItem, type FeaturedProfileRoutineItem, type FeaturedProfileSelection, type FeaturedProfileSelectionInput, type FeaturedProfileSelectionsResponse, type FinishStatus, type FinishWorkoutRequest, type FinishWorkoutResponse, type FollowSuggestion, type FollowSuggestionReason, type FollowSuggestionsResponse, GOAL_SUGGESTIONS_MAX, GOAL_SUGGESTION_DISMISSALS_MAX, GOAL_SUGGESTION_LIFT_MIN_SESSIONS, GOAL_SUGGESTION_LIFT_WINDOW_DAYS, GOAL_SUGGESTION_MIN_ACTIVE_WEEKS, GOAL_SUGGESTION_STRENGTH_STEP, GOAL_SUGGESTION_TYPES, GOAL_SUGGESTION_VOLUME_WEEKS, type GoalSuggestion, type GoalSuggestionBasis, type GoalSuggestionType, type GoalSuggestionsResponse, INCHES_PER_FOOT, type IsoDateString, LENGTH_UNITS, LIMITED_SHORTFALL_KG, LP_BLOCK_STEPS, LP_ESTIMATE_MAX_REPS_TO_FAILURE, LP_ESTIMATE_MIN_SETS, LP_ESTIMATE_STEPS, LP_NEXT_BLOCK_KINDS, LP_PHASES, LP_PROGRESS_CAP, LP_PROGRESS_THRESHOLD, LP_RECOVERY, LP_REFERENCE_MAX_KG, LP_REST_SECONDS, LP_STEPS, LP_WORKING_SETS, type LengthUnit, type LinearBlockChange, type LinearBlockFinishedNotification, type LinearPeriodizationState, type ListSessionsParams, type LpEstimate, type LpLoggedSet, type LpNextBlockKind, type LpPhase, type LpRecommendation, type LpSample, type LpSetPrescription, type LpSetTarget, type LpStep, type LpStoredSet, MAX_SETS_PER_EXERCISE, MEASURABLE_GOALS_MAX, MEASURABLE_GOAL_DIRECTIONS, MEASURABLE_GOAL_TYPES, MESSAGES_PAGE_SIZE, MESSAGES_PER_MINUTE_MAX, MESSAGE_BODY_MAX, MESSAGE_PERMISSIONS, MESSAGE_REPORT_CONTEXT_BEFORE, MESSAGE_REQUEST_DECLINE_COOLDOWN_DAYS, MINUTES_IN_DAY, MODERATION_ACTION_KINDS, MODERATION_HISTORY_PAGE_SIZE, MODERATION_NOTE_MAX_LENGTH, MODERATION_QUEUE_PAGE_SIZE, MOVEMENT_PATTERNS, MUSCLE_GROUPS, type MarkConversationReadRequest, type MarkNotificationsReadRequest, type MarkNotificationsReadResponse, type MeasurableGoal, type MeasurableGoalDirection, type MeasurableGoalExercise, type MeasurableGoalInput, type MeasurableGoalType, type MemberActivityResponse, type MemberMessagingState, type MemberModerationState, type MemberRoutinesResponse, type MemberSearchPage, type MessagePermission, type ModerationActionKind, type ModerationActionRecord, type ModerationHistoryQuery, type ModerationHistoryResponse, type ModerationQueueQuery, type ModerationQueueResponse, type ModerationReport, type ModeratorState, type MoveOccurrenceRequest, type MovementPattern, type MuscleGroup, type MuscleGroupHeatmapQuery, type MuscleGroupHeatmapResponse, type MuscleGroupHeatmapValue, type MuscleGroupHeatmapWeek, type MuscleVolumeTrendSeries, NEW_CONVERSATIONS_PER_DAY_MAX, NOTIFICATIONS_LIST_LIMIT, NOTIFICATIONS_LOOKBACK_DAYS, NOTIFICATIONS_PAGE_SIZE, NOTIFICATIONS_PAGE_SIZE_MAX, NOTIFICATIONS_RETENTION_DAYS, NOTIFICATION_CATEGORIES, NOTIFICATION_KINDS, type NewFollowerNotification, type NotificationCategory, type NotificationKind, type NotificationPreferences, type NotificationPreferencesResponse, type NotificationsQuery, type NotificationsResponse, ONBOARDING_STEPS_MAX, ONBOARDING_STEP_ID_PATTERN_SOURCE, ONBOARDING_VERSION_MAX, OTHER_WARM_UP_STEPS, type OnboardingState, type OwnActivityEntry, type OwnActivityResponse, PLATEAU_MIN_DAYS_SINCE_BEST, PLATEAU_MIN_SESSIONS, PLATEAU_MIN_SESSIONS_MAX, PLATEAU_MIN_SESSIONS_MIN, PLATEAU_RECENT_DAYS, PLATEAU_WINDOW_DAYS, PLATE_SETS, PREFERRED_TRAINING_STYLE_VALUES, PROFILE_BIO_MAX_LENGTH, PROFILE_FAVORITE_EXERCISES_MAX, PROFILE_LOCATION_MAX_LENGTH, PROFILE_TRAINING_DISCIPLINES_MAX, PROFILE_TRAINING_GOALS_MAX, PROFILE_VISIBILITY_VALUES, PROGRESSION_SCHEMES, PROGRESS_TIMELINE_EVENT_TYPES, PUSH_PAYLOAD_KINDS, PUSH_SUBSCRIPTIONS_MAX, type PaginatedResponse, type PersonalGoalProgress, type PersonalGoalsResponse, type PersonalRecordActivity, type PersonalRecordEntry, type PersonalRecordKind, type PlannedReminder, type PlateLoadingItem, type PlateLoadingResult, type PlatePairInventory, type PlateSetChoice, type PlateauPreferences, type PlateauSet, type PlateausResponse, type PreferredTrainingStyle, type PreviousPerformanceResponse, type PreviousSessionRecap, type PreviousSetPerformance, type ProfileDiscoverySettings, type ProfileFavoriteExercise, type ProfilePrivacySettings, type ProfileViewerAccess, type ProfileVisibility, type ProgressTimelineEventType, type ProgressTimelineItem, type ProgressTimelinePersonalRecordItem, type ProgressTimelineProgressionItem, type ProgressTimelineQuery, type ProgressTimelineRecordPerformance, type ProgressTimelineRecordReason, type ProgressTimelineResponse, type ProgressTimelineSessionContext, type ProgressionActivity, type ProgressionChange, type ProgressionRule, type ProgressionScheme, type ProgressionSetChange, type PublicBodyMetrics, type PublicProfileAchievements, type PublicTrainingSummary, type PublicUserProfile, type PushPayload, type PushPayloadKind, type PushSubscriptionKeys, type PushSubscriptionSummary, type PushSubscriptionsResponse, type QuietHours, REALTIME_HEARTBEAT_MS, REALTIME_MAX_STREAMS_PER_MEMBER, REALTIME_MAX_STREAM_MS, REALTIME_STREAM_PATH, REALTIME_TOPICS, REALTIME_UNAVAILABLE_RETRY_SECONDS, RECENT_SEARCHES_MAX, RECENT_SEARCH_KINDS, RELATIONSHIP_LIST_DEFAULT_LIMIT, RELATIONSHIP_LIST_KINDS, RELATIONSHIP_LIST_MAX_LIMIT, RENAISSANCE_RANK_DEFINITIONS, REPORTS_PER_DAY_MAX, REPORT_DETAILS_MAX_LENGTH, REPORT_REASONS, REPORT_STATUSES, REPORT_SUBJECT_KINDS, REP_TYPES, RESERVED_USERNAMES, REST_ALERT_MAX_LEAD_SECONDS, REST_ALERT_MIN_LEAD_SECONDS, REST_ALERT_REFUSALS, ROUTINE_DAYS_MAX, ROUTINE_DAY_NAME_MAX, ROUTINE_DISCOVERY_DEFAULT_LIMIT, ROUTINE_DISCOVERY_MAX_LIMIT, ROUTINE_DISCOVERY_SCAN_LIMIT, ROUTINE_DURATION_BANDS, ROUTINE_DURATION_BAND_MAX_MINUTES, ROUTINE_SCHEDULE_MODES, ROUTINE_SHARE_MAX_ACTIVE_LINKS, ROUTINE_TRAINING_BLOCKS_MAX, ROUTINE_TRAINING_BLOCK_NAME_MAX, ROUTINE_TRAINING_BLOCK_REVISIONS_MAX, ROUTINE_TRAINING_BLOCK_SOURCE_KINDS, ROUTINE_TRAINING_BLOCK_STATES, ROUTINE_VERSIONS_MAX, ROUTINE_VERSION_KINDS, ROUTINE_VERSION_NAME_MAX, ROUTINE_VISIBILITY_VALUES, type RealtimeEvent, type RealtimeTopic, type RecentActivityEntry, type RecentExercise, type RecentRoutine, type RecentSearchItem, type RecentSearchKind, type RecentSearchesResponse, type RecordRecentSearchRequest, type RegisterPushSubscriptionRequest, type RelationshipListKind, type RelationshipListQuery, type RelationshipListResponse, type RelationshipMember, type RenaissanceRankDefinition, type RenaissanceRankProgress, type RepTargetPeriod, type RepTargetSignal, type RepType, type ReplaceFeaturedProfileItemsRequest, type ReplaceMeasurableGoalsRequest, type ReplaceTrainingLocationsRequest, type ReportReason, type ReportStatus, type ReportSubjectKind, type ReportSubjectPreview, type ReportedMessageContext, type ResolvedRoutinePlan, type RestAlertPushPayload, type RestAlertRefusal, type RestoreRoutineVersionResponse, type ReviewReportRequest, type ReviewReportResponse, type Routine, type RoutineClassification, type RoutineDay, type RoutineDayId, type RoutineDiscoveryQuery, type RoutineDiscoveryResponse, type RoutineDurationBand, type RoutineExercise, type RoutineFacets, type RoutineId, type RoutineLineage, type RoutinePlanSource, type RoutineScheduleMode, type RoutineSearchPage, type RoutineSet, type RoutineShare, type RoutineShareListResponse, type RoutineSharedActivity, type RoutineTemporaryOverride, type RoutineTemporaryOverridePlan, type RoutineTemporaryOverridesResponse, type RoutineTrainingBlock, type RoutineTrainingBlockPlan, type RoutineTrainingBlockRevision, type RoutineTrainingBlockRevisionsResponse, type RoutineTrainingBlockSource, type RoutineTrainingBlockSourceKind, type RoutineTrainingBlockState, type RoutineTrainingBlocksResponse, type RoutineVersion, type RoutineVersionDay, type RoutineVersionExercise, type RoutineVersionKind, type RoutineVersionSetup, type RoutineVersionsResponse, type RoutineVisibility, SCHEDULE_MOVE_MAX_DAYS, SCHEDULE_OVERRIDES_MAX_RANGE_DAYS, SCHEDULE_OVERRIDE_KINDS, SCHEDULE_SKIP_PAST_DAYS, SEARCH_PAGE_SIZE, SEARCH_PAGE_SIZE_MAX, SEARCH_PREVIEW_LIMIT, SEARCH_QUERY_MAX_LENGTH, SEARCH_QUERY_MIN_LENGTH, SEARCH_SERVER_CATEGORIES, SESSION_CORRECTIONS_MAX, SESSION_CORRECTION_LIMITS, SESSION_CORRECTION_WINDOW_HOURS, SESSION_EXERCISE_NOTE_MAX_LENGTH, SESSION_NOTE_MAX_LENGTH, SESSION_SHARE_DEFAULT_FIELDS, SESSION_SHARE_FIELDS, SESSION_SHARE_MAX_ACTIVE_LINKS, SET_KINDS, SET_KIND_LABELS, SEXES, SHARED_ROUTINE_SOURCES, STARRED_EXERCISES_MAX, STREAK_MAX_GAP_DAYS, SUPPORTED_LOCALES, type ScheduleOverride, type ScheduleOverrideKind, type ScheduleOverridesQuery, type ScheduleOverridesResponse, type ScheduleRestAlertRequest, type ScheduleRestAlertResponse, type SearchPage, type SearchPageQuery, type SearchPreviewQuery, type SearchPreviewResponse, type SearchServerCategory, type SendMessageRequest, type SendMessageResponse, type SendTrainingPartnerEncouragementRequest, type SendTrainingPartnerEncouragementResponse, type SessionComparisonExercise, type SessionComparisonQuery, type SessionComparisonResponse, type SessionComparisonRoutineDay, type SessionComparisonSession, type SessionComparisonSet, type SessionCompletedActivity, type SessionCorrection, type SessionCorrectionClosedReason, type SessionCorrectionWindow, type SessionCorrectionsResponse, type SessionExerciseNote, type SessionExerciseSubstitution, type SessionProgressNotification, type SessionRecapExerciseNote, type SessionRecapRecord, type SessionSetCorrection, type SessionShare, type SessionShareField, type SessionShareListResponse, type SessionTemporaryOverride, type SessionTrainingBlock, type SetAccountTimeZoneRequest, type SetActivityEntryAudienceRequest, type SetActivityEntryAudienceResponse, type SetActivityReactionRequest, type SetActivityReactionResponse, type SetKind, type SetLog, type SetLogValues, type Sex, type SharedRoutine, type SharedRoutineOwner, type SharedRoutineSearchResult, type SharedRoutineSource, type SharedRoutineSummary, type SharedSessionOwner, type SharedSessionRecap, type SkipOccurrenceRequest, type StarredExercise, type StarredExercisesResponse, type StartConversationRequest, type StartWorkoutRequest, type StartWorkoutResponse, type StreakAtRiskPushPayload, type StreakMilestoneActivity, type StreakMilestoneEventPayload, type SubstituteSessionExerciseRequest, type SubstituteSessionExerciseResponse, type SupabaseAuthResponse, type SupabaseAuthUser, type SupabaseMigrationResponse, TEMPORARY_OVERRIDE_KINDS, TEMPORARY_OVERRIDE_SOURCE_KINDS, TRAINING_BLOCK_COMPARISON_MAX_DAYS, TRAINING_DISCIPLINE_VALUES, TRAINING_EVENT_TYPES, TRAINING_EXPERIENCE_LEVEL_VALUES, TRAINING_GOAL_VALUES, TRAINING_PARTNERSHIP_STATUSES, TRAINING_PARTNERS_MAX, TRAINING_PARTNER_ENCOURAGEMENTS_PER_24_HOURS_MAX, TRAINING_PARTNER_ENCOURAGEMENT_KINDS, TRAINING_PARTNER_PERMISSION_KEYS, TRAINING_PARTNER_REQUESTS_PER_DAY_MAX, TRAINING_SIGNAL_DECLINES_MAX, TRAINING_SIGNAL_DECLINE_SESSIONS, TRAINING_SIGNAL_MIN_DECLINE, TRAINING_SIGNAL_MIN_RPE_SETS, TRAINING_SIGNAL_MIN_SHORT_SETS, TRAINING_SIGNAL_MIN_TARGET_SETS, TRAINING_SIGNAL_PERIOD_DAYS, TRAINING_SIGNAL_RPE_RISE, TRAINING_SIGNAL_SHORT_LIFTS_MAX, TRAINING_SIGNAL_SHORT_POINTS_RISE, TRAINING_SIGNAL_WORKOUT_DROP, type TemporaryOverrideKind, type TemporaryOverrideSource, type TemporaryOverrideSourceKind, type TrainingBlockComparisonResponse, type TrainingDiscipline, type TrainingEventType, type TrainingExperienceLevel, type TrainingGoal, type TrainingIdentity, type TrainingLocationPreference, type TrainingLocationPreferenceInput, type TrainingPartnerAchievementNotification, type TrainingPartnerAchievementPushPayload, type TrainingPartnerEncouragementKind, type TrainingPartnerEncouragementNotification, type TrainingPartnerPermissions, type TrainingPartnerScheduleDay, type TrainingPartnerScheduleResponse, type TrainingPartnerSessionNotification, type TrainingPartnerSessionPushPayload, type TrainingPartnership, type TrainingPartnershipStatus, type TrainingPartnershipsResponse, type TrainingReminderPreference, type TrainingReminderPushPayload, type TrainingSignalPeriod, type TrainingSignalsResponse, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, USERNAME_PATTERN_SOURCE, type UnreadConversationsResponse, type UpdateActivitySharingRequest, type UpdateCustomExerciseRequest, type UpdateDashboardLayoutRequest, type UpdateLocaleRequest, type UpdateMessagePermissionRequest, type UpdateNotificationPreferencesRequest, type UpdateOnboardingRequest, type UpdateProfileDiscoveryRequest, type UpdateProfilePrivacyRequest, type UpdateProfileRequest, type UpdateRoutineRequest, type UpdateRoutineVisibilityRequest, type UpdateSessionNotesRequest, type UpdateSessionNotesResponse, type UpdateTrainingPartnerPermissionsRequest, type UpdateWeekStartRequest, type UpsertBodyMeasurementRequest, type UpsertRoutineTrainingBlockRequest, type UpsertSetLogRequest, type UpsertSetLogResponse, type UserId, type UserProfile, type UserSearchResponse, type VolumeTrendPoint, type VolumeTrendQuery, type VolumeTrendResponse, type VolumeTrendSeries, WEEK_STARTS, WEIGHT_UNITS, WORKOUT_SESSION_STATUSES, type WarmUpEquipment, type WarmUpLoad, type WarmUpRamp, type WarmUpSet, type WarmUpStep, type WeekStartsOn, type WeightUnit, type WorkoutAnalyticsStatus, type WorkoutPeriod, type WorkoutProgressQuery, type WorkoutProgressResponse, type WorkoutSearchPage, type WorkoutSession, type WorkoutSessionId, type WorkoutSessionListResponse, type WorkoutSessionRecap, type WorkoutSessionSnapshotV1, type WorkoutSessionStatus, type WorkoutSessionSummary, type WorkoutSignal, type WorkoutStatsQuery, type WorkoutStatsResponse, accountExportFileName, advanceLinearPeriodization, apiError, apiErrorMessage, applyDeload, bodyMeasurementProblems, bodyProgressRangeStart, buildWarmUpRamp, calculatePlateLoading, canLinkToNext, cmToFeetInches, cmToInches, continueLinearPeriodization, countsAsWork, countsForProgression, customExerciseProblem, defaultWarmUpEquipment, deloadLengthDays, exerciseGroupLabel, exerciseGroupPosition, exerciseGroups, exerciseNameKey, feetInchesToCm, followWorkingLoad, goalSuggestionKey, hasOversizedGroup, inchesToCm, isApiErrorCode, isAppLocale, isBarLoaded, isBodyMeasurementDate, isDashboardSectionId, isDefaultDashboardLayout, isGoalSuggestionKey, isMessagePermission, isOnboardingStepId, isRealtimeTopic, isSetKind, isWeekStartsOn, isWithinQuietHours, latestBodyWeight, leadWorkingWeight, linearPeriodizationProblem, lpEstimate, lpLoadKg, lpPrescription, lpRecommendation, lpRirMidpoint, lpSampleRir, lpSetEstimateKg, lpStep, lpStoredSets, lpWorkingSets, matchesDeletionConfirmation, messageBodyLength, normalizeDashboardLayout, normalizeExerciseLinks, normalizeExerciseName, normalizeMessageBody, normalizeSearchQuery, parseRealtimeEvent, primaryEquipment, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, roundDownToIncrement, roundToIncrement, routineDayLabel, sameLpPosition, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, startLinearPeriodization, summarizeBodyProgress, trainingBlockCovers, warmUpLoad, weekStartOf };
5032
+ export { ACCOUNT_EXPORT_FORMAT, ACCOUNT_EXPORT_VERSION, ACHIEVEMENT_CATEGORIES, ACHIEVEMENT_DEFINITIONS, ACTIVITY_CAPS, ACTIVITY_COMMENTS_PAGE_SIZE, ACTIVITY_COMMENTS_PER_DAY_MAX, ACTIVITY_COMMENT_MAX_LENGTH, ACTIVITY_DEFAULT_AUDIENCE, ACTIVITY_ENTRY_ID_MAX_LENGTH, ACTIVITY_FEED_FOLLOWED_MAX, ACTIVITY_PAGE_DEFAULT_LIMIT, ACTIVITY_PAGE_MAX_LIMIT, ACTIVITY_PREVIEW_AUDIENCES, ACTIVITY_REACTIONS, ACTIVITY_TYPES, ACTIVITY_TYPE_SECTIONS, API_ERROR_CODES, API_ERROR_MESSAGES, type AccountExportBodyMeasurement, type AccountExportGoal, type AccountExportMember, type AccountExportPersonalRecord, type AccountExportRoutine, type AccountExportScheduleOverride, type AccountExportTrainingEvent, type AccountExportTrainingLocation, type AccountExportV1, type AchievementActivity, type AchievementCategory, type AchievementCategoryProgress, type AchievementDefinition, type AchievementNotification, type AchievementUnlockedEventPayload, type AchievementsResponse, type ActivityAudience, type ActivityCap, type ActivityComment, type ActivityCommentNotification, type ActivityCommentSummary, type ActivityCommentsQuery, type ActivityCommentsResponse, type ActivityEntry, type ActivityEntrySharing, type ActivityFeedResponse, type ActivityLink, type ActivityPage, type ActivityPageQuery, type ActivityPreviewAudience, type ActivityPreviewQuery, type ActivityReaction, type ActivityReactionSummary, type ActivitySection, type ActivitySharingSettings, type ActivityType, type ApiErrorBody, type ApiErrorCode, type ApiErrorParams, type AppLocale, type AppNotification, BAR_CHOICES_KG, BAR_WARM_UP_STEPS, BLOCKED_MEMBERS_MAX, BODY_MEASUREMENT_FIELDS, BODY_MEASUREMENT_FIELD_KEYS, BODY_PROGRESS_RANGES, type BlockComparisonLift, type BlockComparisonLiftBest, type BlockComparisonPeriod, type BlockComparisonPeriodKind, type BlockedMember, type BlockedMembersResponse, type BodyFieldSummary, type BodyMeasurement, type BodyMeasurementField, type BodyMeasurementProblem, type BodyMeasurementValues, type BodyProgressRange, type BodyProgressResponse, type Brand, CLONE_ROUTINE_REFUSALS, CM_PER_INCH, COMEBACK_MIN_INACTIVE_DAYS, COMEBACK_RECOGNITION_LIMIT, COMEBACK_REQUIRED_ACTIVE_DAYS, COMEBACK_SESSION_LOOKBACK, COMEBACK_WINDOW_DAYS, CONVERSATIONS_PAGE_SIZE, CONVERSATION_BOXES, CUSTOM_EXERCISES_MAX, CUSTOM_EXERCISE_NAME_MAX, CUSTOM_EXERCISE_NOTE_MAX, CUSTOM_EXERCISE_PROBLEM_MESSAGES, CUSTOM_EXERCISE_REFUSALS, type CalendarDate, type CapturedMessage, type CloneRoutineRefusal, type CloneRoutineRequest, type ComebackActivity, type ComebackRecognition, type ComebackRecognitionSummary, type ContinueLinearBlockRequest, type ConversationBox, type ConversationMember, type ConversationMessage, type ConversationMessagesResponse, type ConversationRequest, type ConversationSummary, type ConversationsResponse, type CorrectSessionRequest, type CorrectSessionResponse, type CorrectSessionSetRequest, type CreateActivityCommentRequest, type CreateActivityCommentResponse, type CreateDeloadRequest, type CreateReportRequest, type CreateReportResponse, type CreateRoutineDayInput, type CreateRoutineExerciseInput, type CreateRoutineRequest, type CreateRoutineVersionRequest, type CreateSessionShareRequest, type CustomExerciseInput, type CustomExerciseProblem, type CustomExerciseRefusal, DASHBOARD_SECTION_IDS, DEFAULT_DASHBOARD_LAYOUT, DEFAULT_LOCALE, DEFAULT_MESSAGE_PERMISSION, DEFAULT_WEEK_STARTS_ON, DELOAD_DEFAULT_DAYS, DELOAD_DEFAULT_LOAD_REDUCTION, DELOAD_DEFAULT_SET_MODE, DELOAD_LOAD_REDUCTIONS, DELOAD_MAX_DAYS, DELOAD_NOT_LIGHTER, DELOAD_SET_MODES, DELOAD_SUGGESTION_COOLDOWN_DAYS, DELOAD_SUGGESTION_EARLIER_DAYS, DELOAD_SUGGESTION_MIN_MARKED_TODAY, DELOAD_SUGGESTION_ROUTINE_DAYS, DELOAD_SUGGESTION_SIGNALS, type DashboardLayout, type DashboardLayoutEntry, type DashboardSectionId, type DeclineSignal, type DecliningLift, type DecliningLiftSession, type DeleteAccountRequest, type DeleteAccountResponse, type DeleteActivityCommentResponse, type DeletePushSubscriptionRequest, type DeloadLoadReduction, type DeloadOptions, type DeloadSetMode, type DeloadSuggestion, type DeloadSuggestionEvidence, type DeloadSuggestionResponse, type DeloadSuggestionSignal, type DeloadSuggestionUnavailableReason, type DiscoverableRoutine, type DismissGoalSuggestionRequest, EXERCISE_EQUIPMENT, EXERCISE_GROUP_KIND_LABELS, EXERCISE_GROUP_MAX, EXERCISE_MECHANICS, type EarnedAchievement, type EarnedPersonalRecord, type EffortPeriod, type EffortSignal, type Exercise, type ExerciseEquipment, type ExerciseGroup, type ExerciseGroupKind, type ExerciseGroupPosition, type ExerciseId, type ExerciseMechanic, type ExercisePerformanceHistoryQuery, type ExercisePerformanceHistoryResponse, type ExercisePerformancePrescription, type ExercisePerformancePrescriptionSet, type ExercisePerformanceSession, type ExercisePerformanceSet, type ExercisePerformanceSummary, type ExercisePlateau, type ExerciseStrengthSummary, type ExerciseStrengthTrendPoint, type ExerciseStrengthTrendQuery, type ExerciseStrengthTrendResponse, FEATURED_PROFILE_ITEMS_MAX, FEATURED_PROFILE_ITEM_KINDS, FEATURED_PROFILE_REFERENCE_MAX_LENGTH, FOLLOW_SUGGESTIONS_DEFAULT_LIMIT, FOLLOW_SUGGESTIONS_MAX_LIMIT, FOLLOW_SUGGESTION_REASONS, type FeaturedProfileAchievementItem, type FeaturedProfileItem, type FeaturedProfileItemKind, type FeaturedProfileRankItem, type FeaturedProfileRecordItem, type FeaturedProfileRoutineItem, type FeaturedProfileSelection, type FeaturedProfileSelectionInput, type FeaturedProfileSelectionsResponse, type FinishStatus, type FinishWorkoutRequest, type FinishWorkoutResponse, type FollowSuggestion, type FollowSuggestionReason, type FollowSuggestionsResponse, GOAL_SUGGESTIONS_MAX, GOAL_SUGGESTION_DISMISSALS_MAX, GOAL_SUGGESTION_LIFT_MIN_SESSIONS, GOAL_SUGGESTION_LIFT_WINDOW_DAYS, GOAL_SUGGESTION_MIN_ACTIVE_WEEKS, GOAL_SUGGESTION_STRENGTH_STEP, GOAL_SUGGESTION_TYPES, GOAL_SUGGESTION_VOLUME_WEEKS, type GoalSuggestion, type GoalSuggestionBasis, type GoalSuggestionType, type GoalSuggestionsResponse, INCHES_PER_FOOT, type IsoDateString, LENGTH_UNITS, LIMITED_SHORTFALL_KG, LP_BLOCK_STEPS, LP_ESTIMATE_MAX_REPS_TO_FAILURE, LP_ESTIMATE_MIN_SETS, LP_ESTIMATE_STEPS, LP_NEXT_BLOCK_KINDS, LP_PHASES, LP_PROGRESS_CAP, LP_PROGRESS_THRESHOLD, LP_RECOVERY, LP_REFERENCE_MAX_KG, LP_REST_SECONDS, LP_STEPS, LP_WORKING_SETS, type LengthUnit, type LinearBlockChange, type LinearBlockFinishedNotification, type LinearPeriodizationState, type ListSessionsParams, type LpEstimate, type LpLoggedSet, type LpNextBlockKind, type LpPhase, type LpRecommendation, type LpSample, type LpSetPrescription, type LpSetTarget, type LpStep, type LpStoredSet, MAX_SETS_PER_EXERCISE, MEASURABLE_GOALS_MAX, MEASURABLE_GOAL_DIRECTIONS, MEASURABLE_GOAL_TYPES, MESSAGES_PAGE_SIZE, MESSAGES_PER_MINUTE_MAX, MESSAGE_ATTACHMENT_KINDS, MESSAGE_BODY_MAX, MESSAGE_PERMISSIONS, MESSAGE_PUSH_DELAY_SECONDS, MESSAGE_REPORT_CONTEXT_BEFORE, MESSAGE_REQUEST_DECLINE_COOLDOWN_DAYS, MINUTES_IN_DAY, MODERATION_ACTION_KINDS, MODERATION_HISTORY_PAGE_SIZE, MODERATION_NOTE_MAX_LENGTH, MODERATION_QUEUE_PAGE_SIZE, MOVEMENT_PATTERNS, MUSCLE_GROUPS, type MarkConversationReadRequest, type MarkNotificationsReadRequest, type MarkNotificationsReadResponse, type MeasurableGoal, type MeasurableGoalDirection, type MeasurableGoalExercise, type MeasurableGoalInput, type MeasurableGoalType, type MemberActivityResponse, type MemberMessagingState, type MemberModerationState, type MemberRoutinesResponse, type MemberSearchPage, type MessageAttachment, type MessageAttachmentKind, type MessagePermission, type MessagePushPayload, type MessageRoutineAttachment, type ModerationActionKind, type ModerationActionRecord, type ModerationHistoryQuery, type ModerationHistoryResponse, type ModerationQueueQuery, type ModerationQueueResponse, type ModerationReport, type ModeratorState, type MoveOccurrenceRequest, type MovementPattern, type MuscleGroup, type MuscleGroupHeatmapQuery, type MuscleGroupHeatmapResponse, type MuscleGroupHeatmapValue, type MuscleGroupHeatmapWeek, type MuscleVolumeTrendSeries, NEW_CONVERSATIONS_PER_DAY_MAX, NOTIFICATIONS_LIST_LIMIT, NOTIFICATIONS_LOOKBACK_DAYS, NOTIFICATIONS_PAGE_SIZE, NOTIFICATIONS_PAGE_SIZE_MAX, NOTIFICATIONS_RETENTION_DAYS, NOTIFICATION_CATEGORIES, NOTIFICATION_KINDS, type NewFollowerNotification, type NotificationCategory, type NotificationKind, type NotificationPreferences, type NotificationPreferencesResponse, type NotificationsQuery, type NotificationsResponse, ONBOARDING_STEPS_MAX, ONBOARDING_STEP_ID_PATTERN_SOURCE, ONBOARDING_VERSION_MAX, OTHER_WARM_UP_STEPS, type OnboardingState, type OwnActivityEntry, type OwnActivityResponse, PLATEAU_MIN_DAYS_SINCE_BEST, PLATEAU_MIN_SESSIONS, PLATEAU_MIN_SESSIONS_MAX, PLATEAU_MIN_SESSIONS_MIN, PLATEAU_RECENT_DAYS, PLATEAU_WINDOW_DAYS, PLATE_SETS, PREFERRED_TRAINING_STYLE_VALUES, PROFILE_BIO_MAX_LENGTH, PROFILE_FAVORITE_EXERCISES_MAX, PROFILE_LOCATION_MAX_LENGTH, PROFILE_TRAINING_DISCIPLINES_MAX, PROFILE_TRAINING_GOALS_MAX, PROFILE_VISIBILITY_VALUES, PROGRESSION_SCHEMES, PROGRESS_TIMELINE_EVENT_TYPES, PUSH_PAYLOAD_KINDS, PUSH_SUBSCRIPTIONS_MAX, type PaginatedResponse, type PersonalGoalProgress, type PersonalGoalsResponse, type PersonalRecordActivity, type PersonalRecordEntry, type PersonalRecordKind, type PlannedReminder, type PlateLoadingItem, type PlateLoadingResult, type PlatePairInventory, type PlateSetChoice, type PlateauPreferences, type PlateauSet, type PlateausResponse, type PreferredTrainingStyle, type PreviousPerformanceResponse, type PreviousSessionRecap, type PreviousSetPerformance, type ProfileDiscoverySettings, type ProfileFavoriteExercise, type ProfilePrivacySettings, type ProfileViewerAccess, type ProfileVisibility, type ProgressTimelineEventType, type ProgressTimelineItem, type ProgressTimelinePersonalRecordItem, type ProgressTimelineProgressionItem, type ProgressTimelineQuery, type ProgressTimelineRecordPerformance, type ProgressTimelineRecordReason, type ProgressTimelineResponse, type ProgressTimelineSessionContext, type ProgressionActivity, type ProgressionChange, type ProgressionRule, type ProgressionScheme, type ProgressionSetChange, type PublicBodyMetrics, type PublicProfileAchievements, type PublicTrainingSummary, type PublicUserProfile, type PushPayload, type PushPayloadKind, type PushSubscriptionKeys, type PushSubscriptionSummary, type PushSubscriptionsResponse, type QuietHours, REALTIME_HEARTBEAT_MS, REALTIME_MAX_STREAMS_PER_MEMBER, REALTIME_MAX_STREAM_MS, REALTIME_STREAM_PATH, REALTIME_TOPICS, REALTIME_UNAVAILABLE_RETRY_SECONDS, RECENT_SEARCHES_MAX, RECENT_SEARCH_KINDS, RELATIONSHIP_LIST_DEFAULT_LIMIT, RELATIONSHIP_LIST_KINDS, RELATIONSHIP_LIST_MAX_LIMIT, RENAISSANCE_RANK_DEFINITIONS, REPORTS_PER_DAY_MAX, REPORT_DETAILS_MAX_LENGTH, REPORT_REASONS, REPORT_STATUSES, REPORT_SUBJECT_KINDS, REP_TYPES, RESERVED_USERNAMES, REST_ALERT_MAX_LEAD_SECONDS, REST_ALERT_MIN_LEAD_SECONDS, REST_ALERT_REFUSALS, ROUTINE_DAYS_MAX, ROUTINE_DAY_NAME_MAX, ROUTINE_DISCOVERY_DEFAULT_LIMIT, ROUTINE_DISCOVERY_MAX_LIMIT, ROUTINE_DISCOVERY_SCAN_LIMIT, ROUTINE_DURATION_BANDS, ROUTINE_DURATION_BAND_MAX_MINUTES, ROUTINE_SCHEDULE_MODES, ROUTINE_SHARE_MAX_ACTIVE_LINKS, ROUTINE_TRAINING_BLOCKS_MAX, ROUTINE_TRAINING_BLOCK_NAME_MAX, ROUTINE_TRAINING_BLOCK_REVISIONS_MAX, ROUTINE_TRAINING_BLOCK_SOURCE_KINDS, ROUTINE_TRAINING_BLOCK_STATES, ROUTINE_VERSIONS_MAX, ROUTINE_VERSION_KINDS, ROUTINE_VERSION_NAME_MAX, ROUTINE_VISIBILITY_VALUES, type RealtimeEvent, type RealtimeTopic, type RecentActivityEntry, type RecentExercise, type RecentRoutine, type RecentSearchItem, type RecentSearchKind, type RecentSearchesResponse, type RecordRecentSearchRequest, type RegisterPushSubscriptionRequest, type RelationshipListKind, type RelationshipListQuery, type RelationshipListResponse, type RelationshipMember, type RenaissanceRankDefinition, type RenaissanceRankProgress, type RepTargetPeriod, type RepTargetSignal, type RepType, type ReplaceFeaturedProfileItemsRequest, type ReplaceMeasurableGoalsRequest, type ReplaceTrainingLocationsRequest, type ReportReason, type ReportStatus, type ReportSubjectKind, type ReportSubjectPreview, type ReportedMessageContext, type ResolvedRoutinePlan, type RestAlertPushPayload, type RestAlertRefusal, type RestoreRoutineVersionResponse, type ReviewReportRequest, type ReviewReportResponse, type Routine, type RoutineClassification, type RoutineDay, type RoutineDayId, type RoutineDiscoveryQuery, type RoutineDiscoveryResponse, type RoutineDurationBand, type RoutineExercise, type RoutineFacets, type RoutineId, type RoutineLineage, type RoutinePlanSource, type RoutineScheduleMode, type RoutineSearchPage, type RoutineSet, type RoutineShare, type RoutineShareListResponse, type RoutineSharedActivity, type RoutineTemporaryOverride, type RoutineTemporaryOverridePlan, type RoutineTemporaryOverridesResponse, type RoutineTrainingBlock, type RoutineTrainingBlockPlan, type RoutineTrainingBlockRevision, type RoutineTrainingBlockRevisionsResponse, type RoutineTrainingBlockSource, type RoutineTrainingBlockSourceKind, type RoutineTrainingBlockState, type RoutineTrainingBlocksResponse, type RoutineVersion, type RoutineVersionDay, type RoutineVersionExercise, type RoutineVersionKind, type RoutineVersionSetup, type RoutineVersionsResponse, type RoutineVisibility, SCHEDULE_MOVE_MAX_DAYS, SCHEDULE_OVERRIDES_MAX_RANGE_DAYS, SCHEDULE_OVERRIDE_KINDS, SCHEDULE_SKIP_PAST_DAYS, SEARCH_PAGE_SIZE, SEARCH_PAGE_SIZE_MAX, SEARCH_PREVIEW_LIMIT, SEARCH_QUERY_MAX_LENGTH, SEARCH_QUERY_MIN_LENGTH, SEARCH_SERVER_CATEGORIES, SESSION_CORRECTIONS_MAX, SESSION_CORRECTION_LIMITS, SESSION_CORRECTION_WINDOW_HOURS, SESSION_EXERCISE_NOTE_MAX_LENGTH, SESSION_NOTE_MAX_LENGTH, SESSION_SHARE_DEFAULT_FIELDS, SESSION_SHARE_FIELDS, SESSION_SHARE_MAX_ACTIVE_LINKS, SET_KINDS, SET_KIND_LABELS, SEXES, SHARED_ROUTINE_SOURCES, STARRED_EXERCISES_MAX, STREAK_MAX_GAP_DAYS, SUPPORTED_LOCALES, type ScheduleOverride, type ScheduleOverrideKind, type ScheduleOverridesQuery, type ScheduleOverridesResponse, type ScheduleRestAlertRequest, type ScheduleRestAlertResponse, type SearchPage, type SearchPageQuery, type SearchPreviewQuery, type SearchPreviewResponse, type SearchServerCategory, type SendMessageRequest, type SendMessageResponse, type SendTrainingPartnerEncouragementRequest, type SendTrainingPartnerEncouragementResponse, type SessionComparisonExercise, type SessionComparisonQuery, type SessionComparisonResponse, type SessionComparisonRoutineDay, type SessionComparisonSession, type SessionComparisonSet, type SessionCompletedActivity, type SessionCorrection, type SessionCorrectionClosedReason, type SessionCorrectionWindow, type SessionCorrectionsResponse, type SessionExerciseNote, type SessionExerciseSubstitution, type SessionProgressNotification, type SessionRecapExerciseNote, type SessionRecapRecord, type SessionSetCorrection, type SessionShare, type SessionShareField, type SessionShareListResponse, type SessionTemporaryOverride, type SessionTrainingBlock, type SetAccountTimeZoneRequest, type SetActivityEntryAudienceRequest, type SetActivityEntryAudienceResponse, type SetActivityReactionRequest, type SetActivityReactionResponse, type SetKind, type SetLog, type SetLogValues, type Sex, type SharedRoutine, type SharedRoutineOwner, type SharedRoutineSearchResult, type SharedRoutineSource, type SharedRoutineSummary, type SharedSessionOwner, type SharedSessionRecap, type SkipOccurrenceRequest, type StarredExercise, type StarredExercisesResponse, type StartConversationRequest, type StartWorkoutRequest, type StartWorkoutResponse, type StreakAtRiskPushPayload, type StreakMilestoneActivity, type StreakMilestoneEventPayload, type SubstituteSessionExerciseRequest, type SubstituteSessionExerciseResponse, type SupabaseAuthResponse, type SupabaseAuthUser, type SupabaseMigrationResponse, TEMPORARY_OVERRIDE_KINDS, TEMPORARY_OVERRIDE_SOURCE_KINDS, TRAINING_BLOCK_COMPARISON_MAX_DAYS, TRAINING_DISCIPLINE_VALUES, TRAINING_EVENT_TYPES, TRAINING_EXPERIENCE_LEVEL_VALUES, TRAINING_GOAL_VALUES, TRAINING_PARTNERSHIP_STATUSES, TRAINING_PARTNERS_MAX, TRAINING_PARTNER_ENCOURAGEMENTS_PER_24_HOURS_MAX, TRAINING_PARTNER_ENCOURAGEMENT_KINDS, TRAINING_PARTNER_PERMISSION_KEYS, TRAINING_PARTNER_REQUESTS_PER_DAY_MAX, TRAINING_SIGNAL_DECLINES_MAX, TRAINING_SIGNAL_DECLINE_SESSIONS, TRAINING_SIGNAL_MIN_DECLINE, TRAINING_SIGNAL_MIN_RPE_SETS, TRAINING_SIGNAL_MIN_SHORT_SETS, TRAINING_SIGNAL_MIN_TARGET_SETS, TRAINING_SIGNAL_PERIOD_DAYS, TRAINING_SIGNAL_RPE_RISE, TRAINING_SIGNAL_SHORT_LIFTS_MAX, TRAINING_SIGNAL_SHORT_POINTS_RISE, TRAINING_SIGNAL_WORKOUT_DROP, type TemporaryOverrideKind, type TemporaryOverrideSource, type TemporaryOverrideSourceKind, type TrainingBlockComparisonResponse, type TrainingDiscipline, type TrainingEventType, type TrainingExperienceLevel, type TrainingGoal, type TrainingIdentity, type TrainingLocationPreference, type TrainingLocationPreferenceInput, type TrainingPartnerAchievementNotification, type TrainingPartnerAchievementPushPayload, type TrainingPartnerEncouragementKind, type TrainingPartnerEncouragementNotification, type TrainingPartnerPermissions, type TrainingPartnerScheduleDay, type TrainingPartnerScheduleResponse, type TrainingPartnerSessionNotification, type TrainingPartnerSessionPushPayload, type TrainingPartnership, type TrainingPartnershipStatus, type TrainingPartnershipsResponse, type TrainingReminderPreference, type TrainingReminderPushPayload, type TrainingSignalPeriod, type TrainingSignalsResponse, USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH, USERNAME_PATTERN_SOURCE, type UnreadConversationsResponse, type UpdateActivitySharingRequest, type UpdateCustomExerciseRequest, type UpdateDashboardLayoutRequest, type UpdateLocaleRequest, type UpdateMessagePermissionRequest, type UpdateNotificationPreferencesRequest, type UpdateOnboardingRequest, type UpdateProfileDiscoveryRequest, type UpdateProfilePrivacyRequest, type UpdateProfileRequest, type UpdateRoutineRequest, type UpdateRoutineVisibilityRequest, type UpdateSessionNotesRequest, type UpdateSessionNotesResponse, type UpdateTrainingPartnerPermissionsRequest, type UpdateWeekStartRequest, type UpsertBodyMeasurementRequest, type UpsertRoutineTrainingBlockRequest, type UpsertSetLogRequest, type UpsertSetLogResponse, type UserId, type UserProfile, type UserSearchResponse, type VolumeTrendPoint, type VolumeTrendQuery, type VolumeTrendResponse, type VolumeTrendSeries, WEEK_STARTS, WEIGHT_UNITS, WORKOUT_SESSION_STATUSES, type WarmUpEquipment, type WarmUpLoad, type WarmUpRamp, type WarmUpSet, type WarmUpStep, type WeekStartsOn, type WeightUnit, type WorkoutAnalyticsStatus, type WorkoutPeriod, type WorkoutProgressQuery, type WorkoutProgressResponse, type WorkoutSearchPage, type WorkoutSession, type WorkoutSessionId, type WorkoutSessionListResponse, type WorkoutSessionRecap, type WorkoutSessionSnapshotV1, type WorkoutSessionStatus, type WorkoutSessionSummary, type WorkoutSignal, type WorkoutStatsQuery, type WorkoutStatsResponse, accountExportFileName, advanceLinearPeriodization, apiError, apiErrorMessage, applyDeload, bodyMeasurementProblems, bodyProgressRangeStart, buildWarmUpRamp, calculatePlateLoading, canLinkToNext, cmToFeetInches, cmToInches, continueLinearPeriodization, countsAsWork, countsForProgression, customExerciseProblem, defaultWarmUpEquipment, deloadLengthDays, exerciseGroupLabel, exerciseGroupPosition, exerciseGroups, exerciseNameKey, feetInchesToCm, followWorkingLoad, goalSuggestionKey, hasOversizedGroup, inchesToCm, isApiErrorCode, isAppLocale, isBarLoaded, isBodyMeasurementDate, isDashboardSectionId, isDefaultDashboardLayout, isGoalSuggestionKey, isMessagePermission, isOnboardingStepId, isRealtimeTopic, isSetKind, isWeekStartsOn, isWithinQuietHours, latestBodyWeight, leadWorkingWeight, linearPeriodizationProblem, lpEstimate, lpLoadKg, lpPrescription, lpRecommendation, lpRirMidpoint, lpSampleRir, lpSetEstimateKg, lpStep, lpStoredSets, lpWorkingSets, matchesDeletionConfirmation, messageBodyLength, messageNote, normalizeDashboardLayout, normalizeExerciseLinks, normalizeExerciseName, normalizeMessageBody, normalizeSearchQuery, parseRealtimeEvent, primaryEquipment, requiredToFinish, resolveActiveTrainingBlock, resolveRoutinePlan, roundDownToIncrement, roundToIncrement, routineDayLabel, sameLpPosition, sessionCorrectionWindow, setKindOf, setLogValuesDiffer, startLinearPeriodization, summarizeBodyProgress, trainingBlockCovers, warmUpLoad, weekStartOf };