@stapel/workspaces-react 0.7.0 → 0.9.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/api/generated/schema.d.ts +497 -5
  3. package/dist/api/generated/schema.d.ts.map +1 -1
  4. package/dist/api/types.d.ts +91 -2
  5. package/dist/api/types.d.ts.map +1 -1
  6. package/dist/api/workspacesApi.d.ts +35 -1
  7. package/dist/api/workspacesApi.d.ts.map +1 -1
  8. package/dist/api/workspacesApi.js +20 -0
  9. package/dist/api/workspacesApi.js.map +1 -1
  10. package/dist/default/MembersManager.js +2 -2
  11. package/dist/i18n/generated/errors.gen.d.ts +6 -0
  12. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  13. package/dist/i18n/generated/errors.gen.js +3 -0
  14. package/dist/i18n/generated/errors.gen.js.map +1 -1
  15. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -1
  16. package/dist/i18n/generated/errors.ru.gen.js +1 -0
  17. package/dist/i18n/generated/errors.ru.gen.js.map +1 -1
  18. package/dist/index.d.ts +7 -5
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/model/mutations.d.ts +86 -2
  23. package/dist/model/mutations.d.ts.map +1 -1
  24. package/dist/model/mutations.js +152 -1
  25. package/dist/model/mutations.js.map +1 -1
  26. package/dist/model/queries.d.ts +90 -2
  27. package/dist/model/queries.d.ts.map +1 -1
  28. package/dist/model/queries.js +115 -1
  29. package/dist/model/queries.js.map +1 -1
  30. package/dist/model/queryKeys.d.ts +11 -1
  31. package/dist/model/queryKeys.d.ts.map +1 -1
  32. package/dist/model/queryKeys.js +21 -1
  33. package/dist/model/queryKeys.js.map +1 -1
  34. package/dist/model/stepUp.d.ts +25 -0
  35. package/dist/model/stepUp.d.ts.map +1 -0
  36. package/dist/model/stepUp.js +79 -0
  37. package/dist/model/stepUp.js.map +1 -0
  38. package/llms.txt +15 -3
  39. package/manifest.json +147 -2
  40. package/package.json +4 -4
  41. package/src/analytics/generated/events.json +1 -1
  42. package/src/api/generated/schema.ts +497 -5
  43. package/src/api/types.ts +101 -2
  44. package/src/api/workspacesApi.ts +93 -0
  45. package/src/default/MembersManager.tsx +2 -2
  46. package/src/i18n/generated/errors.gen.ts +3 -0
  47. package/src/i18n/generated/errors.json +9 -0
  48. package/src/i18n/generated/errors.ru.gen.ts +1 -0
  49. package/src/index.ts +30 -2
  50. package/src/model/mutations.ts +193 -1
  51. package/src/model/queries.ts +162 -2
  52. package/src/model/queryKeys.ts +38 -2
  53. package/src/model/stepUp.ts +96 -0
@@ -89,6 +89,113 @@ export interface paths {
89
89
  patch: operations["workspaces_api_v1_partial_update"];
90
90
  trace?: never;
91
91
  };
92
+ "/workspaces/api/v1/{workspace_id}/invitations": {
93
+ parameters: {
94
+ query?: never;
95
+ header?: never;
96
+ path?: never;
97
+ cookie?: never;
98
+ };
99
+ /**
100
+ * @description Who was invited and has not accepted (#109).
101
+ *
102
+ * Before this endpoint an admin could send invitations and never see
103
+ * them again: acceptance produced a member row, and everything else —
104
+ * the unopened mail, the wrong address, the person who declined — was
105
+ * invisible from the product. The roster answered "who is in"; nothing
106
+ * answered "who is still out, and since when".
107
+ *
108
+ * Gated on ``members.invite``: the mandate that creates invitations is
109
+ * the mandate that sees and manages them. Reading the list is strictly
110
+ * less than sending one, so no separate capability is minted — a role
111
+ * that may invite but may not audit its own invitations would be a
112
+ * distinction without a use.
113
+ *
114
+ * The invite token is never in the response. It is a bearer credential;
115
+ * a list endpoint that carried it would hand every admin a working login
116
+ * link for every invited address.
117
+ *
118
+ * **Permissions:** `IsAuthenticated`
119
+ */
120
+ get: operations["workspaces_api_v1_invitations_list"];
121
+ put?: never;
122
+ post?: never;
123
+ delete?: never;
124
+ options?: never;
125
+ head?: never;
126
+ patch?: never;
127
+ trace?: never;
128
+ };
129
+ "/workspaces/api/v1/{workspace_id}/invitations/{invitation_id}/resend": {
130
+ parameters: {
131
+ query?: never;
132
+ header?: never;
133
+ path?: never;
134
+ cookie?: never;
135
+ };
136
+ get?: never;
137
+ put?: never;
138
+ /**
139
+ * @description Send the invitation email again (#109).
140
+ *
141
+ * Accepts an **expired** invitation on purpose — a dead TTL is the most
142
+ * common reason to resend — and refuses the three stored terminal states,
143
+ * which are decisions rather than delivery failures. The token is
144
+ * rotated and the TTL restarts, so the fresh letter carries a fresh link
145
+ * and any stale copy of the old one stops working.
146
+ *
147
+ * Reviving an expired invitation re-reserves a seat, so the plan ceiling
148
+ * is re-checked here exactly as it is on invite: capability first ("may
149
+ * YOU", 403), then the org's plan ("may the ORG", 402). An invitation
150
+ * that is already pending costs no additional seat and is never blocked
151
+ * by that check.
152
+ *
153
+ * **Permissions:** `IsAuthenticated`
154
+ */
155
+ post: operations["workspaces_api_v1_invitations_resend_create"];
156
+ delete?: never;
157
+ options?: never;
158
+ head?: never;
159
+ patch?: never;
160
+ trace?: never;
161
+ };
162
+ "/workspaces/api/v1/{workspace_id}/invitations/{invitation_id}/revoke": {
163
+ parameters: {
164
+ query?: never;
165
+ header?: never;
166
+ path?: never;
167
+ cookie?: never;
168
+ };
169
+ get?: never;
170
+ put?: never;
171
+ /**
172
+ * @description Withdraw a live invitation (#109).
173
+ *
174
+ * The workspace's terminal "no", the mirror of the invitee's decline —
175
+ * the two stay distinguishable in ``status`` forever. The seat the
176
+ * invitation reserved is freed on commit.
177
+ *
178
+ * Only a **pending** invitation is revocable: an accepted one produced a
179
+ * membership (remove the member instead), a declined or already-revoked
180
+ * one is terminal, and an expired one is already harmless. Each of those
181
+ * gets its own error key rather than a shrug.
182
+ *
183
+ * The transition is a compare-and-set under a row lock, not a blind
184
+ * write: an accept committing between this view's state check and the
185
+ * lock wins, and the revocation then fails honestly with
186
+ * ``error.400.invitation_already_used``. The reverse — a revocation
187
+ * committing between an accept's check and its lock — is the race fixed
188
+ * in 0.10.0, and it is the same predicate holding both ends.
189
+ *
190
+ * **Permissions:** `IsAuthenticated`
191
+ */
192
+ post: operations["workspaces_api_v1_invitations_revoke_create"];
193
+ delete?: never;
194
+ options?: never;
195
+ head?: never;
196
+ patch?: never;
197
+ trace?: never;
198
+ };
92
199
  "/workspaces/api/v1/{workspace_id}/members": {
93
200
  parameters: {
94
201
  query?: never;
@@ -154,6 +261,78 @@ export interface paths {
154
261
  patch: operations["workspaces_api_v1_members_partial_update"];
155
262
  trace?: never;
156
263
  };
264
+ "/workspaces/api/v1/{workspace_id}/members/{user_id}/password/reset": {
265
+ parameters: {
266
+ query?: never;
267
+ header?: never;
268
+ path?: never;
269
+ cookie?: never;
270
+ };
271
+ get?: never;
272
+ put?: never;
273
+ /**
274
+ * @description Reset a member's password on the organization's order (#110).
275
+ *
276
+ * Five questions this endpoint has to answer out loud, because a
277
+ * password reset is an account takeover performed on purpose and every
278
+ * one of them is a way to get it wrong.
279
+ *
280
+ * **Who may do it.** A mandate, not a session: capability
281
+ * ``members.password.reset`` (builtin ``admin`` and ``owner``), declared
282
+ * ``high``, so ``@requires_verification(scope="sensitive")`` demands a
283
+ * fresh step-up on top — an ambient cookie is not enough to hand
284
+ * somebody else's account over. Only an owner may reset an OWNER's
285
+ * password, the same hardcoded owner protection role changes and
286
+ * removals carry: otherwise an admin resets the owner and inherits the
287
+ * organization. And auth refuses a staff/superuser target outright
288
+ * (``error.403.privileged_account``) — org admin is a role inside one
289
+ * workspace, deployment staff is a role above every workspace, and the
290
+ * first must never be a route to the second.
291
+ *
292
+ * **Whether the user finds out.** Always. A
293
+ * ``workspace.member_password_reset`` letter names the workspace and the
294
+ * admin who did it — a reset is indistinguishable from a takeover
295
+ * unless the account holder is told which one it was. ``notified`` in
296
+ * the response says honestly whether a channel existed; the letter
297
+ * never carries the new password (see
298
+ * :func:`~stapel_workspaces.services.reset_member_password`).
299
+ *
300
+ * **Whether the new password is temporary.** Yes — auth raises the
301
+ * workspace's ``provisioned_user_policies`` (#90), defaulting to
302
+ * ``password_change``. A password the admin knows must stop working the
303
+ * first time it is used, and since auth 0.15.0 that demand holds on all
304
+ * 19 session-issuance paths rather than only the password form. An org
305
+ * may pass an explicit ``[]`` to suppress it, and that lands in auth's
306
+ * audit row.
307
+ *
308
+ * **Whether it is an existence oracle.** No: a target that is not a
309
+ * resettable member of THIS workspace — an unknown UUID, a real account
310
+ * that is not a member, a member of a different workspace, or the
311
+ * caller's own id — all get one byte-identical 404. And the capability
312
+ * check runs before any target lookup, so a caller without the mandate
313
+ * learns nothing at all about anybody. ``tests/
314
+ * test_api_member_password_reset.py`` compares those responses byte for
315
+ * byte.
316
+ *
317
+ * **Whether it is logged with the actor.** Twice, on purpose:
318
+ * ``workspace.member_password_reset`` through the transactional outbox
319
+ * (the org's activity log) and auth's own ``AuthAuditLog`` row carrying
320
+ * ``actor_id`` and ``via=admin_reset`` (the deployment's security
321
+ * journal). Neither carries credential material.
322
+ *
323
+ * Own password: use auth's ``POST /password/change/``. This endpoint is
324
+ * for acting on somebody else, and answers about yourself with the same
325
+ * 404 as about a stranger.
326
+ *
327
+ * **Permissions:** `IsAuthenticated`
328
+ */
329
+ post: operations["workspaces_api_v1_members_password_reset_create"];
330
+ delete?: never;
331
+ options?: never;
332
+ head?: never;
333
+ patch?: never;
334
+ trace?: never;
335
+ };
157
336
  "/workspaces/api/v1/{workspace_id}/members/invite": {
158
337
  parameters: {
159
338
  query?: never;
@@ -224,6 +403,27 @@ export interface paths {
224
403
  patch?: never;
225
404
  trace?: never;
226
405
  };
406
+ "/workspaces/api/v1/instance": {
407
+ parameters: {
408
+ query?: never;
409
+ header?: never;
410
+ path?: never;
411
+ cookie?: never;
412
+ };
413
+ /**
414
+ * @description Instance shape: how a street signup lands (personal | none) and whether self-serve registration is open. Public, unauthenticated — the screen a kicked/left member sees depends on it.
415
+ *
416
+ * **Permissions:** `AllowAny`
417
+ */
418
+ get: operations["workspaces_api_v1_instance_retrieve"];
419
+ put?: never;
420
+ post?: never;
421
+ delete?: never;
422
+ options?: never;
423
+ head?: never;
424
+ patch?: never;
425
+ trace?: never;
426
+ };
227
427
  "/workspaces/api/v1/internal/{workspace_id}/members/{user_id}": {
228
428
  parameters: {
229
429
  query?: never;
@@ -406,6 +606,38 @@ export interface paths {
406
606
  export type webhooks = Record<string, never>;
407
607
  export interface components {
408
608
  schemas: {
609
+ /**
610
+ * @description Как развёрнут ЭТОТ инстанс — то, что клиенту нужно знать ДО того, как
611
+ * он решит, что показать человеку без пространства.
612
+ *
613
+ * Ось ``landing`` (``STREET_LANDING_MODE``) существовала с 03.08.2026, но
614
+ * жила только в окружении бэкенда: наружу не отдавалась ничем, и отличить
615
+ * закрытый контур от публичного облака на клиенте было НЕЧЕМ.
616
+ *
617
+ * Почему это не косметика. Экран, который видит человек, выброшенный из
618
+ * Спейса (или вышедший сам), в этих двух мирах разный по существу:
619
+ *
620
+ * * ``none`` — закрытый контур: своего пространства у человека нет и
621
+ * взяться неоткуда. Честный экран говорит «вы не участник, попросите
622
+ * приглашение» и никуда не зовёт;
623
+ * * ``personal`` — публичное облако: у него есть собственное
624
+ * пространство, и туда можно вести.
625
+ *
626
+ * Показать «создайте встречу» тому, кому инстанс её создать не даст, —
627
+ * это тупик, нарисованный кнопкой.
628
+ */
629
+ InstanceShapeResponse: {
630
+ /**
631
+ * @description С чем приземляется человек «с улицы»
632
+ * @example personal
633
+ */
634
+ landing: string;
635
+ /**
636
+ * @description Можно ли завести учётку самому
637
+ * @example True
638
+ */
639
+ registration_open: boolean;
640
+ };
409
641
  /** @description Get-or-create result for a user's personal workspace (service-to-service). */
410
642
  InternalPersonalWorkspaceResponse: {
411
643
  /**
@@ -454,21 +686,78 @@ export interface components {
454
686
  */
455
687
  expires_at: string;
456
688
  };
457
- /** @description InvitationResponse(id: uuid.UUID, workspace_id: uuid.UUID, email: str, role: str, expires_at: str, accepted_at: Optional[str], revoked_at: Optional[str], created_at: str) */
689
+ /**
690
+ * @description One invitation row — the admin's "who has not accepted yet" table (#109).
691
+ *
692
+ * ``status`` is the derived label (``WorkspaceInvitation.status``), not a
693
+ * stored column: it is what the table renders and what the frontend
694
+ * routes the revoke/resend affordances on. The raw timestamps travel
695
+ * alongside it because "expires in 2 days" and "declined last Tuesday"
696
+ * are different rows on the same screen; the label alone cannot say
697
+ * when.
698
+ *
699
+ * The invite token is deliberately absent — it is a bearer secret that
700
+ * only ever leaves this service inside the invitation email.
701
+ */
458
702
  InvitationResponse: {
459
- /** Format: uuid */
703
+ /**
704
+ * Format: uuid
705
+ * @description Invitation UUID
706
+ * @example 0192f...
707
+ */
460
708
  id: string;
461
- /** Format: uuid */
709
+ /**
710
+ * Format: uuid
711
+ * @description Workspace UUID
712
+ */
462
713
  workspace_id: string;
714
+ /**
715
+ * @description Invited email address (normalized lowercase)
716
+ * @example alice@example.com
717
+ */
463
718
  email: string;
719
+ /**
720
+ * @description Role granted on acceptance
721
+ * @example member
722
+ */
464
723
  role: string;
724
+ /**
725
+ * @description Derived state. One of pending / accepted / declined / revoked / expired
726
+ * @example pending
727
+ */
728
+ status: string;
729
+ /**
730
+ * @description ISO 8601 expiry time
731
+ * @example 2026-07-31T10:00:00Z
732
+ */
465
733
  expires_at: string;
734
+ /** @description ISO 8601 acceptance time; null unless accepted */
466
735
  accepted_at: string | null;
736
+ /** @description ISO 8601 decline time (the invitee said no); null unless declined */
737
+ declined_at: string | null;
738
+ /** @description ISO 8601 revocation time (the workspace withdrew it); null unless revoked */
467
739
  revoked_at: string | null;
740
+ /** @description ISO 8601 creation time */
468
741
  created_at: string;
742
+ /**
743
+ * Format: uuid
744
+ * @description UUID of the admin who sent it; null when that account is gone
745
+ * @example 0192a...
746
+ */
747
+ invited_by_id?: string | null;
748
+ /**
749
+ * @description Name hint typed for this invitee at invite time, if any; null otherwise
750
+ * @example Ada Lovelace
751
+ */
752
+ display_name?: string | null;
469
753
  };
470
754
  /** @description Invite payload. */
471
755
  MemberInviteRequest: {
756
+ /**
757
+ * @description Name hint for the invitee (this invite's "Имя" field), applied to every email in this request. Optional — an invite without one behaves exactly as before. NOT written into stapel-profiles directly (that store is the invitee's own): held on the invitation, copied onto the member at accept time, and shown only until stapel-profiles has a real name for the person
758
+ * @example Ada Lovelace
759
+ */
760
+ display_name?: string | null;
472
761
  /**
473
762
  * @description One or more emails to invite
474
763
  * @example [
@@ -486,6 +775,50 @@ export interface components {
486
775
  MemberInviteResponse: {
487
776
  invitations?: components["schemas"]["InvitationResponse"][];
488
777
  };
778
+ /** @description Reset a member's password on the organization's order (#110). */
779
+ MemberPasswordResetRequest: {
780
+ /** @description New password chosen by the admin. Omitted: the server generates a crypto-strong one, returned once as generated_password */
781
+ password?: string | null;
782
+ /**
783
+ * @description First-login steps to demand of the member afterwards — any subset of password_change / mfa_enroll. Omitted: the workspace's own security policies, falling back to password_change. A password somebody else chose has to stop working at its first use, so an EMPTY list is a deliberate, auditable choice, not a shortcut
784
+ * @example [
785
+ * "password_change"
786
+ * ]
787
+ */
788
+ first_login_policies?: string[] | null;
789
+ /**
790
+ * @description Free-text note recorded on auth's audit row (e.g. the ticket the request came in on)
791
+ * @example SUP-42
792
+ */
793
+ reason?: string | null;
794
+ };
795
+ /** @description Result of an administrative password reset (#110). */
796
+ MemberPasswordResetResponse: {
797
+ /**
798
+ * Format: uuid
799
+ * @description UUID of the member whose password was reset
800
+ */
801
+ user_id: string;
802
+ /**
803
+ * @description How many live sessions the reset ended. A reset that left them standing would not recover the account
804
+ * @example 2
805
+ */
806
+ sessions_revoked?: number;
807
+ /** @description Server-generated password — returned exactly ONCE, only when the request omitted password. Hand it to the member out of band; it cannot be re-fetched. A credential: never log it */
808
+ generated_password?: string | null;
809
+ /**
810
+ * @description The steps now demanded of the member before their next session
811
+ * @example [
812
+ * "password_change"
813
+ * ]
814
+ */
815
+ first_login_policies_applied?: string[];
816
+ /**
817
+ * @description Whether the member was told their password was reset. False means the account has no contact channel — the admin is the only one who can tell them
818
+ * @example true
819
+ */
820
+ notified?: boolean;
821
+ };
489
822
  /** @description Workspace member. */
490
823
  MemberResponse: {
491
824
  /**
@@ -523,6 +856,24 @@ export interface components {
523
856
  suspended_at?: string | null;
524
857
  /** @description Why the membership is suspended (canonical value no_mfa); null while active */
525
858
  suspension_reason?: string | null;
859
+ /**
860
+ * @description Best-effort display name — a live lookup in stapel-profiles when it is installed and has one, else the name typed at invite/provision time (never both, never invented when neither exists). Null when nobody has one yet
861
+ * @example Ada Lovelace
862
+ */
863
+ display_name?: string | null;
864
+ };
865
+ PaginatedInvitationResponseList: {
866
+ items: components["schemas"]["InvitationResponse"][];
867
+ /** @description Anchor value for next page */
868
+ next_anchor?: string | null;
869
+ /** @description Anchor value for previous page */
870
+ prev_anchor?: string | null;
871
+ /** @description Whether there are more items after this page */
872
+ has_next: boolean;
873
+ /** @description Whether there are items before this page */
874
+ has_prev: boolean;
875
+ /** @description Number of items in current page */
876
+ count: number;
526
877
  };
527
878
  PaginatedMemberResponseList: {
528
879
  items: components["schemas"]["MemberResponse"][];
@@ -591,9 +942,19 @@ export interface components {
591
942
  /** @description Server-generated initial password — returned exactly ONCE, only when the request omitted password. Store it or hand it to the user now; it cannot be re-fetched. A credential: never log it */
592
943
  generated_password?: string | null;
593
944
  };
594
- /** @description RoleListResponse(roles: List[stapel_workspaces.dto.RoleResponse] = <factory>) */
945
+ /** @description The effective role registry (builtin four + STAPEL_WORKSPACES overlay). */
595
946
  RoleListResponse: {
947
+ /** @description One entry per effective role, descending rank */
596
948
  roles?: components["schemas"]["RoleResponse"][];
949
+ /**
950
+ * @description Step-up level per namespaced capability string, builtin ``members.provision`` / ``members.password.reset`` / ``workspace.security.manage`` plus the deployment's ``STAPEL_WORKSPACES["CAPABILITY_LEVELS"]`` overlay. A capability absent from this map is ``"standard"`` — the client-side default. Lets a frontend stop hardcoding its own copy of this registry
951
+ * @example {
952
+ * "members.provision": "high"
953
+ * }
954
+ */
955
+ capability_levels?: {
956
+ [key: string]: string;
957
+ };
597
958
  };
598
959
  /** @description One role of the effective registry (builtin + STAPEL_WORKSPACES overlay). */
599
960
  RoleResponse: {
@@ -660,9 +1021,17 @@ export interface components {
660
1021
  */
661
1022
  type?: string;
662
1023
  };
663
- /** @description WorkspaceListResponse(workspaces: List[stapel_workspaces.dto.WorkspaceResponse] = <factory>) */
1024
+ /** @description The caller's own workspace list. */
664
1025
  WorkspaceListResponse: {
1026
+ /** @description The caller's active memberships (empty for a guest — see is_guest) */
665
1027
  workspaces?: components["schemas"]["WorkspaceResponse"][];
1028
+ /** @description True when the caller holds NO active mandate anywhere (permissions.is_guest) — the wire form of the mandate-model vardict's guest predicate (2026-08-03), so a frontend can render the "incomplete dashboard" without re-deriving it from workspaces == [] */
1029
+ is_guest?: boolean;
1030
+ /**
1031
+ * @description Which workspace a client should open when the person has expressed no choice — the instance's STAPEL_WORKSPACES["DEFAULT_WORKSPACE_ID"], echoed back ONLY when the caller actually holds an active membership in it, else "". Exists because clients that had to guess guessed badly: meettoday took `workspaces[0]` off a list ordered by last access, so a person in two spaces landed wherever they happened to have been last (measured 2026-08-06 as "the owner cannot see his own invitations" — they were in the OTHER space). A default, not a cage: an explicit choice still wins
1032
+ * @example a8bba7ae-5d2e-43e5-9911-0553e7df50b3
1033
+ */
1034
+ default_workspace_id?: string;
666
1035
  };
667
1036
  /** @description Workspace details. */
668
1037
  WorkspaceResponse: {
@@ -848,6 +1217,82 @@ export interface operations {
848
1217
  };
849
1218
  };
850
1219
  };
1220
+ workspaces_api_v1_invitations_list: {
1221
+ parameters: {
1222
+ query?: {
1223
+ /** @description Anchor value to paginate from (exclusive) */
1224
+ anchor?: string;
1225
+ /** @description Pagination direction */
1226
+ direction?: "next" | "prev" | "center";
1227
+ /** @description Number of items (default 100, max 500) */
1228
+ limit?: number;
1229
+ /** @description Case-insensitive substring filter on the invited email address. */
1230
+ search?: string;
1231
+ /** @description Which invitations to return. `pending` (default) — live, actionable, seat-reserving ones, i.e. who has not accepted yet. `never_accepted` — those plus the declined, revoked and expired ones. `all` — the full history, accepted rows included. */
1232
+ status?: "all" | "never_accepted" | "pending";
1233
+ };
1234
+ header?: never;
1235
+ path: {
1236
+ workspace_id: string;
1237
+ };
1238
+ cookie?: never;
1239
+ };
1240
+ requestBody?: never;
1241
+ responses: {
1242
+ 200: {
1243
+ headers: {
1244
+ [name: string]: unknown;
1245
+ };
1246
+ content: {
1247
+ "application/json": components["schemas"]["PaginatedInvitationResponseList"];
1248
+ };
1249
+ };
1250
+ };
1251
+ };
1252
+ workspaces_api_v1_invitations_resend_create: {
1253
+ parameters: {
1254
+ query?: never;
1255
+ header?: never;
1256
+ path: {
1257
+ invitation_id: string;
1258
+ workspace_id: string;
1259
+ };
1260
+ cookie?: never;
1261
+ };
1262
+ requestBody?: never;
1263
+ responses: {
1264
+ 200: {
1265
+ headers: {
1266
+ [name: string]: unknown;
1267
+ };
1268
+ content: {
1269
+ "application/json": components["schemas"]["InvitationResponse"];
1270
+ };
1271
+ };
1272
+ };
1273
+ };
1274
+ workspaces_api_v1_invitations_revoke_create: {
1275
+ parameters: {
1276
+ query?: never;
1277
+ header?: never;
1278
+ path: {
1279
+ invitation_id: string;
1280
+ workspace_id: string;
1281
+ };
1282
+ cookie?: never;
1283
+ };
1284
+ requestBody?: never;
1285
+ responses: {
1286
+ 200: {
1287
+ headers: {
1288
+ [name: string]: unknown;
1289
+ };
1290
+ content: {
1291
+ "application/json": components["schemas"]["InvitationResponse"];
1292
+ };
1293
+ };
1294
+ };
1295
+ };
851
1296
  workspaces_api_v1_members_list: {
852
1297
  parameters: {
853
1298
  query?: {
@@ -927,6 +1372,34 @@ export interface operations {
927
1372
  };
928
1373
  };
929
1374
  };
1375
+ workspaces_api_v1_members_password_reset_create: {
1376
+ parameters: {
1377
+ query?: never;
1378
+ header?: never;
1379
+ path: {
1380
+ user_id: string;
1381
+ workspace_id: string;
1382
+ };
1383
+ cookie?: never;
1384
+ };
1385
+ requestBody?: {
1386
+ content: {
1387
+ "application/json": components["schemas"]["MemberPasswordResetRequest"];
1388
+ "application/x-www-form-urlencoded": components["schemas"]["MemberPasswordResetRequest"];
1389
+ "multipart/form-data": components["schemas"]["MemberPasswordResetRequest"];
1390
+ };
1391
+ };
1392
+ responses: {
1393
+ 200: {
1394
+ headers: {
1395
+ [name: string]: unknown;
1396
+ };
1397
+ content: {
1398
+ "application/json": components["schemas"]["MemberPasswordResetResponse"];
1399
+ };
1400
+ };
1401
+ };
1402
+ };
930
1403
  workspaces_api_v1_members_invite_create: {
931
1404
  parameters: {
932
1405
  query?: never;
@@ -981,6 +1454,25 @@ export interface operations {
981
1454
  };
982
1455
  };
983
1456
  };
1457
+ workspaces_api_v1_instance_retrieve: {
1458
+ parameters: {
1459
+ query?: never;
1460
+ header?: never;
1461
+ path?: never;
1462
+ cookie?: never;
1463
+ };
1464
+ requestBody?: never;
1465
+ responses: {
1466
+ 200: {
1467
+ headers: {
1468
+ [name: string]: unknown;
1469
+ };
1470
+ content: {
1471
+ "application/json": components["schemas"]["InstanceShapeResponse"];
1472
+ };
1473
+ };
1474
+ };
1475
+ };
984
1476
  workspaces_api_v1_internal_members_retrieve: {
985
1477
  parameters: {
986
1478
  query?: never;