@odla-ai/chapter 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,18 +43,21 @@ interface ChapterCopy {
43
43
  */
44
44
  payment: TextFields<"setupFailed" | "preparing" | "pending" | "processing" | "payAndContinue" | "incomplete" | "consent">;
45
45
  done: TextFields<"label" | "calendarInvite" | "memberArea">;
46
+ accepted: TextFields<"label" | "body">;
47
+ gift: TextFields<"chooseSelf" | "optionsLabel" | "label" | "body" | "save" | "rotate" | "rotateFailed">;
46
48
  };
47
49
  members: {
48
50
  loadFailed: string;
49
51
  account: TextFields<"signOut" | "adminConsole">;
50
52
  provisional: TextFields<"cardLabel" | "applicationNeeded" | "applicationNeededBody" | "apply" | "refunded" | "refundedBody" | "active" | "renews" | "introductionCall" | "calendarInvite" | "joinCall" | "bookCall" | "bookCallBody" | "chooseTime">;
51
53
  full: TextFields<"welcome">;
54
+ gifts: TextFields<"title" | "body" | "noneAvailable" | "paid" | "saveCode" | "purchases" | "noPurchases" | "pending" | "redeemed" | "expired" | "revoked" | "rotate" | "rotated" | "rotateFailed" | "redeemTitle" | "code" | "redeem" | "redeemFailed">;
52
55
  reschedule: TextFields<"changeTime" | "unavailable" | "loadFailed" | "slotGone" | "loading" | "noTimes" | "rescheduling" | "keepTime">;
53
56
  };
54
57
  admin: {
55
58
  auth: TextFields<"checking" | "notAuthorized" | "accountNotAuthorized" | "thisAccount" | "signOut" | "loading" | "signInNotConfigured" | "missingPublishableKey" | "noWorkspaces" | "signInTagline">;
56
59
  shell: TextFields<"adminRole" | "adminConsole" | "adminName" | "navigationLabel">;
57
- workspaces: TextFields<"dashboard" | "overview" | "billing" | "people" | "network" | "portfolio" | "settings" | "calendar" | "email" | "chapters" | "formations" | "dealFlow" | "dashboardViewsLabel" | "settingsViewsLabel" | "collectionsLabel" | "portfolioViewsLabel">;
60
+ workspaces: TextFields<"dashboard" | "overview" | "billing" | "people" | "admission" | "network" | "portfolio" | "settings" | "calendar" | "email" | "chapters" | "formations" | "dealFlow" | "dashboardViewsLabel" | "settingsViewsLabel" | "collectionsLabel" | "portfolioViewsLabel">;
58
61
  dashboard: TextFields<"loading" | "loadFailed" | "upcomingCalls" | "callsNeedAttention" | "noUpcomingCalls" | "drift" | "open" | "meet" | "applications" | "newMembers" | "newMembersUnavailable" | "revenueAdded" | "revenue" | "revenueUnavailable" | "pipeline" | "pipelineLabel" | "thisWeek" | "noChange" | "activeMemberships" | "annualRunRate" | "testMode">;
59
62
  billing: TextFields<"loading" | "loadFailed" | "notConfigured" | "active" | "annualized" | "renewingSoon" | "pastDue" | "subscriptions" | "testMode" | "truncated" | "name" | "email" | "application" | "subscription" | "cancelling" | "amount" | "renews">;
60
63
  availability: TextFields<"loading" | "loadFailed" | "saved" | "title" | "days" | "startHour" | "endHour" | "slotMinutes" | "minNoticeHours" | "windowDays" | "timezone" | "summaryTemplate" | "save"> & {
@@ -62,6 +65,7 @@ interface ChapterCopy {
62
65
  };
63
66
  email: TextFields<"loading" | "loadFailed" | "saved" | "sent" | "testFailed" | "delivery" | "notificationAddress" | "replyTo" | "debugInbox" | "debugInboxHint" | "sendTest" | "enabled" | "subject" | "body" | "save" | "sendLog" | "sentColumn" | "templateColumn" | "statusColumn" | "toColumn" | "failed" | "redirected" | "delivered">;
64
67
  meetings: TextFields<"loading" | "loadFailed" | "cancelConfirm" | "newStartPrompt" | "parseFailed" | "agenda" | "empty" | "unknown" | "drift" | "meet" | "reschedule" | "cancel">;
68
+ admission: TextFields<"title" | "description" | "email" | "decision" | "expires" | "note" | "waive" | "require" | "add" | "ledger" | "loading" | "consumed" | "revoked" | "expired" | "active" | "local" | "parent" | "revoke">;
65
69
  network: AdminNetworkCopy;
66
70
  records: TextFields<"workflowMissing" | "comms" | "commsHistory" | "scheduling" | "billing" | "notes" | "access" | "sharing" | "lifecycle" | "role" | "superAdminHint" | "noAccount" | "approve" | "refund" | "approved" | "refunded" | "roleSet" | "messageSent" | "messageNotSent" | "loadingTemplates" | "template" | "chooseTemplate" | "sending" | "send" | "noMessages" | "message" | "newStartPrompt" | "parseFailed" | "cancelConfirm" | "callCancelled" | "callRescheduled" | "noApplication" | "loadingMeetings" | "noMeetings" | "joinMeeting" | "openCalendar" | "reschedule" | "cancel">;
67
71
  };
@@ -88,6 +92,55 @@ interface ResolvedSignupControl {
88
92
  stripeMode: "test" | "live";
89
93
  }
90
94
 
95
+ /** Optional authenticated member-content surface for a chapter site. */
96
+ interface ChapterMemberContent {
97
+ /** Keep Chapter-admin authoring enabled. Defaults to true. */
98
+ localAuthoring?: boolean;
99
+ /** Optional Parent/Built Not Found authority for signed inherited revisions. */
100
+ parent?: {
101
+ sourceId: string;
102
+ /** Follower-vault key holding the dedicated content edge secret. */
103
+ secretName?: string;
104
+ };
105
+ }
106
+ /** Validated member-content settings carried on a resolved Chapter. */
107
+ interface ResolvedMemberContent {
108
+ enabled: true;
109
+ localAuthoring: boolean;
110
+ parent: {
111
+ sourceId: string;
112
+ secretName: string;
113
+ } | null;
114
+ }
115
+
116
+ /** Scalar kinds accepted by the Chapter schema adapter. */
117
+ type AttrType = "string" | "number" | "boolean" | "json";
118
+ /** One odla-db attribute: its type and index/uniqueness/optionality flags. */
119
+ interface Attr {
120
+ type: AttrType;
121
+ unique: boolean;
122
+ indexed: boolean;
123
+ optional: boolean;
124
+ }
125
+ /** One odla-db namespace: its attribute map. */
126
+ interface Entity {
127
+ attrs: Record<string, Attr>;
128
+ }
129
+ /** A serialized odla-db schema fragment (namespaces + links). */
130
+ interface DbSchema {
131
+ entities: Record<string, Entity>;
132
+ links: Record<string, unknown>;
133
+ }
134
+ /** Per-namespace CEL rule strings (deny-all is `"false"` for each action). */
135
+ interface Rule {
136
+ view: string;
137
+ create: string;
138
+ update: string;
139
+ delete: string;
140
+ }
141
+ /** Namespace → rule set. */
142
+ type DbRules = Record<string, Rule>;
143
+
91
144
  /** One follower site a leader can push CRM records to. The secret VALUE never
92
145
  * lives in config: `secretName` names the leader tenant's vaulted copy of the
93
146
  * follower's `network_share_secret`. */
@@ -251,6 +304,13 @@ interface ChapterDb {
251
304
  value: string | number | boolean;
252
305
  }>[], opts?: {
253
306
  mutationId?: string;
307
+ guards?: Array<{
308
+ ns: string;
309
+ id: string;
310
+ exists: boolean;
311
+ equals?: Record<string, unknown>;
312
+ absent?: string[];
313
+ }>;
254
314
  }): Promise<{
255
315
  txId: number;
256
316
  duplicate: boolean;
@@ -259,33 +319,6 @@ interface ChapterDb {
259
319
  get(name: string): Promise<string>;
260
320
  };
261
321
  }
262
- /** The scalar kinds an odla-db attribute can hold. */
263
- type AttrType = "string" | "number" | "boolean" | "json";
264
- /** One odla-db attribute: its type and index/uniqueness/optionality flags. */
265
- interface Attr {
266
- type: AttrType;
267
- unique: boolean;
268
- indexed: boolean;
269
- optional: boolean;
270
- }
271
- /** One odla-db namespace: its attribute map. */
272
- interface Entity {
273
- attrs: Record<string, Attr>;
274
- }
275
- /** A serialized odla-db schema fragment (namespaces + links). */
276
- interface DbSchema {
277
- entities: Record<string, Entity>;
278
- links: Record<string, unknown>;
279
- }
280
- /** Per-namespace CEL rule strings (deny-all is `"false"` for each action). */
281
- interface Rule {
282
- view: string;
283
- create: string;
284
- update: string;
285
- delete: string;
286
- }
287
- /** Namespace → rule set. */
288
- type DbRules = Record<string, Rule>;
289
322
  /** Typed semantic roles shared by the public site and application surfaces. */
290
323
  interface ChapterBrandTokens {
291
324
  background?: string;
@@ -509,6 +542,8 @@ interface ChapterConfig {
509
542
  network?: ChapterNetwork;
510
543
  /** A separate signed edge that may control this chapter's complete signup. */
511
544
  signupControl?: ChapterSignupControl;
545
+ /** Authenticated parent + chapter member pages with server-enforced tier access. */
546
+ memberContent?: ChapterMemberContent;
512
547
  /** Enable a public, host-rendered formation application workflow. */
513
548
  formation?: LeaderFormationConfig;
514
549
  thesis?: unknown;
@@ -605,6 +640,8 @@ interface Chapter {
605
640
  network: ResolvedNetwork;
606
641
  /** Null unless this follower explicitly delegates signup authority. */
607
642
  signupControl: ResolvedSignupControl | null;
643
+ /** Null unless the standard authenticated member-content surface is enabled. */
644
+ memberContent: ResolvedMemberContent | null;
608
645
  /** Resolved public formation intake contract (disabled when omitted). */
609
646
  formation: ResolvedLeaderFormation;
610
647
  /** Resolved CRM engine (from `defineCrm`). */
@@ -759,6 +796,37 @@ interface MembershipPageDocument {
759
796
  footnoteMarkdown?: string;
760
797
  }
761
798
 
799
+ /** Current nested gift-catalog version inside signup-control. */
800
+ declare const GIFT_OFFER_CATALOG_VERSION: 1;
801
+ /** Membership tier or standalone entitlement fulfilled by redemption. */
802
+ type GiftOfferTarget = {
803
+ type: "tier";
804
+ tierId: string;
805
+ } | {
806
+ type: "entitlement";
807
+ entitlementKey: string;
808
+ };
809
+ /** Server-authored gift SKU; provider identifiers never reach public config. */
810
+ interface GiftOffer {
811
+ id: string;
812
+ target: GiftOfferTarget;
813
+ billingMode: "one_time" | "subscription";
814
+ stripePriceId: string;
815
+ priceCents: number;
816
+ currency: string;
817
+ redemptionLifetimeHours: number;
818
+ activeFrom?: number;
819
+ activeUntil?: number;
820
+ title: string;
821
+ description: string;
822
+ ctaLabel: string;
823
+ }
824
+ /** Versioned bounded collection delegated through signed signup control. */
825
+ interface GiftOfferCatalog {
826
+ schemaVersion: typeof GIFT_OFFER_CATALOG_VERSION;
827
+ offers: readonly GiftOffer[];
828
+ }
829
+
762
830
  /** Current wire-format version for complete signup-control documents. */
763
831
  declare const SIGNUP_CONTROL_SCHEMA_VERSION: 1;
764
832
  /** One authoritative membership tier in a signup-control revision. */
@@ -810,6 +878,7 @@ interface SignupControlDocument {
810
878
  policy?: SignupControlPolicy;
811
879
  scheduling?: ChapterScheduling;
812
880
  theme?: SignupControlTheme;
881
+ giftOffers?: GiftOfferCatalog;
813
882
  }
814
883
  /** Digest travels beside the document so the exact desired state is attestable. */
815
884
  interface SignupControlEnvelope {
@@ -840,6 +909,159 @@ interface SignupControlDeliveryOptions {
840
909
  /** Build and send one signed desired-state delivery. Durable retry belongs to the hub outbox. */
841
910
  declare function deliverSignupControl(options: SignupControlDeliveryOptions): Promise<SignupControlReceipt>;
842
911
 
912
+ /** Versioned contract for authenticated member content. */
913
+ declare const MEMBER_CONTENT_SCHEMA_VERSION: 1;
914
+ /** Authority that authored one independently stored member-content layer. */
915
+ type MemberContentSourceType = "parent" | "chapter";
916
+ /** Stable author identity attached to every member-content document and page. */
917
+ interface MemberContentSource {
918
+ type: MemberContentSourceType;
919
+ appId: string;
920
+ }
921
+ /** Chapter deployment that a parent member-content revision is intended for. */
922
+ interface MemberContentTarget {
923
+ chapterId: string;
924
+ environment: string;
925
+ }
926
+ /** Navigation is data, so agents do not have to coordinate route code. */
927
+ interface MemberPageNavigation {
928
+ section: string;
929
+ order: number;
930
+ parentId?: string;
931
+ }
932
+ /** Explicit sets avoid unsafe assumptions that commercial tiers form a ladder. */
933
+ type MemberPageAudience = {
934
+ kind: "all-members";
935
+ } | {
936
+ kind: "tiers";
937
+ tierIds: readonly string[];
938
+ };
939
+ /** Authored offer copy. Price and provider identity deliberately do not live here. */
940
+ interface MemberPageUpsellOffer {
941
+ tierId: string;
942
+ label?: string;
943
+ bodyMarkdown?: string;
944
+ ctaLabel?: string;
945
+ }
946
+ /** Parent offer authority is explicit; a Chapter can edit only a delegated offer. */
947
+ type MemberPageUpsell = {
948
+ owner: "parent";
949
+ offer: MemberPageUpsellOffer;
950
+ } | {
951
+ owner: "chapter";
952
+ offer?: MemberPageUpsellOffer;
953
+ };
954
+ /** Authored member page whose body is disclosed only after server-side projection. */
955
+ interface MemberContentPage {
956
+ id: string;
957
+ slug: string;
958
+ title: string;
959
+ summary?: string;
960
+ navigation: MemberPageNavigation;
961
+ audience: MemberPageAudience;
962
+ /** Safe Markdown shown while the body is withheld. */
963
+ teaserMarkdown?: string;
964
+ /** Never serialized to a viewer whose audience does not match. */
965
+ bodyMarkdown: string;
966
+ upsell?: MemberPageUpsell;
967
+ }
968
+ /** Chapter-owned offer attached to a Parent page that delegated offer authority. */
969
+ interface MemberPageUpsellOverride {
970
+ pageId: string;
971
+ offer: MemberPageUpsellOffer;
972
+ }
973
+ /** One complete source layer. Parent and Chapter layers are stored independently. */
974
+ interface MemberContentDocument {
975
+ schemaVersion: typeof MEMBER_CONTENT_SCHEMA_VERSION;
976
+ revision: number;
977
+ generatedAt: number;
978
+ source: MemberContentSource;
979
+ target?: MemberContentTarget;
980
+ pages: readonly MemberContentPage[];
981
+ upsellOverrides?: readonly MemberPageUpsellOverride[];
982
+ }
983
+ /** Canonical parent document and digest transmitted over the signed control edge. */
984
+ interface MemberContentEnvelope {
985
+ digest: string;
986
+ document: MemberContentDocument;
987
+ }
988
+ /** Durable Chapter acknowledgement for an accepted or idempotently replayed revision. */
989
+ interface MemberContentReceipt {
990
+ ok: true;
991
+ target: MemberContentTarget;
992
+ revision: number;
993
+ digest: string;
994
+ status: "accepted" | "replayed";
995
+ acknowledgedAt: number;
996
+ }
997
+
998
+ /** Inputs for one signed Parent → Chapter member-content delivery. */
999
+ interface MemberContentDeliveryOptions {
1000
+ secret: string;
1001
+ sender: string;
1002
+ targetUrl: string | URL;
1003
+ envelope: MemberContentEnvelope;
1004
+ fetch?: typeof globalThis.fetch;
1005
+ }
1006
+ /** Deliver one exact revision. Durable retry and approval remain Parent concerns. */
1007
+ declare function deliverMemberContent(options: MemberContentDeliveryOptions): Promise<MemberContentReceipt>;
1008
+
1009
+ /** Current wire version for parent-authored admission decisions. */
1010
+ declare const ADMISSION_GRANTS_SCHEMA_VERSION: 1;
1011
+ /** Whether an exact email can skip or must retain the Chapter interview. */
1012
+ type AdmissionDecision = "waive_interview" | "require_interview";
1013
+ /** One bounded admission decision. Email is PII and never enters public config. */
1014
+ interface AdmissionGrantInput {
1015
+ id: string;
1016
+ email: string;
1017
+ decision: AdmissionDecision;
1018
+ note?: string;
1019
+ expiresAt?: number;
1020
+ }
1021
+ /** Complete desired Parent state for one Chapter and environment. */
1022
+ interface AdmissionGrantDocument {
1023
+ schemaVersion: typeof ADMISSION_GRANTS_SCHEMA_VERSION;
1024
+ revision: number;
1025
+ generatedAt: number;
1026
+ source: {
1027
+ appId: string;
1028
+ actor: string;
1029
+ };
1030
+ target: {
1031
+ chapterId: string;
1032
+ environment: string;
1033
+ };
1034
+ grants: readonly AdmissionGrantInput[];
1035
+ }
1036
+ /** Canonical desired-state document paired with its integrity digest. */
1037
+ interface AdmissionGrantEnvelope {
1038
+ digest: string;
1039
+ document: AdmissionGrantDocument;
1040
+ }
1041
+ /** Chapter acknowledgement for an accepted or idempotently replayed revision. */
1042
+ interface AdmissionGrantReceipt {
1043
+ ok: true;
1044
+ target: {
1045
+ chapterId: string;
1046
+ environment: string;
1047
+ };
1048
+ revision: number;
1049
+ digest: string;
1050
+ status: "accepted" | "replayed";
1051
+ acknowledgedAt: number;
1052
+ }
1053
+
1054
+ /** Inputs required to sign and deliver one Parent admission revision. */
1055
+ interface AdmissionGrantDeliveryOptions {
1056
+ secret: string;
1057
+ sender: string;
1058
+ targetUrl: string | URL;
1059
+ envelope: AdmissionGrantEnvelope;
1060
+ fetch?: typeof globalThis.fetch;
1061
+ }
1062
+ /** Deliver one signed Parent admission revision. Durable retry belongs upstream. */
1063
+ declare function deliverAdmissionGrants(options: AdmissionGrantDeliveryOptions): Promise<AdmissionGrantReceipt>;
1064
+
843
1065
  /** Identity shared by initial HTML, response caching, and client hydration. */
844
1066
  interface SignupControlThemeMetadata {
845
1067
  source: "active" | "bootstrap";
@@ -910,4 +1132,4 @@ declare function chapterWorker(options: ChapterWorkerOptions): {
910
1132
  fetch(req: Request, env: ChapterEnv): Promise<Response>;
911
1133
  };
912
1134
 
913
- export { type ActiveSignupControlHtml, type ActiveSignupControlThemeOptions, type ChapterEnv, type ChapterWorkerOptions, type Route, type SignupControlDeliveryOptions, type WorkerContext, chapterWorker, createWorkerContext, deliverSignupControl, renderActiveSignupControlHtml, withActiveSignupControlTheme };
1135
+ export { type ActiveSignupControlHtml, type ActiveSignupControlThemeOptions, type AdmissionGrantDeliveryOptions, type ChapterEnv, type ChapterWorkerOptions, type MemberContentDeliveryOptions, type Route, type SignupControlDeliveryOptions, type WorkerContext, chapterWorker, createWorkerContext, deliverAdmissionGrants, deliverMemberContent, deliverSignupControl, renderActiveSignupControlHtml, withActiveSignupControlTheme };