@odla-ai/chapter 0.42.2 → 0.42.4

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  formatChapterCopy,
3
3
  useChapterCopy
4
- } from "./chunk-JXFYOUDL.js";
4
+ } from "./chunk-4HS2JPE2.js";
5
5
  import {
6
6
  collectFormFields
7
7
  } from "./chunk-IVXVECKR.js";
@@ -1524,4 +1524,4 @@ export {
1524
1524
  membershipApplicationHref,
1525
1525
  MembershipCards
1526
1526
  };
1527
- //# sourceMappingURL=chunk-S7CND3R5.js.map
1527
+ //# sourceMappingURL=chunk-VWDEHUNI.js.map
@@ -24,7 +24,7 @@ type TextFields$1<Key extends string> = {
24
24
  [Field in Key]: string;
25
25
  };
26
26
  /** User-visible language for sharing, delivery state, and leader rollups. */
27
- type AdminNetworkCopy = TextFields$1<"title" | "allowlistDescription" | "sharing" | "shareWith" | "shared" | "shareFailed" | "deliveryFailed" | "loadingRollup" | "loadRollupFailed" | "overview" | "configuredFollowers" | "reachableFollowers" | "recordsAcrossFollowers" | "noFollowers" | "followers" | "available" | "unavailable" | "recordTotals" | "noRecordTotals">;
27
+ type AdminNetworkCopy = TextFields$1<"title" | "allowlistDescription" | "sharing" | "shareWith" | "shared" | "shareFailed" | "deliveryFailed" | "loadingRollup" | "loadRollupFailed" | "overview" | "configuredFollowers" | "reachableFollowers" | "recordsAcrossFollowers" | "noFollowers" | "followers" | "available" | "unavailable" | "transportReachable" | "transportUnavailable" | "transportNotChecked" | "bindingTransport" | "urlTransport" | "activeConfiguration" | "noActiveConfiguration" | "publicSiteAvailable" | "publicSiteUnavailable" | "publicSiteNotChecked" | "recordTotals" | "noRecordTotals">;
28
28
 
29
29
  type TextFields<Key extends string> = {
30
30
  [Field in Key]: string;
package/dist/index.cjs CHANGED
@@ -32,16 +32,25 @@ __export(index_exports, {
32
32
  DEFAULT_CHAPTER_COPY: () => DEFAULT_CHAPTER_COPY,
33
33
  DEFAULT_SHARE_FIELDS: () => DEFAULT_SHARE_FIELDS,
34
34
  GIFT_OFFER_CATALOG_VERSION: () => GIFT_OFFER_CATALOG_VERSION,
35
+ JOURNEY_ENDINGS: () => JOURNEY_ENDINGS,
36
+ JOURNEY_STAGES: () => JOURNEY_STAGES,
35
37
  MAX_GIFT_OFFERS: () => MAX_GIFT_OFFERS,
36
38
  MEMBERSHIP_PAGE_RENDERER: () => MEMBERSHIP_PAGE_RENDERER,
37
39
  MEMBER_CONTENT_CONTROL_PATH: () => MEMBER_CONTENT_CONTROL_PATH,
38
40
  MEMBER_CONTENT_PATH: () => MEMBER_CONTENT_PATH,
39
41
  MEMBER_CONTENT_SCHEMA_VERSION: () => MEMBER_CONTENT_SCHEMA_VERSION,
42
+ MEMBER_SELF_EDITABLE_FIELDS: () => MEMBER_SELF_EDITABLE_FIELDS,
43
+ MEMBER_SELF_READABLE_FIELDS: () => MEMBER_SELF_READABLE_FIELDS,
44
+ MEMBER_SYSTEM_AUTHORITY_MATRIX: () => MEMBER_SYSTEM_AUTHORITY_MATRIX,
45
+ MEMBER_SYSTEM_CONTRACT_VERSION: () => MEMBER_SYSTEM_CONTRACT_VERSION,
46
+ MEMBER_SYSTEM_RECOVERY_OBJECTIVES: () => MEMBER_SYSTEM_RECOVERY_OBJECTIVES,
47
+ REQUIRED_NOTICE_KINDS: () => REQUIRED_NOTICE_KINDS,
40
48
  SCHEDULING_DEFAULTS: () => SCHEDULING_DEFAULTS,
41
49
  SIGNUP_CONTROL_PATH: () => SIGNUP_CONTROL_PATH,
42
50
  SIGNUP_CONTROL_SCHEMA_VERSION: () => SIGNUP_CONTROL_SCHEMA_VERSION,
43
51
  SIGNUP_CONTROL_THEME_MARKER: () => SIGNUP_CONTROL_THEME_MARKER,
44
52
  SIGNUP_CONTROL_THEME_STYLE_ID: () => SIGNUP_CONTROL_THEME_STYLE_ID,
53
+ SILVER_SALT_P0_FIXTURE: () => SILVER_SALT_P0_FIXTURE,
45
54
  applicantProfile: () => applicantProfile,
46
55
  applicationBookingUpdate: () => applicationBookingUpdate,
47
56
  applicationFlowFields: () => applicationFlowFields,
@@ -68,6 +77,8 @@ __export(index_exports, {
68
77
  chapterDb: () => chapterDb,
69
78
  chapterFlowFieldContract: () => chapterFlowFieldContract,
70
79
  clampArray: () => clampArray,
80
+ classifyMemberStripeEvent: () => classifyMemberStripeEvent,
81
+ classifyMemberSystemWrite: () => classifyMemberSystemWrite,
71
82
  clerkGetUser: () => clerkGetUser,
72
83
  clerkGetUserByEmail: () => clerkGetUserByEmail,
73
84
  clerkIntegration: () => clerkIntegration,
@@ -121,6 +132,8 @@ __export(index_exports, {
121
132
  memberContentDigest: () => memberContentDigest,
122
133
  memberContentDocument: () => memberContentDocument,
123
134
  memberSession: () => memberSession,
135
+ memberSystemAvailability: () => memberSystemAvailability,
136
+ memberSystemRollbackPlan: () => memberSystemRollbackPlan,
124
137
  membershipPageDocument: () => membershipPageDocument,
125
138
  membershipTierPresentationFromMarkdown: () => membershipTierPresentationFromMarkdown,
126
139
  networkSourceTag: () => networkSourceTag,
@@ -132,9 +145,12 @@ __export(index_exports, {
132
145
  paymentsReady: () => paymentsReady,
133
146
  personInputFromApp: () => personInputFromApp,
134
147
  planDelivery: () => planDelivery,
148
+ planMemberSystemEventReplay: () => planMemberSystemEventReplay,
149
+ planMemberSystemMigration: () => planMemberSystemMigration,
135
150
  projectApplicant: () => projectApplicant,
136
151
  projectBuilderLibraryDelivery: () => projectBuilderLibraryDelivery,
137
152
  projectMemberContent: () => projectMemberContent,
153
+ projectMemberSelf: () => projectMemberSelf,
138
154
  projectSharedRecord: () => projectSharedRecord,
139
155
  promoteBuilderLibraryResource: () => promoteBuilderLibraryResource,
140
156
  publicGiftOffers: () => publicGiftOffers,
@@ -177,6 +193,7 @@ __export(index_exports, {
177
193
  validateBuilderLibraryDocument: () => validateBuilderLibraryDocument,
178
194
  validateGiftOfferCatalog: () => validateGiftOfferCatalog,
179
195
  validateMemberContentDocument: () => validateMemberContentDocument,
196
+ validateMemberSystemAuthority: () => validateMemberSystemAuthority,
180
197
  validateMembershipPageDocument: () => validateMembershipPageDocument,
181
198
  validateScheduling: () => validateScheduling,
182
199
  validateSignupControlDocument: () => validateSignupControlDocument,
@@ -1263,6 +1280,16 @@ var DEFAULT_ADMIN_COPY = {
1263
1280
  followers: "Followers",
1264
1281
  available: "available",
1265
1282
  unavailable: "unavailable",
1283
+ transportReachable: "transport reachable",
1284
+ transportUnavailable: "transport unavailable",
1285
+ transportNotChecked: "transport not checked",
1286
+ bindingTransport: "service binding {binding}",
1287
+ urlTransport: "public URL transport",
1288
+ activeConfiguration: "active configuration r{revision}",
1289
+ noActiveConfiguration: "no active managed configuration",
1290
+ publicSiteAvailable: "public site reachable",
1291
+ publicSiteUnavailable: "public site unavailable",
1292
+ publicSiteNotChecked: "public site not probed",
1266
1293
  recordTotals: "Portfolio records",
1267
1294
  noRecordTotals: "No aggregate records are available yet."
1268
1295
  },
@@ -2209,8 +2236,8 @@ function tierPayable(tier, group, hasSecretKey) {
2209
2236
  function byOrder(a, b) {
2210
2237
  return a.sortOrder - b.sortOrder || a.id.localeCompare(b.id);
2211
2238
  }
2212
- function resolveTiers(group, rows2 = []) {
2213
- const stored = rows2.filter((tier) => tier.active);
2239
+ function resolveTiers(group, rows3 = []) {
2240
+ const stored = rows3.filter((tier) => tier.active);
2214
2241
  if (stored.length) return [...stored].sort(byOrder);
2215
2242
  return [{
2216
2243
  id: "standard",
@@ -4238,15 +4265,15 @@ function rowToTier(row, groupId) {
4238
4265
  }
4239
4266
  async function loadTiers(db, group) {
4240
4267
  const groupId = String(group.id ?? "");
4241
- let rows2;
4268
+ let rows3;
4242
4269
  try {
4243
- rows2 = (await db.query({
4270
+ rows3 = (await db.query({
4244
4271
  tiers: { $: { where: { groupId }, order: { sortOrder: "asc" }, limit: 100 } }
4245
4272
  })).tiers;
4246
4273
  } catch {
4247
- rows2 = void 0;
4274
+ rows3 = void 0;
4248
4275
  }
4249
- const list = Array.isArray(rows2) ? rows2.map((row) => rowToTier(row, groupId)) : [];
4276
+ const list = Array.isArray(rows3) ? rows3.map((row) => rowToTier(row, groupId)) : [];
4250
4277
  return resolveTiers(group, list);
4251
4278
  }
4252
4279
  async function loadOfferableTiers(db, group, hasSecretKey) {
@@ -4944,4 +4971,446 @@ async function exportChapterPromotion(input) {
4944
4971
  ]
4945
4972
  };
4946
4973
  }
4974
+
4975
+ // src/member-system-authority.ts
4976
+ var rows2 = (group) => group.fields.map((id4) => ({ ...group, id: id4 }));
4977
+ var MEMBER_SYSTEM_AUTHORITY_MATRIX = [
4978
+ ...rows2({
4979
+ scope: "network",
4980
+ writer: "network_person",
4981
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
4982
+ sensitivity: "pii",
4983
+ memberAccess: "edit",
4984
+ fields: [
4985
+ "person.legalName",
4986
+ "person.preferredName",
4987
+ "person.namePronunciation",
4988
+ "person.pronouns",
4989
+ "person.displayLegalName",
4990
+ "person.primaryEmail",
4991
+ "person.secondaryEmails",
4992
+ "person.phone",
4993
+ "person.linkedinUrl",
4994
+ "person.photo",
4995
+ "person.homeAddress",
4996
+ "person.fulfillmentFit",
4997
+ "person.fulfillmentSize"
4998
+ ]
4999
+ }),
5000
+ ...rows2({
5001
+ scope: "network",
5002
+ writer: "network_person",
5003
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5004
+ sensitivity: "ordinary",
5005
+ memberAccess: "edit",
5006
+ fields: [
5007
+ "person.title",
5008
+ "person.company",
5009
+ "person.companyObservedAt",
5010
+ "person.region",
5011
+ "person.whyText",
5012
+ "person.whyTokens",
5013
+ "person.skillsOffered",
5014
+ "person.openToRequests",
5015
+ "person.directoryPhotoConsent"
5016
+ ]
5017
+ }),
5018
+ ...rows2({
5019
+ scope: "network",
5020
+ writer: "network_person",
5021
+ projections: ["bnf_admin", "chapter_admin"],
5022
+ sensitivity: "restricted",
5023
+ memberAccess: "none",
5024
+ fields: [
5025
+ "person.linkedinMemberId",
5026
+ "person.identityClaims",
5027
+ "person.aliases",
5028
+ "person.mergeHistory",
5029
+ "person.introducedByPersonId",
5030
+ "person.introducedAt",
5031
+ "person.firstTouch",
5032
+ "person.globalSuppression",
5033
+ "person.deceasedAt",
5034
+ "person.archivedAt"
5035
+ ]
5036
+ }),
5037
+ ...rows2({
5038
+ scope: "network",
5039
+ writer: "network_person",
5040
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5041
+ sensitivity: "sensitive",
5042
+ memberAccess: "edit",
5043
+ fields: ["person.accreditationSelfCertification", "person.accreditationCategory", "person.accreditationExpiresAt"]
5044
+ }),
5045
+ ...rows2({
5046
+ scope: "network",
5047
+ writer: "network_person",
5048
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5049
+ sensitivity: "restricted",
5050
+ memberAccess: "read",
5051
+ fields: ["person.acknowledgements"]
5052
+ }),
5053
+ ...rows2({
5054
+ scope: "provider",
5055
+ writer: "clerk",
5056
+ projections: ["clerk_identity", "bnf_admin", "chapter_admin"],
5057
+ sensitivity: "restricted",
5058
+ memberAccess: "none",
5059
+ fields: ["identity.clerkUserIds", "identity.clerkEmailVerification"]
5060
+ }),
5061
+ ...rows2({
5062
+ scope: "chapter",
5063
+ writer: "chapter_journey",
5064
+ projections: ["chapter_admin", "chapter_crm", "bnf_admin"],
5065
+ sensitivity: "ordinary",
5066
+ memberAccess: "none",
5067
+ fields: [
5068
+ "journey.chapterId",
5069
+ "journey.stage",
5070
+ "journey.stageEnteredAt",
5071
+ "journey.stageHistory",
5072
+ "journey.ending",
5073
+ "journey.endingReason",
5074
+ "journey.source",
5075
+ "journey.entryChapterId",
5076
+ "journey.route",
5077
+ "journey.flags",
5078
+ "journey.applicationStartedAt",
5079
+ "journey.appliedAt",
5080
+ "journey.paidAt",
5081
+ "journey.callBookedAt",
5082
+ "journey.metAt",
5083
+ "journey.approvedAt",
5084
+ "journey.onboardedAt",
5085
+ "journey.firstLoginAt",
5086
+ "journey.firstDealAt"
5087
+ ]
5088
+ }),
5089
+ ...rows2({
5090
+ scope: "chapter",
5091
+ writer: "chapter_journey",
5092
+ projections: ["chapter_admin", "chapter_crm"],
5093
+ sensitivity: "sensitive",
5094
+ memberAccess: "none",
5095
+ fields: [
5096
+ "journey.relationshipOwnerId",
5097
+ "journey.lastContactAt",
5098
+ "journey.nextAction",
5099
+ "journey.owes",
5100
+ "journey.asks",
5101
+ "journey.preparation",
5102
+ "journey.notes"
5103
+ ]
5104
+ }),
5105
+ ...rows2({
5106
+ scope: "chapter",
5107
+ writer: "chapter_journey",
5108
+ projections: ["chapter_admin", "chapter_crm", "member_self_service"],
5109
+ sensitivity: "ordinary",
5110
+ memberAccess: "edit",
5111
+ fields: ["journey.dealFlowConsent", "journey.directoryConsent", "journey.emailConsent", "journey.smsConsent"]
5112
+ }),
5113
+ ...rows2({
5114
+ scope: "chapter",
5115
+ writer: "chapter_journey",
5116
+ projections: ["chapter_admin", "bnf_admin", "member_self_service"],
5117
+ sensitivity: "ordinary",
5118
+ memberAccess: "read",
5119
+ fields: ["journey.memberNumber"]
5120
+ }),
5121
+ ...rows2({
5122
+ scope: "network",
5123
+ writer: "network_membership",
5124
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5125
+ sensitivity: "ordinary",
5126
+ memberAccess: "read",
5127
+ fields: [
5128
+ "membership.chapterId",
5129
+ "membership.journeyId",
5130
+ "membership.termStartsAt",
5131
+ "membership.termEndsAt",
5132
+ "membership.tier",
5133
+ "membership.status",
5134
+ "membership.joinedAt",
5135
+ "membership.autoRenews",
5136
+ "membership.renewalAt",
5137
+ "membership.cancelsAt",
5138
+ "membership.graceEndsAt",
5139
+ "membership.foundingCohort",
5140
+ "membership.offeringPolicyVersion",
5141
+ "membership.discountPolicyVersion"
5142
+ ]
5143
+ }),
5144
+ ...rows2({
5145
+ scope: "network",
5146
+ writer: "network_commercial_projection",
5147
+ projections: ["bnf_admin", "chapter_admin"],
5148
+ sensitivity: "restricted",
5149
+ memberAccess: "none",
5150
+ fields: [
5151
+ "membership.stripeCustomerId",
5152
+ "membership.stripeSubscriptionId",
5153
+ "membership.stripePriceId",
5154
+ "membership.lastInvoiceId",
5155
+ "membership.paymentOutcome",
5156
+ "membership.refundOutcome"
5157
+ ]
5158
+ }),
5159
+ ...rows2({
5160
+ scope: "network",
5161
+ writer: "network_discount_policy",
5162
+ projections: ["bnf_admin", "chapter_admin", "stripe_billing"],
5163
+ sensitivity: "ordinary",
5164
+ memberAccess: "none",
5165
+ fields: [
5166
+ "discountPolicy.chapterId",
5167
+ "discountPolicy.version",
5168
+ "discountPolicy.eligibleOfferingIds",
5169
+ "discountPolicy.percentOff",
5170
+ "discountPolicy.amountOff",
5171
+ "discountPolicy.activatesOn",
5172
+ "discountPolicy.invoiceCount",
5173
+ "discountPolicy.expiresAt",
5174
+ "discountPolicy.stackingOrder",
5175
+ "discountPolicy.status"
5176
+ ]
5177
+ }),
5178
+ ...rows2({
5179
+ scope: "network",
5180
+ writer: "network_entitlement",
5181
+ projections: ["bnf_admin", "chapter_admin", "member_self_service", "stripe_billing"],
5182
+ sensitivity: "ordinary",
5183
+ memberAccess: "read",
5184
+ fields: [
5185
+ "entitlement.membershipId",
5186
+ "entitlement.kind",
5187
+ "entitlement.priceCents",
5188
+ "entitlement.currency",
5189
+ "entitlement.payerPersonId",
5190
+ "entitlement.purchasedAt",
5191
+ "entitlement.termEndsAt",
5192
+ "entitlement.renewsWithMembership",
5193
+ "entitlement.status"
5194
+ ]
5195
+ }),
5196
+ ...rows2({
5197
+ scope: "network",
5198
+ writer: "network_seat",
5199
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5200
+ sensitivity: "pii",
5201
+ memberAccess: "read",
5202
+ fields: [
5203
+ "seat.membershipId",
5204
+ "seat.entitlementId",
5205
+ "seat.personId",
5206
+ "seat.recipientName",
5207
+ "seat.recipientEmail",
5208
+ "seat.role",
5209
+ "seat.status",
5210
+ "seat.acceptanceExpiresAt",
5211
+ "seat.acceptedAt",
5212
+ "seat.activatedAt",
5213
+ "seat.refundedAt"
5214
+ ]
5215
+ }),
5216
+ ...rows2({
5217
+ scope: "network",
5218
+ writer: "network_referral_ledger",
5219
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5220
+ sensitivity: "ordinary",
5221
+ memberAccess: "read",
5222
+ fields: [
5223
+ "referral.referrerPersonId",
5224
+ "referral.referredPersonId",
5225
+ "referral.qualifiedMembershipId",
5226
+ "referral.creditCents",
5227
+ "referral.status",
5228
+ "referral.appliedInvoiceId",
5229
+ "referral.carryForwardCents",
5230
+ "referral.adjustmentOf"
5231
+ ]
5232
+ }),
5233
+ ...rows2({
5234
+ scope: "network",
5235
+ writer: "network_investment_ledger",
5236
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5237
+ sensitivity: "restricted",
5238
+ memberAccess: "read",
5239
+ fields: [
5240
+ "investment.personId",
5241
+ "investment.chapterId",
5242
+ "investment.season",
5243
+ "investment.purpose",
5244
+ "investment.targetCount",
5245
+ "investment.status",
5246
+ "investment.amountCents",
5247
+ "investment.closedAt",
5248
+ "investment.sourceReference"
5249
+ ]
5250
+ }),
5251
+ ...rows2({
5252
+ scope: "provider",
5253
+ writer: "stripe",
5254
+ projections: ["stripe_billing", "bnf_admin", "chapter_admin"],
5255
+ sensitivity: "restricted",
5256
+ memberAccess: "none",
5257
+ fields: [
5258
+ "commercial.charge",
5259
+ "commercial.invoice",
5260
+ "commercial.refund",
5261
+ "commercial.providerSubscription",
5262
+ "commercial.paymentMethod"
5263
+ ]
5264
+ })
5265
+ ];
5266
+ var MEMBER_SELF_EDITABLE_FIELDS = new Set(
5267
+ MEMBER_SYSTEM_AUTHORITY_MATRIX.filter((row) => row.memberAccess === "edit").map((row) => row.id)
5268
+ );
5269
+ var MEMBER_SELF_READABLE_FIELDS = new Set(
5270
+ MEMBER_SYSTEM_AUTHORITY_MATRIX.filter((row) => row.memberAccess !== "none").map((row) => row.id)
5271
+ );
5272
+ function projectMemberSelf(record4) {
5273
+ return Object.fromEntries(Object.entries(record4).filter(([field]) => MEMBER_SELF_READABLE_FIELDS.has(field)));
5274
+ }
5275
+ function classifyMemberSystemWrite(intent) {
5276
+ if (intent.actor === "bnf") return "reject_bnf_surface";
5277
+ const authority = MEMBER_SYSTEM_AUTHORITY_MATRIX.find((row) => row.id === intent.field);
5278
+ if (!authority) return "reject_unknown_field";
5279
+ if (authority.writer !== intent.actor) return "reject_wrong_writer";
5280
+ if (intent.expectedRevision !== intent.actualRevision) return "reject_stale_revision";
5281
+ return "apply";
5282
+ }
5283
+ function validateMemberSystemAuthority(matrix = MEMBER_SYSTEM_AUTHORITY_MATRIX) {
5284
+ const errors = [];
5285
+ const ids = /* @__PURE__ */ new Set();
5286
+ for (const row of matrix) {
5287
+ if (!row.id || !row.id.includes(".")) errors.push(`invalid field id "${row.id}"`);
5288
+ if (ids.has(row.id)) errors.push(`duplicate field authority "${row.id}"`);
5289
+ ids.add(row.id);
5290
+ if (row.memberAccess !== "none" && !row.projections.includes("member_self_service")) {
5291
+ errors.push(`${row.id} grants member access without a member_self_service projection`);
5292
+ }
5293
+ if (row.id.startsWith("person.") && (row.scope !== "network" || row.writer !== "network_person")) {
5294
+ errors.push(`${row.id} must be network_person authority`);
5295
+ }
5296
+ if (row.id.startsWith("journey.") && (row.scope !== "chapter" || row.writer !== "chapter_journey")) {
5297
+ errors.push(`${row.id} must be chapter_journey authority`);
5298
+ }
5299
+ }
5300
+ return { ok: errors.length === 0, errors };
5301
+ }
5302
+
5303
+ // src/member-system-contract.ts
5304
+ var MEMBER_SYSTEM_CONTRACT_VERSION = 1;
5305
+ var JOURNEY_STAGES = [
5306
+ "identified",
5307
+ "researched",
5308
+ "outreach",
5309
+ "in_conversation",
5310
+ "invited_or_requested",
5311
+ "application_started",
5312
+ "applied",
5313
+ "paid_awaiting_conversation",
5314
+ "ready_to_book",
5315
+ "booked",
5316
+ "met",
5317
+ "approved",
5318
+ "onboarded",
5319
+ "active",
5320
+ "first_deal"
5321
+ ];
5322
+ var JOURNEY_ENDINGS = ["passed", "declined", "withdrew", "lapsed"];
5323
+ var REQUIRED_NOTICE_KINDS = [
5324
+ "payment_receipt",
5325
+ "refund_confirmation",
5326
+ "security_alert",
5327
+ "legal_notice",
5328
+ "membership_status",
5329
+ "renewal_notice",
5330
+ "cancellation_confirmation"
5331
+ ];
5332
+ function memberSystemAvailability(input) {
5333
+ if (!input.odlaReachable) {
5334
+ return {
5335
+ bnfAdministration: false,
5336
+ chapterWorkflow: false,
5337
+ memberSelfService: false,
5338
+ newApplication: false,
5339
+ newCheckout: false,
5340
+ providerRenewalsMayContinue: true,
5341
+ reason: "odla_unavailable"
5342
+ };
5343
+ }
5344
+ return {
5345
+ bnfAdministration: input.bnfFrontendReachable,
5346
+ chapterWorkflow: true,
5347
+ memberSelfService: true,
5348
+ newApplication: true,
5349
+ newCheckout: true,
5350
+ providerRenewalsMayContinue: true,
5351
+ ...!input.bnfFrontendReachable ? { reason: "bnf_frontend_unavailable" } : {}
5352
+ };
5353
+ }
5354
+ function classifyMemberStripeEvent(identity, target, hasProvenLegacyLocalLink) {
5355
+ const keys = ["appId", "environment", "dataEnvironment", "runtime", "chapterId"];
5356
+ const supplied = keys.filter((key) => identity[key] !== void 0);
5357
+ if (supplied.some((key) => identity[key] !== target[key])) return "ignore_sibling";
5358
+ if (supplied.length === keys.length) return "apply";
5359
+ return hasProvenLegacyLocalLink ? "apply_legacy" : "quarantine_unmatched";
5360
+ }
5361
+ function planMemberSystemEventReplay(events) {
5362
+ const seen = /* @__PURE__ */ new Map();
5363
+ const plan = { accepted: [], replayed: [], collisions: [] };
5364
+ for (const event of events) {
5365
+ const digest = seen.get(event.id);
5366
+ if (digest === void 0) {
5367
+ seen.set(event.id, event.digest);
5368
+ plan.accepted.push(event.id);
5369
+ } else if (digest === event.digest) plan.replayed.push(event.id);
5370
+ else plan.collisions.push(event.id);
5371
+ }
5372
+ return plan;
5373
+ }
5374
+ var MEMBER_SYSTEM_RECOVERY_OBJECTIVES = {
5375
+ failClosedWithinMs: 0,
5376
+ replayProjectionWithinMinutes: 15,
5377
+ providerEventsRemainReplayable: true,
5378
+ requireHumanReviewForCollision: true
5379
+ };
5380
+ function planMemberSystemMigration(rows3) {
5381
+ const plan = { importIds: [], fixtureIds: [], rejectedIds: [] };
5382
+ for (const row of rows3) {
5383
+ if (row.source === "synthetic_fixture" && !row.isRealPerson) plan.fixtureIds.push(row.id);
5384
+ else if (row.source === "external_reimport" && row.isRealPerson && row.provenance) plan.importIds.push(row.id);
5385
+ else plan.rejectedIds.push(row.id);
5386
+ }
5387
+ return plan;
5388
+ }
5389
+ function memberSystemRollbackPlan() {
5390
+ return {
5391
+ stopNetworkWrites: true,
5392
+ disableBnfMemberMutations: true,
5393
+ keepChapterProductionReads: true,
5394
+ keepStripeBillingAuthority: true,
5395
+ deleteProviderObjects: false,
5396
+ reverseProviderPayments: false,
5397
+ reconciliationRequired: true
5398
+ };
5399
+ }
5400
+ var SILVER_SALT_P0_FIXTURE = {
5401
+ sourceInventory: { applications: 36, meetings: 7, emails: 49, realPeople: 0 },
5402
+ application: { id: "fixture_application_001", personId: "fixture_person_001", migrates: false },
5403
+ crm: { recordId: "fixture_crm_001", email: "fixture.member@example.invalid", migrates: false },
5404
+ clerk: { userId: "user_fixture_001", verifiedEmail: "fixture.member@example.invalid", migrates: false },
5405
+ stripe: {
5406
+ customerId: "cus_fixture_001",
5407
+ subscriptionId: "sub_fixture_001",
5408
+ productId: "prod_fixture_001",
5409
+ priceId: "price_fixture_001",
5410
+ eventId: "evt_fixture_001",
5411
+ migrates: false
5412
+ },
5413
+ unmatchedStripeEvent: { id: "evt_fixture_unmatched", disposition: "quarantine_unmatched" },
5414
+ legacyStripeEvent: { id: "evt_fixture_legacy", requiresProvenLocalLink: true }
5415
+ };
4947
5416
  //# sourceMappingURL=index.cjs.map