@productcraft/platform-auth 0.0.8 → 0.0.10

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
@@ -74,6 +74,40 @@ interface paths {
74
74
  patch?: never;
75
75
  trace?: never;
76
76
  };
77
+ "/v1/auth/oauth/{provider}/callback": {
78
+ parameters: {
79
+ query?: never;
80
+ header?: never;
81
+ path?: never;
82
+ cookie?: never;
83
+ };
84
+ get?: never;
85
+ put?: never;
86
+ /** Complete a federated sign-in. auth-ui proxies the provider redirect (query params for Google/GitHub, form_post body for Apple) into this endpoint and uses the returned `tokens` to set the auth_token cookie. */
87
+ post: operations["OAuthController_callback"];
88
+ delete?: never;
89
+ options?: never;
90
+ head?: never;
91
+ patch?: never;
92
+ trace?: never;
93
+ };
94
+ "/v1/auth/oauth/{provider}/start": {
95
+ parameters: {
96
+ query?: never;
97
+ header?: never;
98
+ path?: never;
99
+ cookie?: never;
100
+ };
101
+ /** Begin a federated sign-in flow; 302s to the provider authorize URL. */
102
+ get: operations["OAuthController_start"];
103
+ put?: never;
104
+ post?: never;
105
+ delete?: never;
106
+ options?: never;
107
+ head?: never;
108
+ patch?: never;
109
+ trace?: never;
110
+ };
77
111
  "/v1/auth/password/request-reset": {
78
112
  parameters: {
79
113
  query?: never;
@@ -210,6 +244,58 @@ interface paths {
210
244
  patch?: never;
211
245
  trace?: never;
212
246
  };
247
+ "/v1/me": {
248
+ parameters: {
249
+ query?: never;
250
+ header?: never;
251
+ path?: never;
252
+ cookie?: never;
253
+ };
254
+ /** Read the caller's account profile. */
255
+ get: operations["MeController_getMe"];
256
+ put?: never;
257
+ post?: never;
258
+ delete?: never;
259
+ options?: never;
260
+ head?: never;
261
+ patch?: never;
262
+ trace?: never;
263
+ };
264
+ "/v1/me/avatar": {
265
+ parameters: {
266
+ query?: never;
267
+ header?: never;
268
+ path?: never;
269
+ cookie?: never;
270
+ };
271
+ get?: never;
272
+ put?: never;
273
+ /** Upload (or replace) the caller's avatar. PNG/JPEG/WEBP only — SVG is rejected because user-uploaded SVG from a productcraft.co origin is a stored-XSS vector. ≤2 MB. Magic bytes are sniffed; a mislabeled file is rejected. */
274
+ post: operations["MeController_setAvatar"];
275
+ /** Clear the caller's avatar and delete the stored object. */
276
+ delete: operations["MeController_removeAvatar"];
277
+ options?: never;
278
+ head?: never;
279
+ patch?: never;
280
+ trace?: never;
281
+ };
282
+ "/v1/me/profile": {
283
+ parameters: {
284
+ query?: never;
285
+ header?: never;
286
+ path?: never;
287
+ cookie?: never;
288
+ };
289
+ get?: never;
290
+ put?: never;
291
+ post?: never;
292
+ delete?: never;
293
+ options?: never;
294
+ head?: never;
295
+ /** Update the caller's profile. Currently only `displayName` is editable. An empty body is a no-op that returns the current profile. Cookie/JWT only — this is a human-self-service surface, not a PAK-mutation surface. */
296
+ patch: operations["MeController_updateProfile"];
297
+ trace?: never;
298
+ };
213
299
  "/v1/session": {
214
300
  parameters: {
215
301
  query?: never;
@@ -271,7 +357,7 @@ interface paths {
271
357
  /** List workspaces the current user belongs to */
272
358
  get: operations["WorkspaceController_listWorkspaces"];
273
359
  put?: never;
274
- /** Create a new workspace */
360
+ /** Create a new workspace. Cookie/JWT only — PAKs are workspace-scoped credentials and cannot create new workspaces. */
275
361
  post: operations["WorkspaceController_createWorkspace"];
276
362
  delete?: never;
277
363
  options?: never;
@@ -288,7 +374,7 @@ interface paths {
288
374
  };
289
375
  get?: never;
290
376
  put?: never;
291
- /** Accept a workspace invite by code */
377
+ /** Accept a workspace invite by code. Cookie/JWT only — invite acceptance binds a human identity to a workspace. */
292
378
  post: operations["WorkspaceController_acceptInvite"];
293
379
  delete?: never;
294
380
  options?: never;
@@ -307,11 +393,11 @@ interface paths {
307
393
  get: operations["WorkspaceController_getWorkspace"];
308
394
  put?: never;
309
395
  post?: never;
310
- /** Delete a workspace (requires workspace.delete) */
396
+ /** Delete a workspace (requires workspace.delete). Cookie/JWT only — irreversible workspace destruction needs a human-attributed audit row. */
311
397
  delete: operations["WorkspaceController_deleteWorkspace"];
312
398
  options?: never;
313
399
  head?: never;
314
- /** Update workspace display name, slug, or settings. Slug renames broadcast a `workspace.renamed` event so denormalised consumers (rally-api) sync. */
400
+ /** Update workspace display name, slug, or settings. Slug renames broadcast a `workspace.renamed` event so denormalised consumers (waitlist-api) sync. */
315
401
  patch: operations["WorkspaceController_updateWorkspace"];
316
402
  trace?: never;
317
403
  };
@@ -325,7 +411,7 @@ interface paths {
325
411
  /** List PAKs in this workspace. Plaintext tokens are NOT returned — only prefixes + metadata. */
326
412
  get: operations["PlatformApiKeyController_list"];
327
413
  put?: never;
328
- /** Mint a new PAK. The plaintext `token` is returned ONCE — store it now. The minter can grant at most their own effective permissions. */
414
+ /** Mint a new PAK. The plaintext `token` is returned ONCE — store it now. The minter can grant at most their own effective permissions. Cookie/JWT only — PAKs cannot mint other PAKs. */
329
415
  post: operations["PlatformApiKeyController_create"];
330
416
  delete?: never;
331
417
  options?: never;
@@ -378,7 +464,7 @@ interface paths {
378
464
  };
379
465
  /**
380
466
  * Unified workspace audit feed (cursor-paginated)
381
- * @description Merged audit timeline across the workspace surfaces. v1 covers `workspace_audit` (this service); per-app Heimdall and per-community Agora rows arrive in a follow-up. Response shape is stable from v1 — clients can build against it today.
467
+ * @description Merged audit timeline across the workspace surfaces. v1 covers `workspace_audit` (this service); per-app Auth and per-community Social rows arrive in a follow-up. Response shape is stable from v1 — clients can build against it today.
382
468
  */
383
469
  get: operations["WorkspaceAuditFeedController_listFeed"];
384
470
  put?: never;
@@ -406,6 +492,24 @@ interface paths {
406
492
  patch?: never;
407
493
  trace?: never;
408
494
  };
495
+ "/v1/workspaces/{workspace_slug}/avatar": {
496
+ parameters: {
497
+ query?: never;
498
+ header?: never;
499
+ path?: never;
500
+ cookie?: never;
501
+ };
502
+ get?: never;
503
+ put?: never;
504
+ /** Upload (or replace) the workspace identity avatar. Gated by `workspace.settings.update` (owner + admin). PNG/JPEG/WEBP only, ≤2 MB, magic-byte sniffed. SVG is rejected (stored-XSS). */
505
+ post: operations["WorkspaceController_setAvatar"];
506
+ /** Clear the workspace avatar and delete the stored object. Gated by `workspace.settings.update`. */
507
+ delete: operations["WorkspaceController_removeAvatar"];
508
+ options?: never;
509
+ head?: never;
510
+ patch?: never;
511
+ trace?: never;
512
+ };
409
513
  "/v1/workspaces/{workspace_slug}/invites": {
410
514
  parameters: {
411
515
  query?: never;
@@ -416,7 +520,7 @@ interface paths {
416
520
  /** List workspace invites */
417
521
  get: operations["WorkspaceController_listInvites"];
418
522
  put?: never;
419
- /** Create a workspace invite link */
523
+ /** Create a workspace invite link. Cookie/JWT only — invites bring new humans into the workspace. */
420
524
  post: operations["WorkspaceController_createInvite"];
421
525
  delete?: never;
422
526
  options?: never;
@@ -434,7 +538,7 @@ interface paths {
434
538
  get?: never;
435
539
  put?: never;
436
540
  post?: never;
437
- /** Revoke a workspace invite */
541
+ /** Revoke a workspace invite. Cookie/JWT only. */
438
542
  delete: operations["WorkspaceController_revokeInvite"];
439
543
  options?: never;
440
544
  head?: never;
@@ -502,7 +606,7 @@ interface paths {
502
606
  /** List every managed policy in a workspace */
503
607
  get: operations["WorkspacePolicyController_list"];
504
608
  put?: never;
505
- /** Create a managed policy */
609
+ /** Create a managed policy. Cookie/JWT only — policy authoring is a human-admin surface. */
506
610
  post: operations["WorkspacePolicyController_create"];
507
611
  delete?: never;
508
612
  options?: never;
@@ -538,11 +642,11 @@ interface paths {
538
642
  get: operations["WorkspacePolicyController_get"];
539
643
  put?: never;
540
644
  post?: never;
541
- /** Delete a managed policy. Cascades: API keys lose the binding (deny-all if no other bindings remain); roles fall back to their inline policy column. */
645
+ /** Delete a managed policy. Cascades: API keys lose the binding (deny-all if no other bindings remain); roles fall back to their inline policy column. Cookie/JWT only. */
542
646
  delete: operations["WorkspacePolicyController_delete"];
543
647
  options?: never;
544
648
  head?: never;
545
- /** Update a managed policy */
649
+ /** Update a managed policy. Cookie/JWT only — policy authoring is a human-admin surface. */
546
650
  patch: operations["WorkspacePolicyController_update"];
547
651
  trace?: never;
548
652
  };
@@ -556,7 +660,7 @@ interface paths {
556
660
  /** List all roles in a workspace */
557
661
  get: operations["WorkspaceRoleController_list"];
558
662
  put?: never;
559
- /** Create a new custom role */
663
+ /** Create a new custom role. Cookie/JWT only — role authoring is a human-admin surface. */
560
664
  post: operations["WorkspaceRoleController_create"];
561
665
  delete?: never;
562
666
  options?: never;
@@ -575,11 +679,11 @@ interface paths {
575
679
  get: operations["WorkspaceRoleController_get"];
576
680
  put?: never;
577
681
  post?: never;
578
- /** Delete a custom role (fails if it has members) */
682
+ /** Delete a custom role (fails if it has members). Cookie/JWT only — role authoring is a human-admin surface. */
579
683
  delete: operations["WorkspaceRoleController_delete"];
580
684
  options?: never;
581
685
  head?: never;
582
- /** Update a role or replace its permission set */
686
+ /** Update a role or replace its permission set. Cookie/JWT only — role authoring is a human-admin surface. */
583
687
  patch: operations["WorkspaceRoleController_update"];
584
688
  trace?: never;
585
689
  };
@@ -651,19 +755,32 @@ interface components {
651
755
  /** @description Per-source diagnostics so the UI / customer can see which sources contributed to this page and which are stubbed pending the cross-service fanout. */
652
756
  sources: components["schemas"]["SourceDiagnosticDto"][];
653
757
  };
758
+ AvatarUrlResponseDto: {
759
+ avatar_url: string;
760
+ };
654
761
  BoundPolicySummaryDto: {
655
762
  description: string | null;
656
763
  /** Format: uuid */
657
764
  id: string;
658
- /** @example envoi-readonly */
765
+ /** @example mail-readonly */
659
766
  name: string;
660
767
  };
768
+ CallbackBodyDto: {
769
+ /** @description OAuth authorization code returned by the IdP. Optional — either `idToken` or `code` must be supplied. */
770
+ code?: string;
771
+ /** @description JWT id_token from the IdP (OIDC providers; Apple form_post). Optional — either `idToken` or `code` must be supplied. */
772
+ id_token?: string;
773
+ /** @description Opaque state token returned by the IdP, minted at `/start`. Single-use; binds the callback to a specific browser session. */
774
+ state: string;
775
+ /** @description Apple-only first-signin payload: JSON-encoded `{ name, email }`. Apple returns this only the first time a user signs in. Not signed — treated as untrusted input by the controller's payload parser. */
776
+ user?: string;
777
+ };
661
778
  CreatePakDto: {
662
779
  /** @description Optional description (e.g. which service uses the key). */
663
780
  description?: string;
664
781
  /**
665
782
  * @description Human-readable PAK name (shown in the keys list).
666
- * @example Production agora client
783
+ * @example Production social client
667
784
  */
668
785
  name: string;
669
786
  /**
@@ -713,12 +830,12 @@ interface components {
713
830
  CreateWorkspacePolicyDto: {
714
831
  /**
715
832
  * @description Optional human description. Pass `null` to clear an existing description on PATCH.
716
- * @example Read-only access to all Envoi resources
833
+ * @example Read-only access to all Mail resources
717
834
  */
718
835
  description?: string | null;
719
836
  /**
720
837
  * @description Policy name (1-64 chars, alphanumeric + space/underscore/hyphen). Unique per workspace.
721
- * @example envoi-readonly
838
+ * @example mail-readonly
722
839
  */
723
840
  name: string;
724
841
  /**
@@ -726,8 +843,8 @@ interface components {
726
843
  * @example [
727
844
  * {
728
845
  * "actions": [
729
- * "envoi.read",
730
- * "envoi.list"
846
+ * "mail.read",
847
+ * "mail.list"
731
848
  * ],
732
849
  * "effect": "allow",
733
850
  * "resources": [
@@ -751,7 +868,7 @@ interface components {
751
868
  * @example [
752
869
  * {
753
870
  * "actions": [
754
- * "envoi.*.read"
871
+ * "mail.*.read"
755
872
  * ],
756
873
  * "effect": "allow",
757
874
  * "resources": [
@@ -809,6 +926,8 @@ interface components {
809
926
  message: string;
810
927
  };
811
928
  IntrospectAccountDto: {
929
+ /** @description Public HTTPS URL of the uploaded avatar, or null when no avatar is set. */
930
+ avatar_url: string | null;
812
931
  display_name: string | null;
813
932
  email: string | null;
814
933
  /**
@@ -853,6 +972,8 @@ interface components {
853
972
  name: string;
854
973
  };
855
974
  IntrospectWorkspaceListItemDto: {
975
+ /** @description Workspace identity avatar (public HTTPS URL), or null when none is set. Console workspace switcher reads this. */
976
+ avatar_url: string | null;
856
977
  display_name: string;
857
978
  /** Format: uuid */
858
979
  id: string;
@@ -864,8 +985,8 @@ interface components {
864
985
  /**
865
986
  * @description Enabled services on this workspace.
866
987
  * @example [
867
- * "envoi",
868
- * "rally"
988
+ * "mail",
989
+ * "waitlist"
869
990
  * ]
870
991
  */
871
992
  services: string[];
@@ -884,8 +1005,8 @@ interface components {
884
1005
  /**
885
1006
  * @description Enabled services on this workspace.
886
1007
  * @example [
887
- * "envoi",
888
- * "rally"
1008
+ * "mail",
1009
+ * "waitlist"
889
1010
  * ]
890
1011
  */
891
1012
  services: string[];
@@ -961,7 +1082,7 @@ interface components {
961
1082
  description: string | null;
962
1083
  /** Format: uuid */
963
1084
  id: string;
964
- /** @example envoi-readonly */
1085
+ /** @example mail-readonly */
965
1086
  name: string;
966
1087
  /** @description IAM-style policy statements bound to this managed policy. */
967
1088
  policy: components["schemas"]["PolicyStatementDto"][];
@@ -981,7 +1102,7 @@ interface components {
981
1102
  description: string | null;
982
1103
  /** Format: uuid */
983
1104
  id: string;
984
- /** @example envoi-readonly */
1105
+ /** @example mail-readonly */
985
1106
  name: string;
986
1107
  /** @description IAM-style policy statements bound to this managed policy. */
987
1108
  policy: components["schemas"]["PolicyStatementDto"][];
@@ -990,6 +1111,22 @@ interface components {
990
1111
  /** Format: uuid */
991
1112
  workspace_id: string;
992
1113
  };
1114
+ MeProfileDto: {
1115
+ /** @description Short-lived (15 min) presigned GET URL for the avatar object in private object storage. NULL when no avatar has been set; the frontend then renders initials. The API mints a fresh URL on every response, so a stable bookmark of this value is not meaningful. */
1116
+ avatar_url: string | null;
1117
+ display_name: string | null;
1118
+ email: string | null;
1119
+ /**
1120
+ * Format: date-time
1121
+ * @description Timestamp when this account verified its primary email, or null if unverified.
1122
+ */
1123
+ email_verified_at: string | null;
1124
+ /** Format: uuid */
1125
+ id: string;
1126
+ /** @description Account status (e.g. `active`, `suspended`). */
1127
+ status: string;
1128
+ username: string;
1129
+ };
993
1130
  MintPakResponseDto: {
994
1131
  record: components["schemas"]["PublicApiKeyDto"];
995
1132
  /**
@@ -998,6 +1135,12 @@ interface components {
998
1135
  */
999
1136
  token: string;
1000
1137
  };
1138
+ OAuthCallbackResultDto: {
1139
+ /** @description Original `return_to` the user was sent off with. auth-ui redirects here after writing the cookie. */
1140
+ return_to: string;
1141
+ /** @description Issued PlatformUser session tokens. auth-ui sets the auth_token cookie from `accessToken` and 302s the browser to `return_to`. */
1142
+ tokens: components["schemas"]["TokenResponseDto"];
1143
+ };
1001
1144
  PaginationDto: {
1002
1145
  /** @example false */
1003
1146
  has_more: boolean;
@@ -1012,10 +1155,10 @@ interface components {
1012
1155
  };
1013
1156
  PolicyStatementDto: {
1014
1157
  /**
1015
- * @description Action strings the statement applies to. Wildcards (e.g. `agora.*`, `*.read`, `*`) supported per `actionMatches` semantics.
1158
+ * @description Action strings the statement applies to. Wildcards (e.g. `social.*`, `*.read`, `*`) supported per `actionMatches` semantics.
1016
1159
  * @example [
1017
- * "agora.read",
1018
- * "agora.list"
1160
+ * "social.read",
1161
+ * "social.list"
1019
1162
  * ]
1020
1163
  */
1021
1164
  actions: string[];
@@ -1231,12 +1374,16 @@ interface components {
1231
1374
  description?: string | null;
1232
1375
  name?: string;
1233
1376
  };
1377
+ UpdateProfileDto: {
1378
+ /** @description New display name. 1-128 chars. Optional — empty PATCH is a no-op. */
1379
+ display_name?: string;
1380
+ };
1234
1381
  UpdateWorkspaceDto: {
1235
1382
  display_name?: string;
1236
1383
  /** @description Free-form workspace settings blob. */
1237
1384
  settings?: Record<string, never>;
1238
1385
  /**
1239
- * @description New URL-friendly slug. Same constraints as the create form. Renames are broadcast on the workspace events queue so denormalised consumers (rally-api, future product surfaces) can sync. Old URLs continue to resolve for one rename cycle.
1386
+ * @description New URL-friendly slug. Same constraints as the create form. Renames are broadcast on the workspace events queue so denormalised consumers (waitlist-api, future product surfaces) can sync. Old URLs continue to resolve for one rename cycle.
1240
1387
  * @example acme
1241
1388
  */
1242
1389
  slug?: string;
@@ -1244,12 +1391,12 @@ interface components {
1244
1391
  UpdateWorkspacePolicyDto: {
1245
1392
  /**
1246
1393
  * @description Optional human description. Pass `null` to clear an existing description on PATCH.
1247
- * @example Read-only access to all Envoi resources
1394
+ * @example Read-only access to all Mail resources
1248
1395
  */
1249
1396
  description?: string | null;
1250
1397
  /**
1251
1398
  * @description Policy name (1-64 chars, alphanumeric + space/underscore/hyphen). Unique per workspace.
1252
- * @example envoi-readonly
1399
+ * @example mail-readonly
1253
1400
  */
1254
1401
  name?: string;
1255
1402
  /**
@@ -1257,8 +1404,8 @@ interface components {
1257
1404
  * @example [
1258
1405
  * {
1259
1406
  * "actions": [
1260
- * "envoi.read",
1261
- * "envoi.list"
1407
+ * "mail.read",
1408
+ * "mail.list"
1262
1409
  * ],
1263
1410
  * "effect": "allow",
1264
1411
  * "resources": [
@@ -1320,6 +1467,9 @@ interface components {
1320
1467
  /** Format: uuid */
1321
1468
  workspace_id: string;
1322
1469
  };
1470
+ WorkspaceAvatarUrlResponseDto: {
1471
+ avatar_url: string;
1472
+ };
1323
1473
  WorkspaceInviteListItemDto: {
1324
1474
  /** @description Single-use invite code embedded in the invite URL. */
1325
1475
  code: string;
@@ -1459,8 +1609,8 @@ interface components {
1459
1609
  /** Format: uuid */
1460
1610
  enabled_by: string | null;
1461
1611
  /**
1462
- * @description Service identifier (e.g. `envoi`, `rally`, `agora`, `heimdall`).
1463
- * @example envoi
1612
+ * @description Service identifier (e.g. `mail`, `waitlist`, `social`, `auth`).
1613
+ * @example mail
1464
1614
  */
1465
1615
  service: string;
1466
1616
  /** @description Per-service settings blob (service-specific shape). */
@@ -1581,6 +1731,76 @@ interface operations {
1581
1731
  };
1582
1732
  };
1583
1733
  };
1734
+ OAuthController_callback: {
1735
+ parameters: {
1736
+ query?: never;
1737
+ header?: never;
1738
+ path: {
1739
+ provider: "apple" | "google" | "github";
1740
+ };
1741
+ cookie?: never;
1742
+ };
1743
+ requestBody: {
1744
+ content: {
1745
+ "application/json": components["schemas"]["CallbackBodyDto"];
1746
+ };
1747
+ };
1748
+ responses: {
1749
+ 200: {
1750
+ headers: {
1751
+ [name: string]: unknown;
1752
+ };
1753
+ content: {
1754
+ "application/json": components["schemas"]["OAuthCallbackResultDto"];
1755
+ };
1756
+ };
1757
+ /** @description Unknown / expired state, provider state mismatch, or unknown provider id. */
1758
+ 400: {
1759
+ headers: {
1760
+ [name: string]: unknown;
1761
+ };
1762
+ content?: never;
1763
+ };
1764
+ /** @description Provider token verification failed, nonce replayed, or downstream identity could not be resolved. */
1765
+ 401: {
1766
+ headers: {
1767
+ [name: string]: unknown;
1768
+ };
1769
+ content?: never;
1770
+ };
1771
+ };
1772
+ };
1773
+ OAuthController_start: {
1774
+ parameters: {
1775
+ query: {
1776
+ /** @description Absolute URL the user lands on after a successful signin. Must match the `OAUTH_RETURN_TO_ORIGINS` allowlist (CSV, wildcards supported as `https://*.productcraft.co`). */
1777
+ return_to: string;
1778
+ };
1779
+ header?: never;
1780
+ path: {
1781
+ /** @description OAuth provider id. Providers are gated on env-var configuration; unconfigured providers 400 with UNKNOWN_OAUTH_PROVIDER. */
1782
+ provider: "apple" | "google" | "github";
1783
+ };
1784
+ cookie?: never;
1785
+ };
1786
+ requestBody?: never;
1787
+ responses: {
1788
+ /** @description Redirect to provider authorize URL. */
1789
+ 302: {
1790
+ headers: {
1791
+ [name: string]: unknown;
1792
+ };
1793
+ content?: never;
1794
+ };
1795
+ /** @description Invalid `return_to` or unknown provider. */
1796
+ 400: {
1797
+ headers: {
1798
+ [name: string]: unknown;
1799
+ };
1800
+ content?: never;
1801
+ };
1802
+ };
1803
+ };
1584
1804
  PasswordController_requestPasswordReset: {
1585
1805
  parameters: {
1586
1806
  query?: never;
@@ -1779,6 +1999,151 @@ interface operations {
1779
1999
  };
1780
2000
  };
1781
2001
  };
2002
+ MeController_getMe: {
2003
+ parameters: {
2004
+ query?: never;
2005
+ header?: never;
2006
+ path?: never;
2007
+ cookie?: never;
2008
+ };
2009
+ requestBody?: never;
2010
+ responses: {
2011
+ 200: {
2012
+ headers: {
2013
+ [name: string]: unknown;
2014
+ };
2015
+ content: {
2016
+ "application/json": components["schemas"]["MeProfileDto"];
2017
+ };
2018
+ };
2019
+ /** @description No session. */
2020
+ 401: {
2021
+ headers: {
2022
+ [name: string]: unknown;
2023
+ };
2024
+ content?: never;
2025
+ };
2026
+ /** @description No account row for the session principal. Should never fire for a valid session — surfaced for SDKs. */
2027
+ 404: {
2028
+ headers: {
2029
+ [name: string]: unknown;
2030
+ };
2031
+ content?: never;
2032
+ };
2033
+ };
2034
+ };
2035
+ MeController_setAvatar: {
2036
+ parameters: {
2037
+ query?: never;
2038
+ header?: never;
2039
+ path?: never;
2040
+ cookie?: never;
2041
+ };
2042
+ requestBody: {
2043
+ content: {
2044
+ "multipart/form-data": {
2045
+ /**
2046
+ * Format: binary
2047
+ * @description PNG, JPEG, or WEBP image, ≤2 MB.
2048
+ */
2049
+ file: string;
2050
+ };
2051
+ };
2052
+ };
2053
+ responses: {
2054
+ 200: {
2055
+ headers: {
2056
+ [name: string]: unknown;
2057
+ };
2058
+ content: {
2059
+ "application/json": components["schemas"]["AvatarUrlResponseDto"];
2060
+ };
2061
+ };
2062
+ /** @description Invalid file: wrong mimetype, oversized, or content does not match the declared type. */
2063
+ 400: {
2064
+ headers: {
2065
+ [name: string]: unknown;
2066
+ };
2067
+ content?: never;
2068
+ };
2069
+ /** @description No session. */
2070
+ 401: {
2071
+ headers: {
2072
+ [name: string]: unknown;
2073
+ };
2074
+ content?: never;
2075
+ };
2076
+ };
2077
+ };
2078
+ MeController_removeAvatar: {
2079
+ parameters: {
2080
+ query?: never;
2081
+ header?: never;
2082
+ path?: never;
2083
+ cookie?: never;
2084
+ };
2085
+ requestBody?: never;
2086
+ responses: {
2087
+ /** @description Avatar removed (or already absent). */
2088
+ 204: {
2089
+ headers: {
2090
+ [name: string]: unknown;
2091
+ };
2092
+ content?: never;
2093
+ };
2094
+ /** @description No session. */
2095
+ 401: {
2096
+ headers: {
2097
+ [name: string]: unknown;
2098
+ };
2099
+ content?: never;
2100
+ };
2101
+ };
2102
+ };
2103
+ MeController_updateProfile: {
2104
+ parameters: {
2105
+ query?: never;
2106
+ header?: never;
2107
+ path?: never;
2108
+ cookie?: never;
2109
+ };
2110
+ requestBody: {
2111
+ content: {
2112
+ "application/json": components["schemas"]["UpdateProfileDto"];
2113
+ };
2114
+ };
2115
+ responses: {
2116
+ 200: {
2117
+ headers: {
2118
+ [name: string]: unknown;
2119
+ };
2120
+ content: {
2121
+ "application/json": components["schemas"]["MeProfileDto"];
2122
+ };
2123
+ };
2124
+ /** @description Validation failed (e.g. displayName outside 1-128 chars). */
2125
+ 400: {
2126
+ headers: {
2127
+ [name: string]: unknown;
2128
+ };
2129
+ content?: never;
2130
+ };
2131
+ /** @description No session. */
2132
+ 401: {
2133
+ headers: {
2134
+ [name: string]: unknown;
2135
+ };
2136
+ content?: never;
2137
+ };
2138
+ /** @description The caller authenticated with a non-human principal (e.g. PAK). Profile is per-human; only the human owner can mutate their own row. */
2139
+ 403: {
2140
+ headers: {
2141
+ [name: string]: unknown;
2142
+ };
2143
+ content?: never;
2144
+ };
2145
+ };
2146
+ };
1782
2147
  SessionController_getSessions: {
1783
2148
  parameters: {
1784
2149
  query?: never;
@@ -1907,6 +2272,13 @@ interface operations {
1907
2272
  "application/json": components["schemas"]["WorkspaceResponseDto"];
1908
2273
  };
1909
2274
  };
2275
+ /** @description Caller is a PAK (`pcft_live_*`). Workspace creation requires a human-issued session. */
2276
+ 403: {
2277
+ headers: {
2278
+ [name: string]: unknown;
2279
+ };
2280
+ content?: never;
2281
+ };
1910
2282
  };
1911
2283
  };
1912
2284
  WorkspaceController_acceptInvite: {
@@ -1972,6 +2344,13 @@ interface operations {
1972
2344
  };
1973
2345
  content?: never;
1974
2346
  };
2347
+ /** @description Caller is a PAK (`pcft_live_*`). Workspace deletion requires a human-issued session. */
2348
+ 403: {
2349
+ headers: {
2350
+ [name: string]: unknown;
2351
+ };
2352
+ content?: never;
2353
+ };
1975
2354
  };
1976
2355
  };
1977
2356
  WorkspaceController_updateWorkspace: {
@@ -2065,6 +2444,13 @@ interface operations {
2065
2444
  "application/json": components["schemas"]["MintPakResponseDto"];
2066
2445
  };
2067
2446
  };
2447
+ /** @description Caller is a PAK (`pcft_live_*`). Mint requires a human-issued session. */
2448
+ 403: {
2449
+ headers: {
2450
+ [name: string]: unknown;
2451
+ };
2452
+ content?: never;
2453
+ };
2068
2454
  };
2069
2455
  };
2070
2456
  PlatformApiKeyController_get: {
@@ -2269,6 +2655,64 @@ interface operations {
2269
2655
  };
2270
2656
  };
2271
2657
  };
2658
+ WorkspaceController_setAvatar: {
2659
+ parameters: {
2660
+ query?: never;
2661
+ header?: never;
2662
+ path: {
2663
+ workspace_slug: string;
2664
+ };
2665
+ cookie?: never;
2666
+ };
2667
+ requestBody: {
2668
+ content: {
2669
+ "multipart/form-data": {
2670
+ /**
2671
+ * Format: binary
2672
+ * @description PNG, JPEG, or WEBP image, ≤2 MB. Square images look best.
2673
+ */
2674
+ file: string;
2675
+ };
2676
+ };
2677
+ };
2678
+ responses: {
2679
+ 200: {
2680
+ headers: {
2681
+ [name: string]: unknown;
2682
+ };
2683
+ content: {
2684
+ "application/json": components["schemas"]["WorkspaceAvatarUrlResponseDto"];
2685
+ };
2686
+ };
2687
+ /** @description Caller is not a member of this workspace, or lacks workspace.settings.update. */
2688
+ 403: {
2689
+ headers: {
2690
+ [name: string]: unknown;
2691
+ };
2692
+ content?: never;
2693
+ };
2694
+ };
2695
+ };
2696
+ WorkspaceController_removeAvatar: {
2697
+ parameters: {
2698
+ query?: never;
2699
+ header?: never;
2700
+ path: {
2701
+ workspace_slug: string;
2702
+ };
2703
+ cookie?: never;
2704
+ };
2705
+ requestBody?: never;
2706
+ responses: {
2707
+ /** @description Avatar cleared. */
2708
+ 204: {
2709
+ headers: {
2710
+ [name: string]: unknown;
2711
+ };
2712
+ content?: never;
2713
+ };
2714
+ };
2715
+ };
2272
2716
  WorkspaceController_listInvites: {
2273
2717
  parameters: {
2274
2718
  query: {
@@ -2791,7 +3235,7 @@ interface operations {
2791
3235
  };
2792
3236
  cookie?: never;
2793
3237
  };
2794
- /** @description Replaces the per-service settings jsonb entirely. The body is the settings object itself (no wrapper). Service-specific shape — e.g. envoi tracks default sender, agora tracks ranking weights. */
3238
+ /** @description Replaces the per-service settings jsonb entirely. The body is the settings object itself (no wrapper). Service-specific shape — e.g. mail tracks default sender, social tracks ranking weights. */
2795
3239
  requestBody: {
2796
3240
  content: {
2797
3241
  "application/json": {