@odla-ai/chapter 0.48.3 → 0.50.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.
- package/README.md +29 -2
- package/dist/{chunk-MQ4OPZCS.js → chunk-4EA5V4JE.js} +994 -648
- package/dist/chunk-4EA5V4JE.js.map +1 -0
- package/dist/{chunk-4HS2JPE2.js → chunk-JXX4BFDP.js} +21 -2
- package/dist/chunk-JXX4BFDP.js.map +1 -0
- package/dist/{chunk-KZ2AXEZW.js → chunk-OS46ZE46.js} +765 -543
- package/dist/chunk-OS46ZE46.js.map +1 -0
- package/dist/{copy-context-CMupQL9h.d.ts → copy-context-Ddat__H5.d.ts} +16 -3
- package/dist/index.cjs +591 -158
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +101 -8
- package/dist/index.d.ts +101 -8
- package/dist/index.js +587 -154
- package/dist/index.js.map +1 -1
- package/dist/ui/admin/index.d.ts +64 -5
- package/dist/ui/admin/index.js +14 -2
- package/dist/ui/index.d.ts +3 -3
- package/dist/ui/index.js +19 -3
- package/dist/ui/member/index.d.ts +44 -4
- package/dist/ui/member/index.js +6 -2
- package/dist/worker/index.cjs +5114 -4064
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +105 -6
- package/dist/worker/index.d.ts +105 -6
- package/dist/worker/index.js +5104 -4054
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-4HS2JPE2.js.map +0 -1
- package/dist/chunk-KZ2AXEZW.js.map +0 -1
- package/dist/chunk-MQ4OPZCS.js.map +0 -1
package/dist/worker/index.d.cts
CHANGED
|
@@ -27,15 +27,28 @@ type TextFields$1<Key extends string> = {
|
|
|
27
27
|
/** User-visible language for sharing, delivery state, and leader rollups. */
|
|
28
28
|
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">;
|
|
29
29
|
|
|
30
|
+
/** Copy for the person record panels: lifecycle actions, comms, scheduling, billing and meetings. */
|
|
31
|
+
type AdminRecordsCopy = {
|
|
32
|
+
[Field in AdminRecordsCopyKey]: string;
|
|
33
|
+
};
|
|
34
|
+
/** Every key a host may override under `admin.records`. */
|
|
35
|
+
type AdminRecordsCopyKey = "workflowMissing" | "invitation" | "comms" | "commsHistory" | "scheduling" | "billing" | "notes" | "access" | "sharing" | "lifecycle" | "role" | "superAdminHint" | "noAccount" | "approve" | "refund" | "approved" | "refunded" | "roleSet" | "messageSent" | "messageNotSent" | "loadingTemplates" | "template" | "chooseTemplate" | "sending" | "send" | "noMessages" | "message" | "newStartPrompt" | "parseFailed" | "cancelConfirm" | "callCancelled" | "callRescheduled" | "noApplication" | "loadingMeetings" | "noMeetings" | "joinMeeting" | "openCalendar" | "reschedule" | "cancel";
|
|
36
|
+
|
|
30
37
|
type TextFields<Key extends string> = {
|
|
31
38
|
[Field in Key]: string;
|
|
32
39
|
};
|
|
40
|
+
|
|
33
41
|
/** Complete serializable language for Chapter surfaces; use render slots for markup and `formatChapterCopy()` for placeholders. */
|
|
34
42
|
interface ChapterCopy {
|
|
35
43
|
common: TextFields<"loading" | "saved" | "unknown">;
|
|
36
44
|
join: {
|
|
45
|
+
/** Prepaid invitation attribution, consent and recoverable error copy. */
|
|
46
|
+
namedSeat?: TextFields<"title" | "from" | "prepaid" | "body" | "consent" | "accept" | "accepting" | "loading" | "unavailable" | "retry" | "failure">;
|
|
37
47
|
form: TextFields<"submit" | "submitting" | "submitFailed" | "unexpectedFailure">;
|
|
38
|
-
booking: TextFields<"unavailable" | "loadFailed" | "slotTaken" | "failed" | "loading" | "book" | "booking"
|
|
48
|
+
booking: TextFields<"unavailable" | "loadFailed" | "slotTaken" | "failed" | "loading" | "book" | "booking"> & {
|
|
49
|
+
title?: string;
|
|
50
|
+
intro?: string;
|
|
51
|
+
};
|
|
39
52
|
/**
|
|
40
53
|
* `consent` is the affirmative statement a member agrees to before the card
|
|
41
54
|
* form appears, rendered beside the checkbox and beneath the policy text.
|
|
@@ -43,7 +56,7 @@ interface ChapterCopy {
|
|
|
43
56
|
* agree rather than merely restating the policy. Set it to an empty string
|
|
44
57
|
* to render the checkbox with the policy as its only label.
|
|
45
58
|
*/
|
|
46
|
-
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
|
|
59
|
+
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent" | "foundingMember" | "foundingDiscount">;
|
|
47
60
|
done: TextFields<"label" | "calendarInvite" | "memberArea">;
|
|
48
61
|
accepted: TextFields<"label" | "body">;
|
|
49
62
|
gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed" | "claimTitle" | "claimBody" | "code" | "redeem" | "redeemed" | "redeemFailed">;
|
|
@@ -69,7 +82,7 @@ interface ChapterCopy {
|
|
|
69
82
|
meetings: TextFields<"loading" | "loadFailed" | "cancelConfirm" | "newStartPrompt" | "parseFailed" | "agenda" | "empty" | "unknown" | "drift" | "meet" | "reschedule" | "cancel">;
|
|
70
83
|
admission: TextFields<"title" | "description" | "email" | "decision" | "expires" | "note" | "waive" | "require" | "add" | "ledger" | "loading" | "consumed" | "revoked" | "expired" | "active" | "local" | "parent" | "revoke">;
|
|
71
84
|
network: AdminNetworkCopy;
|
|
72
|
-
records:
|
|
85
|
+
records: AdminRecordsCopy;
|
|
73
86
|
};
|
|
74
87
|
}
|
|
75
88
|
type DeepPartial<T> = T extends readonly (infer Item)[] ? readonly Item[] : T extends object ? {
|
|
@@ -880,6 +893,20 @@ interface IssuedMembershipOffer {
|
|
|
880
893
|
digest: string;
|
|
881
894
|
contract: MembershipCommercialOffer;
|
|
882
895
|
}
|
|
896
|
+
/** What a join page may show before anyone applies: the current promise, without coupon ids or cohort counts. */
|
|
897
|
+
interface MembershipOfferPreview {
|
|
898
|
+
skuId: string;
|
|
899
|
+
offeringVersionId: string;
|
|
900
|
+
basePriceCents: number;
|
|
901
|
+
currency: string;
|
|
902
|
+
interval: "month" | "year";
|
|
903
|
+
founding: boolean;
|
|
904
|
+
cohortLabel?: string;
|
|
905
|
+
dueTodayCents: number;
|
|
906
|
+
renewalCents: number;
|
|
907
|
+
discountDuration?: "first_term" | "while_active";
|
|
908
|
+
initialTermEndsAt?: number;
|
|
909
|
+
}
|
|
883
910
|
|
|
884
911
|
/** Server-owned source identity; the browser never supplies an offer or its price. */
|
|
885
912
|
interface MembershipQuoteTarget {
|
|
@@ -895,6 +922,19 @@ type MembershipOfferIssuer = (input: MembershipQuoteTarget & {
|
|
|
895
922
|
requestId: string;
|
|
896
923
|
}) => Promise<IssuedMembershipOffer>;
|
|
897
924
|
|
|
925
|
+
/** A fresh purchase generation for the same previously approved application and membership. */
|
|
926
|
+
type MembershipRestartInput = MembershipQuoteTarget & {
|
|
927
|
+
previousSubscriptionId: string;
|
|
928
|
+
};
|
|
929
|
+
/** Receipt authorizing a fresh checkout, never proof of payment or access. */
|
|
930
|
+
interface MembershipRestartReceipt {
|
|
931
|
+
applicationId: string;
|
|
932
|
+
membershipId: string;
|
|
933
|
+
restartId: string;
|
|
934
|
+
memberNumber: number;
|
|
935
|
+
status: "ready";
|
|
936
|
+
}
|
|
937
|
+
|
|
898
938
|
/** A consented offer, bound once to the follower's immutable provider Price and quote. */
|
|
899
939
|
interface MembershipCheckoutBindingInput extends MembershipQuoteTarget {
|
|
900
940
|
offerId: string;
|
|
@@ -956,6 +996,7 @@ interface MembershipAccessReceipt {
|
|
|
956
996
|
status: string;
|
|
957
997
|
accessEndsAt: number;
|
|
958
998
|
revision: number;
|
|
999
|
+
restartEligible?: boolean;
|
|
959
1000
|
}
|
|
960
1001
|
|
|
961
1002
|
/** Named-seat offer for the authenticated purchaser, not a transferable gift or arbitrary quantity. */
|
|
@@ -1006,9 +1047,11 @@ interface MembershipChapterEffect extends MembershipQuoteTarget {
|
|
|
1006
1047
|
seatId: string;
|
|
1007
1048
|
kind: "invite_named_recipient" | "grant_named_recipient_access" | "revoke_named_recipient_access";
|
|
1008
1049
|
}
|
|
1009
|
-
/** Recover provider effects
|
|
1050
|
+
/** Recover provider effects from durable state, independently of browser/webhook retries.
|
|
1010
1051
|
* The optional chapter adapter must return a durable, idempotent receipt. An absent adapter leaves work visibly pending.
|
|
1011
1052
|
* Provider HTTP timeouts, ambiguous receipts and scope conflicts never become success or an unbounded automatic retry loop.
|
|
1053
|
+
* An unaccepted seat is never refunded here: refunds are an operator decision (`refundNamedSeatByOperator`),
|
|
1054
|
+
* a recipient decline, a closed primary, or a provider-initiated refund.
|
|
1012
1055
|
*/
|
|
1013
1056
|
declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
1014
1057
|
scope: MembershipEffectScope;
|
|
@@ -1021,7 +1064,6 @@ declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
|
1021
1064
|
}, now: number): Promise<{
|
|
1022
1065
|
complete: number;
|
|
1023
1066
|
pending: number;
|
|
1024
|
-
expired: number;
|
|
1025
1067
|
more: boolean;
|
|
1026
1068
|
}>;
|
|
1027
1069
|
|
|
@@ -1036,6 +1078,22 @@ interface MembershipChapterEffectData extends MembershipChapterEffect {
|
|
|
1036
1078
|
applicable: boolean;
|
|
1037
1079
|
}
|
|
1038
1080
|
|
|
1081
|
+
/** Inputs supplied by an authenticated chapter backend; no browser credentials cross this edge. */
|
|
1082
|
+
interface RequestMembershipOfferOptions {
|
|
1083
|
+
secret: string;
|
|
1084
|
+
targetUrl: string;
|
|
1085
|
+
appId: string;
|
|
1086
|
+
chapterId: string;
|
|
1087
|
+
environment: string;
|
|
1088
|
+
runtime: string;
|
|
1089
|
+
applicationId: string;
|
|
1090
|
+
skuId: string;
|
|
1091
|
+
requestId: string;
|
|
1092
|
+
/** A configured service binding may replace public fetch, but must not fall back when absent. */
|
|
1093
|
+
fetch?: typeof globalThis.fetch;
|
|
1094
|
+
}
|
|
1095
|
+
/** Scope of a join-page preview; the browser never supplies it. */
|
|
1096
|
+
type MembershipOfferPreviewScope = Pick<RequestMembershipOfferOptions, "appId" | "chapterId" | "environment" | "runtime" | "skuId">;
|
|
1039
1097
|
/** Only the named buyer's prepared payment details; no network credentials or canonical PII. */
|
|
1040
1098
|
interface NamedSeatCheckoutReceipt {
|
|
1041
1099
|
seatId: string;
|
|
@@ -1123,6 +1181,8 @@ interface ChapterWorkerOptions {
|
|
|
1123
1181
|
* scope. Never implement these by promoting chapter-local projections to authority. */
|
|
1124
1182
|
membershipAuthority?: {
|
|
1125
1183
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1184
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1185
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1126
1186
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1127
1187
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1128
1188
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1130,6 +1190,8 @@ interface ChapterWorkerOptions {
|
|
|
1130
1190
|
reconcileRenewal: (input: MembershipQuoteTarget & {
|
|
1131
1191
|
eventId: string;
|
|
1132
1192
|
}, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1193
|
+
cancelRenewal?: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1194
|
+
restart?: (input: MembershipRestartInput, env: ChapterEnv) => Promise<MembershipRestartReceipt>;
|
|
1133
1195
|
readAccess: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipAccessReceipt>;
|
|
1134
1196
|
namedSeats?: {
|
|
1135
1197
|
offer: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<NamedSeatOffer>;
|
|
@@ -1152,8 +1214,18 @@ interface ChapterWorkerOptions {
|
|
|
1152
1214
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1153
1215
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1154
1216
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1217
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1218
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1219
|
+
seatId: string;
|
|
1220
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1155
1221
|
};
|
|
1156
1222
|
};
|
|
1223
|
+
/** Network owner only: operate the membership authority this Worker hosts (seat refunds by a super admin).
|
|
1224
|
+
* `makeDb` must return the authority storage mapping, never a chapter projection. */
|
|
1225
|
+
membershipAuthorityOperator?: {
|
|
1226
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1227
|
+
stripeSecretName?: string;
|
|
1228
|
+
};
|
|
1157
1229
|
/** CRM mount point. Default "/api/crm". */
|
|
1158
1230
|
crmBasePath?: string;
|
|
1159
1231
|
/** Host routes, tried BEFORE the built-ins — so a wrapping site can add its own
|
|
@@ -1189,6 +1261,8 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1189
1261
|
requirePaymentQuote: boolean;
|
|
1190
1262
|
membershipAuthority: {
|
|
1191
1263
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1264
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1265
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1192
1266
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1193
1267
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1194
1268
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1196,6 +1270,8 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1196
1270
|
reconcileRenewal: (input: MembershipQuoteTarget & {
|
|
1197
1271
|
eventId: string;
|
|
1198
1272
|
}, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1273
|
+
cancelRenewal?: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1274
|
+
restart?: (input: MembershipRestartInput, env: ChapterEnv) => Promise<MembershipRestartReceipt>;
|
|
1199
1275
|
readAccess: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipAccessReceipt>;
|
|
1200
1276
|
namedSeats?: {
|
|
1201
1277
|
offer: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<NamedSeatOffer>;
|
|
@@ -1218,8 +1294,16 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1218
1294
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1219
1295
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1220
1296
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1297
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1298
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1299
|
+
seatId: string;
|
|
1300
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1221
1301
|
};
|
|
1222
1302
|
} | undefined;
|
|
1303
|
+
membershipAuthorityOperator: {
|
|
1304
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1305
|
+
stripeSecretName?: string;
|
|
1306
|
+
} | undefined;
|
|
1223
1307
|
getPublicConfig: (env: ChapterEnv) => Promise<PublicConfig>;
|
|
1224
1308
|
verifyUser: (req: Request, env: ChapterEnv) => Promise<Verified | null>;
|
|
1225
1309
|
makeDb: (env: ChapterEnv) => Db;
|
|
@@ -1279,6 +1363,21 @@ declare function createMembershipAuthorityHandler(options: MembershipAuthorityHa
|
|
|
1279
1363
|
*/
|
|
1280
1364
|
declare function createMembershipAuthorityStorage(db: ChapterDb, secretNames: readonly string[]): ChapterDb;
|
|
1281
1365
|
|
|
1366
|
+
/** Identity of one purchased seat inside its exact network scope. */
|
|
1367
|
+
type NamedSeatOperatorRefundInput = MembershipQuoteTarget & {
|
|
1368
|
+
seatId: string;
|
|
1369
|
+
};
|
|
1370
|
+
/** Refund one purchased named seat because a verified super admin decided to.
|
|
1371
|
+
* Nothing here is automatic or time-driven: the caller has already authenticated
|
|
1372
|
+
* the operator on the chapter or on the network owner. The primary subscription
|
|
1373
|
+
* is never canceled; an accepted recipient loses access through the durable
|
|
1374
|
+
* revoke effect, and a replay after the refund is idempotent.
|
|
1375
|
+
*/
|
|
1376
|
+
declare function refundNamedSeatByOperator(db: ChapterDb, input: NamedSeatOperatorRefundInput, stripeSecretKey: string, now: number): Promise<NamedSeatRefundReceipt>;
|
|
1377
|
+
|
|
1378
|
+
/** Reasons a purchased seat may be refunded. No reason is time-driven: an unaccepted seat waits for a person. */
|
|
1379
|
+
type NamedSeatRefundReason = "declined" | "operator" | "primary_closed" | "provider_refund";
|
|
1380
|
+
|
|
1282
1381
|
type Row = Record<string, unknown>;
|
|
1283
1382
|
/** Host routes may reuse this gate after resolving a verified chapter/runtime account. */
|
|
1284
1383
|
declare function chapterMembershipAccess(db: ChapterDb, env: ChapterEnv, ctx: WorkerContext, app: Row): Promise<boolean>;
|
|
@@ -1897,4 +1996,4 @@ declare function chapterWorker(options: ChapterWorkerOptions): {
|
|
|
1897
1996
|
fetch(req: Request, env: ChapterEnv): Promise<Response>;
|
|
1898
1997
|
};
|
|
1899
1998
|
|
|
1900
|
-
export { type ActiveSignupControlHtml, type ActiveSignupControlThemeOptions, AdmissionGrantDeliveryError, type AdmissionGrantDeliveryOptions, type BuilderLibraryDeliveryOptions, type ChapterEnv, type ChapterWorkerOptions, type LeaderAdmissionAssignment, type LeaderAdmissionDelivery, type LeaderAdmissionDeliveryStatus, MEMBERSHIP_AUTHORITY_PATH, type MemberContentDeliveryOptions, type MembershipAuthorityHandlerOptions, type MembershipAuthorityPeer, type MembershipChapterEffect, type MembershipEffectScope, type MembershipWorkerAdapter, type MembershipWorkerAdapterOptions, type NetworkTargetTransport, NetworkTargetTransportError, type Route, type SignupControlDeliveryOptions, type WorkerContext, chapterMembershipAccess, chapterWorker, createMembershipAuthorityHandler, createMembershipAuthorityStorage, createMembershipChapterEffectRoute, createMembershipWorkerAdapter, createWorkerContext, deliverAdmissionGrants, deliverBuilderLibrary, deliverMemberContent, deliverMembershipChapterEffect, deliverSignupControl, drainMembershipEffects, renderActiveSignupControlHtml, resolveNetworkTargetTransport, retryChapterApprovalEffects, retryLeaderAdmissionDeliveries, withActiveSignupControlTheme };
|
|
1999
|
+
export { type ActiveSignupControlHtml, type ActiveSignupControlThemeOptions, AdmissionGrantDeliveryError, type AdmissionGrantDeliveryOptions, type BuilderLibraryDeliveryOptions, type ChapterEnv, type ChapterWorkerOptions, type LeaderAdmissionAssignment, type LeaderAdmissionDelivery, type LeaderAdmissionDeliveryStatus, MEMBERSHIP_AUTHORITY_PATH, type MemberContentDeliveryOptions, type MembershipAuthorityHandlerOptions, type MembershipAuthorityPeer, type MembershipChapterEffect, type MembershipEffectScope, type MembershipWorkerAdapter, type MembershipWorkerAdapterOptions, type NamedSeatOperatorRefundInput, type NamedSeatRefundReason, type NetworkTargetTransport, NetworkTargetTransportError, type Route, type SignupControlDeliveryOptions, type WorkerContext, chapterMembershipAccess, chapterWorker, createMembershipAuthorityHandler, createMembershipAuthorityStorage, createMembershipChapterEffectRoute, createMembershipWorkerAdapter, createWorkerContext, deliverAdmissionGrants, deliverBuilderLibrary, deliverMemberContent, deliverMembershipChapterEffect, deliverSignupControl, drainMembershipEffects, refundNamedSeatByOperator, renderActiveSignupControlHtml, resolveNetworkTargetTransport, retryChapterApprovalEffects, retryLeaderAdmissionDeliveries, withActiveSignupControlTheme };
|
package/dist/worker/index.d.ts
CHANGED
|
@@ -27,15 +27,28 @@ type TextFields$1<Key extends string> = {
|
|
|
27
27
|
/** User-visible language for sharing, delivery state, and leader rollups. */
|
|
28
28
|
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">;
|
|
29
29
|
|
|
30
|
+
/** Copy for the person record panels: lifecycle actions, comms, scheduling, billing and meetings. */
|
|
31
|
+
type AdminRecordsCopy = {
|
|
32
|
+
[Field in AdminRecordsCopyKey]: string;
|
|
33
|
+
};
|
|
34
|
+
/** Every key a host may override under `admin.records`. */
|
|
35
|
+
type AdminRecordsCopyKey = "workflowMissing" | "invitation" | "comms" | "commsHistory" | "scheduling" | "billing" | "notes" | "access" | "sharing" | "lifecycle" | "role" | "superAdminHint" | "noAccount" | "approve" | "refund" | "approved" | "refunded" | "roleSet" | "messageSent" | "messageNotSent" | "loadingTemplates" | "template" | "chooseTemplate" | "sending" | "send" | "noMessages" | "message" | "newStartPrompt" | "parseFailed" | "cancelConfirm" | "callCancelled" | "callRescheduled" | "noApplication" | "loadingMeetings" | "noMeetings" | "joinMeeting" | "openCalendar" | "reschedule" | "cancel";
|
|
36
|
+
|
|
30
37
|
type TextFields<Key extends string> = {
|
|
31
38
|
[Field in Key]: string;
|
|
32
39
|
};
|
|
40
|
+
|
|
33
41
|
/** Complete serializable language for Chapter surfaces; use render slots for markup and `formatChapterCopy()` for placeholders. */
|
|
34
42
|
interface ChapterCopy {
|
|
35
43
|
common: TextFields<"loading" | "saved" | "unknown">;
|
|
36
44
|
join: {
|
|
45
|
+
/** Prepaid invitation attribution, consent and recoverable error copy. */
|
|
46
|
+
namedSeat?: TextFields<"title" | "from" | "prepaid" | "body" | "consent" | "accept" | "accepting" | "loading" | "unavailable" | "retry" | "failure">;
|
|
37
47
|
form: TextFields<"submit" | "submitting" | "submitFailed" | "unexpectedFailure">;
|
|
38
|
-
booking: TextFields<"unavailable" | "loadFailed" | "slotTaken" | "failed" | "loading" | "book" | "booking"
|
|
48
|
+
booking: TextFields<"unavailable" | "loadFailed" | "slotTaken" | "failed" | "loading" | "book" | "booking"> & {
|
|
49
|
+
title?: string;
|
|
50
|
+
intro?: string;
|
|
51
|
+
};
|
|
39
52
|
/**
|
|
40
53
|
* `consent` is the affirmative statement a member agrees to before the card
|
|
41
54
|
* form appears, rendered beside the checkbox and beneath the policy text.
|
|
@@ -43,7 +56,7 @@ interface ChapterCopy {
|
|
|
43
56
|
* agree rather than merely restating the policy. Set it to an empty string
|
|
44
57
|
* to render the checkbox with the policy as its only label.
|
|
45
58
|
*/
|
|
46
|
-
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
|
|
59
|
+
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent" | "foundingMember" | "foundingDiscount">;
|
|
47
60
|
done: TextFields<"label" | "calendarInvite" | "memberArea">;
|
|
48
61
|
accepted: TextFields<"label" | "body">;
|
|
49
62
|
gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed" | "claimTitle" | "claimBody" | "code" | "redeem" | "redeemed" | "redeemFailed">;
|
|
@@ -69,7 +82,7 @@ interface ChapterCopy {
|
|
|
69
82
|
meetings: TextFields<"loading" | "loadFailed" | "cancelConfirm" | "newStartPrompt" | "parseFailed" | "agenda" | "empty" | "unknown" | "drift" | "meet" | "reschedule" | "cancel">;
|
|
70
83
|
admission: TextFields<"title" | "description" | "email" | "decision" | "expires" | "note" | "waive" | "require" | "add" | "ledger" | "loading" | "consumed" | "revoked" | "expired" | "active" | "local" | "parent" | "revoke">;
|
|
71
84
|
network: AdminNetworkCopy;
|
|
72
|
-
records:
|
|
85
|
+
records: AdminRecordsCopy;
|
|
73
86
|
};
|
|
74
87
|
}
|
|
75
88
|
type DeepPartial<T> = T extends readonly (infer Item)[] ? readonly Item[] : T extends object ? {
|
|
@@ -880,6 +893,20 @@ interface IssuedMembershipOffer {
|
|
|
880
893
|
digest: string;
|
|
881
894
|
contract: MembershipCommercialOffer;
|
|
882
895
|
}
|
|
896
|
+
/** What a join page may show before anyone applies: the current promise, without coupon ids or cohort counts. */
|
|
897
|
+
interface MembershipOfferPreview {
|
|
898
|
+
skuId: string;
|
|
899
|
+
offeringVersionId: string;
|
|
900
|
+
basePriceCents: number;
|
|
901
|
+
currency: string;
|
|
902
|
+
interval: "month" | "year";
|
|
903
|
+
founding: boolean;
|
|
904
|
+
cohortLabel?: string;
|
|
905
|
+
dueTodayCents: number;
|
|
906
|
+
renewalCents: number;
|
|
907
|
+
discountDuration?: "first_term" | "while_active";
|
|
908
|
+
initialTermEndsAt?: number;
|
|
909
|
+
}
|
|
883
910
|
|
|
884
911
|
/** Server-owned source identity; the browser never supplies an offer or its price. */
|
|
885
912
|
interface MembershipQuoteTarget {
|
|
@@ -895,6 +922,19 @@ type MembershipOfferIssuer = (input: MembershipQuoteTarget & {
|
|
|
895
922
|
requestId: string;
|
|
896
923
|
}) => Promise<IssuedMembershipOffer>;
|
|
897
924
|
|
|
925
|
+
/** A fresh purchase generation for the same previously approved application and membership. */
|
|
926
|
+
type MembershipRestartInput = MembershipQuoteTarget & {
|
|
927
|
+
previousSubscriptionId: string;
|
|
928
|
+
};
|
|
929
|
+
/** Receipt authorizing a fresh checkout, never proof of payment or access. */
|
|
930
|
+
interface MembershipRestartReceipt {
|
|
931
|
+
applicationId: string;
|
|
932
|
+
membershipId: string;
|
|
933
|
+
restartId: string;
|
|
934
|
+
memberNumber: number;
|
|
935
|
+
status: "ready";
|
|
936
|
+
}
|
|
937
|
+
|
|
898
938
|
/** A consented offer, bound once to the follower's immutable provider Price and quote. */
|
|
899
939
|
interface MembershipCheckoutBindingInput extends MembershipQuoteTarget {
|
|
900
940
|
offerId: string;
|
|
@@ -956,6 +996,7 @@ interface MembershipAccessReceipt {
|
|
|
956
996
|
status: string;
|
|
957
997
|
accessEndsAt: number;
|
|
958
998
|
revision: number;
|
|
999
|
+
restartEligible?: boolean;
|
|
959
1000
|
}
|
|
960
1001
|
|
|
961
1002
|
/** Named-seat offer for the authenticated purchaser, not a transferable gift or arbitrary quantity. */
|
|
@@ -1006,9 +1047,11 @@ interface MembershipChapterEffect extends MembershipQuoteTarget {
|
|
|
1006
1047
|
seatId: string;
|
|
1007
1048
|
kind: "invite_named_recipient" | "grant_named_recipient_access" | "revoke_named_recipient_access";
|
|
1008
1049
|
}
|
|
1009
|
-
/** Recover provider effects
|
|
1050
|
+
/** Recover provider effects from durable state, independently of browser/webhook retries.
|
|
1010
1051
|
* The optional chapter adapter must return a durable, idempotent receipt. An absent adapter leaves work visibly pending.
|
|
1011
1052
|
* Provider HTTP timeouts, ambiguous receipts and scope conflicts never become success or an unbounded automatic retry loop.
|
|
1053
|
+
* An unaccepted seat is never refunded here: refunds are an operator decision (`refundNamedSeatByOperator`),
|
|
1054
|
+
* a recipient decline, a closed primary, or a provider-initiated refund.
|
|
1012
1055
|
*/
|
|
1013
1056
|
declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
1014
1057
|
scope: MembershipEffectScope;
|
|
@@ -1021,7 +1064,6 @@ declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
|
1021
1064
|
}, now: number): Promise<{
|
|
1022
1065
|
complete: number;
|
|
1023
1066
|
pending: number;
|
|
1024
|
-
expired: number;
|
|
1025
1067
|
more: boolean;
|
|
1026
1068
|
}>;
|
|
1027
1069
|
|
|
@@ -1036,6 +1078,22 @@ interface MembershipChapterEffectData extends MembershipChapterEffect {
|
|
|
1036
1078
|
applicable: boolean;
|
|
1037
1079
|
}
|
|
1038
1080
|
|
|
1081
|
+
/** Inputs supplied by an authenticated chapter backend; no browser credentials cross this edge. */
|
|
1082
|
+
interface RequestMembershipOfferOptions {
|
|
1083
|
+
secret: string;
|
|
1084
|
+
targetUrl: string;
|
|
1085
|
+
appId: string;
|
|
1086
|
+
chapterId: string;
|
|
1087
|
+
environment: string;
|
|
1088
|
+
runtime: string;
|
|
1089
|
+
applicationId: string;
|
|
1090
|
+
skuId: string;
|
|
1091
|
+
requestId: string;
|
|
1092
|
+
/** A configured service binding may replace public fetch, but must not fall back when absent. */
|
|
1093
|
+
fetch?: typeof globalThis.fetch;
|
|
1094
|
+
}
|
|
1095
|
+
/** Scope of a join-page preview; the browser never supplies it. */
|
|
1096
|
+
type MembershipOfferPreviewScope = Pick<RequestMembershipOfferOptions, "appId" | "chapterId" | "environment" | "runtime" | "skuId">;
|
|
1039
1097
|
/** Only the named buyer's prepared payment details; no network credentials or canonical PII. */
|
|
1040
1098
|
interface NamedSeatCheckoutReceipt {
|
|
1041
1099
|
seatId: string;
|
|
@@ -1123,6 +1181,8 @@ interface ChapterWorkerOptions {
|
|
|
1123
1181
|
* scope. Never implement these by promoting chapter-local projections to authority. */
|
|
1124
1182
|
membershipAuthority?: {
|
|
1125
1183
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1184
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1185
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1126
1186
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1127
1187
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1128
1188
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1130,6 +1190,8 @@ interface ChapterWorkerOptions {
|
|
|
1130
1190
|
reconcileRenewal: (input: MembershipQuoteTarget & {
|
|
1131
1191
|
eventId: string;
|
|
1132
1192
|
}, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1193
|
+
cancelRenewal?: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1194
|
+
restart?: (input: MembershipRestartInput, env: ChapterEnv) => Promise<MembershipRestartReceipt>;
|
|
1133
1195
|
readAccess: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipAccessReceipt>;
|
|
1134
1196
|
namedSeats?: {
|
|
1135
1197
|
offer: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<NamedSeatOffer>;
|
|
@@ -1152,8 +1214,18 @@ interface ChapterWorkerOptions {
|
|
|
1152
1214
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1153
1215
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1154
1216
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1217
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1218
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1219
|
+
seatId: string;
|
|
1220
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1155
1221
|
};
|
|
1156
1222
|
};
|
|
1223
|
+
/** Network owner only: operate the membership authority this Worker hosts (seat refunds by a super admin).
|
|
1224
|
+
* `makeDb` must return the authority storage mapping, never a chapter projection. */
|
|
1225
|
+
membershipAuthorityOperator?: {
|
|
1226
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1227
|
+
stripeSecretName?: string;
|
|
1228
|
+
};
|
|
1157
1229
|
/** CRM mount point. Default "/api/crm". */
|
|
1158
1230
|
crmBasePath?: string;
|
|
1159
1231
|
/** Host routes, tried BEFORE the built-ins — so a wrapping site can add its own
|
|
@@ -1189,6 +1261,8 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1189
1261
|
requirePaymentQuote: boolean;
|
|
1190
1262
|
membershipAuthority: {
|
|
1191
1263
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1264
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1265
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1192
1266
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1193
1267
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1194
1268
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1196,6 +1270,8 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1196
1270
|
reconcileRenewal: (input: MembershipQuoteTarget & {
|
|
1197
1271
|
eventId: string;
|
|
1198
1272
|
}, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1273
|
+
cancelRenewal?: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipRenewalReceipt>;
|
|
1274
|
+
restart?: (input: MembershipRestartInput, env: ChapterEnv) => Promise<MembershipRestartReceipt>;
|
|
1199
1275
|
readAccess: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipAccessReceipt>;
|
|
1200
1276
|
namedSeats?: {
|
|
1201
1277
|
offer: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<NamedSeatOffer>;
|
|
@@ -1218,8 +1294,16 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1218
1294
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1219
1295
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1220
1296
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1297
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1298
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1299
|
+
seatId: string;
|
|
1300
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1221
1301
|
};
|
|
1222
1302
|
} | undefined;
|
|
1303
|
+
membershipAuthorityOperator: {
|
|
1304
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1305
|
+
stripeSecretName?: string;
|
|
1306
|
+
} | undefined;
|
|
1223
1307
|
getPublicConfig: (env: ChapterEnv) => Promise<PublicConfig>;
|
|
1224
1308
|
verifyUser: (req: Request, env: ChapterEnv) => Promise<Verified | null>;
|
|
1225
1309
|
makeDb: (env: ChapterEnv) => Db;
|
|
@@ -1279,6 +1363,21 @@ declare function createMembershipAuthorityHandler(options: MembershipAuthorityHa
|
|
|
1279
1363
|
*/
|
|
1280
1364
|
declare function createMembershipAuthorityStorage(db: ChapterDb, secretNames: readonly string[]): ChapterDb;
|
|
1281
1365
|
|
|
1366
|
+
/** Identity of one purchased seat inside its exact network scope. */
|
|
1367
|
+
type NamedSeatOperatorRefundInput = MembershipQuoteTarget & {
|
|
1368
|
+
seatId: string;
|
|
1369
|
+
};
|
|
1370
|
+
/** Refund one purchased named seat because a verified super admin decided to.
|
|
1371
|
+
* Nothing here is automatic or time-driven: the caller has already authenticated
|
|
1372
|
+
* the operator on the chapter or on the network owner. The primary subscription
|
|
1373
|
+
* is never canceled; an accepted recipient loses access through the durable
|
|
1374
|
+
* revoke effect, and a replay after the refund is idempotent.
|
|
1375
|
+
*/
|
|
1376
|
+
declare function refundNamedSeatByOperator(db: ChapterDb, input: NamedSeatOperatorRefundInput, stripeSecretKey: string, now: number): Promise<NamedSeatRefundReceipt>;
|
|
1377
|
+
|
|
1378
|
+
/** Reasons a purchased seat may be refunded. No reason is time-driven: an unaccepted seat waits for a person. */
|
|
1379
|
+
type NamedSeatRefundReason = "declined" | "operator" | "primary_closed" | "provider_refund";
|
|
1380
|
+
|
|
1282
1381
|
type Row = Record<string, unknown>;
|
|
1283
1382
|
/** Host routes may reuse this gate after resolving a verified chapter/runtime account. */
|
|
1284
1383
|
declare function chapterMembershipAccess(db: ChapterDb, env: ChapterEnv, ctx: WorkerContext, app: Row): Promise<boolean>;
|
|
@@ -1897,4 +1996,4 @@ declare function chapterWorker(options: ChapterWorkerOptions): {
|
|
|
1897
1996
|
fetch(req: Request, env: ChapterEnv): Promise<Response>;
|
|
1898
1997
|
};
|
|
1899
1998
|
|
|
1900
|
-
export { type ActiveSignupControlHtml, type ActiveSignupControlThemeOptions, AdmissionGrantDeliveryError, type AdmissionGrantDeliveryOptions, type BuilderLibraryDeliveryOptions, type ChapterEnv, type ChapterWorkerOptions, type LeaderAdmissionAssignment, type LeaderAdmissionDelivery, type LeaderAdmissionDeliveryStatus, MEMBERSHIP_AUTHORITY_PATH, type MemberContentDeliveryOptions, type MembershipAuthorityHandlerOptions, type MembershipAuthorityPeer, type MembershipChapterEffect, type MembershipEffectScope, type MembershipWorkerAdapter, type MembershipWorkerAdapterOptions, type NetworkTargetTransport, NetworkTargetTransportError, type Route, type SignupControlDeliveryOptions, type WorkerContext, chapterMembershipAccess, chapterWorker, createMembershipAuthorityHandler, createMembershipAuthorityStorage, createMembershipChapterEffectRoute, createMembershipWorkerAdapter, createWorkerContext, deliverAdmissionGrants, deliverBuilderLibrary, deliverMemberContent, deliverMembershipChapterEffect, deliverSignupControl, drainMembershipEffects, renderActiveSignupControlHtml, resolveNetworkTargetTransport, retryChapterApprovalEffects, retryLeaderAdmissionDeliveries, withActiveSignupControlTheme };
|
|
1999
|
+
export { type ActiveSignupControlHtml, type ActiveSignupControlThemeOptions, AdmissionGrantDeliveryError, type AdmissionGrantDeliveryOptions, type BuilderLibraryDeliveryOptions, type ChapterEnv, type ChapterWorkerOptions, type LeaderAdmissionAssignment, type LeaderAdmissionDelivery, type LeaderAdmissionDeliveryStatus, MEMBERSHIP_AUTHORITY_PATH, type MemberContentDeliveryOptions, type MembershipAuthorityHandlerOptions, type MembershipAuthorityPeer, type MembershipChapterEffect, type MembershipEffectScope, type MembershipWorkerAdapter, type MembershipWorkerAdapterOptions, type NamedSeatOperatorRefundInput, type NamedSeatRefundReason, type NetworkTargetTransport, NetworkTargetTransportError, type Route, type SignupControlDeliveryOptions, type WorkerContext, chapterMembershipAccess, chapterWorker, createMembershipAuthorityHandler, createMembershipAuthorityStorage, createMembershipChapterEffectRoute, createMembershipWorkerAdapter, createWorkerContext, deliverAdmissionGrants, deliverBuilderLibrary, deliverMemberContent, deliverMembershipChapterEffect, deliverSignupControl, drainMembershipEffects, refundNamedSeatByOperator, renderActiveSignupControlHtml, resolveNetworkTargetTransport, retryChapterApprovalEffects, retryLeaderAdmissionDeliveries, withActiveSignupControlTheme };
|