@odla-ai/chapter 0.42.0 → 0.42.2

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/dist/index.d.cts CHANGED
@@ -275,6 +275,16 @@ interface ChapterNetworkTarget {
275
275
  * this follower. Omitted by default: a target never gains write permission
276
276
  * merely because its records are browsable. */
277
277
  sharedNotes?: readonly string[];
278
+ /** Per-record-type upper bound on profile fields this leader permits its
279
+ * admins to edit remotely. The follower must independently delegate the
280
+ * same field; readable fields never become writable implicitly. */
281
+ editableFields?: Record<string, readonly string[]>;
282
+ /** Record types on which this leader permits remote lifecycle transitions.
283
+ * The follower must independently opt in and remains pipeline authority. */
284
+ stageTransitions?: readonly string[];
285
+ /** Allow package-owned desired admission decisions for existing leader CRM
286
+ * people to be delivered to this target. Omitted means default deny. */
287
+ admissionGrants?: boolean;
278
288
  }
279
289
  /** One signed peer allowed to browse a privacy-bounded projection of this
280
290
  * site's CRM. The follower owns this allowlist; a leader target declaration
@@ -284,11 +294,21 @@ interface ChapterNetworkReader {
284
294
  id: string;
285
295
  /** Per-record-type field allowlist. Omitted types and fields never leave
286
296
  * this site. Record id, name, stage, and timestamps are bounded metadata. */
287
- fields: Record<string, readonly string[]>;
297
+ fields?: Record<string, readonly string[]>;
288
298
  /** Record types on which this reader may append an explicitly shared note.
289
299
  * Omitted by default: browse permission never silently grants write access.
290
300
  * Shared notes land in the follower CRM activity feed. */
291
301
  sharedNotes?: readonly string[];
302
+ /** Exact local CRM fields this reader may edit remotely, by record type.
303
+ * Every field must also be readable so the peer can perform an optimistic
304
+ * edit against the value and revision it actually reviewed. */
305
+ editableFields?: Record<string, readonly string[]>;
306
+ /** Local CRM record types on which this reader may request a lifecycle
307
+ * transition. Chapter still enforces the local pipeline and gates. */
308
+ stageTransitions?: readonly string[];
309
+ /** Accept signed desired admission decisions from this reader. Independent
310
+ * of record browsing; an admission-only reader may omit `fields`. */
311
+ admissionGrants?: boolean;
292
312
  }
293
313
  /** Leader/follower network configuration. A follower needs no code config to
294
314
  * receive pushed records. It must explicitly declare `readers` before any peer
@@ -331,12 +351,18 @@ interface ResolvedNetworkTarget {
331
351
  secretName: string;
332
352
  fields?: Record<string, readonly string[]>;
333
353
  sharedNotes: readonly string[];
354
+ editableFields: Record<string, readonly string[]>;
355
+ stageTransitions: readonly string[];
356
+ admissionGrants?: boolean;
334
357
  }
335
358
  /** A validated follower-owned record projection for one signed reader. */
336
359
  interface ResolvedNetworkReader {
337
360
  id: string;
338
361
  fields: Record<string, readonly string[]>;
339
362
  sharedNotes: readonly string[];
363
+ editableFields: Record<string, readonly string[]>;
364
+ stageTransitions: readonly string[];
365
+ admissionGrants?: boolean;
340
366
  }
341
367
  /** Fully-resolved leader network configuration. */
342
368
  interface ResolvedNetwork {
@@ -938,7 +964,7 @@ declare function createChapterIntegration(chapter: Chapter, options?: ChapterInt
938
964
  * read-only super-admin tier (default on for the `"claim"` ladder). A `"claim"`
939
965
  * chapter therefore emits the reference namespace set — `applications`,
940
966
  * `groups`, `meetings`, `emailLog`, `superAdmins` — with no `admins` table. */
941
- declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication, includeSignupControl?: boolean, includeMemberContent?: boolean, includeBuilderLibrary?: boolean): {
967
+ declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication, includeSignupControl?: boolean, includeMemberContent?: boolean, includeBuilderLibrary?: boolean, includeLeaderAdmissions?: boolean): {
942
968
  schema: DbSchema;
943
969
  rules: DbRules;
944
970
  };
@@ -1932,6 +1958,52 @@ interface NetworkRecord {
1932
1958
  fields: Record<string, unknown>;
1933
1959
  createdAt: number;
1934
1960
  updatedAt: number;
1961
+ /** Optimistic concurrency token authored by the follower. */
1962
+ revision: number;
1963
+ /** Follower-authored edit contract. Omitted when this edge is read-only. */
1964
+ edit?: NetworkRecordEdit;
1965
+ }
1966
+ /** One follower CRM field a leader may patch. */
1967
+ interface NetworkEditableField {
1968
+ id: string;
1969
+ label: string;
1970
+ type: FieldType;
1971
+ required: boolean;
1972
+ options?: readonly string[];
1973
+ }
1974
+ /** One follower-authoritative lifecycle destination currently allowed. */
1975
+ interface NetworkStageTransition {
1976
+ id: string;
1977
+ label: string;
1978
+ }
1979
+ /** Edit metadata computed from the follower schema, pipeline, and record. */
1980
+ interface NetworkRecordEdit {
1981
+ fields: NetworkEditableField[];
1982
+ allowedStages: NetworkStageTransition[];
1983
+ }
1984
+ /** Signed follower mutation dispatched by a leader admin. Exactly one of
1985
+ * `fields` or `stage` is present. */
1986
+ interface NetworkRecordMutation {
1987
+ type: string;
1988
+ expectedRevision: number;
1989
+ expectedStage?: string | null;
1990
+ mutationId: string;
1991
+ fields?: Record<string, unknown>;
1992
+ stage?: string;
1993
+ actor: {
1994
+ id: string;
1995
+ email?: string;
1996
+ };
1997
+ }
1998
+ /** Successful follower mutation response. */
1999
+ interface NetworkRecordMutationResult {
2000
+ version: 1;
2001
+ site: {
2002
+ id: string;
2003
+ name: string;
2004
+ };
2005
+ record: NetworkRecord;
2006
+ duplicate: boolean;
1935
2007
  }
1936
2008
  /** One bounded, offset-paged follower record window. */
1937
2009
  interface NetworkRecordPage {
@@ -2825,4 +2897,4 @@ interface ChapterPromotionInput {
2825
2897
  /** Export the provider-independent pieces of one exact active signup revision. */
2826
2898
  declare function exportChapterPromotion(input: ChapterPromotionInput): Promise<PromotionAdapterResult>;
2827
2899
 
2828
- export { ADMISSION_GRANTS_PATH, ADMISSION_GRANTS_SCHEMA_VERSION, type AccountModel, type AdminNotificationTrigger, type AdmissionDecision, type AdmissionGrantDocument, type AdmissionGrantEnvelope, type AdmissionGrantInput, type AdmissionGrantReceipt, type AdmissionGrantRejection, type AdmissionGrantRevisionRow, type AdmissionGrantRow, type AdmissionGrantValidation, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, BUILDER_LIBRARY_ADMIN_PATH, BUILDER_LIBRARY_CONTROL_PATH, BUILDER_LIBRARY_MANIFEST_PATH, BUILDER_LIBRARY_PROMOTE_PATH, BUILDER_LIBRARY_SCHEMA_VERSION, type BuilderLibraryBrandAssetRef, type BuilderLibraryDocument, type BuilderLibraryEnvelope, type BuilderLibraryManifest, type BuilderLibraryPromotionProvenance, type BuilderLibraryReceipt, type BuilderLibraryResource, type BuilderLibraryResourceKind, type BuilderLibraryResourceProvenance, type BuilderLibraryResourceStatus, type BuilderLibraryScope, type BuilderLibrarySource, type BuilderLibrarySourceType, type BuilderLibraryTarget, type BuilderLibraryValidationOptions, type BuilderLibraryValidationResult, type BuilderLibraryViewer, type BuyerGiftClaim, CHAPTER_FLOW_FIELDS_SCHEMA_VERSION, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterBuilderLibrary, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmailIdentity, type ChapterEmails, type ChapterFieldFlow, type ChapterFlowField, type ChapterFlowFieldContract, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMemberContent, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, 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 EffectiveMemberContent, type EffectiveMemberContentPage, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, GIFT_OFFER_CATALOG_VERSION, type GiftOffer, type GiftOfferCatalog, type GiftOfferTarget, type GiftOfferValidation, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type JoinContinuation, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MAX_GIFT_OFFERS, MEMBERSHIP_PAGE_RENDERER, MEMBER_CONTENT_CONTROL_PATH, MEMBER_CONTENT_PATH, MEMBER_CONTENT_SCHEMA_VERSION, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberContentDocument, type MemberContentEnvelope, type MemberContentPage, type MemberContentPageProjection, type MemberContentProjection, type MemberContentReceipt, type MemberContentRejection, type MemberContentSource, type MemberContentSourceType, type MemberContentTarget, type MemberContentTierAuthority, type MemberContentValidationOptions, type MemberContentValidationResult, type MemberContentViewer, type MemberPageAudience, type MemberPageNavigation, type MemberPageUpsell, type MemberPageUpsellOffer, type MemberPageUpsellOverride, 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 PublicGiftOffer, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedBuilderLibrary, type ResolvedLeaderFormation, type ResolvedMemberContent, type ResolvedMemberPageUpsell, 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, SIGNUP_CONTROL_THEME_MARKER, SIGNUP_CONTROL_THEME_STYLE_ID, 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 SignupControlThemeHead, type SignupControlThemeMetadata, type SignupControlThemeOptions, type SignupControlThemeRevision, type SignupControlThemeStyleTarget, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationFlowFields, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildBuilderLibraryManifest, buildGroupSeed, buildTierSeeds, builderLibraryDigest, canApprove, canBook, canChangeRole, canTransition, canViewBuilderLibraryResource, canceledPatch, canonicalBuilderLibrary, canonicalMemberContent, canonicalSignupControl, chapterBrandFromTokens, chapterDb, chapterFlowFieldContract, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, composeMemberContent, createAdmissionGrantEnvelope, createBuilderLibraryEnvelope, createChapterIntegration, createClerkInvitation, createClerkUser, createMemberContentEnvelope, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findAdmissionGrant, findApplicationRef, findGiftOffer, findTier, firstPaymentPatch, formatChapterCopy, formationFields, formationFlowFields, getVaultSecret, giftOfferActive, hasDisclaimerAck, hydrateSignupControlTheme, injectSignupControlThemeHead, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadLatestAdmissionRevision, loadOfferableTiers, loadTiers, materializeAdmissionGrants, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberContentDigest, memberContentDocument, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeAdmissionEmail, normalizeChapterEmail, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectBuilderLibraryDelivery, projectMemberContent, projectSharedRecord, promoteBuilderLibraryResource, publicGiftOffers, reconcileMeetings, refundedPatch, render, renderSignupControlThemeHead, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveBuilderLibrary, resolveChapterCopy, resolveJoinContinuation, resolveLeaderFormation, resolveMemberContent, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateAdmissionGrantDocument, validateBuilderLibraryDocument, validateGiftOfferCatalog, validateMemberContentDocument, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
2900
+ export { ADMISSION_GRANTS_PATH, ADMISSION_GRANTS_SCHEMA_VERSION, type AccountModel, type AdminNotificationTrigger, type AdmissionDecision, type AdmissionGrantDocument, type AdmissionGrantEnvelope, type AdmissionGrantInput, type AdmissionGrantReceipt, type AdmissionGrantRejection, type AdmissionGrantRevisionRow, type AdmissionGrantRow, type AdmissionGrantValidation, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, BUILDER_LIBRARY_ADMIN_PATH, BUILDER_LIBRARY_CONTROL_PATH, BUILDER_LIBRARY_MANIFEST_PATH, BUILDER_LIBRARY_PROMOTE_PATH, BUILDER_LIBRARY_SCHEMA_VERSION, type BuilderLibraryBrandAssetRef, type BuilderLibraryDocument, type BuilderLibraryEnvelope, type BuilderLibraryManifest, type BuilderLibraryPromotionProvenance, type BuilderLibraryReceipt, type BuilderLibraryResource, type BuilderLibraryResourceKind, type BuilderLibraryResourceProvenance, type BuilderLibraryResourceStatus, type BuilderLibraryScope, type BuilderLibrarySource, type BuilderLibrarySourceType, type BuilderLibraryTarget, type BuilderLibraryValidationOptions, type BuilderLibraryValidationResult, type BuilderLibraryViewer, type BuyerGiftClaim, CHAPTER_FLOW_FIELDS_SCHEMA_VERSION, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterBuilderLibrary, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmailIdentity, type ChapterEmails, type ChapterFieldFlow, type ChapterFlowField, type ChapterFlowFieldContract, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMemberContent, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, 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 EffectiveMemberContent, type EffectiveMemberContentPage, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, GIFT_OFFER_CATALOG_VERSION, type GiftOffer, type GiftOfferCatalog, type GiftOfferTarget, type GiftOfferValidation, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type JoinContinuation, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MAX_GIFT_OFFERS, MEMBERSHIP_PAGE_RENDERER, MEMBER_CONTENT_CONTROL_PATH, MEMBER_CONTENT_PATH, MEMBER_CONTENT_SCHEMA_VERSION, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberContentDocument, type MemberContentEnvelope, type MemberContentPage, type MemberContentPageProjection, type MemberContentProjection, type MemberContentReceipt, type MemberContentRejection, type MemberContentSource, type MemberContentSourceType, type MemberContentTarget, type MemberContentTierAuthority, type MemberContentValidationOptions, type MemberContentValidationResult, type MemberContentViewer, type MemberPageAudience, type MemberPageNavigation, type MemberPageUpsell, type MemberPageUpsellOffer, type MemberPageUpsellOverride, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkEditableField, type NetworkRecord, type NetworkRecordEdit, type NetworkRecordMutation, type NetworkRecordMutationResult, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NetworkStageTransition, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type PublicGiftOffer, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedBuilderLibrary, type ResolvedLeaderFormation, type ResolvedMemberContent, type ResolvedMemberPageUpsell, 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, SIGNUP_CONTROL_THEME_MARKER, SIGNUP_CONTROL_THEME_STYLE_ID, 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 SignupControlThemeHead, type SignupControlThemeMetadata, type SignupControlThemeOptions, type SignupControlThemeRevision, type SignupControlThemeStyleTarget, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationFlowFields, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildBuilderLibraryManifest, buildGroupSeed, buildTierSeeds, builderLibraryDigest, canApprove, canBook, canChangeRole, canTransition, canViewBuilderLibraryResource, canceledPatch, canonicalBuilderLibrary, canonicalMemberContent, canonicalSignupControl, chapterBrandFromTokens, chapterDb, chapterFlowFieldContract, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, composeMemberContent, createAdmissionGrantEnvelope, createBuilderLibraryEnvelope, createChapterIntegration, createClerkInvitation, createClerkUser, createMemberContentEnvelope, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findAdmissionGrant, findApplicationRef, findGiftOffer, findTier, firstPaymentPatch, formatChapterCopy, formationFields, formationFlowFields, getVaultSecret, giftOfferActive, hasDisclaimerAck, hydrateSignupControlTheme, injectSignupControlThemeHead, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadLatestAdmissionRevision, loadOfferableTiers, loadTiers, materializeAdmissionGrants, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberContentDigest, memberContentDocument, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeAdmissionEmail, normalizeChapterEmail, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectBuilderLibraryDelivery, projectMemberContent, projectSharedRecord, promoteBuilderLibraryResource, publicGiftOffers, reconcileMeetings, refundedPatch, render, renderSignupControlThemeHead, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveBuilderLibrary, resolveChapterCopy, resolveJoinContinuation, resolveLeaderFormation, resolveMemberContent, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateAdmissionGrantDocument, validateBuilderLibraryDocument, validateGiftOfferCatalog, validateMemberContentDocument, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
package/dist/index.d.ts CHANGED
@@ -275,6 +275,16 @@ interface ChapterNetworkTarget {
275
275
  * this follower. Omitted by default: a target never gains write permission
276
276
  * merely because its records are browsable. */
277
277
  sharedNotes?: readonly string[];
278
+ /** Per-record-type upper bound on profile fields this leader permits its
279
+ * admins to edit remotely. The follower must independently delegate the
280
+ * same field; readable fields never become writable implicitly. */
281
+ editableFields?: Record<string, readonly string[]>;
282
+ /** Record types on which this leader permits remote lifecycle transitions.
283
+ * The follower must independently opt in and remains pipeline authority. */
284
+ stageTransitions?: readonly string[];
285
+ /** Allow package-owned desired admission decisions for existing leader CRM
286
+ * people to be delivered to this target. Omitted means default deny. */
287
+ admissionGrants?: boolean;
278
288
  }
279
289
  /** One signed peer allowed to browse a privacy-bounded projection of this
280
290
  * site's CRM. The follower owns this allowlist; a leader target declaration
@@ -284,11 +294,21 @@ interface ChapterNetworkReader {
284
294
  id: string;
285
295
  /** Per-record-type field allowlist. Omitted types and fields never leave
286
296
  * this site. Record id, name, stage, and timestamps are bounded metadata. */
287
- fields: Record<string, readonly string[]>;
297
+ fields?: Record<string, readonly string[]>;
288
298
  /** Record types on which this reader may append an explicitly shared note.
289
299
  * Omitted by default: browse permission never silently grants write access.
290
300
  * Shared notes land in the follower CRM activity feed. */
291
301
  sharedNotes?: readonly string[];
302
+ /** Exact local CRM fields this reader may edit remotely, by record type.
303
+ * Every field must also be readable so the peer can perform an optimistic
304
+ * edit against the value and revision it actually reviewed. */
305
+ editableFields?: Record<string, readonly string[]>;
306
+ /** Local CRM record types on which this reader may request a lifecycle
307
+ * transition. Chapter still enforces the local pipeline and gates. */
308
+ stageTransitions?: readonly string[];
309
+ /** Accept signed desired admission decisions from this reader. Independent
310
+ * of record browsing; an admission-only reader may omit `fields`. */
311
+ admissionGrants?: boolean;
292
312
  }
293
313
  /** Leader/follower network configuration. A follower needs no code config to
294
314
  * receive pushed records. It must explicitly declare `readers` before any peer
@@ -331,12 +351,18 @@ interface ResolvedNetworkTarget {
331
351
  secretName: string;
332
352
  fields?: Record<string, readonly string[]>;
333
353
  sharedNotes: readonly string[];
354
+ editableFields: Record<string, readonly string[]>;
355
+ stageTransitions: readonly string[];
356
+ admissionGrants?: boolean;
334
357
  }
335
358
  /** A validated follower-owned record projection for one signed reader. */
336
359
  interface ResolvedNetworkReader {
337
360
  id: string;
338
361
  fields: Record<string, readonly string[]>;
339
362
  sharedNotes: readonly string[];
363
+ editableFields: Record<string, readonly string[]>;
364
+ stageTransitions: readonly string[];
365
+ admissionGrants?: boolean;
340
366
  }
341
367
  /** Fully-resolved leader network configuration. */
342
368
  interface ResolvedNetwork {
@@ -938,7 +964,7 @@ declare function createChapterIntegration(chapter: Chapter, options?: ChapterInt
938
964
  * read-only super-admin tier (default on for the `"claim"` ladder). A `"claim"`
939
965
  * chapter therefore emits the reference namespace set — `applications`,
940
966
  * `groups`, `meetings`, `emailLog`, `superAdmins` — with no `admins` table. */
941
- declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication, includeSignupControl?: boolean, includeMemberContent?: boolean, includeBuilderLibrary?: boolean): {
967
+ declare function chapterDb(mode: ChapterMode, auth: ResolvedAuth, includeNetworkNotes?: boolean, application?: ResolvedApplication, includeSignupControl?: boolean, includeMemberContent?: boolean, includeBuilderLibrary?: boolean, includeLeaderAdmissions?: boolean): {
942
968
  schema: DbSchema;
943
969
  rules: DbRules;
944
970
  };
@@ -1932,6 +1958,52 @@ interface NetworkRecord {
1932
1958
  fields: Record<string, unknown>;
1933
1959
  createdAt: number;
1934
1960
  updatedAt: number;
1961
+ /** Optimistic concurrency token authored by the follower. */
1962
+ revision: number;
1963
+ /** Follower-authored edit contract. Omitted when this edge is read-only. */
1964
+ edit?: NetworkRecordEdit;
1965
+ }
1966
+ /** One follower CRM field a leader may patch. */
1967
+ interface NetworkEditableField {
1968
+ id: string;
1969
+ label: string;
1970
+ type: FieldType;
1971
+ required: boolean;
1972
+ options?: readonly string[];
1973
+ }
1974
+ /** One follower-authoritative lifecycle destination currently allowed. */
1975
+ interface NetworkStageTransition {
1976
+ id: string;
1977
+ label: string;
1978
+ }
1979
+ /** Edit metadata computed from the follower schema, pipeline, and record. */
1980
+ interface NetworkRecordEdit {
1981
+ fields: NetworkEditableField[];
1982
+ allowedStages: NetworkStageTransition[];
1983
+ }
1984
+ /** Signed follower mutation dispatched by a leader admin. Exactly one of
1985
+ * `fields` or `stage` is present. */
1986
+ interface NetworkRecordMutation {
1987
+ type: string;
1988
+ expectedRevision: number;
1989
+ expectedStage?: string | null;
1990
+ mutationId: string;
1991
+ fields?: Record<string, unknown>;
1992
+ stage?: string;
1993
+ actor: {
1994
+ id: string;
1995
+ email?: string;
1996
+ };
1997
+ }
1998
+ /** Successful follower mutation response. */
1999
+ interface NetworkRecordMutationResult {
2000
+ version: 1;
2001
+ site: {
2002
+ id: string;
2003
+ name: string;
2004
+ };
2005
+ record: NetworkRecord;
2006
+ duplicate: boolean;
1935
2007
  }
1936
2008
  /** One bounded, offset-paged follower record window. */
1937
2009
  interface NetworkRecordPage {
@@ -2825,4 +2897,4 @@ interface ChapterPromotionInput {
2825
2897
  /** Export the provider-independent pieces of one exact active signup revision. */
2826
2898
  declare function exportChapterPromotion(input: ChapterPromotionInput): Promise<PromotionAdapterResult>;
2827
2899
 
2828
- export { ADMISSION_GRANTS_PATH, ADMISSION_GRANTS_SCHEMA_VERSION, type AccountModel, type AdminNotificationTrigger, type AdmissionDecision, type AdmissionGrantDocument, type AdmissionGrantEnvelope, type AdmissionGrantInput, type AdmissionGrantReceipt, type AdmissionGrantRejection, type AdmissionGrantRevisionRow, type AdmissionGrantRow, type AdmissionGrantValidation, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, BUILDER_LIBRARY_ADMIN_PATH, BUILDER_LIBRARY_CONTROL_PATH, BUILDER_LIBRARY_MANIFEST_PATH, BUILDER_LIBRARY_PROMOTE_PATH, BUILDER_LIBRARY_SCHEMA_VERSION, type BuilderLibraryBrandAssetRef, type BuilderLibraryDocument, type BuilderLibraryEnvelope, type BuilderLibraryManifest, type BuilderLibraryPromotionProvenance, type BuilderLibraryReceipt, type BuilderLibraryResource, type BuilderLibraryResourceKind, type BuilderLibraryResourceProvenance, type BuilderLibraryResourceStatus, type BuilderLibraryScope, type BuilderLibrarySource, type BuilderLibrarySourceType, type BuilderLibraryTarget, type BuilderLibraryValidationOptions, type BuilderLibraryValidationResult, type BuilderLibraryViewer, type BuyerGiftClaim, CHAPTER_FLOW_FIELDS_SCHEMA_VERSION, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterBuilderLibrary, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmailIdentity, type ChapterEmails, type ChapterFieldFlow, type ChapterFlowField, type ChapterFlowFieldContract, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMemberContent, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, 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 EffectiveMemberContent, type EffectiveMemberContentPage, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, GIFT_OFFER_CATALOG_VERSION, type GiftOffer, type GiftOfferCatalog, type GiftOfferTarget, type GiftOfferValidation, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type JoinContinuation, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MAX_GIFT_OFFERS, MEMBERSHIP_PAGE_RENDERER, MEMBER_CONTENT_CONTROL_PATH, MEMBER_CONTENT_PATH, MEMBER_CONTENT_SCHEMA_VERSION, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberContentDocument, type MemberContentEnvelope, type MemberContentPage, type MemberContentPageProjection, type MemberContentProjection, type MemberContentReceipt, type MemberContentRejection, type MemberContentSource, type MemberContentSourceType, type MemberContentTarget, type MemberContentTierAuthority, type MemberContentValidationOptions, type MemberContentValidationResult, type MemberContentViewer, type MemberPageAudience, type MemberPageNavigation, type MemberPageUpsell, type MemberPageUpsellOffer, type MemberPageUpsellOverride, 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 PublicGiftOffer, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedBuilderLibrary, type ResolvedLeaderFormation, type ResolvedMemberContent, type ResolvedMemberPageUpsell, 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, SIGNUP_CONTROL_THEME_MARKER, SIGNUP_CONTROL_THEME_STYLE_ID, 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 SignupControlThemeHead, type SignupControlThemeMetadata, type SignupControlThemeOptions, type SignupControlThemeRevision, type SignupControlThemeStyleTarget, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationFlowFields, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildBuilderLibraryManifest, buildGroupSeed, buildTierSeeds, builderLibraryDigest, canApprove, canBook, canChangeRole, canTransition, canViewBuilderLibraryResource, canceledPatch, canonicalBuilderLibrary, canonicalMemberContent, canonicalSignupControl, chapterBrandFromTokens, chapterDb, chapterFlowFieldContract, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, composeMemberContent, createAdmissionGrantEnvelope, createBuilderLibraryEnvelope, createChapterIntegration, createClerkInvitation, createClerkUser, createMemberContentEnvelope, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findAdmissionGrant, findApplicationRef, findGiftOffer, findTier, firstPaymentPatch, formatChapterCopy, formationFields, formationFlowFields, getVaultSecret, giftOfferActive, hasDisclaimerAck, hydrateSignupControlTheme, injectSignupControlThemeHead, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadLatestAdmissionRevision, loadOfferableTiers, loadTiers, materializeAdmissionGrants, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberContentDigest, memberContentDocument, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeAdmissionEmail, normalizeChapterEmail, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectBuilderLibraryDelivery, projectMemberContent, projectSharedRecord, promoteBuilderLibraryResource, publicGiftOffers, reconcileMeetings, refundedPatch, render, renderSignupControlThemeHead, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveBuilderLibrary, resolveChapterCopy, resolveJoinContinuation, resolveLeaderFormation, resolveMemberContent, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateAdmissionGrantDocument, validateBuilderLibraryDocument, validateGiftOfferCatalog, validateMemberContentDocument, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
2900
+ export { ADMISSION_GRANTS_PATH, ADMISSION_GRANTS_SCHEMA_VERSION, type AccountModel, type AdminNotificationTrigger, type AdmissionDecision, type AdmissionGrantDocument, type AdmissionGrantEnvelope, type AdmissionGrantInput, type AdmissionGrantReceipt, type AdmissionGrantRejection, type AdmissionGrantRevisionRow, type AdmissionGrantRow, type AdmissionGrantValidation, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, BUILDER_LIBRARY_ADMIN_PATH, BUILDER_LIBRARY_CONTROL_PATH, BUILDER_LIBRARY_MANIFEST_PATH, BUILDER_LIBRARY_PROMOTE_PATH, BUILDER_LIBRARY_SCHEMA_VERSION, type BuilderLibraryBrandAssetRef, type BuilderLibraryDocument, type BuilderLibraryEnvelope, type BuilderLibraryManifest, type BuilderLibraryPromotionProvenance, type BuilderLibraryReceipt, type BuilderLibraryResource, type BuilderLibraryResourceKind, type BuilderLibraryResourceProvenance, type BuilderLibraryResourceStatus, type BuilderLibraryScope, type BuilderLibrarySource, type BuilderLibrarySourceType, type BuilderLibraryTarget, type BuilderLibraryValidationOptions, type BuilderLibraryValidationResult, type BuilderLibraryViewer, type BuyerGiftClaim, CHAPTER_FLOW_FIELDS_SCHEMA_VERSION, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterBuilderLibrary, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmailIdentity, type ChapterEmails, type ChapterFieldFlow, type ChapterFlowField, type ChapterFlowFieldContract, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMemberContent, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, 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 EffectiveMemberContent, type EffectiveMemberContentPage, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, GIFT_OFFER_CATALOG_VERSION, type GiftOffer, type GiftOfferCatalog, type GiftOfferTarget, type GiftOfferValidation, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type JoinContinuation, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MAX_GIFT_OFFERS, MEMBERSHIP_PAGE_RENDERER, MEMBER_CONTENT_CONTROL_PATH, MEMBER_CONTENT_PATH, MEMBER_CONTENT_SCHEMA_VERSION, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberContentDocument, type MemberContentEnvelope, type MemberContentPage, type MemberContentPageProjection, type MemberContentProjection, type MemberContentReceipt, type MemberContentRejection, type MemberContentSource, type MemberContentSourceType, type MemberContentTarget, type MemberContentTierAuthority, type MemberContentValidationOptions, type MemberContentValidationResult, type MemberContentViewer, type MemberPageAudience, type MemberPageNavigation, type MemberPageUpsell, type MemberPageUpsellOffer, type MemberPageUpsellOverride, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkEditableField, type NetworkRecord, type NetworkRecordEdit, type NetworkRecordMutation, type NetworkRecordMutationResult, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NetworkStageTransition, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type PublicGiftOffer, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedBuilderLibrary, type ResolvedLeaderFormation, type ResolvedMemberContent, type ResolvedMemberPageUpsell, 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, SIGNUP_CONTROL_THEME_MARKER, SIGNUP_CONTROL_THEME_STYLE_ID, 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 SignupControlThemeHead, type SignupControlThemeMetadata, type SignupControlThemeOptions, type SignupControlThemeRevision, type SignupControlThemeStyleTarget, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationFlowFields, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildBuilderLibraryManifest, buildGroupSeed, buildTierSeeds, builderLibraryDigest, canApprove, canBook, canChangeRole, canTransition, canViewBuilderLibraryResource, canceledPatch, canonicalBuilderLibrary, canonicalMemberContent, canonicalSignupControl, chapterBrandFromTokens, chapterDb, chapterFlowFieldContract, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, composeMemberContent, createAdmissionGrantEnvelope, createBuilderLibraryEnvelope, createChapterIntegration, createClerkInvitation, createClerkUser, createMemberContentEnvelope, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findAdmissionGrant, findApplicationRef, findGiftOffer, findTier, firstPaymentPatch, formatChapterCopy, formationFields, formationFlowFields, getVaultSecret, giftOfferActive, hasDisclaimerAck, hydrateSignupControlTheme, injectSignupControlThemeHead, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadLatestAdmissionRevision, loadOfferableTiers, loadTiers, materializeAdmissionGrants, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberContentDigest, memberContentDocument, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeAdmissionEmail, normalizeChapterEmail, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectBuilderLibraryDelivery, projectMemberContent, projectSharedRecord, promoteBuilderLibraryResource, publicGiftOffers, reconcileMeetings, refundedPatch, render, renderSignupControlThemeHead, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveBuilderLibrary, resolveChapterCopy, resolveJoinContinuation, resolveLeaderFormation, resolveMemberContent, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateAdmissionGrantDocument, validateBuilderLibraryDocument, validateGiftOfferCatalog, validateMemberContentDocument, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
package/dist/index.js CHANGED
@@ -299,6 +299,50 @@ var admissionGrantRevisionsEntity = {
299
299
  receivedAt: attr2("number", { indexed: true })
300
300
  }
301
301
  };
302
+ var leaderAdmissionAssignmentsEntity = {
303
+ attrs: {
304
+ id: id(),
305
+ targetId: attr2("string", { indexed: true }),
306
+ personId: attr2("string", { indexed: true }),
307
+ grantId: attr2("string", { indexed: true }),
308
+ decision: attr2("string", { indexed: true }),
309
+ note: attr2("string", { optional: true }),
310
+ expiresAt: attr2("number", { optional: true, indexed: true }),
311
+ active: attr2("boolean", { indexed: true }),
312
+ lastMutationId: attr2("string", { indexed: true }),
313
+ lastRequestDigest: attr2("string"),
314
+ createdAt: attr2("number", { indexed: true }),
315
+ createdBy: attr2("string", { indexed: true }),
316
+ updatedAt: attr2("number", { indexed: true }),
317
+ updatedBy: attr2("string", { indexed: true })
318
+ }
319
+ };
320
+ var leaderAdmissionDeliveriesEntity = {
321
+ attrs: {
322
+ id: id(),
323
+ targetId: attr2("string", { indexed: true }),
324
+ environment: attr2("string", { indexed: true }),
325
+ revision: attr2("number", { indexed: true }),
326
+ digest: attr2("string", { indexed: true }),
327
+ envelope: attr2("json"),
328
+ status: attr2("string", { indexed: true }),
329
+ attempts: attr2("number", { indexed: true }),
330
+ lastAttemptAt: attr2("number", { optional: true, indexed: true }),
331
+ lastError: attr2("string", { optional: true }),
332
+ acknowledgedAt: attr2("number", { optional: true, indexed: true }),
333
+ updatedAt: attr2("number", { indexed: true })
334
+ }
335
+ };
336
+ var leaderAdmissionMutationsEntity = {
337
+ attrs: {
338
+ id: id(),
339
+ targetId: attr2("string", { indexed: true }),
340
+ personId: attr2("string", { indexed: true }),
341
+ requestDigest: attr2("string", { indexed: true }),
342
+ revision: attr2("number", { indexed: true }),
343
+ createdAt: attr2("number", { indexed: true })
344
+ }
345
+ };
302
346
 
303
347
  // src/schema-gifts.ts
304
348
  var attr3 = (type, flags = {}) => ({
@@ -570,7 +614,7 @@ var emailLog = {
570
614
  sentAt: attr4("number", { indexed: true })
571
615
  }
572
616
  };
573
- function chapterDb(mode, auth, includeNetworkNotes = false, application = resolveApplication(void 0), includeSignupControl = false, includeMemberContent = false, includeBuilderLibrary = false) {
617
+ function chapterDb(mode, auth, includeNetworkNotes = false, application = resolveApplication(void 0), includeSignupControl = false, includeMemberContent = false, includeBuilderLibrary = false, includeLeaderAdmissions = false) {
574
618
  const entities = {};
575
619
  if (mode === "chapter") {
576
620
  entities.applications = applicationsFor(application);
@@ -598,6 +642,11 @@ function chapterDb(mode, auth, includeNetworkNotes = false, application = resolv
598
642
  entities.builderLibraryControls = builderLibraryControls;
599
643
  entities.builderLibraryLocal = builderLibraryLocal;
600
644
  }
645
+ if (includeLeaderAdmissions) {
646
+ entities.leaderAdmissionAssignments = leaderAdmissionAssignmentsEntity;
647
+ entities.leaderAdmissionDeliveries = leaderAdmissionDeliveriesEntity;
648
+ entities.leaderAdmissionMutations = leaderAdmissionMutationsEntity;
649
+ }
601
650
  const schema = { entities, links: {} };
602
651
  const rules = {};
603
652
  for (const ns of Object.keys(entities)) {
@@ -1366,6 +1415,12 @@ function formationFields(crm, formation) {
1366
1415
  return resolveFormationFlowFields(crm, formation);
1367
1416
  }
1368
1417
 
1418
+ // src/network-contract.ts
1419
+ var DEFAULT_SHARE_FIELDS = {
1420
+ person: ["name", "email", "firstName", "lastName", "phone", "linkedin"],
1421
+ company: ["name", "domain", "industry", "location", "linkedin", "notes"]
1422
+ };
1423
+
1369
1424
  // src/config-network.ts
1370
1425
  var SLUG = /^[a-z0-9][a-z0-9-]{1,62}$/;
1371
1426
  var FIELD = /^[a-z][a-zA-Z0-9_]*$/;
@@ -1377,6 +1432,34 @@ function validateSharedNotes(opts) {
1377
1432
  throw new Error(`${opts.path}: must contain unique CRM types allowed by fields`);
1378
1433
  }
1379
1434
  }
1435
+ function validateEditableFields(opts) {
1436
+ for (const [type, names] of Object.entries(opts.values)) {
1437
+ const readable = opts.readable?.[type];
1438
+ const def = opts.crm.config.types[type];
1439
+ const duplicate = names.some((name, index) => names.indexOf(name) !== index);
1440
+ const unknown = names.some((name) => !FIELD.test(name) || !def?.fields[name]);
1441
+ const hidden = opts.readable ? !readable || names.some((name) => !readable.includes(name)) : false;
1442
+ if (!FIELD.test(type) || names.length === 0 || duplicate || !def || unknown || hidden) {
1443
+ throw new Error(
1444
+ `${opts.path}.${type}: must contain unique, readable fields declared on CRM type "${type}"`
1445
+ );
1446
+ }
1447
+ }
1448
+ }
1449
+ function validateStageTransitions(opts) {
1450
+ const duplicate = opts.values.some((type, index) => opts.values.indexOf(type) !== index);
1451
+ const invalid = opts.values.some((type) => !FIELD.test(type) || !opts.crm.config.types[type]?.pipeline || (opts.readable ? !opts.readable[type] : false));
1452
+ if (duplicate || invalid) {
1453
+ throw new Error(`${opts.path}: must contain unique, readable CRM types with pipelines`);
1454
+ }
1455
+ }
1456
+ function validateAdmissionCapability(path, enabled, crm) {
1457
+ if (!enabled) return;
1458
+ const person = crm.config.types.person;
1459
+ if (!person?.emailField || person.fields[person.emailField]?.type !== "email") {
1460
+ throw new Error(`${path}: requires a CRM person type with an emailField`);
1461
+ }
1462
+ }
1380
1463
  function resolveNetwork(config, crm) {
1381
1464
  const seen = /* @__PURE__ */ new Set();
1382
1465
  const targets = [];
@@ -1435,6 +1518,26 @@ function resolveNetwork(config, crm) {
1435
1518
  crm,
1436
1519
  fields
1437
1520
  });
1521
+ const readableFields = fields ?? DEFAULT_SHARE_FIELDS;
1522
+ const editableFields = target.editableFields ?? {};
1523
+ validateEditableFields({
1524
+ path: `defineChapter.network.targets.${target.id}.editableFields`,
1525
+ values: editableFields,
1526
+ crm,
1527
+ readable: readableFields
1528
+ });
1529
+ const stageTransitions = target.stageTransitions ?? [];
1530
+ validateStageTransitions({
1531
+ path: `defineChapter.network.targets.${target.id}.stageTransitions`,
1532
+ values: stageTransitions,
1533
+ crm,
1534
+ readable: readableFields
1535
+ });
1536
+ validateAdmissionCapability(
1537
+ `defineChapter.network.targets.${target.id}.admissionGrants`,
1538
+ target.admissionGrants,
1539
+ crm
1540
+ );
1438
1541
  targets.push({
1439
1542
  id: target.id,
1440
1543
  name: target.name?.trim() || target.id,
@@ -1442,7 +1545,10 @@ function resolveNetwork(config, crm) {
1442
1545
  ...binding ? { binding } : {},
1443
1546
  secretName,
1444
1547
  ...fields ? { fields } : {},
1445
- sharedNotes
1548
+ sharedNotes,
1549
+ editableFields,
1550
+ stageTransitions,
1551
+ ...target.admissionGrants === true ? { admissionGrants: true } : {}
1446
1552
  });
1447
1553
  }
1448
1554
  const readerIds = /* @__PURE__ */ new Set();
@@ -1455,9 +1561,12 @@ function resolveNetwork(config, crm) {
1455
1561
  throw new Error(`defineChapter.network.readers: duplicate reader "${reader.id}"`);
1456
1562
  }
1457
1563
  readerIds.add(reader.id);
1458
- const entries = Object.entries(reader.fields ?? {});
1459
- if (entries.length === 0) {
1460
- throw new Error(`defineChapter.network.readers.${reader.id}.fields: at least one CRM type is required`);
1564
+ const readerFields = reader.fields ?? {};
1565
+ const entries = Object.entries(readerFields);
1566
+ if (entries.length === 0 && !reader.admissionGrants) {
1567
+ throw new Error(
1568
+ `defineChapter.network.readers.${reader.id}.fields: at least one CRM type is required unless this is an admission-only reader`
1569
+ );
1461
1570
  }
1462
1571
  for (const [type, names] of entries) {
1463
1572
  if (!FIELD.test(type) || names.length === 0 || names.some((name) => !FIELD.test(name))) {
@@ -1487,9 +1596,35 @@ function resolveNetwork(config, crm) {
1487
1596
  path: `defineChapter.network.readers.${reader.id}.sharedNotes`,
1488
1597
  values: sharedNotes,
1489
1598
  crm,
1490
- fields: reader.fields
1599
+ fields: readerFields
1600
+ });
1601
+ const editableFields = reader.editableFields ?? {};
1602
+ validateEditableFields({
1603
+ path: `defineChapter.network.readers.${reader.id}.editableFields`,
1604
+ values: editableFields,
1605
+ crm,
1606
+ readable: readerFields
1607
+ });
1608
+ const stageTransitions = reader.stageTransitions ?? [];
1609
+ validateStageTransitions({
1610
+ path: `defineChapter.network.readers.${reader.id}.stageTransitions`,
1611
+ values: stageTransitions,
1612
+ crm,
1613
+ readable: readerFields
1614
+ });
1615
+ validateAdmissionCapability(
1616
+ `defineChapter.network.readers.${reader.id}.admissionGrants`,
1617
+ reader.admissionGrants,
1618
+ crm
1619
+ );
1620
+ readers.push({
1621
+ id: reader.id,
1622
+ fields: readerFields,
1623
+ sharedNotes,
1624
+ editableFields,
1625
+ stageTransitions,
1626
+ ...reader.admissionGrants === true ? { admissionGrants: true } : {}
1491
1627
  });
1492
- readers.push({ id: reader.id, fields: reader.fields, sharedNotes });
1493
1628
  }
1494
1629
  return { targets, readers };
1495
1630
  }
@@ -1620,7 +1755,8 @@ function defineChapter(config) {
1620
1755
  application,
1621
1756
  Boolean(signupControl),
1622
1757
  Boolean(memberContent),
1623
- Boolean(builderLibrary)
1758
+ Boolean(builderLibrary),
1759
+ network.targets.some((target) => target.admissionGrants)
1624
1760
  );
1625
1761
  const services = config.services ?? ["db", "calendar", "o11y"];
1626
1762
  const account = config.account ?? "none";
@@ -3072,14 +3208,6 @@ import {
3072
3208
  updateRecord,
3073
3209
  upsertRecordOrigin
3074
3210
  } from "@odla-ai/crm";
3075
-
3076
- // src/network-contract.ts
3077
- var DEFAULT_SHARE_FIELDS = {
3078
- person: ["name", "email", "firstName", "lastName", "phone", "linkedin"],
3079
- company: ["name", "domain", "industry", "location", "linkedin", "notes"]
3080
- };
3081
-
3082
- // src/network.ts
3083
3211
  function sharedPersonInput(person) {
3084
3212
  const email = person.email.toLowerCase();
3085
3213
  const fullName = [person.firstName, person.lastName].filter(Boolean).join(" ").trim();