@odla-ai/chapter 0.42.0 → 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
@@ -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
@@ -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
@@ -1366,6 +1366,12 @@ function formationFields(crm, formation) {
1366
1366
  return resolveFormationFlowFields(crm, formation);
1367
1367
  }
1368
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
+
1369
1375
  // src/config-network.ts
1370
1376
  var SLUG = /^[a-z0-9][a-z0-9-]{1,62}$/;
1371
1377
  var FIELD = /^[a-z][a-zA-Z0-9_]*$/;
@@ -1377,6 +1383,27 @@ function validateSharedNotes(opts) {
1377
1383
  throw new Error(`${opts.path}: must contain unique CRM types allowed by fields`);
1378
1384
  }
1379
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
+ }
1380
1407
  function resolveNetwork(config, crm) {
1381
1408
  const seen = /* @__PURE__ */ new Set();
1382
1409
  const targets = [];
@@ -1435,6 +1462,21 @@ function resolveNetwork(config, crm) {
1435
1462
  crm,
1436
1463
  fields
1437
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
+ });
1438
1480
  targets.push({
1439
1481
  id: target.id,
1440
1482
  name: target.name?.trim() || target.id,
@@ -1442,7 +1484,9 @@ function resolveNetwork(config, crm) {
1442
1484
  ...binding ? { binding } : {},
1443
1485
  secretName,
1444
1486
  ...fields ? { fields } : {},
1445
- sharedNotes
1487
+ sharedNotes,
1488
+ editableFields,
1489
+ stageTransitions
1446
1490
  });
1447
1491
  }
1448
1492
  const readerIds = /* @__PURE__ */ new Set();
@@ -1489,7 +1533,21 @@ function resolveNetwork(config, crm) {
1489
1533
  crm,
1490
1534
  fields: reader.fields
1491
1535
  });
1492
- 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 });
1493
1551
  }
1494
1552
  return { targets, readers };
1495
1553
  }
@@ -3072,14 +3130,6 @@ import {
3072
3130
  updateRecord,
3073
3131
  upsertRecordOrigin
3074
3132
  } 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
3133
  function sharedPersonInput(person) {
3084
3134
  const email = person.email.toLowerCase();
3085
3135
  const fullName = [person.firstName, person.lastName].filter(Boolean).join(" ").trim();