@odla-ai/chapter 0.49.0 → 0.51.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 +36 -2
- package/dist/{chunk-KXIGZWG5.js → chunk-4EA5V4JE.js} +855 -614
- package/dist/chunk-4EA5V4JE.js.map +1 -0
- package/dist/{chunk-N2JIKINY.js → chunk-JXX4BFDP.js} +5 -2
- package/dist/chunk-JXX4BFDP.js.map +1 -0
- package/dist/{chunk-KHDO2QFA.js → chunk-UAXWA5BL.js} +36 -24
- package/dist/chunk-UAXWA5BL.js.map +1 -0
- package/dist/{copy-context-By4Nq7yB.d.ts → copy-context-Ddat__H5.d.ts} +10 -2
- package/dist/index.cjs +129 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +59 -7
- package/dist/index.d.ts +59 -7
- package/dist/index.js +129 -54
- package/dist/index.js.map +1 -1
- package/dist/ui/admin/index.d.ts +54 -6
- package/dist/ui/admin/index.js +10 -2
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +11 -3
- package/dist/ui/member/index.d.ts +10 -2
- package/dist/ui/member/index.js +2 -2
- package/dist/worker/index.cjs +588 -272
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +86 -6
- package/dist/worker/index.d.ts +86 -6
- package/dist/worker/index.js +582 -266
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-KHDO2QFA.js.map +0 -1
- package/dist/chunk-KXIGZWG5.js.map +0 -1
- package/dist/chunk-N2JIKINY.js.map +0 -1
package/dist/worker/index.d.cts
CHANGED
|
@@ -27,9 +27,17 @@ 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">;
|
|
@@ -48,7 +56,7 @@ interface ChapterCopy {
|
|
|
48
56
|
* agree rather than merely restating the policy. Set it to an empty string
|
|
49
57
|
* to render the checkbox with the policy as its only label.
|
|
50
58
|
*/
|
|
51
|
-
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
|
|
59
|
+
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent" | "foundingMember" | "foundingDiscount">;
|
|
52
60
|
done: TextFields<"label" | "calendarInvite" | "memberArea">;
|
|
53
61
|
accepted: TextFields<"label" | "body">;
|
|
54
62
|
gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed" | "claimTitle" | "claimBody" | "code" | "redeem" | "redeemed" | "redeemFailed">;
|
|
@@ -74,7 +82,7 @@ interface ChapterCopy {
|
|
|
74
82
|
meetings: TextFields<"loading" | "loadFailed" | "cancelConfirm" | "newStartPrompt" | "parseFailed" | "agenda" | "empty" | "unknown" | "drift" | "meet" | "reschedule" | "cancel">;
|
|
75
83
|
admission: TextFields<"title" | "description" | "email" | "decision" | "expires" | "note" | "waive" | "require" | "add" | "ledger" | "loading" | "consumed" | "revoked" | "expired" | "active" | "local" | "parent" | "revoke">;
|
|
76
84
|
network: AdminNetworkCopy;
|
|
77
|
-
records:
|
|
85
|
+
records: AdminRecordsCopy;
|
|
78
86
|
};
|
|
79
87
|
}
|
|
80
88
|
type DeepPartial<T> = T extends readonly (infer Item)[] ? readonly Item[] : T extends object ? {
|
|
@@ -834,7 +842,9 @@ interface MembershipOfferingVersion {
|
|
|
834
842
|
autoRenew: true;
|
|
835
843
|
paymentGraceDays: number;
|
|
836
844
|
seatPriceCents: number;
|
|
837
|
-
|
|
845
|
+
/** Calendar months after the initial payment during which a seat may be bought. Absent: no window; a seat
|
|
846
|
+
* may be bought whenever the primary membership is paid and active, renewals included. */
|
|
847
|
+
seatPurchaseWindowCalendarMonths?: number;
|
|
838
848
|
requiredDisclosures: string[];
|
|
839
849
|
}
|
|
840
850
|
/** Cohort qualification survives the expiration of its monetary benefit. */
|
|
@@ -885,6 +895,20 @@ interface IssuedMembershipOffer {
|
|
|
885
895
|
digest: string;
|
|
886
896
|
contract: MembershipCommercialOffer;
|
|
887
897
|
}
|
|
898
|
+
/** What a join page may show before anyone applies: the current promise, without coupon ids or cohort counts. */
|
|
899
|
+
interface MembershipOfferPreview {
|
|
900
|
+
skuId: string;
|
|
901
|
+
offeringVersionId: string;
|
|
902
|
+
basePriceCents: number;
|
|
903
|
+
currency: string;
|
|
904
|
+
interval: "month" | "year";
|
|
905
|
+
founding: boolean;
|
|
906
|
+
cohortLabel?: string;
|
|
907
|
+
dueTodayCents: number;
|
|
908
|
+
renewalCents: number;
|
|
909
|
+
discountDuration?: "first_term" | "while_active";
|
|
910
|
+
initialTermEndsAt?: number;
|
|
911
|
+
}
|
|
888
912
|
|
|
889
913
|
/** Server-owned source identity; the browser never supplies an offer or its price. */
|
|
890
914
|
interface MembershipQuoteTarget {
|
|
@@ -988,6 +1012,8 @@ interface NamedSeatOffer {
|
|
|
988
1012
|
autoRenew: boolean;
|
|
989
1013
|
eligible: boolean;
|
|
990
1014
|
digest: string;
|
|
1015
|
+
/** False when the frozen offering sets no purchase window: seats may be bought for as long as the membership is paid. */
|
|
1016
|
+
purchaseWindowed?: boolean;
|
|
991
1017
|
seat?: {
|
|
992
1018
|
seatId: string;
|
|
993
1019
|
status: string;
|
|
@@ -1025,9 +1051,11 @@ interface MembershipChapterEffect extends MembershipQuoteTarget {
|
|
|
1025
1051
|
seatId: string;
|
|
1026
1052
|
kind: "invite_named_recipient" | "grant_named_recipient_access" | "revoke_named_recipient_access";
|
|
1027
1053
|
}
|
|
1028
|
-
/** Recover provider effects
|
|
1054
|
+
/** Recover provider effects from durable state, independently of browser/webhook retries.
|
|
1029
1055
|
* The optional chapter adapter must return a durable, idempotent receipt. An absent adapter leaves work visibly pending.
|
|
1030
1056
|
* Provider HTTP timeouts, ambiguous receipts and scope conflicts never become success or an unbounded automatic retry loop.
|
|
1057
|
+
* An unaccepted seat is never refunded here: refunds are an operator decision (`refundNamedSeatByOperator`),
|
|
1058
|
+
* a recipient decline, a closed primary, or a provider-initiated refund.
|
|
1031
1059
|
*/
|
|
1032
1060
|
declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
1033
1061
|
scope: MembershipEffectScope;
|
|
@@ -1040,7 +1068,6 @@ declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
|
1040
1068
|
}, now: number): Promise<{
|
|
1041
1069
|
complete: number;
|
|
1042
1070
|
pending: number;
|
|
1043
|
-
expired: number;
|
|
1044
1071
|
more: boolean;
|
|
1045
1072
|
}>;
|
|
1046
1073
|
|
|
@@ -1055,6 +1082,22 @@ interface MembershipChapterEffectData extends MembershipChapterEffect {
|
|
|
1055
1082
|
applicable: boolean;
|
|
1056
1083
|
}
|
|
1057
1084
|
|
|
1085
|
+
/** Inputs supplied by an authenticated chapter backend; no browser credentials cross this edge. */
|
|
1086
|
+
interface RequestMembershipOfferOptions {
|
|
1087
|
+
secret: string;
|
|
1088
|
+
targetUrl: string;
|
|
1089
|
+
appId: string;
|
|
1090
|
+
chapterId: string;
|
|
1091
|
+
environment: string;
|
|
1092
|
+
runtime: string;
|
|
1093
|
+
applicationId: string;
|
|
1094
|
+
skuId: string;
|
|
1095
|
+
requestId: string;
|
|
1096
|
+
/** A configured service binding may replace public fetch, but must not fall back when absent. */
|
|
1097
|
+
fetch?: typeof globalThis.fetch;
|
|
1098
|
+
}
|
|
1099
|
+
/** Scope of a join-page preview; the browser never supplies it. */
|
|
1100
|
+
type MembershipOfferPreviewScope = Pick<RequestMembershipOfferOptions, "appId" | "chapterId" | "environment" | "runtime" | "skuId">;
|
|
1058
1101
|
/** Only the named buyer's prepared payment details; no network credentials or canonical PII. */
|
|
1059
1102
|
interface NamedSeatCheckoutReceipt {
|
|
1060
1103
|
seatId: string;
|
|
@@ -1142,6 +1185,8 @@ interface ChapterWorkerOptions {
|
|
|
1142
1185
|
* scope. Never implement these by promoting chapter-local projections to authority. */
|
|
1143
1186
|
membershipAuthority?: {
|
|
1144
1187
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1188
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1189
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1145
1190
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1146
1191
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1147
1192
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1173,8 +1218,18 @@ interface ChapterWorkerOptions {
|
|
|
1173
1218
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1174
1219
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1175
1220
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1221
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1222
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1223
|
+
seatId: string;
|
|
1224
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1176
1225
|
};
|
|
1177
1226
|
};
|
|
1227
|
+
/** Network owner only: operate the membership authority this Worker hosts (seat refunds by a super admin).
|
|
1228
|
+
* `makeDb` must return the authority storage mapping, never a chapter projection. */
|
|
1229
|
+
membershipAuthorityOperator?: {
|
|
1230
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1231
|
+
stripeSecretName?: string;
|
|
1232
|
+
};
|
|
1178
1233
|
/** CRM mount point. Default "/api/crm". */
|
|
1179
1234
|
crmBasePath?: string;
|
|
1180
1235
|
/** Host routes, tried BEFORE the built-ins — so a wrapping site can add its own
|
|
@@ -1210,6 +1265,8 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1210
1265
|
requirePaymentQuote: boolean;
|
|
1211
1266
|
membershipAuthority: {
|
|
1212
1267
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1268
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1269
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1213
1270
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1214
1271
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1215
1272
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1241,8 +1298,16 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1241
1298
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1242
1299
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1243
1300
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1301
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1302
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1303
|
+
seatId: string;
|
|
1304
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1244
1305
|
};
|
|
1245
1306
|
} | undefined;
|
|
1307
|
+
membershipAuthorityOperator: {
|
|
1308
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1309
|
+
stripeSecretName?: string;
|
|
1310
|
+
} | undefined;
|
|
1246
1311
|
getPublicConfig: (env: ChapterEnv) => Promise<PublicConfig>;
|
|
1247
1312
|
verifyUser: (req: Request, env: ChapterEnv) => Promise<Verified | null>;
|
|
1248
1313
|
makeDb: (env: ChapterEnv) => Db;
|
|
@@ -1302,6 +1367,21 @@ declare function createMembershipAuthorityHandler(options: MembershipAuthorityHa
|
|
|
1302
1367
|
*/
|
|
1303
1368
|
declare function createMembershipAuthorityStorage(db: ChapterDb, secretNames: readonly string[]): ChapterDb;
|
|
1304
1369
|
|
|
1370
|
+
/** Identity of one purchased seat inside its exact network scope. */
|
|
1371
|
+
type NamedSeatOperatorRefundInput = MembershipQuoteTarget & {
|
|
1372
|
+
seatId: string;
|
|
1373
|
+
};
|
|
1374
|
+
/** Refund one purchased named seat because a verified super admin decided to.
|
|
1375
|
+
* Nothing here is automatic or time-driven: the caller has already authenticated
|
|
1376
|
+
* the operator on the chapter or on the network owner. The primary subscription
|
|
1377
|
+
* is never canceled; an accepted recipient loses access through the durable
|
|
1378
|
+
* revoke effect, and a replay after the refund is idempotent.
|
|
1379
|
+
*/
|
|
1380
|
+
declare function refundNamedSeatByOperator(db: ChapterDb, input: NamedSeatOperatorRefundInput, stripeSecretKey: string, now: number): Promise<NamedSeatRefundReceipt>;
|
|
1381
|
+
|
|
1382
|
+
/** Reasons a purchased seat may be refunded. No reason is time-driven: an unaccepted seat waits for a person. */
|
|
1383
|
+
type NamedSeatRefundReason = "declined" | "operator" | "primary_closed" | "provider_refund";
|
|
1384
|
+
|
|
1305
1385
|
type Row = Record<string, unknown>;
|
|
1306
1386
|
/** Host routes may reuse this gate after resolving a verified chapter/runtime account. */
|
|
1307
1387
|
declare function chapterMembershipAccess(db: ChapterDb, env: ChapterEnv, ctx: WorkerContext, app: Row): Promise<boolean>;
|
|
@@ -1920,4 +2000,4 @@ declare function chapterWorker(options: ChapterWorkerOptions): {
|
|
|
1920
2000
|
fetch(req: Request, env: ChapterEnv): Promise<Response>;
|
|
1921
2001
|
};
|
|
1922
2002
|
|
|
1923
|
-
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 };
|
|
2003
|
+
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,9 +27,17 @@ 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">;
|
|
@@ -48,7 +56,7 @@ interface ChapterCopy {
|
|
|
48
56
|
* agree rather than merely restating the policy. Set it to an empty string
|
|
49
57
|
* to render the checkbox with the policy as its only label.
|
|
50
58
|
*/
|
|
51
|
-
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
|
|
59
|
+
payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent" | "foundingMember" | "foundingDiscount">;
|
|
52
60
|
done: TextFields<"label" | "calendarInvite" | "memberArea">;
|
|
53
61
|
accepted: TextFields<"label" | "body">;
|
|
54
62
|
gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed" | "claimTitle" | "claimBody" | "code" | "redeem" | "redeemed" | "redeemFailed">;
|
|
@@ -74,7 +82,7 @@ interface ChapterCopy {
|
|
|
74
82
|
meetings: TextFields<"loading" | "loadFailed" | "cancelConfirm" | "newStartPrompt" | "parseFailed" | "agenda" | "empty" | "unknown" | "drift" | "meet" | "reschedule" | "cancel">;
|
|
75
83
|
admission: TextFields<"title" | "description" | "email" | "decision" | "expires" | "note" | "waive" | "require" | "add" | "ledger" | "loading" | "consumed" | "revoked" | "expired" | "active" | "local" | "parent" | "revoke">;
|
|
76
84
|
network: AdminNetworkCopy;
|
|
77
|
-
records:
|
|
85
|
+
records: AdminRecordsCopy;
|
|
78
86
|
};
|
|
79
87
|
}
|
|
80
88
|
type DeepPartial<T> = T extends readonly (infer Item)[] ? readonly Item[] : T extends object ? {
|
|
@@ -834,7 +842,9 @@ interface MembershipOfferingVersion {
|
|
|
834
842
|
autoRenew: true;
|
|
835
843
|
paymentGraceDays: number;
|
|
836
844
|
seatPriceCents: number;
|
|
837
|
-
|
|
845
|
+
/** Calendar months after the initial payment during which a seat may be bought. Absent: no window; a seat
|
|
846
|
+
* may be bought whenever the primary membership is paid and active, renewals included. */
|
|
847
|
+
seatPurchaseWindowCalendarMonths?: number;
|
|
838
848
|
requiredDisclosures: string[];
|
|
839
849
|
}
|
|
840
850
|
/** Cohort qualification survives the expiration of its monetary benefit. */
|
|
@@ -885,6 +895,20 @@ interface IssuedMembershipOffer {
|
|
|
885
895
|
digest: string;
|
|
886
896
|
contract: MembershipCommercialOffer;
|
|
887
897
|
}
|
|
898
|
+
/** What a join page may show before anyone applies: the current promise, without coupon ids or cohort counts. */
|
|
899
|
+
interface MembershipOfferPreview {
|
|
900
|
+
skuId: string;
|
|
901
|
+
offeringVersionId: string;
|
|
902
|
+
basePriceCents: number;
|
|
903
|
+
currency: string;
|
|
904
|
+
interval: "month" | "year";
|
|
905
|
+
founding: boolean;
|
|
906
|
+
cohortLabel?: string;
|
|
907
|
+
dueTodayCents: number;
|
|
908
|
+
renewalCents: number;
|
|
909
|
+
discountDuration?: "first_term" | "while_active";
|
|
910
|
+
initialTermEndsAt?: number;
|
|
911
|
+
}
|
|
888
912
|
|
|
889
913
|
/** Server-owned source identity; the browser never supplies an offer or its price. */
|
|
890
914
|
interface MembershipQuoteTarget {
|
|
@@ -988,6 +1012,8 @@ interface NamedSeatOffer {
|
|
|
988
1012
|
autoRenew: boolean;
|
|
989
1013
|
eligible: boolean;
|
|
990
1014
|
digest: string;
|
|
1015
|
+
/** False when the frozen offering sets no purchase window: seats may be bought for as long as the membership is paid. */
|
|
1016
|
+
purchaseWindowed?: boolean;
|
|
991
1017
|
seat?: {
|
|
992
1018
|
seatId: string;
|
|
993
1019
|
status: string;
|
|
@@ -1025,9 +1051,11 @@ interface MembershipChapterEffect extends MembershipQuoteTarget {
|
|
|
1025
1051
|
seatId: string;
|
|
1026
1052
|
kind: "invite_named_recipient" | "grant_named_recipient_access" | "revoke_named_recipient_access";
|
|
1027
1053
|
}
|
|
1028
|
-
/** Recover provider effects
|
|
1054
|
+
/** Recover provider effects from durable state, independently of browser/webhook retries.
|
|
1029
1055
|
* The optional chapter adapter must return a durable, idempotent receipt. An absent adapter leaves work visibly pending.
|
|
1030
1056
|
* Provider HTTP timeouts, ambiguous receipts and scope conflicts never become success or an unbounded automatic retry loop.
|
|
1057
|
+
* An unaccepted seat is never refunded here: refunds are an operator decision (`refundNamedSeatByOperator`),
|
|
1058
|
+
* a recipient decline, a closed primary, or a provider-initiated refund.
|
|
1031
1059
|
*/
|
|
1032
1060
|
declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
1033
1061
|
scope: MembershipEffectScope;
|
|
@@ -1040,7 +1068,6 @@ declare function drainMembershipEffects(db: ChapterDb, options: {
|
|
|
1040
1068
|
}, now: number): Promise<{
|
|
1041
1069
|
complete: number;
|
|
1042
1070
|
pending: number;
|
|
1043
|
-
expired: number;
|
|
1044
1071
|
more: boolean;
|
|
1045
1072
|
}>;
|
|
1046
1073
|
|
|
@@ -1055,6 +1082,22 @@ interface MembershipChapterEffectData extends MembershipChapterEffect {
|
|
|
1055
1082
|
applicable: boolean;
|
|
1056
1083
|
}
|
|
1057
1084
|
|
|
1085
|
+
/** Inputs supplied by an authenticated chapter backend; no browser credentials cross this edge. */
|
|
1086
|
+
interface RequestMembershipOfferOptions {
|
|
1087
|
+
secret: string;
|
|
1088
|
+
targetUrl: string;
|
|
1089
|
+
appId: string;
|
|
1090
|
+
chapterId: string;
|
|
1091
|
+
environment: string;
|
|
1092
|
+
runtime: string;
|
|
1093
|
+
applicationId: string;
|
|
1094
|
+
skuId: string;
|
|
1095
|
+
requestId: string;
|
|
1096
|
+
/** A configured service binding may replace public fetch, but must not fall back when absent. */
|
|
1097
|
+
fetch?: typeof globalThis.fetch;
|
|
1098
|
+
}
|
|
1099
|
+
/** Scope of a join-page preview; the browser never supplies it. */
|
|
1100
|
+
type MembershipOfferPreviewScope = Pick<RequestMembershipOfferOptions, "appId" | "chapterId" | "environment" | "runtime" | "skuId">;
|
|
1058
1101
|
/** Only the named buyer's prepared payment details; no network credentials or canonical PII. */
|
|
1059
1102
|
interface NamedSeatCheckoutReceipt {
|
|
1060
1103
|
seatId: string;
|
|
@@ -1142,6 +1185,8 @@ interface ChapterWorkerOptions {
|
|
|
1142
1185
|
* scope. Never implement these by promoting chapter-local projections to authority. */
|
|
1143
1186
|
membershipAuthority?: {
|
|
1144
1187
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1188
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1189
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1145
1190
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1146
1191
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1147
1192
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1173,8 +1218,18 @@ interface ChapterWorkerOptions {
|
|
|
1173
1218
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1174
1219
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1175
1220
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1221
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1222
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1223
|
+
seatId: string;
|
|
1224
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1176
1225
|
};
|
|
1177
1226
|
};
|
|
1227
|
+
/** Network owner only: operate the membership authority this Worker hosts (seat refunds by a super admin).
|
|
1228
|
+
* `makeDb` must return the authority storage mapping, never a chapter projection. */
|
|
1229
|
+
membershipAuthorityOperator?: {
|
|
1230
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1231
|
+
stripeSecretName?: string;
|
|
1232
|
+
};
|
|
1178
1233
|
/** CRM mount point. Default "/api/crm". */
|
|
1179
1234
|
crmBasePath?: string;
|
|
1180
1235
|
/** Host routes, tried BEFORE the built-ins — so a wrapping site can add its own
|
|
@@ -1210,6 +1265,8 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1210
1265
|
requirePaymentQuote: boolean;
|
|
1211
1266
|
membershipAuthority: {
|
|
1212
1267
|
issueOffer: (input: Parameters<MembershipOfferIssuer>[0], env: ChapterEnv) => ReturnType<MembershipOfferIssuer>;
|
|
1268
|
+
/** Read-only founding preview for a join page; absent on older adapters, in which case tiers carry no preview. */
|
|
1269
|
+
previewOffer?: (input: MembershipOfferPreviewScope, env: ChapterEnv) => Promise<MembershipOfferPreview>;
|
|
1213
1270
|
bindCheckout: (input: MembershipCheckoutBindingInput, env: ChapterEnv) => Promise<MembershipCheckoutBinding>;
|
|
1214
1271
|
confirmPayment: (input: ConfirmMembershipPaymentInput, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
1215
1272
|
approveMembership: (input: MembershipQuoteTarget, env: ChapterEnv) => Promise<MembershipPaymentReceipt>;
|
|
@@ -1241,8 +1298,16 @@ declare function createWorkerContext(options: ChapterWorkerOptions): {
|
|
|
1241
1298
|
accept: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1242
1299
|
approve: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRecipientReceipt>;
|
|
1243
1300
|
decline: (input: NamedSeatRecipientInput, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1301
|
+
/** A verified super admin refunds one purchased seat; never automatic. */
|
|
1302
|
+
operatorRefund: (input: MembershipQuoteTarget & {
|
|
1303
|
+
seatId: string;
|
|
1304
|
+
}, env: ChapterEnv) => Promise<NamedSeatRefundReceipt>;
|
|
1244
1305
|
};
|
|
1245
1306
|
} | undefined;
|
|
1307
|
+
membershipAuthorityOperator: {
|
|
1308
|
+
makeDb: (env: ChapterEnv) => ChapterDb;
|
|
1309
|
+
stripeSecretName?: string;
|
|
1310
|
+
} | undefined;
|
|
1246
1311
|
getPublicConfig: (env: ChapterEnv) => Promise<PublicConfig>;
|
|
1247
1312
|
verifyUser: (req: Request, env: ChapterEnv) => Promise<Verified | null>;
|
|
1248
1313
|
makeDb: (env: ChapterEnv) => Db;
|
|
@@ -1302,6 +1367,21 @@ declare function createMembershipAuthorityHandler(options: MembershipAuthorityHa
|
|
|
1302
1367
|
*/
|
|
1303
1368
|
declare function createMembershipAuthorityStorage(db: ChapterDb, secretNames: readonly string[]): ChapterDb;
|
|
1304
1369
|
|
|
1370
|
+
/** Identity of one purchased seat inside its exact network scope. */
|
|
1371
|
+
type NamedSeatOperatorRefundInput = MembershipQuoteTarget & {
|
|
1372
|
+
seatId: string;
|
|
1373
|
+
};
|
|
1374
|
+
/** Refund one purchased named seat because a verified super admin decided to.
|
|
1375
|
+
* Nothing here is automatic or time-driven: the caller has already authenticated
|
|
1376
|
+
* the operator on the chapter or on the network owner. The primary subscription
|
|
1377
|
+
* is never canceled; an accepted recipient loses access through the durable
|
|
1378
|
+
* revoke effect, and a replay after the refund is idempotent.
|
|
1379
|
+
*/
|
|
1380
|
+
declare function refundNamedSeatByOperator(db: ChapterDb, input: NamedSeatOperatorRefundInput, stripeSecretKey: string, now: number): Promise<NamedSeatRefundReceipt>;
|
|
1381
|
+
|
|
1382
|
+
/** Reasons a purchased seat may be refunded. No reason is time-driven: an unaccepted seat waits for a person. */
|
|
1383
|
+
type NamedSeatRefundReason = "declined" | "operator" | "primary_closed" | "provider_refund";
|
|
1384
|
+
|
|
1305
1385
|
type Row = Record<string, unknown>;
|
|
1306
1386
|
/** Host routes may reuse this gate after resolving a verified chapter/runtime account. */
|
|
1307
1387
|
declare function chapterMembershipAccess(db: ChapterDb, env: ChapterEnv, ctx: WorkerContext, app: Row): Promise<boolean>;
|
|
@@ -1920,4 +2000,4 @@ declare function chapterWorker(options: ChapterWorkerOptions): {
|
|
|
1920
2000
|
fetch(req: Request, env: ChapterEnv): Promise<Response>;
|
|
1921
2001
|
};
|
|
1922
2002
|
|
|
1923
|
-
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 };
|
|
2003
|
+
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 };
|