@odla-ai/chapter 0.32.2 → 0.33.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 +79 -0
- package/dist/{chunk-HJNPF5JD.js → chunk-UJIVBGL5.js} +89 -24
- package/dist/chunk-UJIVBGL5.js.map +1 -0
- package/dist/{copy-context-BXBEdp4p.d.ts → copy-context-c1tqPXOR.d.ts} +20 -0
- package/dist/index.cjs +277 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +120 -2
- package/dist/index.d.ts +120 -2
- package/dist/index.js +277 -15
- package/dist/index.js.map +1 -1
- package/dist/ui/admin/index.d.ts +2 -2
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +1 -1
- package/dist/ui/member/index.d.ts +74 -42
- package/dist/ui/member/index.js +1 -1
- package/dist/worker/index.cjs +623 -23
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +145 -1
- package/dist/worker/index.d.ts +145 -1
- package/dist/worker/index.js +618 -18
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -1
- package/runbooks/adopt-existing.md +3 -0
- package/runbooks/greenfield.md +11 -0
- package/dist/chunk-HJNPF5JD.js.map +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -161,6 +161,22 @@ type DeepPartial<T> = T extends readonly (infer Item)[] ? readonly Item[] : T ex
|
|
|
161
161
|
/** Recursively partial copy overrides accepted by `defineChapter({ copy })`. */
|
|
162
162
|
type ChapterCopyInput = DeepPartial<ChapterCopy>;
|
|
163
163
|
|
|
164
|
+
/** Explicit authority a chapter grants to one Built Not Found-style hub. */
|
|
165
|
+
interface ChapterSignupControl {
|
|
166
|
+
/** Stable app id expected in the signed delivery envelope. */
|
|
167
|
+
sourceId: string;
|
|
168
|
+
/** Follower-vault key holding the dedicated edge secret. */
|
|
169
|
+
secretName?: string;
|
|
170
|
+
/** Stripe mode this deployed environment accepts. */
|
|
171
|
+
stripeMode: "test" | "live";
|
|
172
|
+
}
|
|
173
|
+
/** Validated signup-control authority carried on a resolved Chapter. */
|
|
174
|
+
interface ResolvedSignupControl {
|
|
175
|
+
sourceId: string;
|
|
176
|
+
secretName: string;
|
|
177
|
+
stripeMode: "test" | "live";
|
|
178
|
+
}
|
|
179
|
+
|
|
164
180
|
/** One follower site a leader can push CRM records to. The secret VALUE never
|
|
165
181
|
* lives in config: `secretName` names the leader tenant's vaulted copy of the
|
|
166
182
|
* follower's `network_share_secret`. */
|
|
@@ -552,6 +568,8 @@ interface ChapterConfig {
|
|
|
552
568
|
/** Signed network edges: leader delivery targets and follower-owned,
|
|
553
569
|
* privacy-bounded record readers. Secret values stay in tenant vaults. */
|
|
554
570
|
network?: ChapterNetwork;
|
|
571
|
+
/** A separate signed edge that may control this chapter's complete signup. */
|
|
572
|
+
signupControl?: ChapterSignupControl;
|
|
555
573
|
/** Enable a public, host-rendered formation application workflow. */
|
|
556
574
|
formation?: LeaderFormationConfig;
|
|
557
575
|
thesis?: unknown;
|
|
@@ -646,6 +664,8 @@ interface Chapter {
|
|
|
646
664
|
copy: ChapterCopy;
|
|
647
665
|
/** Validated follower targets for leader-driven record pushes. */
|
|
648
666
|
network: ResolvedNetwork;
|
|
667
|
+
/** Null unless this follower explicitly delegates signup authority. */
|
|
668
|
+
signupControl: ResolvedSignupControl | null;
|
|
649
669
|
/** Resolved public formation intake contract (disabled when omitted). */
|
|
650
670
|
formation: ResolvedLeaderFormation;
|
|
651
671
|
/** Resolved CRM engine (from `defineCrm`). */
|
|
@@ -678,6 +698,9 @@ interface Chapter {
|
|
|
678
698
|
*/
|
|
679
699
|
declare function defineChapter(config: ChapterConfig): Chapter;
|
|
680
700
|
|
|
701
|
+
/** Validate one deliberately separate signup-control edge. */
|
|
702
|
+
declare function resolveSignupControl(input: ChapterSignupControl | undefined): ResolvedSignupControl | null;
|
|
703
|
+
|
|
681
704
|
/** Options for {@link leaderCrmConfig}. */
|
|
682
705
|
interface LeaderCrmOptions {
|
|
683
706
|
/** Existing host CRM config to preserve. Defaults to Chapter's people +
|
|
@@ -773,7 +796,7 @@ declare function createChapterIntegration(chapter: Chapter, options?: ChapterInt
|
|
|
773
796
|
* read-only super-admin tier (default on for the `"claim"` ladder). A `"claim"`
|
|
774
797
|
* chapter therefore emits the reference namespace set — `applications`,
|
|
775
798
|
* `groups`, `meetings`, `emailLog`, `superAdmins` — with no `admins` table. */
|
|
776
|
-
declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication): {
|
|
799
|
+
declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication, includeSignupControl?: boolean): {
|
|
777
800
|
schema: DbSchema;
|
|
778
801
|
rules: DbRules;
|
|
779
802
|
};
|
|
@@ -1921,6 +1944,101 @@ declare function validateMembershipPageDocument(input: unknown, options?: Member
|
|
|
1921
1944
|
/** Validate a document or fail closed with all actionable validation errors. */
|
|
1922
1945
|
declare function membershipPageDocument(input: unknown, options?: MembershipPageValidationOptions): MembershipPageDocument;
|
|
1923
1946
|
|
|
1947
|
+
/** Current wire-format version for complete signup-control documents. */
|
|
1948
|
+
declare const SIGNUP_CONTROL_SCHEMA_VERSION: 1;
|
|
1949
|
+
/** Package-owned follower endpoint for signed signup-control delivery. */
|
|
1950
|
+
declare const SIGNUP_CONTROL_PATH: "/api/signup-control";
|
|
1951
|
+
/** One authoritative membership tier in a signup-control revision. */
|
|
1952
|
+
interface SignupControlTier {
|
|
1953
|
+
id: string;
|
|
1954
|
+
name: string;
|
|
1955
|
+
available: boolean;
|
|
1956
|
+
sortOrder: number;
|
|
1957
|
+
priceCents: number;
|
|
1958
|
+
stripePriceId?: string;
|
|
1959
|
+
blurb?: string;
|
|
1960
|
+
}
|
|
1961
|
+
/** A bounded application contract. Fields must already exist in the follower schema. */
|
|
1962
|
+
interface SignupControlApplication {
|
|
1963
|
+
required: readonly string[];
|
|
1964
|
+
optional: readonly string[];
|
|
1965
|
+
conditions?: Readonly<Record<string, FieldConditions>>;
|
|
1966
|
+
copy?: Readonly<Record<string, string>>;
|
|
1967
|
+
}
|
|
1968
|
+
/** Delegated legal and trust copy used by the packaged join journey. */
|
|
1969
|
+
interface SignupControlPolicy {
|
|
1970
|
+
disclaimerText: string;
|
|
1971
|
+
refundPolicyText: string;
|
|
1972
|
+
trustCopy?: string;
|
|
1973
|
+
commitmentText?: string;
|
|
1974
|
+
normsText?: string;
|
|
1975
|
+
}
|
|
1976
|
+
/** Bounded semantic design tokens delegated to the chapter signup surface. */
|
|
1977
|
+
interface SignupControlTheme {
|
|
1978
|
+
/** Includes color, spacing, and typography tokens such as font families. */
|
|
1979
|
+
tokens: Readonly<Record<string, string | number>>;
|
|
1980
|
+
}
|
|
1981
|
+
/** Complete desired state delivered by a controlling hub. */
|
|
1982
|
+
interface SignupControlDocument {
|
|
1983
|
+
schemaVersion: typeof SIGNUP_CONTROL_SCHEMA_VERSION;
|
|
1984
|
+
revision: number;
|
|
1985
|
+
generatedAt: number;
|
|
1986
|
+
source: {
|
|
1987
|
+
appId: string;
|
|
1988
|
+
};
|
|
1989
|
+
target: {
|
|
1990
|
+
chapterId: string;
|
|
1991
|
+
environment: string;
|
|
1992
|
+
stripeMode: "test" | "live";
|
|
1993
|
+
};
|
|
1994
|
+
tiers: readonly SignupControlTier[];
|
|
1995
|
+
membershipPage: MembershipPageDocument;
|
|
1996
|
+
application?: SignupControlApplication;
|
|
1997
|
+
policy?: SignupControlPolicy;
|
|
1998
|
+
scheduling?: ChapterScheduling;
|
|
1999
|
+
theme?: SignupControlTheme;
|
|
2000
|
+
}
|
|
2001
|
+
/** Digest travels beside the document so the exact desired state is attestable. */
|
|
2002
|
+
interface SignupControlEnvelope {
|
|
2003
|
+
digest: string;
|
|
2004
|
+
document: SignupControlDocument;
|
|
2005
|
+
}
|
|
2006
|
+
/** Exact follower acknowledgement for one accepted or replayed revision. */
|
|
2007
|
+
interface SignupControlReceipt {
|
|
2008
|
+
ok: true;
|
|
2009
|
+
target: {
|
|
2010
|
+
chapterId: string;
|
|
2011
|
+
environment: string;
|
|
2012
|
+
};
|
|
2013
|
+
revision: number;
|
|
2014
|
+
digest: string;
|
|
2015
|
+
status: "accepted" | "replayed";
|
|
2016
|
+
acknowledgedAt: number;
|
|
2017
|
+
}
|
|
2018
|
+
/** Stable reason codes returned when a follower refuses desired state. */
|
|
2019
|
+
type SignupControlRejection = "invalid_document" | "invalid_digest" | "wrong_source" | "wrong_target" | "wrong_environment" | "wrong_stripe_mode" | "stale_revision" | "conflicting_revision";
|
|
2020
|
+
/** Normalized document result returned by the package validator. */
|
|
2021
|
+
type SignupControlValidation = {
|
|
2022
|
+
ok: true;
|
|
2023
|
+
value: SignupControlDocument;
|
|
2024
|
+
} | {
|
|
2025
|
+
ok: false;
|
|
2026
|
+
errors: readonly string[];
|
|
2027
|
+
};
|
|
2028
|
+
|
|
2029
|
+
/** Serialize JSON-like signup state with recursively sorted object keys. */
|
|
2030
|
+
declare function canonicalSignupControl(value: unknown): string;
|
|
2031
|
+
/** Compute the protocol's canonical SHA-256 digest for desired signup state. */
|
|
2032
|
+
declare function signupControlDigest(document: unknown): Promise<string>;
|
|
2033
|
+
/** Pair one desired-state document with its canonical digest for delivery. */
|
|
2034
|
+
declare function createSignupControlEnvelope(document: SignupControlDocument): Promise<{
|
|
2035
|
+
document: SignupControlDocument;
|
|
2036
|
+
digest: string;
|
|
2037
|
+
}>;
|
|
2038
|
+
|
|
2039
|
+
/** Validate and normalize one complete desired signup state. */
|
|
2040
|
+
declare function validateSignupControlDocument(input: unknown): SignupControlValidation;
|
|
2041
|
+
|
|
1924
2042
|
/** A presentation overlay parsed from the constrained membership Markdown convention. */
|
|
1925
2043
|
type MembershipTierMarkdownResult = {
|
|
1926
2044
|
ok: true;
|
|
@@ -1944,4 +2062,4 @@ declare function applyMembershipTierMarkdown(presentation: MembershipTierPresent
|
|
|
1944
2062
|
/** Apply constrained membership Markdown or fail closed with actionable errors. */
|
|
1945
2063
|
declare function membershipTierPresentationFromMarkdown(presentation: MembershipTierPresentation, source: string): MembershipTierPresentation;
|
|
1946
2064
|
|
|
1947
|
-
export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, webhookMutationId };
|
|
2065
|
+
export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterSignupControl, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type ResolvedSignupControl, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, SIGNUP_CONTROL_PATH, SIGNUP_CONTROL_SCHEMA_VERSION, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type SignupControlApplication, type SignupControlDocument, type SignupControlEnvelope, type SignupControlPolicy, type SignupControlReceipt, type SignupControlRejection, type SignupControlTheme, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, canonicalSignupControl, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
|
package/dist/index.d.ts
CHANGED
|
@@ -161,6 +161,22 @@ type DeepPartial<T> = T extends readonly (infer Item)[] ? readonly Item[] : T ex
|
|
|
161
161
|
/** Recursively partial copy overrides accepted by `defineChapter({ copy })`. */
|
|
162
162
|
type ChapterCopyInput = DeepPartial<ChapterCopy>;
|
|
163
163
|
|
|
164
|
+
/** Explicit authority a chapter grants to one Built Not Found-style hub. */
|
|
165
|
+
interface ChapterSignupControl {
|
|
166
|
+
/** Stable app id expected in the signed delivery envelope. */
|
|
167
|
+
sourceId: string;
|
|
168
|
+
/** Follower-vault key holding the dedicated edge secret. */
|
|
169
|
+
secretName?: string;
|
|
170
|
+
/** Stripe mode this deployed environment accepts. */
|
|
171
|
+
stripeMode: "test" | "live";
|
|
172
|
+
}
|
|
173
|
+
/** Validated signup-control authority carried on a resolved Chapter. */
|
|
174
|
+
interface ResolvedSignupControl {
|
|
175
|
+
sourceId: string;
|
|
176
|
+
secretName: string;
|
|
177
|
+
stripeMode: "test" | "live";
|
|
178
|
+
}
|
|
179
|
+
|
|
164
180
|
/** One follower site a leader can push CRM records to. The secret VALUE never
|
|
165
181
|
* lives in config: `secretName` names the leader tenant's vaulted copy of the
|
|
166
182
|
* follower's `network_share_secret`. */
|
|
@@ -552,6 +568,8 @@ interface ChapterConfig {
|
|
|
552
568
|
/** Signed network edges: leader delivery targets and follower-owned,
|
|
553
569
|
* privacy-bounded record readers. Secret values stay in tenant vaults. */
|
|
554
570
|
network?: ChapterNetwork;
|
|
571
|
+
/** A separate signed edge that may control this chapter's complete signup. */
|
|
572
|
+
signupControl?: ChapterSignupControl;
|
|
555
573
|
/** Enable a public, host-rendered formation application workflow. */
|
|
556
574
|
formation?: LeaderFormationConfig;
|
|
557
575
|
thesis?: unknown;
|
|
@@ -646,6 +664,8 @@ interface Chapter {
|
|
|
646
664
|
copy: ChapterCopy;
|
|
647
665
|
/** Validated follower targets for leader-driven record pushes. */
|
|
648
666
|
network: ResolvedNetwork;
|
|
667
|
+
/** Null unless this follower explicitly delegates signup authority. */
|
|
668
|
+
signupControl: ResolvedSignupControl | null;
|
|
649
669
|
/** Resolved public formation intake contract (disabled when omitted). */
|
|
650
670
|
formation: ResolvedLeaderFormation;
|
|
651
671
|
/** Resolved CRM engine (from `defineCrm`). */
|
|
@@ -678,6 +698,9 @@ interface Chapter {
|
|
|
678
698
|
*/
|
|
679
699
|
declare function defineChapter(config: ChapterConfig): Chapter;
|
|
680
700
|
|
|
701
|
+
/** Validate one deliberately separate signup-control edge. */
|
|
702
|
+
declare function resolveSignupControl(input: ChapterSignupControl | undefined): ResolvedSignupControl | null;
|
|
703
|
+
|
|
681
704
|
/** Options for {@link leaderCrmConfig}. */
|
|
682
705
|
interface LeaderCrmOptions {
|
|
683
706
|
/** Existing host CRM config to preserve. Defaults to Chapter's people +
|
|
@@ -773,7 +796,7 @@ declare function createChapterIntegration(chapter: Chapter, options?: ChapterInt
|
|
|
773
796
|
* read-only super-admin tier (default on for the `"claim"` ladder). A `"claim"`
|
|
774
797
|
* chapter therefore emits the reference namespace set — `applications`,
|
|
775
798
|
* `groups`, `meetings`, `emailLog`, `superAdmins` — with no `admins` table. */
|
|
776
|
-
declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication): {
|
|
799
|
+
declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication, includeSignupControl?: boolean): {
|
|
777
800
|
schema: DbSchema;
|
|
778
801
|
rules: DbRules;
|
|
779
802
|
};
|
|
@@ -1921,6 +1944,101 @@ declare function validateMembershipPageDocument(input: unknown, options?: Member
|
|
|
1921
1944
|
/** Validate a document or fail closed with all actionable validation errors. */
|
|
1922
1945
|
declare function membershipPageDocument(input: unknown, options?: MembershipPageValidationOptions): MembershipPageDocument;
|
|
1923
1946
|
|
|
1947
|
+
/** Current wire-format version for complete signup-control documents. */
|
|
1948
|
+
declare const SIGNUP_CONTROL_SCHEMA_VERSION: 1;
|
|
1949
|
+
/** Package-owned follower endpoint for signed signup-control delivery. */
|
|
1950
|
+
declare const SIGNUP_CONTROL_PATH: "/api/signup-control";
|
|
1951
|
+
/** One authoritative membership tier in a signup-control revision. */
|
|
1952
|
+
interface SignupControlTier {
|
|
1953
|
+
id: string;
|
|
1954
|
+
name: string;
|
|
1955
|
+
available: boolean;
|
|
1956
|
+
sortOrder: number;
|
|
1957
|
+
priceCents: number;
|
|
1958
|
+
stripePriceId?: string;
|
|
1959
|
+
blurb?: string;
|
|
1960
|
+
}
|
|
1961
|
+
/** A bounded application contract. Fields must already exist in the follower schema. */
|
|
1962
|
+
interface SignupControlApplication {
|
|
1963
|
+
required: readonly string[];
|
|
1964
|
+
optional: readonly string[];
|
|
1965
|
+
conditions?: Readonly<Record<string, FieldConditions>>;
|
|
1966
|
+
copy?: Readonly<Record<string, string>>;
|
|
1967
|
+
}
|
|
1968
|
+
/** Delegated legal and trust copy used by the packaged join journey. */
|
|
1969
|
+
interface SignupControlPolicy {
|
|
1970
|
+
disclaimerText: string;
|
|
1971
|
+
refundPolicyText: string;
|
|
1972
|
+
trustCopy?: string;
|
|
1973
|
+
commitmentText?: string;
|
|
1974
|
+
normsText?: string;
|
|
1975
|
+
}
|
|
1976
|
+
/** Bounded semantic design tokens delegated to the chapter signup surface. */
|
|
1977
|
+
interface SignupControlTheme {
|
|
1978
|
+
/** Includes color, spacing, and typography tokens such as font families. */
|
|
1979
|
+
tokens: Readonly<Record<string, string | number>>;
|
|
1980
|
+
}
|
|
1981
|
+
/** Complete desired state delivered by a controlling hub. */
|
|
1982
|
+
interface SignupControlDocument {
|
|
1983
|
+
schemaVersion: typeof SIGNUP_CONTROL_SCHEMA_VERSION;
|
|
1984
|
+
revision: number;
|
|
1985
|
+
generatedAt: number;
|
|
1986
|
+
source: {
|
|
1987
|
+
appId: string;
|
|
1988
|
+
};
|
|
1989
|
+
target: {
|
|
1990
|
+
chapterId: string;
|
|
1991
|
+
environment: string;
|
|
1992
|
+
stripeMode: "test" | "live";
|
|
1993
|
+
};
|
|
1994
|
+
tiers: readonly SignupControlTier[];
|
|
1995
|
+
membershipPage: MembershipPageDocument;
|
|
1996
|
+
application?: SignupControlApplication;
|
|
1997
|
+
policy?: SignupControlPolicy;
|
|
1998
|
+
scheduling?: ChapterScheduling;
|
|
1999
|
+
theme?: SignupControlTheme;
|
|
2000
|
+
}
|
|
2001
|
+
/** Digest travels beside the document so the exact desired state is attestable. */
|
|
2002
|
+
interface SignupControlEnvelope {
|
|
2003
|
+
digest: string;
|
|
2004
|
+
document: SignupControlDocument;
|
|
2005
|
+
}
|
|
2006
|
+
/** Exact follower acknowledgement for one accepted or replayed revision. */
|
|
2007
|
+
interface SignupControlReceipt {
|
|
2008
|
+
ok: true;
|
|
2009
|
+
target: {
|
|
2010
|
+
chapterId: string;
|
|
2011
|
+
environment: string;
|
|
2012
|
+
};
|
|
2013
|
+
revision: number;
|
|
2014
|
+
digest: string;
|
|
2015
|
+
status: "accepted" | "replayed";
|
|
2016
|
+
acknowledgedAt: number;
|
|
2017
|
+
}
|
|
2018
|
+
/** Stable reason codes returned when a follower refuses desired state. */
|
|
2019
|
+
type SignupControlRejection = "invalid_document" | "invalid_digest" | "wrong_source" | "wrong_target" | "wrong_environment" | "wrong_stripe_mode" | "stale_revision" | "conflicting_revision";
|
|
2020
|
+
/** Normalized document result returned by the package validator. */
|
|
2021
|
+
type SignupControlValidation = {
|
|
2022
|
+
ok: true;
|
|
2023
|
+
value: SignupControlDocument;
|
|
2024
|
+
} | {
|
|
2025
|
+
ok: false;
|
|
2026
|
+
errors: readonly string[];
|
|
2027
|
+
};
|
|
2028
|
+
|
|
2029
|
+
/** Serialize JSON-like signup state with recursively sorted object keys. */
|
|
2030
|
+
declare function canonicalSignupControl(value: unknown): string;
|
|
2031
|
+
/** Compute the protocol's canonical SHA-256 digest for desired signup state. */
|
|
2032
|
+
declare function signupControlDigest(document: unknown): Promise<string>;
|
|
2033
|
+
/** Pair one desired-state document with its canonical digest for delivery. */
|
|
2034
|
+
declare function createSignupControlEnvelope(document: SignupControlDocument): Promise<{
|
|
2035
|
+
document: SignupControlDocument;
|
|
2036
|
+
digest: string;
|
|
2037
|
+
}>;
|
|
2038
|
+
|
|
2039
|
+
/** Validate and normalize one complete desired signup state. */
|
|
2040
|
+
declare function validateSignupControlDocument(input: unknown): SignupControlValidation;
|
|
2041
|
+
|
|
1924
2042
|
/** A presentation overlay parsed from the constrained membership Markdown convention. */
|
|
1925
2043
|
type MembershipTierMarkdownResult = {
|
|
1926
2044
|
ok: true;
|
|
@@ -1944,4 +2062,4 @@ declare function applyMembershipTierMarkdown(presentation: MembershipTierPresent
|
|
|
1944
2062
|
/** Apply constrained membership Markdown or fail closed with actionable errors. */
|
|
1945
2063
|
declare function membershipTierPresentationFromMarkdown(presentation: MembershipTierPresentation, source: string): MembershipTierPresentation;
|
|
1946
2064
|
|
|
1947
|
-
export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, webhookMutationId };
|
|
2065
|
+
export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterSignupControl, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type ResolvedSignupControl, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, SIGNUP_CONTROL_PATH, SIGNUP_CONTROL_SCHEMA_VERSION, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type SignupControlApplication, type SignupControlDocument, type SignupControlEnvelope, type SignupControlPolicy, type SignupControlReceipt, type SignupControlRejection, type SignupControlTheme, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, canonicalSignupControl, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
|