@odla-ai/chapter 0.41.1 → 0.42.1

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
@@ -134,7 +134,7 @@ interface ChapterCopy {
134
134
  payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
135
135
  done: TextFields<"label" | "calendarInvite" | "memberArea">;
136
136
  accepted: TextFields<"label" | "body">;
137
- gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed">;
137
+ gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed" | "claimTitle" | "claimBody" | "code" | "redeem" | "redeemed" | "redeemFailed">;
138
138
  };
139
139
  members: {
140
140
  loadFailed: string;
@@ -275,6 +275,13 @@ 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[];
278
285
  }
279
286
  /** One signed peer allowed to browse a privacy-bounded projection of this
280
287
  * site's CRM. The follower owns this allowlist; a leader target declaration
@@ -289,6 +296,13 @@ interface ChapterNetworkReader {
289
296
  * Omitted by default: browse permission never silently grants write access.
290
297
  * Shared notes land in the follower CRM activity feed. */
291
298
  sharedNotes?: readonly string[];
299
+ /** Exact local CRM fields this reader may edit remotely, by record type.
300
+ * Every field must also be readable so the peer can perform an optimistic
301
+ * edit against the value and revision it actually reviewed. */
302
+ editableFields?: Record<string, readonly string[]>;
303
+ /** Local CRM record types on which this reader may request a lifecycle
304
+ * transition. Chapter still enforces the local pipeline and gates. */
305
+ stageTransitions?: readonly string[];
292
306
  }
293
307
  /** Leader/follower network configuration. A follower needs no code config to
294
308
  * receive pushed records. It must explicitly declare `readers` before any peer
@@ -331,12 +345,16 @@ interface ResolvedNetworkTarget {
331
345
  secretName: string;
332
346
  fields?: Record<string, readonly string[]>;
333
347
  sharedNotes: readonly string[];
348
+ editableFields: Record<string, readonly string[]>;
349
+ stageTransitions: readonly string[];
334
350
  }
335
351
  /** A validated follower-owned record projection for one signed reader. */
336
352
  interface ResolvedNetworkReader {
337
353
  id: string;
338
354
  fields: Record<string, readonly string[]>;
339
355
  sharedNotes: readonly string[];
356
+ editableFields: Record<string, readonly string[]>;
357
+ stageTransitions: readonly string[];
340
358
  }
341
359
  /** Fully-resolved leader network configuration. */
342
360
  interface ResolvedNetwork {
@@ -1932,6 +1950,52 @@ interface NetworkRecord {
1932
1950
  fields: Record<string, unknown>;
1933
1951
  createdAt: number;
1934
1952
  updatedAt: number;
1953
+ /** Optimistic concurrency token authored by the follower. */
1954
+ revision: number;
1955
+ /** Follower-authored edit contract. Omitted when this edge is read-only. */
1956
+ edit?: NetworkRecordEdit;
1957
+ }
1958
+ /** One follower CRM field a leader may patch. */
1959
+ interface NetworkEditableField {
1960
+ id: string;
1961
+ label: string;
1962
+ type: FieldType;
1963
+ required: boolean;
1964
+ options?: readonly string[];
1965
+ }
1966
+ /** One follower-authoritative lifecycle destination currently allowed. */
1967
+ interface NetworkStageTransition {
1968
+ id: string;
1969
+ label: string;
1970
+ }
1971
+ /** Edit metadata computed from the follower schema, pipeline, and record. */
1972
+ interface NetworkRecordEdit {
1973
+ fields: NetworkEditableField[];
1974
+ allowedStages: NetworkStageTransition[];
1975
+ }
1976
+ /** Signed follower mutation dispatched by a leader admin. Exactly one of
1977
+ * `fields` or `stage` is present. */
1978
+ interface NetworkRecordMutation {
1979
+ type: string;
1980
+ expectedRevision: number;
1981
+ expectedStage?: string | null;
1982
+ mutationId: string;
1983
+ fields?: Record<string, unknown>;
1984
+ stage?: string;
1985
+ actor: {
1986
+ id: string;
1987
+ email?: string;
1988
+ };
1989
+ }
1990
+ /** Successful follower mutation response. */
1991
+ interface NetworkRecordMutationResult {
1992
+ version: 1;
1993
+ site: {
1994
+ id: string;
1995
+ name: string;
1996
+ };
1997
+ record: NetworkRecord;
1998
+ duplicate: boolean;
1935
1999
  }
1936
2000
  /** One bounded, offset-paged follower record window. */
1937
2001
  interface NetworkRecordPage {
@@ -2825,4 +2889,4 @@ interface ChapterPromotionInput {
2825
2889
  /** Export the provider-independent pieces of one exact active signup revision. */
2826
2890
  declare function exportChapterPromotion(input: ChapterPromotionInput): Promise<PromotionAdapterResult>;
2827
2891
 
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 };
2892
+ 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
@@ -134,7 +134,7 @@ interface ChapterCopy {
134
134
  payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
135
135
  done: TextFields<"label" | "calendarInvite" | "memberArea">;
136
136
  accepted: TextFields<"label" | "body">;
137
- gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed">;
137
+ gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed" | "claimTitle" | "claimBody" | "code" | "redeem" | "redeemed" | "redeemFailed">;
138
138
  };
139
139
  members: {
140
140
  loadFailed: string;
@@ -275,6 +275,13 @@ 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[];
278
285
  }
279
286
  /** One signed peer allowed to browse a privacy-bounded projection of this
280
287
  * site's CRM. The follower owns this allowlist; a leader target declaration
@@ -289,6 +296,13 @@ interface ChapterNetworkReader {
289
296
  * Omitted by default: browse permission never silently grants write access.
290
297
  * Shared notes land in the follower CRM activity feed. */
291
298
  sharedNotes?: readonly string[];
299
+ /** Exact local CRM fields this reader may edit remotely, by record type.
300
+ * Every field must also be readable so the peer can perform an optimistic
301
+ * edit against the value and revision it actually reviewed. */
302
+ editableFields?: Record<string, readonly string[]>;
303
+ /** Local CRM record types on which this reader may request a lifecycle
304
+ * transition. Chapter still enforces the local pipeline and gates. */
305
+ stageTransitions?: readonly string[];
292
306
  }
293
307
  /** Leader/follower network configuration. A follower needs no code config to
294
308
  * receive pushed records. It must explicitly declare `readers` before any peer
@@ -331,12 +345,16 @@ interface ResolvedNetworkTarget {
331
345
  secretName: string;
332
346
  fields?: Record<string, readonly string[]>;
333
347
  sharedNotes: readonly string[];
348
+ editableFields: Record<string, readonly string[]>;
349
+ stageTransitions: readonly string[];
334
350
  }
335
351
  /** A validated follower-owned record projection for one signed reader. */
336
352
  interface ResolvedNetworkReader {
337
353
  id: string;
338
354
  fields: Record<string, readonly string[]>;
339
355
  sharedNotes: readonly string[];
356
+ editableFields: Record<string, readonly string[]>;
357
+ stageTransitions: readonly string[];
340
358
  }
341
359
  /** Fully-resolved leader network configuration. */
342
360
  interface ResolvedNetwork {
@@ -1932,6 +1950,52 @@ interface NetworkRecord {
1932
1950
  fields: Record<string, unknown>;
1933
1951
  createdAt: number;
1934
1952
  updatedAt: number;
1953
+ /** Optimistic concurrency token authored by the follower. */
1954
+ revision: number;
1955
+ /** Follower-authored edit contract. Omitted when this edge is read-only. */
1956
+ edit?: NetworkRecordEdit;
1957
+ }
1958
+ /** One follower CRM field a leader may patch. */
1959
+ interface NetworkEditableField {
1960
+ id: string;
1961
+ label: string;
1962
+ type: FieldType;
1963
+ required: boolean;
1964
+ options?: readonly string[];
1965
+ }
1966
+ /** One follower-authoritative lifecycle destination currently allowed. */
1967
+ interface NetworkStageTransition {
1968
+ id: string;
1969
+ label: string;
1970
+ }
1971
+ /** Edit metadata computed from the follower schema, pipeline, and record. */
1972
+ interface NetworkRecordEdit {
1973
+ fields: NetworkEditableField[];
1974
+ allowedStages: NetworkStageTransition[];
1975
+ }
1976
+ /** Signed follower mutation dispatched by a leader admin. Exactly one of
1977
+ * `fields` or `stage` is present. */
1978
+ interface NetworkRecordMutation {
1979
+ type: string;
1980
+ expectedRevision: number;
1981
+ expectedStage?: string | null;
1982
+ mutationId: string;
1983
+ fields?: Record<string, unknown>;
1984
+ stage?: string;
1985
+ actor: {
1986
+ id: string;
1987
+ email?: string;
1988
+ };
1989
+ }
1990
+ /** Successful follower mutation response. */
1991
+ interface NetworkRecordMutationResult {
1992
+ version: 1;
1993
+ site: {
1994
+ id: string;
1995
+ name: string;
1996
+ };
1997
+ record: NetworkRecord;
1998
+ duplicate: boolean;
1935
1999
  }
1936
2000
  /** One bounded, offset-paged follower record window. */
1937
2001
  interface NetworkRecordPage {
@@ -2825,4 +2889,4 @@ interface ChapterPromotionInput {
2825
2889
  /** Export the provider-independent pieces of one exact active signup revision. */
2826
2890
  declare function exportChapterPromotion(input: ChapterPromotionInput): Promise<PromotionAdapterResult>;
2827
2891
 
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 };
2892
+ 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
@@ -1119,7 +1119,13 @@ var DEFAULT_JOIN_COPY = {
1119
1119
  body: "Share this one-time code with the recipient. It becomes active after payment is confirmed.",
1120
1120
  save: "Save it now. For security, this code is shown only once.",
1121
1121
  rotate: "Generate a new code",
1122
- rotateFailed: "A new code could not be generated."
1122
+ rotateFailed: "A new code could not be generated.",
1123
+ claimTitle: "Have a gift code?",
1124
+ claimBody: "Use it here instead of paying by card.",
1125
+ code: "One-time code",
1126
+ redeem: "Use gift code",
1127
+ redeemed: "Gift code applied.",
1128
+ redeemFailed: "The code is invalid, unavailable, or does not match this membership."
1123
1129
  }
1124
1130
  };
1125
1131
  var DEFAULT_MEMBERS_COPY = {
@@ -1360,6 +1366,12 @@ function formationFields(crm, formation) {
1360
1366
  return resolveFormationFlowFields(crm, formation);
1361
1367
  }
1362
1368
 
1369
+ // src/network-contract.ts
1370
+ var DEFAULT_SHARE_FIELDS = {
1371
+ person: ["name", "email", "firstName", "lastName", "phone", "linkedin"],
1372
+ company: ["name", "domain", "industry", "location", "linkedin", "notes"]
1373
+ };
1374
+
1363
1375
  // src/config-network.ts
1364
1376
  var SLUG = /^[a-z0-9][a-z0-9-]{1,62}$/;
1365
1377
  var FIELD = /^[a-z][a-zA-Z0-9_]*$/;
@@ -1371,6 +1383,27 @@ function validateSharedNotes(opts) {
1371
1383
  throw new Error(`${opts.path}: must contain unique CRM types allowed by fields`);
1372
1384
  }
1373
1385
  }
1386
+ function validateEditableFields(opts) {
1387
+ for (const [type, names] of Object.entries(opts.values)) {
1388
+ const readable = opts.readable?.[type];
1389
+ const def = opts.crm.config.types[type];
1390
+ const duplicate = names.some((name, index) => names.indexOf(name) !== index);
1391
+ const unknown = names.some((name) => !FIELD.test(name) || !def?.fields[name]);
1392
+ const hidden = opts.readable ? !readable || names.some((name) => !readable.includes(name)) : false;
1393
+ if (!FIELD.test(type) || names.length === 0 || duplicate || !def || unknown || hidden) {
1394
+ throw new Error(
1395
+ `${opts.path}.${type}: must contain unique, readable fields declared on CRM type "${type}"`
1396
+ );
1397
+ }
1398
+ }
1399
+ }
1400
+ function validateStageTransitions(opts) {
1401
+ const duplicate = opts.values.some((type, index) => opts.values.indexOf(type) !== index);
1402
+ const invalid = opts.values.some((type) => !FIELD.test(type) || !opts.crm.config.types[type]?.pipeline || (opts.readable ? !opts.readable[type] : false));
1403
+ if (duplicate || invalid) {
1404
+ throw new Error(`${opts.path}: must contain unique, readable CRM types with pipelines`);
1405
+ }
1406
+ }
1374
1407
  function resolveNetwork(config, crm) {
1375
1408
  const seen = /* @__PURE__ */ new Set();
1376
1409
  const targets = [];
@@ -1429,6 +1462,21 @@ function resolveNetwork(config, crm) {
1429
1462
  crm,
1430
1463
  fields
1431
1464
  });
1465
+ const readableFields = fields ?? DEFAULT_SHARE_FIELDS;
1466
+ const editableFields = target.editableFields ?? {};
1467
+ validateEditableFields({
1468
+ path: `defineChapter.network.targets.${target.id}.editableFields`,
1469
+ values: editableFields,
1470
+ crm,
1471
+ readable: readableFields
1472
+ });
1473
+ const stageTransitions = target.stageTransitions ?? [];
1474
+ validateStageTransitions({
1475
+ path: `defineChapter.network.targets.${target.id}.stageTransitions`,
1476
+ values: stageTransitions,
1477
+ crm,
1478
+ readable: readableFields
1479
+ });
1432
1480
  targets.push({
1433
1481
  id: target.id,
1434
1482
  name: target.name?.trim() || target.id,
@@ -1436,7 +1484,9 @@ function resolveNetwork(config, crm) {
1436
1484
  ...binding ? { binding } : {},
1437
1485
  secretName,
1438
1486
  ...fields ? { fields } : {},
1439
- sharedNotes
1487
+ sharedNotes,
1488
+ editableFields,
1489
+ stageTransitions
1440
1490
  });
1441
1491
  }
1442
1492
  const readerIds = /* @__PURE__ */ new Set();
@@ -1483,7 +1533,21 @@ function resolveNetwork(config, crm) {
1483
1533
  crm,
1484
1534
  fields: reader.fields
1485
1535
  });
1486
- readers.push({ id: reader.id, fields: reader.fields, sharedNotes });
1536
+ const editableFields = reader.editableFields ?? {};
1537
+ validateEditableFields({
1538
+ path: `defineChapter.network.readers.${reader.id}.editableFields`,
1539
+ values: editableFields,
1540
+ crm,
1541
+ readable: reader.fields
1542
+ });
1543
+ const stageTransitions = reader.stageTransitions ?? [];
1544
+ validateStageTransitions({
1545
+ path: `defineChapter.network.readers.${reader.id}.stageTransitions`,
1546
+ values: stageTransitions,
1547
+ crm,
1548
+ readable: reader.fields
1549
+ });
1550
+ readers.push({ id: reader.id, fields: reader.fields, sharedNotes, editableFields, stageTransitions });
1487
1551
  }
1488
1552
  return { targets, readers };
1489
1553
  }
@@ -3066,14 +3130,6 @@ import {
3066
3130
  updateRecord,
3067
3131
  upsertRecordOrigin
3068
3132
  } from "@odla-ai/crm";
3069
-
3070
- // src/network-contract.ts
3071
- var DEFAULT_SHARE_FIELDS = {
3072
- person: ["name", "email", "firstName", "lastName", "phone", "linkedin"],
3073
- company: ["name", "domain", "industry", "location", "linkedin", "notes"]
3074
- };
3075
-
3076
- // src/network.ts
3077
3133
  function sharedPersonInput(person) {
3078
3134
  const email = person.email.toLowerCase();
3079
3135
  const fullName = [person.firstName, person.lastName].filter(Boolean).join(" ").trim();