@aglyn/tenant-data-admin 1.0.0-beta.220 → 1.0.0-beta.222

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 (114) hide show
  1. package/package.json +7 -7
  2. package/src/lib/server/api-keys.js +3 -3
  3. package/src/lib/server/api-keys.js.map +1 -1
  4. package/src/lib/server/api-v1-resources.d.ts +44 -3
  5. package/src/lib/server/api-v1-resources.js +82 -5
  6. package/src/lib/server/api-v1-resources.js.map +1 -1
  7. package/src/lib/server/collection-live-pages.d.ts +2 -2
  8. package/src/lib/server/collection-live-pages.js +1 -1
  9. package/src/lib/server/collection-live-pages.js.map +1 -1
  10. package/src/lib/server/email-delivery-log.d.ts +17 -73
  11. package/src/lib/server/email-delivery-log.js +44 -222
  12. package/src/lib/server/email-delivery-log.js.map +1 -1
  13. package/src/lib/server/email-flow-gate.js +27 -38
  14. package/src/lib/server/email-flow-gate.js.map +1 -1
  15. package/src/lib/server/erase-person.d.ts +34 -54
  16. package/src/lib/server/erase-person.js +44 -239
  17. package/src/lib/server/erase-person.js.map +1 -1
  18. package/src/lib/server/host-visitor-records.d.ts +12 -4
  19. package/src/lib/server/host-visitor-records.js +20 -10
  20. package/src/lib/server/host-visitor-records.js.map +1 -1
  21. package/src/lib/server/hosted-page-review.d.ts +7 -0
  22. package/src/lib/server/hosted-page-review.js +144 -20
  23. package/src/lib/server/hosted-page-review.js.map +1 -1
  24. package/src/lib/server/leaving-notice.d.ts +98 -0
  25. package/src/lib/server/leaving-notice.js +250 -0
  26. package/src/lib/server/leaving-notice.js.map +1 -0
  27. package/src/lib/server/link-reputation-review.d.ts +58 -0
  28. package/src/lib/server/link-reputation-review.js +185 -0
  29. package/src/lib/server/link-reputation-review.js.map +1 -0
  30. package/src/lib/server/live-page-drops.d.ts +67 -0
  31. package/src/lib/server/live-page-drops.js +57 -0
  32. package/src/lib/server/live-page-drops.js.map +1 -0
  33. package/src/lib/server/media-bandwidth-cap.d.ts +78 -0
  34. package/src/lib/server/media-bandwidth-cap.js +180 -0
  35. package/src/lib/server/media-bandwidth-cap.js.map +1 -0
  36. package/src/lib/server/media-cdn-icon.d.ts +77 -0
  37. package/src/lib/server/media-cdn-icon.js +140 -0
  38. package/src/lib/server/media-cdn-icon.js.map +1 -0
  39. package/src/lib/server/media-delivery-regeneration.d.ts +132 -0
  40. package/src/lib/server/media-delivery-regeneration.js +216 -0
  41. package/src/lib/server/media-delivery-regeneration.js.map +1 -0
  42. package/src/lib/server/media-delivery.d.ts +2 -0
  43. package/src/lib/server/media-delivery.js +2 -1
  44. package/src/lib/server/media-delivery.js.map +1 -1
  45. package/src/lib/server/media-serve-count.d.ts +50 -0
  46. package/src/lib/server/media-serve-count.js +62 -0
  47. package/src/lib/server/media-serve-count.js.map +1 -0
  48. package/src/lib/server/media-signing.d.ts +13 -2
  49. package/src/lib/server/media-signing.js +12 -8
  50. package/src/lib/server/media-signing.js.map +1 -1
  51. package/src/lib/server/media-tombstone.js +7 -5
  52. package/src/lib/server/media-tombstone.js.map +1 -1
  53. package/src/lib/server/media-variants.d.ts +151 -20
  54. package/src/lib/server/media-variants.js +204 -27
  55. package/src/lib/server/media-variants.js.map +1 -1
  56. package/src/lib/server/org-age.d.ts +15 -6
  57. package/src/lib/server/org-age.js +20 -8
  58. package/src/lib/server/org-age.js.map +1 -1
  59. package/src/lib/server/organizations.d.ts +102 -2
  60. package/src/lib/server/organizations.js +388 -58
  61. package/src/lib/server/organizations.js.map +1 -1
  62. package/src/lib/server/outbound-send-review.js +24 -6
  63. package/src/lib/server/outbound-send-review.js.map +1 -1
  64. package/src/lib/server/page-security-hold.d.ts +93 -0
  65. package/src/lib/server/page-security-hold.js +180 -0
  66. package/src/lib/server/page-security-hold.js.map +1 -0
  67. package/src/lib/server/paged-sweeps.d.ts +51 -0
  68. package/src/lib/server/paged-sweeps.js +79 -0
  69. package/src/lib/server/paged-sweeps.js.map +1 -0
  70. package/src/lib/server/platform-marketing-consent.d.ts +0 -49
  71. package/src/lib/server/platform-marketing-consent.js +27 -11
  72. package/src/lib/server/platform-marketing-consent.js.map +1 -1
  73. package/src/lib/server/serve-media-cdn.d.ts +69 -1
  74. package/src/lib/server/serve-media-cdn.js +424 -70
  75. package/src/lib/server/serve-media-cdn.js.map +1 -1
  76. package/src/lib/server/site-icon-render.d.ts +68 -0
  77. package/src/lib/server/site-icon-render.js +157 -0
  78. package/src/lib/server/site-icon-render.js.map +1 -0
  79. package/src/lib/server/staff-seat.d.ts +50 -0
  80. package/src/lib/server/staff-seat.js +118 -0
  81. package/src/lib/server/staff-seat.js.map +1 -0
  82. package/src/lib/server/transfer-export.d.ts +46 -0
  83. package/src/lib/server/transfer-export.js +221 -0
  84. package/src/lib/server/transfer-export.js.map +1 -0
  85. package/src/lib/server/transfer-jobs.d.ts +385 -0
  86. package/src/lib/server/transfer-jobs.js +2368 -0
  87. package/src/lib/server/transfer-jobs.js.map +1 -0
  88. package/src/lib/server/transfer-packages.d.ts +127 -0
  89. package/src/lib/server/transfer-packages.js +1036 -0
  90. package/src/lib/server/transfer-packages.js.map +1 -0
  91. package/src/lib/server/upgrade-proposal.d.ts +97 -0
  92. package/src/lib/server/upgrade-proposal.js +312 -0
  93. package/src/lib/server/upgrade-proposal.js.map +1 -0
  94. package/src/lib/server/upsert-contact.d.ts +17 -8
  95. package/src/lib/server/upsert-contact.js +82 -16
  96. package/src/lib/server/upsert-contact.js.map +1 -1
  97. package/src/lib/server/web-risk.d.ts +139 -0
  98. package/src/lib/server/web-risk.js +521 -0
  99. package/src/lib/server/web-risk.js.map +1 -0
  100. package/src/tenancy.d.ts +3 -1
  101. package/src/tenancy.js +5 -1
  102. package/src/tenancy.js.map +1 -1
  103. package/src/lib/server/campaign-attribution-store.d.ts +0 -55
  104. package/src/lib/server/campaign-attribution-store.js +0 -95
  105. package/src/lib/server/campaign-attribution-store.js.map +0 -1
  106. package/src/lib/server/campaign-conversion-attribution.d.ts +0 -283
  107. package/src/lib/server/campaign-conversion-attribution.js +0 -450
  108. package/src/lib/server/campaign-conversion-attribution.js.map +0 -1
  109. package/src/lib/server/dataset-live-pages.d.ts +0 -179
  110. package/src/lib/server/dataset-live-pages.js +0 -421
  111. package/src/lib/server/dataset-live-pages.js.map +0 -1
  112. package/src/lib/server/email-revenue-attribution.d.ts +0 -185
  113. package/src/lib/server/email-revenue-attribution.js +0 -321
  114. package/src/lib/server/email-revenue-attribution.js.map +0 -1
@@ -20,7 +20,7 @@
20
20
  * and the projections the security rules authorize against are never
21
21
  * client-writable (docs/MULTI_TENANT_FIRESTORE.md §8).
22
22
  */
23
- import { type ConsentGroup, type AglynOrganization, type AglynOrgBilling, type AglynOrgMember, type HostAccessRole, type OrgPermission, type OrgRole } from '@aglyn/aglyn/server';
23
+ import { type ConsentGroup, type AglynOrganization, type AglynOrgBilling, type AglynOrgMember, type HostAccessRole, type OrgPermission, type OrgRole, type OwnerHandoffPreviousOwner } from '@aglyn/aglyn/server';
24
24
  import type { PluginActivityTargetType } from '@aglyn/aglyn/plugin-manager/plugin-activity-actions';
25
25
  import type { HostActivityActor } from '@aglyn/aglyn/app-utils/activity-presenter';
26
26
  export declare class OrgSlugTakenError extends Error {
@@ -102,6 +102,13 @@ export interface CreateOrganizationOptions {
102
102
  * nothing else.
103
103
  */
104
104
  bypassFreeWorkspaceCap?: boolean;
105
+ /**
106
+ * Whether the creator holds the `staff` claim, when the caller already
107
+ * knows (AGL-3466). Absent, it is looked up. A staff creator's owner row is
108
+ * stamped `staffSeat: true`, so a workspace staff build for a prospect
109
+ * leaves the prospect's one Free seat free for the prospect.
110
+ */
111
+ ownerStaffSeat?: boolean;
105
112
  }
106
113
  /**
107
114
  * Creates an org in one transaction: slug reservation (uniqueness), org
@@ -435,7 +442,7 @@ options?: {
435
442
  }): Promise<void>;
436
443
  /** What a host activity entry points at. Mirrors `HostActivityTarget`. */
437
444
  export interface HostActivityTarget {
438
- type: 'host' | 'screen' | 'layout' | 'theme' | 'media' | 'content' | 'variable' | 'function' | 'workflow' | 'member' | 'component' | 'template' | 'contact' | 'company' | 'deal' | 'lead';
445
+ type: 'host' | 'screen' | 'layout' | 'theme' | 'media' | 'content' | 'variable' | 'function' | 'workflow' | 'member' | 'component' | 'template' | 'contact' | 'company' | 'deal' | 'lead' | PluginActivityTargetType;
439
446
  id?: string;
440
447
  name?: string;
441
448
  versionId?: string;
@@ -514,9 +521,11 @@ export declare function collaboratorSeatRefusal(options: {
514
521
  orgId: string;
515
522
  org: Partial<AglynOrgBilling>;
516
523
  hostIds: string[];
524
+ /** `staffSeat` admits platform staff without a seat (AGL-3466). */
517
525
  self?: {
518
526
  uid?: string | null;
519
527
  email?: string | null;
528
+ staffSeat?: boolean;
520
529
  };
521
530
  }): Promise<Response | null>;
522
531
  /**
@@ -566,9 +575,11 @@ export declare function managerSeatRefusal(options: {
566
575
  orgId: string;
567
576
  org: Partial<AglynOrgBilling>;
568
577
  becomesManager: boolean;
578
+ /** `staffSeat` admits platform staff without a seat (AGL-3466). */
569
579
  self?: {
570
580
  uid?: string | null;
571
581
  email?: string | null;
582
+ staffSeat?: boolean;
572
583
  };
573
584
  }): Promise<Response | null>;
574
585
  export interface UpsertOrgMemberOptions {
@@ -755,6 +766,95 @@ export declare function backfillMemberIdentityEverywhere(uid: string, identity:
755
766
  * sequence to keep it that way.
756
767
  */
757
768
  export declare function transferOrgOwnership(orgId: string, fromUid: string, toUid: string): Promise<void>;
769
+ /**
770
+ * An owner handoff refused because it would need a team seat the plan does
771
+ * not have (AGL-3466).
772
+ *
773
+ * The loophole guard. A handoff reserves no seat, because the owner seat
774
+ * MOVES — but a `stay` handoff keeps the outgoing owner as an admin, so the
775
+ * workspace ends with one more manager than it started with. On Free that is
776
+ * a second manager on a one-seat plan, and without this check any owner could
777
+ * mint free managers by handing the workspace back and forth. The refusal
778
+ * names the way out: the outgoing owner leaving instead.
779
+ *
780
+ * Separate from {@link ManagerSeatLimitError} because the remedy is
781
+ * different, and a client that branches on `code` must be able to tell.
782
+ */
783
+ export declare class OwnerHandoffSeatError extends Error {
784
+ readonly limit: number;
785
+ readonly upgradeRequired: boolean;
786
+ readonly previousOwner: OwnerHandoffPreviousOwner;
787
+ constructor(previousOwner: OwnerHandoffPreviousOwner, quota: {
788
+ limit: number;
789
+ upgradeRequired: boolean;
790
+ });
791
+ }
792
+ /**
793
+ * An owner handoff that can no longer be accepted as asked (AGL-3466): the
794
+ * invite was answered or withdrawn in the meantime, is not a handoff, is
795
+ * addressed to somebody else, or the accepter already owns the workspace.
796
+ */
797
+ export declare class OwnerHandoffError extends Error {
798
+ readonly reason: 'not-pending' | 'not-handoff' | 'not-addressed' | 'already-owner';
799
+ constructor(reason: OwnerHandoffError['reason']);
800
+ }
801
+ /**
802
+ * Turn a handoff refusal into the response the invite route returns, or
803
+ * null when the error is something else and must keep propagating.
804
+ */
805
+ export declare function ownerHandoffRefusalResponse(error: unknown): Response | null;
806
+ /**
807
+ * The handoff seat check, asked when the invitation is SENT (AGL-3466), so
808
+ * nobody is mailed a handoff that will be refused when they click it.
809
+ *
810
+ * Not the enforcement — `acceptOwnerHandoff` asks again inside its
811
+ * transaction, against the account that actually accepts. Here the invitee
812
+ * is only an address, so their current seat is read off the roster row that
813
+ * carries it.
814
+ *
815
+ * @returns the 403 to send, or null to proceed.
816
+ */
817
+ export declare function ownerHandoffSeatRefusal(options: {
818
+ orgId: string;
819
+ email: string;
820
+ previousOwner: OwnerHandoffPreviousOwner;
821
+ inviteeStaff: boolean;
822
+ }): Promise<Response | null>;
823
+ export interface AcceptOwnerHandoffOptions {
824
+ orgId: string;
825
+ inviteId: string;
826
+ /** The account accepting, which becomes the owner. */
827
+ uid: string;
828
+ /** The accepter's primary address, mirrored onto their roster row. */
829
+ email: string;
830
+ /**
831
+ * Every CONFIRMED address on the accepting account (AGL-2486). The invite
832
+ * must be addressed to one of them, re-checked inside the transaction.
833
+ */
834
+ emails: readonly string[];
835
+ displayName?: string;
836
+ photoURL?: string;
837
+ }
838
+ export interface AcceptOwnerHandoffResult {
839
+ previousOwnerUid: string;
840
+ previousOwner: OwnerHandoffPreviousOwner;
841
+ }
842
+ /**
843
+ * Accept an owner handoff (AGL-3466): the invitee becomes the owner, the
844
+ * outgoing owner stays on as an admin or leaves, and the invite is marked
845
+ * accepted — all in ONE transaction, with the seat check inside it.
846
+ *
847
+ * The move itself is {@link writeOwnershipMove}, the same writes a transfer
848
+ * makes. What this adds is what an invitation needs that a transfer does not:
849
+ * the incoming owner may not be on the roster yet, so their row is created
850
+ * with the identity a join would give it; and the outgoing owner may leave.
851
+ *
852
+ * The SSO lockout check is the CALLER's, for the reason
853
+ * `assessOwnershipTransferLockout` gives: it cannot live in this library
854
+ * without an import cycle, and `sso-transfer-lockout-wiring.spec.ts` pins
855
+ * that every caller of this asks it first.
856
+ */
857
+ export declare function acceptOwnerHandoff(options: AcceptOwnerHandoffOptions): Promise<AcceptOwnerHandoffResult>;
758
858
  /**
759
859
  * Grants (or updates) per-host access for a uid without disturbing an
760
860
  * existing membership's org role or allHosts flag (AGL-238: the host user