@sunsteel/contracts 0.92.0 → 0.94.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
@@ -981,291 +981,6 @@ declare const CLONE_ROUTINE_REFUSALS: {
981
981
  };
982
982
  type CloneRoutineRefusal = (typeof CLONE_ROUTINE_REFUSALS)[keyof typeof CLONE_ROUTINE_REFUSALS];
983
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).
1146
- */
1147
- requests: number;
1148
- }
1149
- /** GET /conversations/:id/messages, newest first; `cursor` pages older. */
1150
- interface ConversationMessagesResponse {
1151
- conversation: ConversationSummary;
1152
- messages: ConversationMessage[];
1153
- nextCursor: string | null;
1154
- }
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;
1166
- }
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;
1173
- }
1174
- interface SendMessageResponse {
1175
- conversation: ConversationSummary;
1176
- message: ConversationMessage;
1177
- }
1178
- /** PUT /users/preferences/messages. */
1179
- interface UpdateMessagePermissionRequest {
1180
- messagePermission: MessagePermission;
1181
- }
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;
1192
- }
1193
- declare function isMessagePermission(value: unknown): value is MessagePermission;
1194
-
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;
1210
- }
1211
- /**
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.
1215
- */
1216
- interface UpdateOnboardingRequest {
1217
- stepsDone?: string[];
1218
- completedVersion?: number;
1219
- offered?: true;
1220
- }
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;
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;
1268
-
1269
984
  interface SetLog {
1270
985
  id: string;
1271
986
  sessionId: string;
@@ -1771,258 +1486,617 @@ interface ExercisePerformancePrescription {
1771
1486
  minWeightIncrementKg: number;
1772
1487
  sets: ExercisePerformancePrescriptionSet[];
1773
1488
  }
1774
- interface ExercisePerformanceSession {
1489
+ interface ExercisePerformanceSession {
1490
+ sessionId: string;
1491
+ status: Extract<WorkoutSessionStatus, 'COMPLETED' | 'ABORTED'>;
1492
+ routineName: string;
1493
+ dayName?: string | null;
1494
+ startedAt: string;
1495
+ endedAt: string;
1496
+ durationSec?: number | null;
1497
+ sessionNotes?: string | null;
1498
+ sets: ExercisePerformanceSet[];
1499
+ prescriptions: ExercisePerformancePrescription[];
1500
+ progressionChanges: ProgressionChange[];
1501
+ }
1502
+ /** Stable successful response of GET /workouts/progress/performance. */
1503
+ interface ExercisePerformanceHistoryResponse {
1504
+ exercises: ExercisePerformanceSummary[];
1505
+ selectedExercise: ExercisePerformanceSummary | null;
1506
+ items: ExercisePerformanceSession[];
1507
+ nextCursor?: string;
1508
+ }
1509
+ interface MuscleGroupHeatmapQuery {
1510
+ timeZone: string;
1511
+ /** Number of Monday-based calendar weeks to return, including this week. */
1512
+ weeks?: number;
1513
+ }
1514
+ interface MuscleGroupHeatmapValue {
1515
+ muscle: MuscleGroup;
1516
+ /** Completed-set equivalents: primary muscles count 1, secondary count 0.5. */
1517
+ weightedSets: number;
1518
+ }
1519
+ interface MuscleGroupHeatmapWeek {
1520
+ weekStart: string;
1521
+ isCurrentWeek: boolean;
1522
+ totalWeightedSets: number;
1523
+ muscles: MuscleGroupHeatmapValue[];
1524
+ }
1525
+ /** Stable successful response of GET /workouts/progress/muscles. */
1526
+ interface MuscleGroupHeatmapResponse {
1527
+ timeZone: string;
1528
+ weeks: MuscleGroupHeatmapWeek[];
1529
+ peakWeightedSets: number;
1530
+ }
1531
+ interface VolumeTrendQuery {
1532
+ timeZone: string;
1533
+ /** Number of Monday-based calendar weeks to return, including this week. */
1534
+ weeks?: number;
1535
+ }
1536
+ interface VolumeTrendPoint {
1537
+ weekStart: string;
1538
+ isCurrentWeek: boolean;
1539
+ /** External-load volume in canonical kilograms: weight × repetitions. */
1540
+ volumeKg: number;
1541
+ completedSets: number;
1542
+ }
1543
+ interface VolumeTrendSeries {
1544
+ id: string;
1545
+ name: string;
1546
+ totalVolumeKg: number;
1547
+ totalCompletedSets: number;
1548
+ points: VolumeTrendPoint[];
1549
+ }
1550
+ interface MuscleVolumeTrendSeries extends VolumeTrendSeries {
1551
+ id: MuscleGroup;
1552
+ }
1553
+ /** Stable successful response of GET /workouts/progress/volume. */
1554
+ interface VolumeTrendResponse {
1555
+ timeZone: string;
1556
+ weeks: number;
1557
+ overall: VolumeTrendPoint[];
1558
+ muscles: MuscleVolumeTrendSeries[];
1559
+ routines: VolumeTrendSeries[];
1560
+ exercises: VolumeTrendSeries[];
1561
+ }
1562
+ interface SessionComparisonQuery {
1563
+ routineDayId?: string;
1564
+ }
1565
+ interface SessionComparisonRoutineDay {
1566
+ routineDayId: string;
1567
+ routineId: string;
1568
+ routineName: string;
1569
+ dayName?: string | null;
1570
+ lastCompletedAt: IsoDateString;
1571
+ completedSessionCount: number;
1572
+ }
1573
+ interface SessionComparisonSet {
1574
+ routineExerciseId: string;
1575
+ setNumber: number;
1576
+ reps: number;
1577
+ weightKg?: number | null;
1578
+ rpe?: number | null;
1579
+ }
1580
+ interface SessionComparisonExercise {
1581
+ routineExerciseId: string;
1582
+ exerciseId: string;
1583
+ exerciseName: string;
1584
+ order: number;
1585
+ sets: SessionComparisonSet[];
1586
+ }
1587
+ interface SessionComparisonSession {
1588
+ sessionId: string;
1589
+ routineDayId: string;
1590
+ routineName: string;
1591
+ dayName?: string | null;
1592
+ startedAt: IsoDateString;
1593
+ endedAt: IsoDateString;
1594
+ durationSec: number;
1595
+ totalVolumeKg: number;
1596
+ completedSets: number;
1597
+ notes?: string | null;
1598
+ exercises: SessionComparisonExercise[];
1599
+ }
1600
+ /** Stable successful response of GET /workouts/progress/session-comparison. */
1601
+ interface SessionComparisonResponse {
1602
+ routineDays: SessionComparisonRoutineDay[];
1603
+ selectedRoutineDay: SessionComparisonRoutineDay | null;
1604
+ latestSession: SessionComparisonSession | null;
1605
+ previousSession: SessionComparisonSession | null;
1606
+ }
1607
+ declare const PROGRESS_TIMELINE_EVENT_TYPES: readonly ["PERSONAL_RECORD", "PROGRESSION_CHANGED"];
1608
+ type ProgressTimelineEventType = (typeof PROGRESS_TIMELINE_EVENT_TYPES)[number];
1609
+ interface ProgressTimelineQuery {
1610
+ type?: ProgressTimelineEventType;
1611
+ /** Only events for one catalog exercise (EXER-01). */
1612
+ exerciseId?: string;
1613
+ cursor?: string;
1614
+ limit?: number;
1615
+ }
1616
+ interface ProgressTimelineSessionContext {
1617
+ sessionId: string;
1618
+ routineName: string;
1619
+ dayName?: string | null;
1620
+ }
1621
+ interface ProgressTimelineRecordPerformance {
1622
+ weightKg: number;
1623
+ reps: number;
1624
+ estimated1rmKg: number;
1625
+ }
1626
+ type ProgressTimelineRecordReason = 'FIRST_RECORDED_BEST' | 'HEAVIER_LOAD' | 'MORE_REPS_AT_SAME_LOAD';
1627
+ interface ProgressTimelinePersonalRecordItem {
1628
+ eventId: string;
1629
+ type: 'PERSONAL_RECORD';
1630
+ occurredAt: IsoDateString;
1631
+ session: ProgressTimelineSessionContext;
1632
+ exerciseId: string;
1633
+ exerciseName: string;
1634
+ current: ProgressTimelineRecordPerformance;
1635
+ previous: ProgressTimelineRecordPerformance | null;
1636
+ reason: ProgressTimelineRecordReason;
1637
+ }
1638
+ interface ProgressTimelineProgressionItem {
1639
+ eventId: string;
1640
+ type: 'PROGRESSION_CHANGED';
1641
+ occurredAt: IsoDateString;
1642
+ session: ProgressTimelineSessionContext;
1643
+ exerciseId: string;
1644
+ exerciseName: string;
1645
+ change: ProgressionChange;
1646
+ }
1647
+ type ProgressTimelineItem = ProgressTimelinePersonalRecordItem | ProgressTimelineProgressionItem;
1648
+ /** Stable successful response of GET /workouts/progress/timeline. */
1649
+ interface ProgressTimelineResponse {
1650
+ items: ProgressTimelineItem[];
1651
+ nextCursor?: string;
1652
+ }
1653
+ /** Immutable prescription captured before any sets or progression. */
1654
+ interface WorkoutSessionSnapshotV1 {
1655
+ schemaVersion: 1;
1656
+ sessionId: string;
1657
+ sourceRoutineId: string;
1658
+ sourceRoutineDayId: string;
1659
+ capturedAt: string;
1660
+ provenance: 'CAPTURED' | 'APPROXIMATED';
1661
+ notes: string | null;
1662
+ routine: NonNullable<WorkoutSession['routine']>;
1663
+ routineDay: NonNullable<WorkoutSession['routineDay']>;
1664
+ /** ROUT-15; absent on snapshots captured before blocks executed. */
1665
+ trainingBlock?: WorkoutSession['trainingBlock'];
1666
+ /** ROUT-16; absent on snapshots captured before deloads existed. */
1667
+ temporaryOverride?: WorkoutSession['temporaryOverride'];
1668
+ }
1669
+ interface SetAccountTimeZoneRequest {
1670
+ timeZone: string;
1671
+ /** Bootstrap must not replace a zone registered by another device. */
1672
+ onlyIfUnset?: boolean;
1673
+ }
1674
+ interface WorkoutAnalyticsStatus {
1675
+ timeZone: string | null;
1676
+ requestedTimeZone: string | null;
1677
+ state: 'UNINITIALIZED' | 'BUILDING' | 'READY' | 'FAILED';
1678
+ generationId: string | null;
1679
+ }
1680
+ /**
1681
+ * Thresholds behind every plateau. A lift is flagged only when all hold: at
1682
+ * least the account's minimum sessions (`PLATEAU_MIN_SESSIONS` by default)
1683
+ * of terminal sessions with completed loaded sets of it since its current
1684
+ * best (the session that set the best excluded, and counting only inside the
1685
+ * look-back window), the best is at least
1686
+ * `PLATEAU_MIN_DAYS_SINCE_BEST` days old, and the lift was trained within the
1687
+ * last `PLATEAU_RECENT_DAYS` days. They describe numbers, never a cause.
1688
+ */
1689
+ declare const PLATEAU_WINDOW_DAYS = 56;
1690
+ declare const PLATEAU_MIN_SESSIONS = 4;
1691
+ declare const PLATEAU_MIN_DAYS_SINCE_BEST = 21;
1692
+ declare const PLATEAU_RECENT_DAYS = 21;
1693
+ /**
1694
+ * PREF-05: each account chooses its minimum sessions within these bounds;
1695
+ * `PLATEAU_MIN_SESSIONS` is the default. The other thresholds stay fixed.
1696
+ */
1697
+ declare const PLATEAU_MIN_SESSIONS_MIN = 3;
1698
+ declare const PLATEAU_MIN_SESSIONS_MAX = 8;
1699
+ /** Body and response of PUT /users/preferences/plateaus. */
1700
+ interface PlateauPreferences {
1701
+ minSessions: number;
1702
+ }
1703
+ interface PlateauSet {
1704
+ weightKg: number;
1705
+ reps: number;
1706
+ estimated1rmKg: number;
1707
+ }
1708
+ interface ExercisePlateau {
1709
+ exerciseId: string;
1710
+ exerciseName: string;
1711
+ /** The persisted best-set frontier. */
1712
+ best: PlateauSet & {
1713
+ achievedAt: IsoDateString;
1714
+ };
1715
+ /** Sessions were counted from the later of the best and the window start. */
1716
+ countedSince: IsoDateString;
1717
+ sessionsWithoutNewBest: number;
1718
+ /** The set since then with the highest estimated 1RM (latest on ties). */
1719
+ closest: PlateauSet & {
1720
+ performedAt: IsoDateString;
1721
+ };
1722
+ /** closest.estimated1rmKg / best.estimated1rmKg. */
1723
+ closestRatio: number;
1724
+ lastPerformedAt: IsoDateString;
1725
+ }
1726
+ /** Stable successful response of GET /workouts/progress/plateaus. */
1727
+ interface PlateausResponse {
1728
+ asOf: IsoDateString;
1729
+ thresholds: {
1730
+ windowDays: number;
1731
+ /** The account's PREF-05 choice, within the bounds above. */
1732
+ minSessions: number;
1733
+ minDaysSinceBest: number;
1734
+ recentDays: number;
1735
+ };
1736
+ /** Lifts with a best set that were trained within the recent days. */
1737
+ checkedExercises: number;
1738
+ /** Longest-running first: most sessions without a new best. */
1739
+ plateaus: ExercisePlateau[];
1740
+ }
1741
+
1742
+ /**
1743
+ * Who may start a conversation with a member. `FOLLOWED`: members they follow.
1744
+ * `EVERYONE` (MSG-02): members they follow reach the inbox, anyone else lands
1745
+ * in Requests. `NOBODY`: no one may start a new one.
1746
+ */
1747
+ declare const MESSAGE_PERMISSIONS: readonly ["FOLLOWED", "EVERYONE", "NOBODY"];
1748
+ type MessagePermission = (typeof MESSAGE_PERMISSIONS)[number];
1749
+ declare const DEFAULT_MESSAGE_PERMISSION: MessagePermission;
1750
+ /** Characters in one message, counted as code points. */
1751
+ declare const MESSAGE_BODY_MAX = 2000;
1752
+ /** Messages one member may send in a rolling minute. */
1753
+ declare const MESSAGES_PER_MINUTE_MAX = 30;
1754
+ /** Conversations one member may start in a rolling day. */
1755
+ declare const NEW_CONVERSATIONS_PER_DAY_MAX = 20;
1756
+ declare const CONVERSATIONS_PAGE_SIZE = 20;
1757
+ declare const MESSAGES_PAGE_SIZE = 30;
1758
+ /** Length as a reader counts it: an emoji is one character, not two. */
1759
+ declare function messageBodyLength(body: string): number;
1760
+ /**
1761
+ * The stored form of a typed message: line endings made `\n` and the ends
1762
+ * trimmed, the lines in between kept as written. Null when it is empty or too
1763
+ * long -- it is refused rather than cut, because a message clipped mid-sentence
1764
+ * would misrepresent its author.
1765
+ */
1766
+ declare function normalizeMessageBody(body: string): string | null;
1767
+ /**
1768
+ * MSG-07: what a message, its text left empty or not, may carry -- one of
1769
+ * them, with an optional note. MSG-10 adds a finished workout.
1770
+ */
1771
+ declare const MESSAGE_ATTACHMENT_KINDS: readonly ["ROUTINE", "WORKOUT", "RECORD"];
1772
+ type MessageAttachmentKind = (typeof MESSAGE_ATTACHMENT_KINDS)[number];
1773
+ /**
1774
+ * MSG-07: a routine in a message, as it is now. `routine` is null once it is
1775
+ * no longer available -- deleted, or hidden by moderation -- and the card
1776
+ * says so rather than showing what it once was.
1777
+ */
1778
+ interface MessageRoutineAttachment {
1779
+ kind: "ROUTINE";
1780
+ routine: SharedRoutineSummary | null;
1781
+ }
1782
+ /**
1783
+ * MSG-10: a finished workout in a card -- what was trained and its totals,
1784
+ * as the workout is now (a correction shows). Never its notes, RPE or the
1785
+ * comparison with the session before.
1786
+ */
1787
+ interface MessageWorkoutSummary {
1775
1788
  sessionId: string;
1776
- status: Extract<WorkoutSessionStatus, 'COMPLETED' | 'ABORTED'>;
1777
1789
  routineName: string;
1778
- dayName?: string | null;
1779
- startedAt: string;
1780
- endedAt: string;
1781
- durationSec?: number | null;
1782
- sessionNotes?: string | null;
1783
- sets: ExercisePerformanceSet[];
1784
- prescriptions: ExercisePerformancePrescription[];
1785
- progressionChanges: ProgressionChange[];
1786
- }
1787
- /** Stable successful response of GET /workouts/progress/performance. */
1788
- interface ExercisePerformanceHistoryResponse {
1789
- exercises: ExercisePerformanceSummary[];
1790
- selectedExercise: ExercisePerformanceSummary | null;
1791
- items: ExercisePerformanceSession[];
1792
- nextCursor?: string;
1790
+ dayName: string | null;
1791
+ endedAt: IsoDateString;
1792
+ durationSec: number;
1793
+ totalVolumeKg: number;
1794
+ completedSets: number;
1793
1795
  }
1794
- interface MuscleGroupHeatmapQuery {
1795
- timeZone: string;
1796
- /** Number of Monday-based calendar weeks to return, including this week. */
1797
- weeks?: number;
1796
+ /** MSG-10: `workout` is null once it is no longer available (deleted). */
1797
+ interface MessageWorkoutAttachment {
1798
+ kind: "WORKOUT";
1799
+ workout: MessageWorkoutSummary | null;
1798
1800
  }
1799
- interface MuscleGroupHeatmapValue {
1800
- muscle: MuscleGroup;
1801
- /** Completed-set equivalents: primary muscles count 1, secondary count 0.5. */
1802
- weightedSets: number;
1801
+ /**
1802
+ * MSG-11: a personal record in a card -- that record as set, even once
1803
+ * beaten: its lift, the performance, when, and the best it beat, as the
1804
+ * progress timeline words it. Nothing of the workout around it.
1805
+ */
1806
+ interface MessageRecordSummary {
1807
+ /** The `PERSONAL_RECORD` training event. */
1808
+ eventId: string;
1809
+ exerciseId: string;
1810
+ exerciseName: string;
1811
+ occurredAt: IsoDateString;
1812
+ current: ProgressTimelineRecordPerformance;
1813
+ previous: ProgressTimelineRecordPerformance | null;
1814
+ reason: ProgressTimelineRecordReason;
1803
1815
  }
1804
- interface MuscleGroupHeatmapWeek {
1805
- weekStart: string;
1806
- isCurrentWeek: boolean;
1807
- totalWeightedSets: number;
1808
- muscles: MuscleGroupHeatmapValue[];
1816
+ /** MSG-11: `record` is null once a correction removed it. */
1817
+ interface MessageRecordAttachment {
1818
+ kind: "RECORD";
1819
+ record: MessageRecordSummary | null;
1809
1820
  }
1810
- /** Stable successful response of GET /workouts/progress/muscles. */
1811
- interface MuscleGroupHeatmapResponse {
1812
- timeZone: string;
1813
- weeks: MuscleGroupHeatmapWeek[];
1814
- peakWeightedSets: number;
1821
+ type MessageAttachment = MessageRoutineAttachment | MessageWorkoutAttachment | MessageRecordAttachment;
1822
+ /** MSG-10: one completed set of a shared workout. Never its RPE. */
1823
+ interface SharedWorkoutSet {
1824
+ setNumber: number;
1825
+ kind: SetKind;
1826
+ /** Canonical kilograms; null for a set logged without a load. */
1827
+ weightKg: number | null;
1828
+ reps: number | null;
1815
1829
  }
1816
- interface VolumeTrendQuery {
1817
- timeZone: string;
1818
- /** Number of Monday-based calendar weeks to return, including this week. */
1819
- weeks?: number;
1830
+ interface SharedWorkoutExercise {
1831
+ exerciseId: string;
1832
+ /** The exercise as it was performed (a swapped slot by its substitute). */
1833
+ name: string;
1834
+ sets: SharedWorkoutSet[];
1820
1835
  }
1821
- interface VolumeTrendPoint {
1822
- weekStart: string;
1823
- isCurrentWeek: boolean;
1824
- /** External-load volume in canonical kilograms: weight × repetitions. */
1825
- volumeKg: number;
1826
- completedSets: number;
1836
+ /**
1837
+ * MSG-10: GET /conversations/:id/messages/:messageId/workout. The workout a
1838
+ * message shared, opened: the summary, the records it set and each
1839
+ * exercise's completed sets, in the order they were trained. Nothing else of
1840
+ * the session -- no notes, no RPE, no previous-session comparison.
1841
+ */
1842
+ interface SharedWorkout extends MessageWorkoutSummary {
1843
+ owner: SharedSessionOwner;
1844
+ /** The owner's unit; a reader shows weights in their own. */
1845
+ weightUnit: WeightUnit;
1846
+ records: SessionRecapRecord[];
1847
+ exercises: SharedWorkoutExercise[];
1827
1848
  }
1828
- interface VolumeTrendSeries {
1849
+ /**
1850
+ * MSG-07: the stored text of a message. A message with a routine may leave it
1851
+ * empty (null); one without must say something. Undefined when the text is
1852
+ * refused: empty with nothing attached, or too long.
1853
+ */
1854
+ declare function messageNote(body: string | undefined | null, hasAttachment: boolean): string | null | undefined;
1855
+ /** The other participant, or null once their account was deleted. */
1856
+ interface ConversationMember {
1829
1857
  id: string;
1858
+ username: string;
1830
1859
  name: string;
1831
- totalVolumeKg: number;
1832
- totalCompletedSets: number;
1833
- points: VolumeTrendPoint[];
1834
- }
1835
- interface MuscleVolumeTrendSeries extends VolumeTrendSeries {
1836
- id: MuscleGroup;
1837
- }
1838
- /** Stable successful response of GET /workouts/progress/volume. */
1839
- interface VolumeTrendResponse {
1840
- timeZone: string;
1841
- weeks: number;
1842
- overall: VolumeTrendPoint[];
1843
- muscles: MuscleVolumeTrendSeries[];
1844
- routines: VolumeTrendSeries[];
1845
- exercises: VolumeTrendSeries[];
1846
- }
1847
- interface SessionComparisonQuery {
1848
- routineDayId?: string;
1860
+ avatarUrl: string | null;
1849
1861
  }
1850
- interface SessionComparisonRoutineDay {
1851
- routineDayId: string;
1852
- routineId: string;
1853
- routineName: string;
1854
- dayName?: string | null;
1855
- lastCompletedAt: IsoDateString;
1856
- completedSessionCount: number;
1862
+ interface ConversationMessage {
1863
+ id: string;
1864
+ sentByMe: boolean;
1865
+ /**
1866
+ * Null once its author deleted it; the place stays as "Message deleted".
1867
+ * Also null for the other participant while moderation hides it (MSG-09),
1868
+ * and for a routine sent without a note (MSG-07).
1869
+ */
1870
+ body: string | null;
1871
+ deleted: boolean;
1872
+ /**
1873
+ * MSG-09: a moderator hid this message from the other participant. They read
1874
+ * "Removed by moderation" in its place; its author still reads the text and
1875
+ * is told it is hidden.
1876
+ */
1877
+ hiddenByModeration: boolean;
1878
+ /**
1879
+ * MSG-07: a routine it carries, resolved as it is now. Null when it carries
1880
+ * none, and whenever the text is withheld (deleted, or hidden from the
1881
+ * viewer by moderation).
1882
+ */
1883
+ attachment: MessageAttachment | null;
1884
+ createdAt: IsoDateString;
1857
1885
  }
1858
- interface SessionComparisonSet {
1859
- routineExerciseId: string;
1860
- setNumber: number;
1861
- reps: number;
1862
- weightKg?: number | null;
1863
- rpe?: number | null;
1886
+ /**
1887
+ * MSG-02: a conversation that is still a request. `INCOMING`: the viewer may
1888
+ * accept, decline or block. `OUTGOING`: the viewer sent it and waits -- told
1889
+ * neither whether it was seen nor whether it was declined.
1890
+ */
1891
+ interface ConversationRequest {
1892
+ direction: "INCOMING" | "OUTGOING";
1864
1893
  }
1865
- interface SessionComparisonExercise {
1866
- routineExerciseId: string;
1867
- exerciseId: string;
1868
- exerciseName: string;
1869
- order: number;
1870
- sets: SessionComparisonSet[];
1894
+ interface ConversationSummary {
1895
+ id: string;
1896
+ /** Null when the other member deleted their account ("Deleted member"). */
1897
+ counterpart: ConversationMember | null;
1898
+ /** The newest message the viewer can see, or null when there is none. */
1899
+ lastMessage: ConversationMessage | null;
1900
+ lastMessageAt: IsoDateString | null;
1901
+ /**
1902
+ * Whether the viewer may write in it now. False when the other member's
1903
+ * account is gone, or the viewer's own messaging is unavailable or
1904
+ * restricted.
1905
+ */
1906
+ canSend: boolean;
1907
+ /**
1908
+ * MSG-09: a moderator restricted the viewer's messaging, which is why they
1909
+ * cannot write. Only ever about the viewer: nobody else is told.
1910
+ */
1911
+ messagingRestricted: boolean;
1912
+ /**
1913
+ * MSG-03: the other member wrote something the viewer has not seen -- a
1914
+ * message after the viewer's read position that is neither deleted nor
1915
+ * removed for them. The viewer's own messages never count.
1916
+ */
1917
+ unread: boolean;
1918
+ /**
1919
+ * MSG-03: the viewer's read position, where "new since you last looked"
1920
+ * starts. Null when they have never read the conversation. It is the
1921
+ * viewer's alone: no read receipts, so a sender never learns it.
1922
+ */
1923
+ lastReadAt: IsoDateString | null;
1924
+ /** MSG-02: null once accepted, or for a conversation that never was a request. */
1925
+ request: ConversationRequest | null;
1871
1926
  }
1872
- interface SessionComparisonSession {
1873
- sessionId: string;
1874
- routineDayId: string;
1875
- routineName: string;
1876
- dayName?: string | null;
1877
- startedAt: IsoDateString;
1878
- endedAt: IsoDateString;
1879
- durationSec: number;
1880
- totalVolumeKg: number;
1881
- completedSets: number;
1882
- notes?: string | null;
1883
- exercises: SessionComparisonExercise[];
1927
+ /**
1928
+ * MSG-02: GET /conversations?box=. The inbox holds accepted conversations
1929
+ * and the viewer's own requests; Requests holds the ones waiting for them.
1930
+ */
1931
+ declare const CONVERSATION_BOXES: readonly ["INBOX", "REQUESTS"];
1932
+ type ConversationBox = (typeof CONVERSATION_BOXES)[number];
1933
+ /**
1934
+ * MSG-02: after a decline, the same member's new request is refused for this
1935
+ * many days, unless the recipient follows them or writes first.
1936
+ */
1937
+ declare const MESSAGE_REQUEST_DECLINE_COOLDOWN_DAYS = 30;
1938
+ /**
1939
+ * MSG-08: a message push waits this long and is dropped if the conversation
1940
+ * was read meanwhile, so two members talking live do not buzz each other.
1941
+ */
1942
+ declare const MESSAGE_PUSH_DELAY_SECONDS = 30;
1943
+ /** GET /conversations, newest activity first. */
1944
+ interface ConversationsResponse {
1945
+ conversations: ConversationSummary[];
1946
+ nextCursor: string | null;
1947
+ /** MSG-09: the viewer's own messaging is restricted by moderation. */
1948
+ messagingRestricted: boolean;
1884
1949
  }
1885
- /** Stable successful response of GET /workouts/progress/session-comparison. */
1886
- interface SessionComparisonResponse {
1887
- routineDays: SessionComparisonRoutineDay[];
1888
- selectedRoutineDay: SessionComparisonRoutineDay | null;
1889
- latestSession: SessionComparisonSession | null;
1890
- previousSession: SessionComparisonSession | null;
1950
+ /**
1951
+ * MSG-09: a report of a message captures it and at most this many messages
1952
+ * before it in its conversation, as the reporter could see them then.
1953
+ */
1954
+ declare const MESSAGE_REPORT_CONTEXT_BEFORE = 5;
1955
+ /**
1956
+ * MSG-03: POST /conversations/:id/read. Moves the viewer's read position to
1957
+ * the message they have seen (`through`, the newest one on their screen),
1958
+ * never backwards, so a message that arrived after it stays unread.
1959
+ */
1960
+ interface MarkConversationReadRequest {
1961
+ through: string;
1891
1962
  }
1892
- declare const PROGRESS_TIMELINE_EVENT_TYPES: readonly ["PERSONAL_RECORD", "PROGRESSION_CHANGED"];
1893
- type ProgressTimelineEventType = (typeof PROGRESS_TIMELINE_EVENT_TYPES)[number];
1894
- interface ProgressTimelineQuery {
1895
- type?: ProgressTimelineEventType;
1896
- /** Only events for one catalog exercise (EXER-01). */
1897
- exerciseId?: string;
1898
- cursor?: string;
1899
- limit?: number;
1963
+ /** MSG-03: GET /conversations/unread, for the navigation's count. */
1964
+ interface UnreadConversationsResponse {
1965
+ /** Conversations with something new, not messages (owner, 2026-10-06). */
1966
+ unreadConversations: number;
1967
+ /**
1968
+ * MSG-02: requests waiting for the viewer. For the Requests tab only: they
1969
+ * never count in the navigation (owner, 2026-10-06).
1970
+ */
1971
+ requests: number;
1900
1972
  }
1901
- interface ProgressTimelineSessionContext {
1902
- sessionId: string;
1903
- routineName: string;
1904
- dayName?: string | null;
1973
+ /** GET /conversations/:id/messages, newest first; `cursor` pages older. */
1974
+ interface ConversationMessagesResponse {
1975
+ conversation: ConversationSummary;
1976
+ messages: ConversationMessage[];
1977
+ nextCursor: string | null;
1905
1978
  }
1906
- interface ProgressTimelineRecordPerformance {
1907
- weightKg: number;
1908
- reps: number;
1909
- estimated1rmKg: number;
1979
+ /**
1980
+ * POST /conversations. Starts a conversation with its first message, so an
1981
+ * empty conversation never exists; when one with this member already exists
1982
+ * the message is sent there instead. `recipient` is a username or an id.
1983
+ */
1984
+ interface StartConversationRequest {
1985
+ recipient: string;
1986
+ /** Optional when the message carries a routine or a workout. */
1987
+ body?: string;
1988
+ /** MSG-07: one of the sender's own routines. */
1989
+ routineId?: string;
1990
+ /** MSG-10: one of the sender's own finished workouts. Not with a routine. */
1991
+ sessionId?: string;
1992
+ /** MSG-11: one of the sender's own personal records, by its event. */
1993
+ recordEventId?: string;
1910
1994
  }
1911
- type ProgressTimelineRecordReason = 'FIRST_RECORDED_BEST' | 'HEAVIER_LOAD' | 'MORE_REPS_AT_SAME_LOAD';
1912
- interface ProgressTimelinePersonalRecordItem {
1913
- eventId: string;
1914
- type: 'PERSONAL_RECORD';
1915
- occurredAt: IsoDateString;
1916
- session: ProgressTimelineSessionContext;
1917
- exerciseId: string;
1918
- exerciseName: string;
1919
- current: ProgressTimelineRecordPerformance;
1920
- previous: ProgressTimelineRecordPerformance | null;
1921
- reason: ProgressTimelineRecordReason;
1995
+ /** POST /conversations/:id/messages. */
1996
+ interface SendMessageRequest {
1997
+ /** Optional when the message carries a routine or a workout. */
1998
+ body?: string;
1999
+ /** MSG-07: one of the sender's own routines. */
2000
+ routineId?: string;
2001
+ /** MSG-10: one of the sender's own finished workouts. Not with a routine. */
2002
+ sessionId?: string;
2003
+ /** MSG-11: one of the sender's own personal records, by its event. */
2004
+ recordEventId?: string;
1922
2005
  }
1923
- interface ProgressTimelineProgressionItem {
1924
- eventId: string;
1925
- type: 'PROGRESSION_CHANGED';
1926
- occurredAt: IsoDateString;
1927
- session: ProgressTimelineSessionContext;
1928
- exerciseId: string;
1929
- exerciseName: string;
1930
- change: ProgressionChange;
2006
+ interface SendMessageResponse {
2007
+ conversation: ConversationSummary;
2008
+ message: ConversationMessage;
1931
2009
  }
1932
- type ProgressTimelineItem = ProgressTimelinePersonalRecordItem | ProgressTimelineProgressionItem;
1933
- /** Stable successful response of GET /workouts/progress/timeline. */
1934
- interface ProgressTimelineResponse {
1935
- items: ProgressTimelineItem[];
1936
- nextCursor?: string;
2010
+ /** PUT /users/preferences/messages. */
2011
+ interface UpdateMessagePermissionRequest {
2012
+ messagePermission: MessagePermission;
1937
2013
  }
1938
- /** Immutable prescription captured before any sets or progression. */
1939
- interface WorkoutSessionSnapshotV1 {
1940
- schemaVersion: 1;
1941
- sessionId: string;
1942
- sourceRoutineId: string;
1943
- sourceRoutineDayId: string;
1944
- capturedAt: string;
1945
- provenance: 'CAPTURED' | 'APPROXIMATED';
1946
- notes: string | null;
1947
- routine: NonNullable<WorkoutSession['routine']>;
1948
- routineDay: NonNullable<WorkoutSession['routineDay']>;
1949
- /** ROUT-15; absent on snapshots captured before blocks executed. */
1950
- trainingBlock?: WorkoutSession['trainingBlock'];
1951
- /** ROUT-16; absent on snapshots captured before deloads existed. */
1952
- temporaryOverride?: WorkoutSession['temporaryOverride'];
2014
+ /**
2015
+ * On the authenticated member profile only: whether the viewer may start a
2016
+ * conversation, and the one they already have. The server decides; a viewer
2017
+ * who may not is told nothing more.
2018
+ */
2019
+ interface MemberMessagingState {
2020
+ canStart: boolean;
2021
+ conversationId: string | null;
2022
+ /** MSG-02: a first message would land in their Requests. */
2023
+ asRequest: boolean;
1953
2024
  }
1954
- interface SetAccountTimeZoneRequest {
1955
- timeZone: string;
1956
- /** Bootstrap must not replace a zone registered by another device. */
1957
- onlyIfUnset?: boolean;
2025
+ declare function isMessagePermission(value: unknown): value is MessagePermission;
2026
+
2027
+ /** A step id as the registry names it: lowercase words joined by hyphens. */
2028
+ declare const ONBOARDING_STEP_ID_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,39}$";
2029
+ declare const ONBOARDING_STEPS_MAX = 30;
2030
+ declare const ONBOARDING_VERSION_MAX = 1000;
2031
+ interface OnboardingState {
2032
+ /**
2033
+ * The registry version the account completed. A new account starts at 0;
2034
+ * accounts that existed when onboarding shipped start at 1, so they are
2035
+ * offered only steps added later.
2036
+ */
2037
+ completedVersion: number;
2038
+ /** Steps answered or skipped since that version, so the flow resumes. */
2039
+ stepsDone: string[];
2040
+ /** When the flow first opened by itself; it never does again. */
2041
+ offeredAt: IsoDateString | null;
1958
2042
  }
1959
- interface WorkoutAnalyticsStatus {
1960
- timeZone: string | null;
1961
- requestedTimeZone: string | null;
1962
- state: 'UNINITIALIZED' | 'BUILDING' | 'READY' | 'FAILED';
1963
- generationId: string | null;
2043
+ /**
2044
+ * PUT /users/preferences/onboarding. Partial: `stepsDone` is added to what is
2045
+ * stored (two devices never undo each other), `completedVersion` only ever
2046
+ * rises and clears the steps, and `offered` records the first opening once.
2047
+ */
2048
+ interface UpdateOnboardingRequest {
2049
+ stepsDone?: string[];
2050
+ completedVersion?: number;
2051
+ offered?: true;
1964
2052
  }
2053
+ declare function isOnboardingStepId(value: unknown): value is string;
2054
+
1965
2055
  /**
1966
- * Thresholds behind every plateau. A lift is flagged only when all hold: at
1967
- * least the account's minimum sessions (`PLATEAU_MIN_SESSIONS` by default)
1968
- * of terminal sessions with completed loaded sets of it since its current
1969
- * best (the session that set the best excluded, and counting only inside the
1970
- * look-back window), the best is at least
1971
- * `PLATEAU_MIN_DAYS_SINCE_BEST` days old, and the lift was trained within the
1972
- * last `PLATEAU_RECENT_DAYS` days. They describe numbers, never a cause.
2056
+ * The weekday a week starts on, as `Date.getDay()` numbers it: 1 Monday, 0
2057
+ * Sunday. Monday is everyone's default, so nothing changes until a member
2058
+ * chooses. **The rank never follows it**: its active weeks are Monday weeks
2059
+ * for every member, because a rank is public and must mean the same on every
2060
+ * profile.
1973
2061
  */
1974
- declare const PLATEAU_WINDOW_DAYS = 56;
1975
- declare const PLATEAU_MIN_SESSIONS = 4;
1976
- declare const PLATEAU_MIN_DAYS_SINCE_BEST = 21;
1977
- declare const PLATEAU_RECENT_DAYS = 21;
2062
+ declare const WEEK_STARTS: readonly [1, 0];
2063
+ type WeekStartsOn = (typeof WEEK_STARTS)[number];
2064
+ declare const DEFAULT_WEEK_STARTS_ON: WeekStartsOn;
2065
+ declare function isWeekStartsOn(value: unknown): value is WeekStartsOn;
1978
2066
  /**
1979
- * PREF-05: each account chooses its minimum sessions within these bounds;
1980
- * `PLATEAU_MIN_SESSIONS` is the default. The other thresholds stay fixed.
2067
+ * The first day of the week a `YYYY-MM-DD` calendar date belongs to, as a
2068
+ * `YYYY-MM-DD` date, for a week starting on `weekStartsOn`. Calendar
2069
+ * arithmetic only: no time zone, so a daylight-saving change cannot move it.
1981
2070
  */
1982
- declare const PLATEAU_MIN_SESSIONS_MIN = 3;
1983
- declare const PLATEAU_MIN_SESSIONS_MAX = 8;
1984
- /** Body and response of PUT /users/preferences/plateaus. */
1985
- interface PlateauPreferences {
1986
- minSessions: number;
1987
- }
1988
- interface PlateauSet {
1989
- weightKg: number;
1990
- reps: number;
1991
- estimated1rmKg: number;
1992
- }
1993
- interface ExercisePlateau {
1994
- exerciseId: string;
1995
- exerciseName: string;
1996
- /** The persisted best-set frontier. */
1997
- best: PlateauSet & {
1998
- achievedAt: IsoDateString;
1999
- };
2000
- /** Sessions were counted from the later of the best and the window start. */
2001
- countedSince: IsoDateString;
2002
- sessionsWithoutNewBest: number;
2003
- /** The set since then with the highest estimated 1RM (latest on ties). */
2004
- closest: PlateauSet & {
2005
- performedAt: IsoDateString;
2006
- };
2007
- /** closest.estimated1rmKg / best.estimated1rmKg. */
2008
- closestRatio: number;
2009
- lastPerformedAt: IsoDateString;
2010
- }
2011
- /** Stable successful response of GET /workouts/progress/plateaus. */
2012
- interface PlateausResponse {
2013
- asOf: IsoDateString;
2014
- thresholds: {
2015
- windowDays: number;
2016
- /** The account's PREF-05 choice, within the bounds above. */
2017
- minSessions: number;
2018
- minDaysSinceBest: number;
2019
- recentDays: number;
2020
- };
2021
- /** Lifts with a best set that were trained within the recent days. */
2022
- checkedExercises: number;
2023
- /** Longest-running first: most sessions without a new best. */
2024
- plateaus: ExercisePlateau[];
2071
+ declare function weekStartOf(dateKey: string, weekStartsOn?: WeekStartsOn): string;
2072
+ /** PUT /users/preferences/week-start */
2073
+ interface UpdateWeekStartRequest {
2074
+ weekStartsOn: WeekStartsOn;
2025
2075
  }
2076
+ /**
2077
+ * How lengths are shown and typed: centimetres, or inches (a height in feet
2078
+ * and inches). Every length is **stored in centimetres**, as weights are
2079
+ * stored in kilograms; the unit is only the display and entry boundary.
2080
+ */
2081
+ declare const LENGTH_UNITS: readonly ["CM", "IN"];
2082
+ type LengthUnit = (typeof LENGTH_UNITS)[number];
2083
+ declare const CM_PER_INCH = 2.54;
2084
+ declare const INCHES_PER_FOOT = 12;
2085
+ /** Centimetres as inches, to two decimals. */
2086
+ declare function cmToInches(cm: number): number;
2087
+ /** Inches as centimetres, to two decimals. */
2088
+ declare function inchesToCm(inches: number): number;
2089
+ /**
2090
+ * A height in centimetres as whole feet and inches to one decimal. The total
2091
+ * is rounded before it is split, so 71.98 in reads as 6 ft 0 in, never as
2092
+ * 5 ft 12 in.
2093
+ */
2094
+ declare function cmToFeetInches(cm: number): {
2095
+ feet: number;
2096
+ inches: number;
2097
+ };
2098
+ /** Feet and inches as centimetres, to two decimals. */
2099
+ declare function feetInchesToCm(feet: number, inches: number): number;
2026
2100
 
2027
2101
  declare const ACHIEVEMENT_CATEGORIES: readonly ["SESSIONS", "SETS", "VOLUME_KG", "RECORDS", "STREAK_DAYS"];
2028
2102
  type AchievementCategory = (typeof ACHIEVEMENT_CATEGORIES)[number];
@@ -2291,6 +2365,16 @@ interface CapturedMessage {
2291
2365
  * it carried none. Its name and nothing of the routine itself.
2292
2366
  */
2293
2367
  routineName?: string | null;
2368
+ /**
2369
+ * MSG-10: the workout it carried, by the routine and day the reporter saw,
2370
+ * empty when it was no longer available, or null when it carried none.
2371
+ */
2372
+ workoutName?: string | null;
2373
+ /**
2374
+ * MSG-11: the record it carried, by its lift, empty when it was no longer
2375
+ * available, or null when it carried none.
2376
+ */
2377
+ recordName?: string | null;
2294
2378
  createdAt: IsoDateString;
2295
2379
  }
2296
2380
  /**
@@ -4661,6 +4745,10 @@ interface AccountExportV1 {
4661
4745
  body: string;
4662
4746
  /** MSG-07: the member's own routine the message shared, by id. */
4663
4747
  routineId?: string;
4748
+ /** MSG-10: the member's own workout the message shared, by id. */
4749
+ sessionId?: string;
4750
+ /** MSG-11: the member's own record the message shared, by its event. */
4751
+ recordEventId?: string;
4664
4752
  createdAt: IsoDateString;
4665
4753
  }>;
4666
4754
  reportsFiled: Array<{
@@ -4838,6 +4926,7 @@ declare const API_ERROR_MESSAGES: {
4838
4926
  readonly ENCOURAGEMENT_RETRY: "Please retry the encouragement.";
4839
4927
  readonly MESSAGE_SELF: "You cannot message yourself";
4840
4928
  readonly MESSAGE_LENGTH: "A message must not be empty and may be at most {max} characters.";
4929
+ readonly MESSAGE_ONE_ATTACHMENT: "A message can carry one routine, one workout or one record.";
4841
4930
  readonly MESSAGES_PER_MINUTE: "You can send at most {max} messages a minute.";
4842
4931
  readonly CONVERSATIONS_PER_DAY: "You can start at most {max} new conversations a day.";
4843
4932
  readonly MESSAGE_NOT_ADMITTED: "This member is not taking messages from you.";
@@ -5029,4 +5118,4 @@ declare function isRealtimeTopic(value: unknown): value is RealtimeTopic;
5029
5118
  /** The event in one `data:` payload, or null for anything else. */
5030
5119
  declare function parseRealtimeEvent(data: string): RealtimeEvent | null;
5031
5120
 
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 };
5121
+ 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 MessageRecordAttachment, type MessageRecordSummary, type MessageRoutineAttachment, type MessageWorkoutAttachment, type MessageWorkoutSummary, 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 SharedWorkout, type SharedWorkoutExercise, type SharedWorkoutSet, 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 };