quantum-component-library 1.4.69 → 1.4.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/components/parameter-edit-list/index.d.ts +2 -1
  2. package/dist/components.cjs +1 -1
  3. package/dist/components.js +1428 -1398
  4. package/dist/{dnd-core-vendor-Dpm8Ha_h.cjs → dnd-core-vendor-BQo1WiA6.cjs} +1 -1
  5. package/dist/{dnd-core-vendor-BvkN08kD.js → dnd-core-vendor-NmXYCL5j.js} +2 -2
  6. package/dist/generated/graphql.d.ts +601 -6
  7. package/dist/generated-graphql.cjs +1 -1
  8. package/dist/generated-graphql.js +83 -76
  9. package/dist/{graphql-vendor-ipMKtdBu.js → graphql-vendor-BOwWQmc4.js} +1 -1
  10. package/dist/{graphql-vendor-CSrUjvOC.cjs → graphql-vendor-CMjSICJP.cjs} +1 -1
  11. package/dist/hooks.cjs +1 -1
  12. package/dist/hooks.js +3 -3
  13. package/dist/index.cjs +1 -1
  14. package/dist/index.js +47 -46
  15. package/dist/lib/types/sensor-info.test.d.ts +1 -0
  16. package/dist/lib/utils/parameters.d.ts +14 -1
  17. package/dist/lib/utils/parameters.test.d.ts +1 -0
  18. package/dist/{lodash-vendor-CfNg9qwP.cjs → lodash-vendor-CGEP7jch.cjs} +1 -1
  19. package/dist/{lodash-vendor-CY4G3-79.js → lodash-vendor-Deq42ySR.js} +1 -1
  20. package/dist/{other-CPHWCRXi.js → other-Bp68Uzz1.js} +3 -3
  21. package/dist/{other-B_xypnnb.cjs → other-Bsl3n3tj.cjs} +1 -1
  22. package/dist/{react-dnd-vendor-DvbjNa5U.cjs → react-dnd-vendor-CPQdLxxA.cjs} +1 -1
  23. package/dist/{react-dnd-vendor-DYesaYGm.js → react-dnd-vendor-D7ujbWN2.js} +2 -2
  24. package/dist/react-icons-vendor-D3in8HbI.cjs +1 -0
  25. package/dist/{react-icons-vendor-DqOJrTLA.js → react-icons-vendor-bPI9-m-x.js} +26 -22
  26. package/dist/{react-select-vendor-B0QF8gkj.js → react-select-vendor-B-vWCyYj.js} +1 -1
  27. package/dist/{react-select-vendor-BLLqfZvd.cjs → react-select-vendor-Dletsq31.cjs} +1 -1
  28. package/dist/services-human-Cl36G8mV.cjs +1 -0
  29. package/dist/{services-human-D5IllQkM.js → services-human-mjbBM3xQ.js} +2 -2
  30. package/dist/services.cjs +1 -1
  31. package/dist/services.js +1 -1
  32. package/dist/types.cjs +1 -1
  33. package/dist/types.js +13 -13
  34. package/dist/{utils-conversion-DFO1UVSN.cjs → utils-conversion-CBAxJ_Vx.cjs} +1 -1
  35. package/dist/{utils-conversion-BQfLNP0g.js → utils-conversion-Dmt0JwSC.js} +1 -1
  36. package/dist/{utils-parameters-DkefNhWo.js → utils-parameters-BiyUnm5t.js} +17 -7
  37. package/dist/utils-parameters-Bx16_6xw.cjs +1 -0
  38. package/dist/utils.cjs +1 -1
  39. package/dist/utils.js +19 -18
  40. package/dist/{vendor-DeYnrakH.cjs → vendor-CNEuzHxC.cjs} +1 -1
  41. package/dist/{vendor-BSFJsa1P.js → vendor-D_9BWGCW.js} +1 -1
  42. package/package.json +1 -1
  43. package/dist/react-icons-vendor-c4NUuwCE.cjs +0 -1
  44. package/dist/services-human-DFPelsei.cjs +0 -1
  45. package/dist/utils-parameters-dwKmz1VU.cjs +0 -1
@@ -46,23 +46,21 @@ export type Scalars = {
46
46
  input: any;
47
47
  output: any;
48
48
  };
49
- /** An ISO-8601 encoded date string (YYYY-MM-DD) */
50
49
  DateString: {
51
50
  input: any;
52
51
  output: any;
53
52
  };
54
- /** Long custom scalar type */
55
53
  Long: {
56
54
  input: any;
57
55
  output: any;
58
56
  };
59
- /** Unit custom scalar type */
60
57
  Unit: {
61
58
  input: any;
62
59
  output: any;
63
60
  };
64
61
  };
65
62
  export type AcceptInvitationInput = {
63
+ dateOfBirth?: InputMaybe<Scalars['Date']['input']>;
66
64
  firstName: Scalars['String']['input'];
67
65
  lastName: Scalars['String']['input'];
68
66
  password: Scalars['String']['input'];
@@ -71,9 +69,25 @@ export type AcceptInvitationInput = {
71
69
  };
72
70
  export type AcceptInvitationResult = {
73
71
  __typename?: 'AcceptInvitationResult';
74
- session: AuthSession;
72
+ /**
73
+ * AC-5.2.9 — null for an admin invitation: acceptance carries no session, no
74
+ * cookie, no token, and nothing in the response that can call the API as the
75
+ * new account. The invitee is sent to sign in and proves the password reached
76
+ * the system as they typed it. Every other invitation type still gets one.
77
+ */
78
+ session?: Maybe<AuthSession>;
75
79
  user: CurrentUser;
76
80
  };
81
+ /**
82
+ * The same three states, for any account rather than only a Quantum staff one.
83
+ * Declared separately from AdminLifecycle so the admin screen's contract is not
84
+ * widened by a change made for the clinic staff list.
85
+ */
86
+ export declare enum AccountLifecycle {
87
+ Active = "ACTIVE",
88
+ Removed = "REMOVED",
89
+ Suspended = "SUSPENDED"
90
+ }
77
91
  export type Action = {
78
92
  __typename?: 'Action';
79
93
  activityKind: ActionActivityKind;
@@ -126,6 +140,36 @@ export declare enum ActivityType {
126
140
  IsolatedAction = "IsolatedAction",
127
141
  IsolatedMovement = "IsolatedMovement"
128
142
  }
143
+ export type AdminHolder = {
144
+ __typename?: 'AdminHolder';
145
+ createdAt: Scalars['String']['output'];
146
+ /** MOB-554 — when a suspension began, so the screen can say for how long. */
147
+ deletedAt?: Maybe<Scalars['String']['output']>;
148
+ email: Scalars['String']['output'];
149
+ firstName?: Maybe<Scalars['String']['output']>;
150
+ id: Scalars['ID']['output'];
151
+ lastName?: Maybe<Scalars['String']['output']>;
152
+ lifecycle: AdminLifecycle;
153
+ /**
154
+ * US-4.7 — the profile carrying this person's name, which is what
155
+ * updateUserProfile acts on. Nullable: an account can exist before a profile
156
+ * does, and the screen has to say so rather than send a null id to the server.
157
+ */
158
+ profileId?: Maybe<Scalars['ID']['output']>;
159
+ username: Scalars['String']['output'];
160
+ };
161
+ /**
162
+ * US-5.1 — one Quantum staff account and where it sits in its lifecycle.
163
+ *
164
+ * ACTIVE, SUSPENDED and REMOVED are distinguishable because they mean different
165
+ * things: a suspended person can come back, a removed one cannot, and the record
166
+ * of who held Quantum-level access is never lost either way.
167
+ */
168
+ export declare enum AdminLifecycle {
169
+ Active = "ACTIVE",
170
+ Removed = "REMOVED",
171
+ Suspended = "SUSPENDED"
172
+ }
129
173
  export type AnalysisAction = {
130
174
  __typename?: 'AnalysisAction';
131
175
  id: Scalars['ID']['output'];
@@ -197,6 +241,36 @@ export type AnalysisSubClassification = {
197
241
  id: Scalars['ID']['output'];
198
242
  name: Scalars['String']['output'];
199
243
  };
244
+ export type AssignCatalog = {
245
+ __typename?: 'AssignCatalog';
246
+ activities: Array<AssignCatalogActivity>;
247
+ programs: Array<AssignCatalogProgram>;
248
+ };
249
+ export type AssignCatalogActivity = {
250
+ __typename?: 'AssignCatalogActivity';
251
+ id: Scalars['ID']['output'];
252
+ name: Scalars['String']['output'];
253
+ };
254
+ export type AssignCatalogProgram = {
255
+ __typename?: 'AssignCatalogProgram';
256
+ activityIds: Array<Scalars['ID']['output']>;
257
+ id: Scalars['ID']['output'];
258
+ name: Scalars['String']['output'];
259
+ };
260
+ /** How one activity in a client's plan got there (AC-14.2.4): picked individually, supplied by an assigned program, or both. */
261
+ export type AssignedActionProvenance = {
262
+ __typename?: 'AssignedActionProvenance';
263
+ actionId: Scalars['ID']['output'];
264
+ /** The practitioner ticked this activity itself (a direct assignment). */
265
+ pickedIndividually: Scalars['Boolean']['output'];
266
+ /** The assigned programs that supply it. Empty when it is individually picked only. */
267
+ suppliedByModuleIds: Array<Scalars['ID']['output']>;
268
+ };
269
+ export type AssignedActionReport = {
270
+ __typename?: 'AssignedActionReport';
271
+ actionId: Scalars['ID']['output'];
272
+ reportId: Scalars['ID']['output'];
273
+ };
200
274
  export type AssignedReport = {
201
275
  __typename?: 'AssignedReport';
202
276
  autoGenerate: Scalars['Boolean']['output'];
@@ -208,15 +282,93 @@ export type AssignedReport = {
208
282
  testReport?: Maybe<TestReportUnion>;
209
283
  testReportId?: Maybe<Scalars['ID']['output']>;
210
284
  };
285
+ /**
286
+ * One staged change, as the practitioner made it. A change LIST rather than a
287
+ * desired full set, so a save touches only the items this practitioner staged
288
+ * and a colleague's concurrent change is never reverted (AC-4.4.24).
289
+ */
290
+ export type AssignmentChangeInput = {
291
+ /** true = in the client's plan afterwards, false = not. */
292
+ assigned: Scalars['Boolean']['input'];
293
+ itemId: Scalars['ID']['input'];
294
+ kind: AssignmentItemKind;
295
+ /** ACTION + assigned:true only. null detaches; omitted leaves it untouched. */
296
+ reportId?: InputMaybe<Scalars['ID']['input']>;
297
+ };
298
+ /** Whether this item ended in the state that was chosen (AC-4.6.1). */
299
+ export type AssignmentChangeResult = {
300
+ __typename?: 'AssignmentChangeResult';
301
+ applied: Scalars['Boolean']['output'];
302
+ itemId: Scalars['ID']['output'];
303
+ kind: AssignmentItemKind;
304
+ /** Machine-readable code when applied is false. Never a client-facing string. */
305
+ reason?: Maybe<Scalars['String']['output']>;
306
+ };
307
+ export declare enum AssignmentItemKind {
308
+ Action = "ACTION",
309
+ Module = "MODULE"
310
+ }
311
+ export type AttachTestFilesInput = {
312
+ dataUploadId?: InputMaybe<Scalars['ID']['input']>;
313
+ isHorizontalFlip?: InputMaybe<Scalars['Boolean']['input']>;
314
+ metaData?: InputMaybe<Scalars['String']['input']>;
315
+ requestPose?: InputMaybe<Scalars['Boolean']['input']>;
316
+ trimEndMs?: InputMaybe<Scalars['Int']['input']>;
317
+ trimStartMs?: InputMaybe<Scalars['Int']['input']>;
318
+ videoUploadId?: InputMaybe<Scalars['ID']['input']>;
319
+ };
320
+ export type AuditLogEntry = {
321
+ __typename?: 'AuditLogEntry';
322
+ action: Scalars['String']['output'];
323
+ actorEmail?: Maybe<Scalars['String']['output']>;
324
+ actorUserId?: Maybe<Scalars['ID']['output']>;
325
+ createdAt: Scalars['String']['output'];
326
+ groupId?: Maybe<Scalars['ID']['output']>;
327
+ id: Scalars['ID']['output'];
328
+ metadata?: Maybe<Scalars['String']['output']>;
329
+ profileId?: Maybe<Scalars['ID']['output']>;
330
+ targetUserId?: Maybe<Scalars['ID']['output']>;
331
+ };
332
+ export type AuditLogFilter = {
333
+ action?: InputMaybe<Scalars['String']['input']>;
334
+ actorUserId?: InputMaybe<Scalars['ID']['input']>;
335
+ limit?: InputMaybe<Scalars['Int']['input']>;
336
+ offset?: InputMaybe<Scalars['Int']['input']>;
337
+ profileId?: InputMaybe<Scalars['ID']['input']>;
338
+ };
211
339
  export type AuthSession = {
212
340
  __typename?: 'AuthSession';
213
341
  accessToken: Scalars['String']['output'];
342
+ /** Seconds until accessToken expires — refresh before it does, without decoding the JWT. */
343
+ expiresIn: Scalars['Int']['output'];
214
344
  refreshToken?: Maybe<Scalars['String']['output']>;
215
345
  };
216
346
  export type ChangePasswordInput = {
217
- newPassword: Scalars['String']['input'];
347
+ /**
348
+ * Required when changing YOUR OWN password (AC-6.2.1). The mutation asked for
349
+ * no current password at all, so whoever held an open session could change it —
350
+ * holding a session is not by itself enough. Ignored when an authorised
351
+ * operator resets somebody else's, which is a different act governed by rows
352
+ * B.9 and C.7.
353
+ */
354
+ currentPassword?: InputMaybe<Scalars['String']['input']>;
355
+ /**
356
+ * Required on every path that SETS a password: changing your own, and an
357
+ * operator resetting a colleague inside their own organisation.
358
+ *
359
+ * Omitted on the path that sends a LINK — a client, or anybody outside the
360
+ * caller's organisation (AC-4.9.2, AC-4.9.5). Nullable for exactly that reason:
361
+ * the Console must not offer a field whose value is discarded (AC-4.9.9), and a
362
+ * required field forced it to send one. The server refuses an omission on a path
363
+ * that needs it rather than inventing a password.
364
+ */
365
+ newPassword?: InputMaybe<Scalars['String']['input']>;
218
366
  userId: Scalars['ID']['input'];
219
367
  };
368
+ export type ChangePasswordResult = {
369
+ __typename?: 'ChangePasswordResult';
370
+ outcome: PasswordChangeOutcome;
371
+ };
220
372
  export type ComparativeMetric = {
221
373
  __typename?: 'ComparativeMetric';
222
374
  labelA: Scalars['String']['output'];
@@ -250,6 +402,11 @@ export type CreateAccountInput = {
250
402
  groupId?: InputMaybe<Scalars['ID']['input']>;
251
403
  lastName: Scalars['String']['input'];
252
404
  password: Scalars['String']['input'];
405
+ /**
406
+ * Required. This path never called assignRole at all, so every account it
407
+ * created held no role (AC-1.3.2).
408
+ */
409
+ role: InvitationRole;
253
410
  username: Scalars['String']['input'];
254
411
  };
255
412
  export type CreateAccountResult = {
@@ -291,8 +448,20 @@ export type CreateInvitationInput = {
291
448
  email: Scalars['String']['input'];
292
449
  firstName?: InputMaybe<Scalars['String']['input']>;
293
450
  groupId: Scalars['ID']['input'];
451
+ /**
452
+ * Superseded by `role` and retained only so existing callers still parse. When
453
+ * `role` is given this is ignored; the pair disagreeing is refused.
454
+ */
294
455
  isAdmin?: InputMaybe<Scalars['Boolean']['input']>;
295
456
  lastName?: InputMaybe<Scalars['String']['input']>;
457
+ /** Required. The one role this invitation grants (AC-1.3.1). */
458
+ role: InvitationRole;
459
+ /**
460
+ * Required. It carried a server-side default of ADMIN_PORTAL, which minted the
461
+ * highest privilege in the system for any request that simply omitted it
462
+ * (AC-1.3.8).
463
+ */
464
+ type: InvitationType;
296
465
  };
297
466
  export type CreateKeypointGroupInput = {
298
467
  activity?: InputMaybe<Scalars['String']['input']>;
@@ -346,13 +515,21 @@ export type CreateTestInput = {
346
515
  actionId?: InputMaybe<Scalars['ID']['input']>;
347
516
  assignedReportIds?: InputMaybe<Array<Scalars['ID']['input']>>;
348
517
  comment?: InputMaybe<Scalars['String']['input']>;
518
+ dataUploadId?: InputMaybe<Scalars['ID']['input']>;
349
519
  endedAt?: InputMaybe<Scalars['Date']['input']>;
350
520
  info: CreateTestInfoInput;
521
+ isHorizontalFlip?: InputMaybe<Scalars['Boolean']['input']>;
351
522
  kind: Scalars['ID']['input'];
523
+ metaData?: InputMaybe<Scalars['String']['input']>;
352
524
  name: Scalars['String']['input'];
525
+ requestPose?: InputMaybe<Scalars['Boolean']['input']>;
526
+ routineId?: InputMaybe<Scalars['ID']['input']>;
353
527
  sessionId: Scalars['ID']['input'];
354
528
  startedAt: Scalars['Date']['input'];
355
529
  timezone?: InputMaybe<Scalars['String']['input']>;
530
+ trimEndMs?: InputMaybe<Scalars['Int']['input']>;
531
+ trimStartMs?: InputMaybe<Scalars['Int']['input']>;
532
+ videoUploadId?: InputMaybe<Scalars['ID']['input']>;
356
533
  };
357
534
  export type CreateTrialInput = {
358
535
  endFrame: Scalars['Int']['input'];
@@ -362,6 +539,7 @@ export type CreateTrialInput = {
362
539
  };
363
540
  export type CreateTrialParameterInput = {
364
541
  data?: InputMaybe<TrialParameterDataInput>;
542
+ dataSource?: InputMaybe<TrialParameterDataSource>;
365
543
  kind: ParameterKind;
366
544
  max: Scalars['Float']['input'];
367
545
  metrics?: InputMaybe<TrialParameterMetricsInput>;
@@ -392,6 +570,25 @@ export type CurrentUser = {
392
570
  updatedAt: Scalars['String']['output'];
393
571
  username: Scalars['String']['output'];
394
572
  };
573
+ /**
574
+ * Display-only labels for the session list. Never used in an authorization
575
+ * decision, so treat them as untrusted client input when rendering.
576
+ */
577
+ export type DeviceInput = {
578
+ name?: InputMaybe<Scalars['String']['input']>;
579
+ platform?: InputMaybe<Scalars['String']['input']>;
580
+ };
581
+ /** One signed-in device. */
582
+ export type DeviceSession = {
583
+ __typename?: 'DeviceSession';
584
+ createdAt: Scalars['String']['output'];
585
+ /** True for the session making this request. */
586
+ current: Scalars['Boolean']['output'];
587
+ deviceName?: Maybe<Scalars['String']['output']>;
588
+ devicePlatform?: Maybe<Scalars['String']['output']>;
589
+ id: Scalars['ID']['output'];
590
+ lastUsedAt?: Maybe<Scalars['String']['output']>;
591
+ };
395
592
  export type DiscreteMetric = {
396
593
  __typename?: 'DiscreteMetric';
397
594
  unit: Scalars['Unit']['output'];
@@ -401,6 +598,15 @@ export type DiscreteMetricInput = {
401
598
  unit: Scalars['Unit']['input'];
402
599
  value: Scalars['Float']['input'];
403
600
  };
601
+ /**
602
+ * A feature flag evaluated by the API for the signed-in user. Web and mobile read
603
+ * flags only through this query; no client talks to the flag provider directly.
604
+ */
605
+ export type FeatureFlag = {
606
+ __typename?: 'FeatureFlag';
607
+ enabled: Scalars['Boolean']['output'];
608
+ key: Scalars['String']['output'];
609
+ };
404
610
  export type GeneralActivityReport = {
405
611
  __typename?: 'GeneralActivityReport';
406
612
  averageParameterScores: Array<TestAverageParameterScore>;
@@ -414,15 +620,37 @@ export type Group = {
414
620
  id: Scalars['ID']['output'];
415
621
  imageUrl?: Maybe<Scalars['String']['output']>;
416
622
  name: Scalars['String']['output'];
623
+ /**
624
+ * One page of the organisation's people, filtered by role and searchable by
625
+ * name, username or email. The split is decided ONCE, on the server.
626
+ */
627
+ people: PersonPage;
417
628
  profiles: Array<UserProfile>;
418
629
  updatedAt: Scalars['String']['output'];
630
+ /**
631
+ * Superseded by `people`. Unfiltered and unpaged; kept so existing callers
632
+ * still work while they move over.
633
+ */
419
634
  users: Array<User>;
420
635
  };
636
+ export type GroupPeopleArgs = {
637
+ cursor?: InputMaybe<Scalars['String']['input']>;
638
+ includeArchived?: InputMaybe<Scalars['Boolean']['input']>;
639
+ kind: PersonKind;
640
+ limit?: InputMaybe<Scalars['Int']['input']>;
641
+ search?: InputMaybe<Scalars['String']['input']>;
642
+ };
421
643
  export type GroupInfo = {
422
644
  __typename?: 'GroupInfo';
423
645
  id: Scalars['ID']['output'];
424
646
  name: Scalars['String']['output'];
425
647
  };
648
+ export type IdentityVerificationResult = {
649
+ __typename?: 'IdentityVerificationResult';
650
+ errorMessage?: Maybe<Scalars['String']['output']>;
651
+ locked: Scalars['Boolean']['output'];
652
+ verified: Scalars['Boolean']['output'];
653
+ };
426
654
  export type ImageMetric = {
427
655
  __typename?: 'ImageMetric';
428
656
  path: Scalars['String']['output'];
@@ -439,6 +667,9 @@ export type Invitation = {
439
667
  invitedBy?: Maybe<InvitationInviter>;
440
668
  isAdmin: Scalars['Boolean']['output'];
441
669
  lastName?: Maybe<Scalars['String']['output']>;
670
+ requiresIdentityVerification: Scalars['Boolean']['output'];
671
+ /** The role this invitation grants. Null only on rows predating US-1.3. */
672
+ role?: Maybe<InvitationRole>;
442
673
  status: InvitationStatus;
443
674
  type: InvitationType;
444
675
  };
@@ -448,6 +679,22 @@ export type InvitationInviter = {
448
679
  id: Scalars['ID']['output'];
449
680
  username: Scalars['String']['output'];
450
681
  };
682
+ /**
683
+ * The role an invitation grants. Every invitation carries exactly one, chosen at
684
+ * creation: an account that comes into existence holding no role can sign in and
685
+ * do nothing, and nobody can diagnose that from the outside (US-1.3).
686
+ *
687
+ * `admin` and `mobile_client` are absent from the Console's selector but present
688
+ * here, because the server decides both — an admin invitation is US-5.1's, and a
689
+ * client invitation is the customer web app's.
690
+ */
691
+ export declare enum InvitationRole {
692
+ AccountAdmin = "account_admin",
693
+ AccountManager = "account_manager",
694
+ AccountUser = "account_user",
695
+ Admin = "admin",
696
+ MobileClient = "mobile_client"
697
+ }
451
698
  export declare enum InvitationStatus {
452
699
  Accepted = "ACCEPTED",
453
700
  Cancelled = "CANCELLED",
@@ -461,6 +708,12 @@ export declare enum InvitationType {
461
708
  }
462
709
  export type InvitationValidation = {
463
710
  __typename?: 'InvitationValidation';
711
+ /**
712
+ * MOB-552 — why the token is not valid: INVITATION_NOT_FOUND, INVITATION_EXPIRED,
713
+ * INVITATION_ALREADY_USED or INVITATION_CANCELLED. errorMessage is left as the
714
+ * text existing clients display.
715
+ */
716
+ errorCode?: Maybe<Scalars['String']['output']>;
464
717
  errorMessage?: Maybe<Scalars['String']['output']>;
465
718
  invitation?: Maybe<Invitation>;
466
719
  valid: Scalars['Boolean']['output'];
@@ -552,6 +805,14 @@ export type MetricInput = {
552
805
  poiMetrics?: InputMaybe<Array<PoiMetricInput>>;
553
806
  table?: InputMaybe<TableMetricInput>;
554
807
  };
808
+ export declare enum MobileAccessStatus {
809
+ Accepted = "ACCEPTED",
810
+ Expired = "EXPIRED",
811
+ /** The profile is linked to a login that is not an active mobile client; it cannot be invited. */
812
+ LinkedAccount = "LINKED_ACCOUNT",
813
+ None = "NONE",
814
+ Pending = "PENDING"
815
+ }
555
816
  export type ModuleAction = {
556
817
  __typename?: 'ModuleAction';
557
818
  action: Action;
@@ -592,10 +853,57 @@ export type Mutation = {
592
853
  addActionToModule: ActionModule;
593
854
  archiveUser: Scalars['Boolean']['output'];
594
855
  assignActionToProfile: Scalars['Boolean']['output'];
856
+ assignModuleToProfile: Scalars['Boolean']['output'];
595
857
  assignRoutineToProfile: Scalars['Boolean']['output'];
596
858
  assignTestToRoutine: Scalars['Boolean']['output'];
859
+ attachReportToAssignedAction: Scalars['Boolean']['output'];
860
+ attachTestFiles: TestFile;
861
+ /**
862
+ * AC-4.6.12 — stop a pending change of email address, from the single-use link
863
+ * sent to the address currently on the account. Public for the same reason
864
+ * confirmation is, and a stronger one: the person objecting may be objecting
865
+ * because somebody else holds a session on their account.
866
+ *
867
+ * It can only ever STOP a change. There is no address it can set.
868
+ */
869
+ cancelEmailChange: Scalars['Boolean']['output'];
597
870
  cancelInvitation: Scalars['Boolean']['output'];
598
- changePassword: Scalars['Boolean']['output'];
871
+ /**
872
+ * AC-4.7.3 — cancel a pending change from the Console, which kills the
873
+ * verification link with it. Omit `userId` to cancel your own.
874
+ *
875
+ * The pair to the link in the warning email: the same discard, reached by
876
+ * somebody signed in with authority over the account rather than by somebody
877
+ * holding a token. Succeeds when nothing is pending — no pending change is the
878
+ * outcome the caller wanted.
879
+ */
880
+ cancelPendingEmailChange: Scalars['Boolean']['output'];
881
+ /**
882
+ * Change a password: your own (row D.3, and then `currentPassword` is required)
883
+ * or somebody else's (rows B.9 and C.7). The result says WHICH of the two
884
+ * outcomes happened rather than only that something did — see
885
+ * PasswordChangeOutcome.
886
+ */
887
+ changePassword: ChangePasswordResult;
888
+ /**
889
+ * US-4.4 — move a person between the three clinic roles.
890
+ *
891
+ * A role could only be assigned at invitation time; there was no way to change
892
+ * it afterwards from any interface, so a promotion meant deleting the person and
893
+ * inviting them again.
894
+ *
895
+ * Granting is always a REPLACEMENT, because an account holds exactly one role:
896
+ * there is no state in which it holds two, and none in which it holds none.
897
+ * `account_user` is the floor, so no clinic role change can produce a roleless
898
+ * account.
899
+ */
900
+ changeRole: User;
901
+ /**
902
+ * Confirm a change of email address. Public: the person opening the link is
903
+ * proving they hold the new mailbox, which is the whole point, and they may not
904
+ * be signed in when they do it.
905
+ */
906
+ confirmEmailChange: Scalars['Boolean']['output'];
599
907
  convertActionToQuantumOwned: Action;
600
908
  copyActions: Scalars['Boolean']['output'];
601
909
  copyModules: Scalars['Boolean']['output'];
@@ -633,18 +941,75 @@ export type Mutation = {
633
941
  deleteTrial: Scalars['Boolean']['output'];
634
942
  deleteTrialParameter: Scalars['Boolean']['output'];
635
943
  deleteUserProfile: Scalars['Boolean']['output'];
944
+ detachReportFromAssignedAction: Scalars['Boolean']['output'];
636
945
  duplicateAction: Scalars['Boolean']['output'];
637
946
  inviteMobileAppUser: Scalars['Boolean']['output'];
638
947
  inviteTeamMember: Invitation;
639
948
  login?: Maybe<LoginResult>;
949
+ /**
950
+ * Closes one session. Pass refreshToken to log out with an expired access
951
+ * token; otherwise the bearer token identifies the session. Always succeeds —
952
+ * a session that is already closed is the outcome the caller wanted.
953
+ */
954
+ logout: Scalars['Boolean']['output'];
955
+ /** Closes every session except the one making this request. */
956
+ logoutOtherDevices: Scalars['Boolean']['output'];
957
+ mobileInviteLink: Scalars['String']['output'];
640
958
  refresh: LoginResult;
959
+ removeAccountAdminRole: Scalars['Boolean']['output'];
641
960
  removeActionFromModule: ActionModule;
961
+ /**
962
+ * US-5.1 — REMOVE a Quantum staff account. NOT reversible: the same effects as
963
+ * suspending, and the role comes off so the person can never be restored.
964
+ * Bringing them back means a fresh invitation.
965
+ *
966
+ * Until now there was only suspend, used for both — so a departed employee
967
+ * still held an account with the highest privilege in the system, one click
968
+ * away from being live again, with nothing marking that they should not return.
969
+ */
970
+ removeAdmin: Scalars['Boolean']['output'];
642
971
  removeMobileAppAccess: Scalars['Boolean']['output'];
972
+ /**
973
+ * US-2.3 / row B.3 — REMOVE a staff member from a clinic. NOT reversible: the
974
+ * same effects as suspending (sessions end, the account is hidden), and the
975
+ * clinic role comes off so the person can never be restored.
976
+ *
977
+ * The pair to `archiveUser`, which suspends and is reversible. Removal is what
978
+ * a clinic needs when somebody has left rather than gone on leave — and until
979
+ * now only suspend existed, used for both.
980
+ *
981
+ * The row stays on the clinic's staff list, marked removed, with no action
982
+ * offered: with no audit-log viewer in this delivery, that row is the only
983
+ * thing that can answer who used to work here while the clinical records they
984
+ * created remain (AC-2.3.12).
985
+ */
986
+ removeStaff: Scalars['Boolean']['output'];
643
987
  replaceTrialParameters: Array<TrialParameter>;
988
+ /**
989
+ * US-4.6 — request a change of email address. Nothing on the account changes:
990
+ * a verification link goes to the NEW address, and the old one keeps working
991
+ * until it is confirmed. Omit `userId` to change your own (row D.4).
992
+ */
993
+ requestEmailChange: Scalars['Boolean']['output'];
644
994
  requestPoseProcessing: Scalars['Boolean']['output'];
645
995
  resendInvitation: Invitation;
996
+ resetMobileClientPassword: Scalars['Boolean']['output'];
997
+ resetPasswordWithToken: Scalars['Boolean']['output'];
998
+ /** Reverse a suspension. */
999
+ restoreAdmin: Scalars['Boolean']['output'];
1000
+ /** Closes another of the caller's own devices. False if it was already gone. */
1001
+ revokeSession: Scalars['Boolean']['output'];
1002
+ revokeUserAccess: Scalars['Boolean']['output'];
1003
+ setProfileAssignments: SetProfileAssignmentsResult;
1004
+ /**
1005
+ * US-5.1 — SUSPEND a Quantum staff account. Reversible: sessions end and the
1006
+ * account is hidden, the role stays attached, and the person can come back.
1007
+ * For somebody on leave, under investigation, or with a lost laptop.
1008
+ */
1009
+ suspendAdmin: Scalars['Boolean']['output'];
646
1010
  unarchiveUserProfile: UserProfile;
647
1011
  unassignActionFromProfile: Scalars['Boolean']['output'];
1012
+ unassignModuleFromProfile: Scalars['Boolean']['output'];
648
1013
  unassignRoutineFromProfile: Scalars['Boolean']['output'];
649
1014
  updateAction: Action;
650
1015
  updateGroup: Group;
@@ -656,8 +1021,10 @@ export type Mutation = {
656
1021
  updateTrialData: Trial;
657
1022
  updateUserProfile: UserProfile;
658
1023
  updateVideoDataOffset: TestFile;
1024
+ verifyInvitationIdentity: IdentityVerificationResult;
659
1025
  };
660
1026
  export type MutationAcceptInvitationArgs = {
1027
+ device?: InputMaybe<DeviceInput>;
661
1028
  input: AcceptInvitationInput;
662
1029
  };
663
1030
  export type MutationAddActionToModuleArgs = {
@@ -672,6 +1039,10 @@ export type MutationAssignActionToProfileArgs = {
672
1039
  actionId: Scalars['ID']['input'];
673
1040
  profileId: Scalars['ID']['input'];
674
1041
  };
1042
+ export type MutationAssignModuleToProfileArgs = {
1043
+ moduleId: Scalars['ID']['input'];
1044
+ profileId: Scalars['ID']['input'];
1045
+ };
675
1046
  export type MutationAssignRoutineToProfileArgs = {
676
1047
  profileId: Scalars['ID']['input'];
677
1048
  routineId: Scalars['ID']['input'];
@@ -680,12 +1051,34 @@ export type MutationAssignTestToRoutineArgs = {
680
1051
  routineId?: InputMaybe<Scalars['ID']['input']>;
681
1052
  testId: Scalars['ID']['input'];
682
1053
  };
1054
+ export type MutationAttachReportToAssignedActionArgs = {
1055
+ actionId: Scalars['ID']['input'];
1056
+ profileId: Scalars['ID']['input'];
1057
+ reportId: Scalars['ID']['input'];
1058
+ };
1059
+ export type MutationAttachTestFilesArgs = {
1060
+ input: AttachTestFilesInput;
1061
+ testId: Scalars['ID']['input'];
1062
+ };
1063
+ export type MutationCancelEmailChangeArgs = {
1064
+ token: Scalars['String']['input'];
1065
+ };
683
1066
  export type MutationCancelInvitationArgs = {
684
1067
  invitationId: Scalars['ID']['input'];
685
1068
  };
1069
+ export type MutationCancelPendingEmailChangeArgs = {
1070
+ userId?: InputMaybe<Scalars['ID']['input']>;
1071
+ };
686
1072
  export type MutationChangePasswordArgs = {
687
1073
  input: ChangePasswordInput;
688
1074
  };
1075
+ export type MutationChangeRoleArgs = {
1076
+ role: InvitationRole;
1077
+ userId: Scalars['ID']['input'];
1078
+ };
1079
+ export type MutationConfirmEmailChangeArgs = {
1080
+ token: Scalars['String']['input'];
1081
+ };
689
1082
  export type MutationConvertActionToQuantumOwnedArgs = {
690
1083
  id: Scalars['ID']['input'];
691
1084
  };
@@ -810,6 +1203,10 @@ export type MutationDeleteTrialParameterArgs = {
810
1203
  export type MutationDeleteUserProfileArgs = {
811
1204
  id: Scalars['ID']['input'];
812
1205
  };
1206
+ export type MutationDetachReportFromAssignedActionArgs = {
1207
+ actionId: Scalars['ID']['input'];
1208
+ profileId: Scalars['ID']['input'];
1209
+ };
813
1210
  export type MutationDuplicateActionArgs = {
814
1211
  id: Scalars['ID']['input'];
815
1212
  };
@@ -821,28 +1218,70 @@ export type MutationInviteTeamMemberArgs = {
821
1218
  input: CreateTeamInvitationInput;
822
1219
  };
823
1220
  export type MutationLoginArgs = {
1221
+ device?: InputMaybe<DeviceInput>;
824
1222
  input: LoginInput;
825
1223
  };
1224
+ export type MutationLogoutArgs = {
1225
+ refreshToken?: InputMaybe<Scalars['String']['input']>;
1226
+ };
1227
+ export type MutationMobileInviteLinkArgs = {
1228
+ profileId: Scalars['ID']['input'];
1229
+ };
826
1230
  export type MutationRefreshArgs = {
827
1231
  refreshToken: Scalars['String']['input'];
828
1232
  };
1233
+ export type MutationRemoveAccountAdminRoleArgs = {
1234
+ userId: Scalars['ID']['input'];
1235
+ };
829
1236
  export type MutationRemoveActionFromModuleArgs = {
830
1237
  moduleActionId: Scalars['ID']['input'];
831
1238
  moduleId: Scalars['ID']['input'];
832
1239
  };
1240
+ export type MutationRemoveAdminArgs = {
1241
+ userId: Scalars['ID']['input'];
1242
+ };
833
1243
  export type MutationRemoveMobileAppAccessArgs = {
834
1244
  profileId: Scalars['ID']['input'];
835
1245
  };
1246
+ export type MutationRemoveStaffArgs = {
1247
+ userId: Scalars['ID']['input'];
1248
+ };
836
1249
  export type MutationReplaceTrialParametersArgs = {
837
1250
  input: Array<ReplaceTrialParameterInput>;
838
1251
  trialId: Scalars['ID']['input'];
839
1252
  };
1253
+ export type MutationRequestEmailChangeArgs = {
1254
+ newEmail: Scalars['String']['input'];
1255
+ userId?: InputMaybe<Scalars['ID']['input']>;
1256
+ };
840
1257
  export type MutationRequestPoseProcessingArgs = {
841
1258
  testFileId: Scalars['ID']['input'];
842
1259
  };
843
1260
  export type MutationResendInvitationArgs = {
844
1261
  invitationId: Scalars['ID']['input'];
845
1262
  };
1263
+ export type MutationResetMobileClientPasswordArgs = {
1264
+ profileId: Scalars['ID']['input'];
1265
+ };
1266
+ export type MutationResetPasswordWithTokenArgs = {
1267
+ newPassword: Scalars['String']['input'];
1268
+ token: Scalars['String']['input'];
1269
+ };
1270
+ export type MutationRestoreAdminArgs = {
1271
+ userId: Scalars['ID']['input'];
1272
+ };
1273
+ export type MutationRevokeSessionArgs = {
1274
+ sessionId: Scalars['ID']['input'];
1275
+ };
1276
+ export type MutationRevokeUserAccessArgs = {
1277
+ userId: Scalars['ID']['input'];
1278
+ };
1279
+ export type MutationSetProfileAssignmentsArgs = {
1280
+ input: SetProfileAssignmentsInput;
1281
+ };
1282
+ export type MutationSuspendAdminArgs = {
1283
+ userId: Scalars['ID']['input'];
1284
+ };
846
1285
  export type MutationUnarchiveUserProfileArgs = {
847
1286
  id: Scalars['ID']['input'];
848
1287
  };
@@ -850,6 +1289,10 @@ export type MutationUnassignActionFromProfileArgs = {
850
1289
  actionId: Scalars['ID']['input'];
851
1290
  profileId: Scalars['ID']['input'];
852
1291
  };
1292
+ export type MutationUnassignModuleFromProfileArgs = {
1293
+ moduleId: Scalars['ID']['input'];
1294
+ profileId: Scalars['ID']['input'];
1295
+ };
853
1296
  export type MutationUnassignRoutineFromProfileArgs = {
854
1297
  profileId: Scalars['ID']['input'];
855
1298
  routineId: Scalars['ID']['input'];
@@ -893,6 +1336,12 @@ export type MutationUpdateVideoDataOffsetArgs = {
893
1336
  offset: Scalars['Int']['input'];
894
1337
  testFileId: Scalars['ID']['input'];
895
1338
  };
1339
+ export type MutationVerifyInvitationIdentityArgs = {
1340
+ dateOfBirth: Scalars['Date']['input'];
1341
+ firstName: Scalars['String']['input'];
1342
+ lastName: Scalars['String']['input'];
1343
+ token: Scalars['String']['input'];
1344
+ };
896
1345
  export type Parameter = {
897
1346
  __typename?: 'Parameter';
898
1347
  id: Scalars['ID']['output'];
@@ -905,6 +1354,66 @@ export declare enum ParameterKind {
905
1354
  Limit = "Limit",
906
1355
  Target = "Target"
907
1356
  }
1357
+ /**
1358
+ * AC-4.9.9 — WHICH of the two things a reset did.
1359
+ *
1360
+ * The mutation returned `Boolean!`, and a reset has two outcomes: the password is
1361
+ * set directly, or a single-use link is sent and the password the operator typed
1362
+ * is discarded. One bit cannot carry that, so the Console reported "Password for X
1363
+ * has been changed successfully" on a path where no password was changed and
1364
+ * support read out a credential that never existed.
1365
+ */
1366
+ export declare enum PasswordChangeOutcome {
1367
+ /**
1368
+ * A single-use, time-limited link was sent to the person instead, and no
1369
+ * password was chosen on their behalf. Any password the caller supplied was
1370
+ * discarded. This is the outcome for every client (AC-4.9.2) and for anybody
1371
+ * outside the caller's own organisation (AC-4.9.5).
1372
+ */
1373
+ LinkSent = "LINK_SENT",
1374
+ /**
1375
+ * Nothing was written. The row the update aimed at was not there — AC-3.3.1's
1376
+ * case, where reporting success from the absence of an error is the defect.
1377
+ */
1378
+ NotChanged = "NOT_CHANGED",
1379
+ /** A password was set on the account. It is the one the caller supplied. */
1380
+ PasswordSet = "PASSWORD_SET"
1381
+ }
1382
+ /**
1383
+ * A change of email address that has been requested and not yet confirmed. It
1384
+ * carries no token: this is what a screen may show, and a token is not.
1385
+ */
1386
+ export type PendingEmailChange = {
1387
+ __typename?: 'PendingEmailChange';
1388
+ /** When the verification link stops working. */
1389
+ expiresAt: Scalars['String']['output'];
1390
+ /** The address the account will move to once the link is opened. */
1391
+ newEmail: Scalars['String']['output'];
1392
+ };
1393
+ /**
1394
+ * Which of an organisation's people to return. One account holds one role, so
1395
+ * these two sets never overlap.
1396
+ */
1397
+ export declare enum PersonKind {
1398
+ Client = "CLIENT",
1399
+ Staff = "STAFF"
1400
+ }
1401
+ /**
1402
+ * US-4.2 — one page of an organisation's people.
1403
+ *
1404
+ * `Group.users` returns EVERY user in the organisation including archived ones,
1405
+ * with no role filter, and the Console renders all of them in one pass. That does
1406
+ * not survive an organisation with two thousand people, and it left the split
1407
+ * between staff and clients to be decided in the client.
1408
+ */
1409
+ export type PersonPage = {
1410
+ __typename?: 'PersonPage';
1411
+ /** Cursor for the next page, or null when this is the last one. */
1412
+ nextCursor?: Maybe<Scalars['String']['output']>;
1413
+ people: Array<User>;
1414
+ /** Total matching the filter, before paging. */
1415
+ totalCount: Scalars['Int']['output'];
1416
+ };
908
1417
  export type PoiMetric = {
909
1418
  __typename?: 'PoiMetric';
910
1419
  frame: Scalars['Int']['output'];
@@ -935,9 +1444,19 @@ export type QuantumOwnedData = {
935
1444
  export type Query = {
936
1445
  __typename?: 'Query';
937
1446
  actions: Array<Action>;
1447
+ /**
1448
+ * US-5.1 — every account holding admin, at every point in its lifecycle.
1449
+ * There is no consolidated list of admin holders anywhere in the product
1450
+ * today, and no way to grant the role or end it from any interface.
1451
+ */
1452
+ adminHolders: Array<AdminHolder>;
938
1453
  analysisClassifications: Array<AnalysisClassification>;
1454
+ appEnv: Scalars['String']['output'];
1455
+ assignCatalog: AssignCatalog;
939
1456
  assignedReport?: Maybe<AssignedReport>;
1457
+ auditLogs: Array<AuditLogEntry>;
940
1458
  currentGroup?: Maybe<Group>;
1459
+ featureFlags: Array<FeatureFlag>;
941
1460
  generalActivityReport?: Maybe<GeneralActivityReport>;
942
1461
  getActionById?: Maybe<Action>;
943
1462
  getMetadataByKey: MetadataGroup;
@@ -950,6 +1469,17 @@ export type Query = {
950
1469
  group?: Maybe<Group>;
951
1470
  groups: Array<Group>;
952
1471
  historicalMetrics: Array<AnalysisMetric>;
1472
+ /**
1473
+ * US-5.3 / UF-3.1 — Quantum's own organisation, which is where a Quantum staff
1474
+ * invitation must be written (AC-5.3.7) and the one organisation the customer
1475
+ * list deliberately excludes (US-5.4). The Quantum Staff screen cannot ask for
1476
+ * it through `groups`, which filters it out by design.
1477
+ *
1478
+ * Null when no organisation carries the flag — a real state where migration
1479
+ * 000078 has run and nobody has set it yet. The screen says so rather than
1480
+ * offering to invite somebody into nowhere.
1481
+ */
1482
+ internalOrganisation?: Maybe<Group>;
953
1483
  invitations: Array<Invitation>;
954
1484
  keypoints: Array<Keypoint>;
955
1485
  me?: Maybe<CurrentUser>;
@@ -957,6 +1487,12 @@ export type Query = {
957
1487
  moduleCategories: Array<ModuleCategory>;
958
1488
  modules: Array<ActionModule>;
959
1489
  movementCoordinationReport?: Maybe<MovementCoordinationReport>;
1490
+ /**
1491
+ * AC-6.4.3 — your own pending change of address, so the person whose account it
1492
+ * is can see that one is in flight rather than only the operator who asked for
1493
+ * it.
1494
+ */
1495
+ myPendingEmailChange?: Maybe<PendingEmailChange>;
960
1496
  profileSessionForToday: Session;
961
1497
  quantumOwnedActions: Array<Action>;
962
1498
  quantumOwnedModules: Array<ActionModule>;
@@ -964,6 +1500,8 @@ export type Query = {
964
1500
  rangeReport?: Maybe<RangeReport>;
965
1501
  routine?: Maybe<Routine>;
966
1502
  routines: Array<Routine>;
1503
+ /** The caller's signed-in devices, newest first. */
1504
+ sessions: Array<DeviceSession>;
967
1505
  sessionsCreatedByProfile: Array<Session>;
968
1506
  sessionsForProfile: Array<Session>;
969
1507
  stabilityBalanceReport?: Maybe<StabilityBalanceReport>;
@@ -979,9 +1517,15 @@ export type Query = {
979
1517
  export type QueryActionsArgs = {
980
1518
  groupId?: InputMaybe<Scalars['ID']['input']>;
981
1519
  };
1520
+ export type QueryAdminHoldersArgs = {
1521
+ search?: InputMaybe<Scalars['String']['input']>;
1522
+ };
982
1523
  export type QueryAssignedReportArgs = {
983
1524
  id: Scalars['ID']['input'];
984
1525
  };
1526
+ export type QueryAuditLogsArgs = {
1527
+ filter?: InputMaybe<AuditLogFilter>;
1528
+ };
985
1529
  export type QueryGeneralActivityReportArgs = {
986
1530
  id: Scalars['ID']['input'];
987
1531
  };
@@ -1169,6 +1713,23 @@ export declare enum SessionType {
1169
1713
  BiofeedbackTraining = "BiofeedbackTraining",
1170
1714
  RecordedTesting = "RecordedTesting"
1171
1715
  }
1716
+ export type SetProfileAssignmentsInput = {
1717
+ changes: Array<AssignmentChangeInput>;
1718
+ profileId: Scalars['ID']['input'];
1719
+ };
1720
+ /**
1721
+ * Per-item outcomes plus the plan as the server now holds it, so the panel
1722
+ * reconciles against the server in the same round trip (AC-4.4.32).
1723
+ */
1724
+ export type SetProfileAssignmentsResult = {
1725
+ __typename?: 'SetProfileAssignmentsResult';
1726
+ /** The practitioner's individually-picked activities ONLY — not the client's full library. A program's activities are supplied by the program, not listed here; see UserProfile.assignedActions for the full union. */
1727
+ assignedActionIds: Array<Scalars['ID']['output']>;
1728
+ assignedActionReports: Array<AssignedActionReport>;
1729
+ /** The programs assigned directly to this profile. Does not include a program's own activities, which are derived at read time from the module, not stored here. */
1730
+ assignedModuleIds: Array<Scalars['ID']['output']>;
1731
+ results: Array<AssignmentChangeResult>;
1732
+ };
1172
1733
  export type StabilityBalanceReport = {
1173
1734
  __typename?: 'StabilityBalanceReport';
1174
1735
  averageParameterScores: Array<TestAverageParameterScore>;
@@ -1426,6 +1987,10 @@ export type TrialParameterDataInput = {
1426
1987
  timestamps: Array<Scalars['Long']['input']>;
1427
1988
  values: Array<Scalars['Float']['input']>;
1428
1989
  };
1990
+ export declare enum TrialParameterDataSource {
1991
+ Pose = "Pose",
1992
+ Sensor = "Sensor"
1993
+ }
1429
1994
  export type TrialParameterMetrics = {
1430
1995
  __typename?: 'TrialParameterMetrics';
1431
1996
  id: Scalars['ID']['output'];
@@ -1540,6 +2105,28 @@ export type User = {
1540
2105
  deletedAt?: Maybe<Scalars['Date']['output']>;
1541
2106
  email: Scalars['String']['output'];
1542
2107
  id: Scalars['ID']['output'];
2108
+ /**
2109
+ * Where this account sits in its lifecycle. deletedAt says only that the account
2110
+ * is inactive; it cannot tell a SUSPENDED person, who can be restored, from a
2111
+ * REMOVED one, who never can.
2112
+ *
2113
+ * Reading the label from deletedAt alone made the Console offer Restore on a
2114
+ * removed account — an action the server refuses and always will, because the
2115
+ * person gave up their sign-in identity and somebody else may now hold it
2116
+ * (AC-2.3.12: a removed person stays listed, marked removed, with no action
2117
+ * offered on their row).
2118
+ */
2119
+ lifecycle: AccountLifecycle;
2120
+ /**
2121
+ * AC-4.7.2 — a change of email address awaiting confirmation, and the address
2122
+ * it is going to. Null when none is in flight.
2123
+ *
2124
+ * The row has to be able to say this. Requesting a change alters nothing on the
2125
+ * account, so without it the screen shows the old address and looks identical
2126
+ * whether or not somebody asked for a change an hour ago — and an operator who
2127
+ * cannot see a pending change cannot cancel one either.
2128
+ */
2129
+ pendingEmailChange?: Maybe<PendingEmailChange>;
1543
2130
  profile?: Maybe<UserProfile>;
1544
2131
  roles: Array<Scalars['String']['output']>;
1545
2132
  unitSystem: UnitSystem;
@@ -1549,11 +2136,17 @@ export type User = {
1549
2136
  export type UserProfile = {
1550
2137
  __typename?: 'UserProfile';
1551
2138
  age?: Maybe<Scalars['Int']['output']>;
2139
+ /** AC-14.2.4: one entry per activity in the client's plan, saying how it got there. Deliberately NOT filtered by any practitioner's catalogue — items outside the reader's reach are reported too. Scoped like every other assignment read: a client reaches only their own profile. */
2140
+ assignedActionProvenance: Array<AssignedActionProvenance>;
2141
+ assignedActionReports: Array<AssignedActionReport>;
1552
2142
  assignedActions: Array<Action>;
2143
+ assignedModules: Array<ActionModule>;
1553
2144
  assignedRoutines: Array<Routine>;
1554
2145
  createdAt: Scalars['Date']['output'];
1555
2146
  date_of_birth?: Maybe<Scalars['Date']['output']>;
1556
2147
  deletedAt?: Maybe<Scalars['Date']['output']>;
2148
+ /** The practitioner's individually-picked activities ONLY — the same set SetProfileAssignmentsResult.assignedActionIds returns. assignedActions, by contrast, is the client's whole visible library: these direct picks plus every activity supplied by an assigned program. */
2149
+ directAssignedActionIds: Array<Scalars['ID']['output']>;
1557
2150
  firstName: Scalars['String']['output'];
1558
2151
  gender?: Maybe<Scalars['String']['output']>;
1559
2152
  group?: Maybe<GroupInfo>;
@@ -1562,6 +2155,8 @@ export type UserProfile = {
1562
2155
  id: Scalars['ID']['output'];
1563
2156
  lastName: Scalars['String']['output'];
1564
2157
  mobileAccessEmail?: Maybe<Scalars['String']['output']>;
2158
+ mobileAccessStatus: MobileAccessStatus;
2159
+ mobileInvitation?: Maybe<Invitation>;
1565
2160
  updatedAt: Scalars['Date']['output'];
1566
2161
  weight?: Maybe<Scalars['Float']['output']>;
1567
2162
  };