@odla-ai/chapter 0.61.0 → 0.63.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.
@@ -61,11 +61,30 @@ interface ChapterEmailEvent {
61
61
  requiresTier?: boolean;
62
62
  }
63
63
 
64
- type TextFields$1<Key extends string> = {
64
+ type TextFields$2<Key extends string> = {
65
65
  [Field in Key]: string;
66
66
  };
67
67
  /** User-visible language for sharing, delivery state, and leader rollups. */
68
- type AdminNetworkCopy = TextFields$1<"title" | "allowlistDescription" | "sharing" | "shareWith" | "shared" | "shareFailed" | "deliveryFailed" | "loadingRollup" | "loadRollupFailed" | "overview" | "configuredFollowers" | "reachableFollowers" | "recordsAcrossFollowers" | "noFollowers" | "followers" | "available" | "unavailable" | "transportReachable" | "transportUnavailable" | "transportNotChecked" | "edgeUnpaired" | "edgeUnpairedHint" | "bindingTransport" | "urlTransport" | "activeConfiguration" | "noActiveConfiguration" | "publicSiteAvailable" | "publicSiteUnavailable" | "publicSiteNotChecked" | "recordTotals" | "noRecordTotals">;
68
+ type AdminNetworkCopy = TextFields$2<"title" | "allowlistDescription" | "sharing" | "shareWith" | "shared" | "shareFailed" | "deliveryFailed" | "loadingRollup" | "loadRollupFailed" | "overview" | "configuredFollowers" | "reachableFollowers" | "recordsAcrossFollowers" | "noFollowers" | "followers" | "available" | "unavailable" | "transportReachable" | "transportUnavailable" | "transportNotChecked" | "edgeUnpaired" | "edgeUnpairedHint" | "bindingTransport" | "urlTransport" | "activeConfiguration" | "noActiveConfiguration" | "publicSiteAvailable" | "publicSiteUnavailable" | "publicSiteNotChecked" | "recordTotals" | "noRecordTotals">;
69
+
70
+ type TextFields$1<Key extends string> = {
71
+ [Field in Key]: string;
72
+ };
73
+ /**
74
+ * Member portal language. Placeholders in braces are filled by
75
+ * `formatChapterCopy()`. Sites override any field through `copy.portal`.
76
+ */
77
+ interface PortalCopy {
78
+ shell: TextFields$1<"navLabel" | "welcomeBack" | "home" | "backHome" | "yourProfile" | "signedInAs" | "signOut" | "adminConsole" | "openMenu" | "closeMenu" | "locked" | "loading" | "loadFailed" | "notFound">;
79
+ pages: TextFields$1<"comingSoon" | "comingIn" | "includedWith" | "upgrade" | "comingToPortal" | "tagNew" | "tagSoon">;
80
+ profile: TextFields$1<"eyebrow" | "editProfile" | "saveProfile" | "saving" | "cancel" | "uploadPhoto" | "changePhoto" | "photoUploading" | "photoFailed" | "memberSince" | "promptsTitle" | "promptsNote" | "answerEmpty" | "addPrompt" | "howYouFoundUs" | "referredBy" | "referredByNote" | "introducedBy" | "introducedByPlaceholder" | "namePlaceholder" | "locationPlaceholder" | "saved" | "conflict" | "saveFailed">;
81
+ /** Invitations and referrals. Templates take {tierName}, {article}, {inviteUrl}, {firstName}, {location}, {credit}. */
82
+ share: TextFields$1<"eyebrow" | "intro" | "officialTitle" | "officialBody" | "showMeHow" | "stepsEyebrow" | "openLinkedIn" | "copyDescription" | "linkedinDescription" | "postTitle" | "postBody" | "shareOnLinkedIn" | "previewPost" | "linkedinPost" | "linkTitle" | "linkBody" | "linkCredit" | "referralsCredit" | "copyLink" | "copied" | "copyBlocked" | "emailInvite" | "textInvite" | "inviteNote" | "emailSubject" | "emailBody" | "textBody" | "fallbackEmail" | "fallbackText" | "copyMessage" | "close" | "referralsTitle" | "referralsBody" | "inviteFriend" | "joined" | "inProcess" | "offNextYear" | "joinedWith"> & {
83
+ steps: string[];
84
+ };
85
+ /** The cohort course page and Home panel. Templates take {left}, {capacity}, {position}, {count}. */
86
+ course: TextFields$1<"eyebrow" | "reserve" | "seeDetails" | "courseDetails" | "youreIn" | "invitesOnWay" | "openMeet" | "giveUp" | "confirmGiveUp" | "joinWaitlist" | "onWaitlist" | "leaveWaitlist" | "seatsOpen" | "full" | "closed" | "when" | "dates" | "where" | "seats" | "googleMeet" | "inviteEvery" | "guidesTitle" | "sessionsTitle" | "materialsOpen" | "materialsLocked" | "items" | "outcomesTitle" | "toolkitTitle" | "timeTitle" | "open" | "read" | "do" | "watch" | "extra" | "failed" | "reserveYourSeat">;
87
+ }
69
88
 
70
89
  /** Copy for the person record panels: lifecycle actions, comms, scheduling, billing and meetings. */
71
90
  type AdminRecordsCopy = {
@@ -108,11 +127,13 @@ interface ChapterCopy {
108
127
  members: {
109
128
  loadFailed: string;
110
129
  account: TextFields<"signOut" | "adminConsole">;
111
- provisional: TextFields<"cardLabel" | "applicationNeeded" | "applicationNeededBody" | "apply" | "refunded" | "refundedBody" | "active" | "renews" | "introductionCall" | "calendarInvite" | "joinCall" | "bookCall" | "bookCallBody" | "chooseTime">;
130
+ provisional: TextFields<"cardLabel" | "applicationNeeded" | "applicationNeededBody" | "apply" | "refunded" | "refundedBody" | "declined" | "declinedBody" | "active" | "renews" | "introductionCall" | "calendarInvite" | "joinCall" | "bookCall" | "bookCallBody" | "chooseTime">;
112
131
  full: TextFields<"welcome">;
113
132
  gifts: TextFields<"title" | "body" | "noneAvailable" | "paid" | "saveCode" | "purchases" | "noPurchases" | "pending" | "redeemed" | "expired" | "revoked" | "rotate" | "rotated" | "rotateFailed" | "redeemTitle" | "code" | "redeem" | "redeemFailed">;
114
133
  reschedule: TextFields<"changeTime" | "unavailable" | "loadFailed" | "slotGone" | "loading" | "noTimes" | "rescheduling" | "keepTime">;
115
134
  };
135
+ /** Signed-in member portal: shell, pages, profile. */
136
+ portal: PortalCopy;
116
137
  admin: {
117
138
  auth: TextFields<"checking" | "notAuthorized" | "accountNotAuthorized" | "thisAccount" | "signOut" | "loading" | "signInNotConfigured" | "missingPublishableKey" | "noWorkspaces" | "signInTagline">;
118
139
  shell: TextFields<"adminRole" | "adminConsole" | "adminName" | "navigationLabel">;
@@ -175,6 +196,51 @@ interface ResolvedMemberContent {
175
196
  } | null;
176
197
  }
177
198
 
199
+ /** Invite links and referral credit for a chapter-mode site. */
200
+ interface ChapterMemberReferrals {
201
+ /** Public path that invite links live under; `<path>/<code>`. Defaults to `/join`. */
202
+ path?: string;
203
+ /** Where an invite link sends a visitor (absolute https URL or site path). `?ref=<code>` is appended. */
204
+ membershipUrl: string;
205
+ /** Lifetime of the first-party referral cookie, in days. Defaults to 90. */
206
+ cookieDays?: number;
207
+ /**
208
+ * Credit a dues-paying referrer earns when a friend they referred is approved
209
+ * on a dues-paying tier. Omit or `false` for invite links without credit.
210
+ */
211
+ credit?: {
212
+ valueCents: number;
213
+ } | false;
214
+ }
215
+ /** The signed-in member portal. Its navigation and access come from the member-content catalog. */
216
+ interface ChapterMemberPortal {
217
+ /** Prompts a member may answer on their profile, in display order. */
218
+ profilePrompts?: readonly string[];
219
+ /** How many prompts a member may answer. Defaults to 3. */
220
+ maxPrompts?: number;
221
+ /** Member profile photos in odla-db file storage. Defaults to true. */
222
+ photos?: boolean;
223
+ /** Cohort courses on one recurring Google Calendar event. Chapter mode only. */
224
+ courses?: boolean;
225
+ /** Personal invite links, Referred by, and optional credit. Chapter mode only. */
226
+ referrals?: ChapterMemberReferrals;
227
+ }
228
+ /** Resolved invite-link settings. */
229
+ interface ResolvedMemberReferrals {
230
+ path: string;
231
+ membershipUrl: string;
232
+ cookieDays: number;
233
+ creditCents: number | null;
234
+ }
235
+ /** Resolved member portal settings. */
236
+ interface ResolvedMemberPortal {
237
+ profilePrompts: readonly string[];
238
+ maxPrompts: number;
239
+ photos: boolean;
240
+ courses: boolean;
241
+ referrals: ResolvedMemberReferrals | null;
242
+ }
243
+
178
244
  /** Optional private Builder Library shared across Built Not Found and Chapters. */
179
245
  interface ChapterBuilderLibrary {
180
246
  /** Keep local admin authoring enabled. Defaults to true. */
@@ -391,6 +457,82 @@ interface ResolvedNetwork {
391
457
  readers: readonly ResolvedNetworkReader[];
392
458
  }
393
459
 
460
+ /** Brand identity and build-time tokens from the checked-in Chapter config. */
461
+ /** Typed semantic roles shared by the public site and application surfaces. */
462
+ interface ChapterBrandTokens {
463
+ background?: string;
464
+ surface?: string;
465
+ surface2?: string;
466
+ text?: string;
467
+ textMuted?: string;
468
+ textFaint?: string;
469
+ border?: string;
470
+ borderStrong?: string;
471
+ accent?: string;
472
+ accentStrong?: string;
473
+ accentSoft?: string;
474
+ onAccent?: string;
475
+ good?: string;
476
+ warn?: string;
477
+ danger?: string;
478
+ chart1?: string;
479
+ chart2?: string;
480
+ chart3?: string;
481
+ chart4?: string;
482
+ chart5?: string;
483
+ chart6?: string;
484
+ chartPositive?: string;
485
+ chartNegative?: string;
486
+ /** Admin/application content width, e.g. `"960px"`. */
487
+ contentWidth?: string;
488
+ panelRadius?: string;
489
+ panelShadow?: string;
490
+ masterDetailColumns?: string;
491
+ masterDetailMinHeight?: string;
492
+ /** Chapter-admin page padding shorthand. */
493
+ pagePadding?: string;
494
+ /** Chapter-admin workspace-tab padding shorthand. */
495
+ workspacePadding?: string;
496
+ }
497
+ /** Brand tokens that theme the site: theme, semantic roles, fonts, and logos. */
498
+ interface ChapterBrand {
499
+ /** Preloaded @odla-ai/ui theme name used by ThemeScope. */
500
+ theme?: string;
501
+ /** Named accent family supplied by the selected @odla-ai/ui theme. */
502
+ accent?: string;
503
+ /** Admin/application color mode. Explicit light is the safe default. */
504
+ colorScheme?: "light" | "dark" | "system";
505
+ tokens?: ChapterBrandTokens;
506
+ tokensDark?: ChapterBrandTokens;
507
+ /** Palette overrides written into styles.css :root (e.g. `{ moss: "#2F3E34" }`
508
+ * or `--ui-*` token names). Applies in BOTH light and dark unless overridden
509
+ * by {@link paletteDark}. */
510
+ palette?: Record<string, string>;
511
+ /** Dark-mode palette overrides. Same shape as {@link palette}; emitted under
512
+ * `:root[data-theme="dark"]` and `@media (prefers-color-scheme: dark)`, so a
513
+ * site brands both modes. */
514
+ paletteDark?: Record<string, string>;
515
+ /** Full token map for `.ui-invert` islands. A compiled custom theme normally
516
+ * uses its dark map here so inverted content never inherits stale composites. */
517
+ paletteInvert?: Record<string, string>;
518
+ fonts?: {
519
+ display?: string;
520
+ body?: string;
521
+ numeral?: string;
522
+ };
523
+ /** Short glyph used in compact admin chrome. Defaults to the first three
524
+ * letters of the chapter name. */
525
+ badge?: string;
526
+ wordmark?: string;
527
+ tagline?: string;
528
+ /** Header/footer nav sections for the web-component chrome: label → entries. */
529
+ nav?: Record<string, ReadonlyArray<{
530
+ label: string;
531
+ href: string;
532
+ }>>;
533
+ logos?: string;
534
+ }
535
+
394
536
  /**
395
537
  * Membership pricing for the group row (chapter mode).
396
538
  *
@@ -477,80 +619,18 @@ interface ChapterDb {
477
619
  secrets: {
478
620
  get(name: string): Promise<string>;
479
621
  };
480
- }
481
- /** Typed semantic roles shared by the public site and application surfaces. */
482
- interface ChapterBrandTokens {
483
- background?: string;
484
- surface?: string;
485
- surface2?: string;
486
- text?: string;
487
- textMuted?: string;
488
- textFaint?: string;
489
- border?: string;
490
- borderStrong?: string;
491
- accent?: string;
492
- accentStrong?: string;
493
- accentSoft?: string;
494
- onAccent?: string;
495
- good?: string;
496
- warn?: string;
497
- danger?: string;
498
- chart1?: string;
499
- chart2?: string;
500
- chart3?: string;
501
- chart4?: string;
502
- chart5?: string;
503
- chart6?: string;
504
- chartPositive?: string;
505
- chartNegative?: string;
506
- /** Admin/application content width, e.g. `"960px"`. */
507
- contentWidth?: string;
508
- panelRadius?: string;
509
- panelShadow?: string;
510
- masterDetailColumns?: string;
511
- masterDetailMinHeight?: string;
512
- /** Chapter-admin page padding shorthand. */
513
- pagePadding?: string;
514
- /** Chapter-admin workspace-tab padding shorthand. */
515
- workspacePadding?: string;
516
- }
517
- /** Brand tokens that theme the site: theme, semantic roles, fonts, and logos. */
518
- interface ChapterBrand {
519
- /** Preloaded @odla-ai/ui theme name used by ThemeScope. */
520
- theme?: string;
521
- /** Named accent family supplied by the selected @odla-ai/ui theme. */
522
- accent?: string;
523
- /** Admin/application color mode. Explicit light is the safe default. */
524
- colorScheme?: "light" | "dark" | "system";
525
- tokens?: ChapterBrandTokens;
526
- tokensDark?: ChapterBrandTokens;
527
- /** Palette overrides written into styles.css :root (e.g. `{ moss: "#2F3E34" }`
528
- * or `--ui-*` token names). Applies in BOTH light and dark unless overridden
529
- * by {@link paletteDark}. */
530
- palette?: Record<string, string>;
531
- /** Dark-mode palette overrides. Same shape as {@link palette}; emitted under
532
- * `:root[data-theme="dark"]` and `@media (prefers-color-scheme: dark)`, so a
533
- * site brands both modes. */
534
- paletteDark?: Record<string, string>;
535
- /** Full token map for `.ui-invert` islands. A compiled custom theme normally
536
- * uses its dark map here so inverted content never inherits stale composites. */
537
- paletteInvert?: Record<string, string>;
538
- fonts?: {
539
- display?: string;
540
- body?: string;
541
- numeral?: string;
622
+ /** odla-db file storage (present on the real client). Member photos use it. */
623
+ storage?: {
624
+ upload(path: string, data: BodyInit, contentType?: string, opts?: {
625
+ private?: boolean;
626
+ }): Promise<{
627
+ path: string;
628
+ size: number;
629
+ contentType: string;
630
+ }>;
631
+ sign(path: string, ttlSeconds?: number): Promise<string>;
632
+ delete(path: string): Promise<void>;
542
633
  };
543
- /** Short glyph used in compact admin chrome. Defaults to the first three
544
- * letters of the chapter name. */
545
- badge?: string;
546
- wordmark?: string;
547
- tagline?: string;
548
- /** Header/footer nav sections for the web-component chrome: label → entries. */
549
- nav?: Record<string, ReadonlyArray<{
550
- label: string;
551
- href: string;
552
- }>>;
553
- logos?: string;
554
634
  }
555
635
 
556
636
  /** One owner-editable transactional email template. Automatic sends require explicit `enabled: true`. */
@@ -612,6 +692,8 @@ interface ChapterAuth {
612
692
  * app allowlist; `"odla"` reads protected `$users.role` by exact subject ID.
613
693
  * Default `"odla"` for private Clerk mode, `"table"` for legacy modes. */
614
694
  superAdminSource?: "table" | "odla";
695
+ /** Require a second sign-in factor on admin routes: `off` (default), `report` (allow and log), `enforce`. */
696
+ adminSecondFactor?: "off" | "report" | "enforce";
615
697
  }
616
698
  /** The fully-resolved auth policy (defaults applied) carried on the {@link Chapter}. */
617
699
  interface ResolvedAuth {
@@ -622,6 +704,7 @@ interface ResolvedAuth {
622
704
  adminRole: string;
623
705
  superAdmins: boolean;
624
706
  superAdminSource: "none" | "table" | "odla";
707
+ adminSecondFactor: "off" | "report" | "enforce";
625
708
  }
626
709
  /** The application status pipeline. Which statuses exist, and the subsets a site
627
710
  * allows a call to be booked from / an application approved from. Defaults to
@@ -717,6 +800,8 @@ interface ChapterConfig {
717
800
  signupControl?: ChapterSignupControl;
718
801
  /** Authenticated parent + chapter member pages with server-enforced tier access. */
719
802
  memberContent?: ChapterMemberContent;
803
+ /** Signed-in member portal: profile, photos, courses, invite links and credit. */
804
+ memberPortal?: ChapterMemberPortal;
720
805
  /** Private docs, Brand asset references, and links for authorized site-building agents. */
721
806
  builderLibrary?: ChapterBuilderLibrary;
722
807
  /** Network-scoped canonical Person registry. Shadow mode is additive only:
@@ -822,6 +907,8 @@ interface Chapter {
822
907
  signupControl: ResolvedSignupControl | null;
823
908
  /** Null unless the standard authenticated member-content surface is enabled. */
824
909
  memberContent: ResolvedMemberContent | null;
910
+ /** Null unless the member portal is enabled. */
911
+ memberPortal: ResolvedMemberPortal | null;
825
912
  /** Null unless the private scoped Builder Library is enabled. */
826
913
  builderLibrary: ResolvedBuilderLibrary | null;
827
914
  /** Null unless this hub explicitly enables the shadow Person registry. */
@@ -2130,8 +2217,54 @@ interface SignupControlDeliveryOptions {
2130
2217
  /** Build and send one signed desired-state delivery. Durable retry belongs to the hub outbox. */
2131
2218
  declare function deliverSignupControl(options: SignupControlDeliveryOptions): Promise<SignupControlReceipt>;
2132
2219
 
2133
- /** Versioned contract for authenticated member content. */
2134
- declare const MEMBER_CONTENT_SCHEMA_VERSION: 1;
2220
+ /**
2221
+ * Member catalog schema version 2: ordered navigation sections, page kinds,
2222
+ * navigation tags and icons. Version 1 documents remain valid and keep their
2223
+ * alphabetical section order; every field here requires `schemaVersion: 2`.
2224
+ */
2225
+ /** Packaged member features a catalog page can stand for. */
2226
+ declare const MEMBER_PAGE_FEATURES: readonly ["course", "share"];
2227
+ /** A packaged member feature: `course` (cohort course) or `share` (invite kit). */
2228
+ type MemberPageFeatureName = typeof MEMBER_PAGE_FEATURES[number];
2229
+ /** Fixed icon vocabulary. Content never carries SVG, URLs or markup. */
2230
+ declare const MEMBER_PAGE_ICONS: readonly ["home", "course", "library", "deals", "training", "events", "members", "share", "profile", "document", "calendar", "chat", "star"];
2231
+ /** One icon from {@link MEMBER_PAGE_ICONS}. */
2232
+ type MemberPageIcon = typeof MEMBER_PAGE_ICONS[number];
2233
+ /** Authored navigation tags. "Soon" and year tags are derived from placeholder pages. */
2234
+ declare const MEMBER_PAGE_TAGS: readonly ["new"];
2235
+ /** One tag from {@link MEMBER_PAGE_TAGS}. */
2236
+ type MemberPageTag = typeof MEMBER_PAGE_TAGS[number];
2237
+ /** How a page renders: authored Markdown, a not-yet-open placeholder, or a packaged feature. */
2238
+ type MemberPageKind = "markdown" | "placeholder" | "feature";
2239
+ /**
2240
+ * A page that is announced but not open. Without `availableYear` it reads as
2241
+ * "Coming soon"; with one, as "Coming in <year>".
2242
+ */
2243
+ interface MemberPagePlaceholder {
2244
+ /** Calendar year the page is expected to open. */
2245
+ availableYear?: number;
2246
+ /** Replaces the derived "Coming soon" / "Coming in <year>" badge text. */
2247
+ badge?: string;
2248
+ /** Label of a disabled call to action, e.g. "Investor form opens in 2027". */
2249
+ actionLabel?: string;
2250
+ }
2251
+ /** A catalog page backed by a packaged feature, gated by the page's audience. */
2252
+ interface MemberPageFeature {
2253
+ name: MemberPageFeatureName;
2254
+ /** Feature-specific identity, e.g. the course id for `course`. */
2255
+ ref?: string;
2256
+ }
2257
+ /**
2258
+ * One navigation group. A section without a label renders without a heading.
2259
+ * Section order is the order of the document's `sections` array.
2260
+ */
2261
+ interface MemberContentSection {
2262
+ id: string;
2263
+ label?: string;
2264
+ }
2265
+
2266
+ /** Every member-content schema version this release validates. */
2267
+ type MemberContentSchemaVersion = 1 | 2;
2135
2268
  /** Authority that authored one independently stored member-content layer. */
2136
2269
  type MemberContentSourceType = "parent" | "chapter";
2137
2270
  /** Stable author identity attached to every member-content document and page. */
@@ -2146,9 +2279,14 @@ interface MemberContentTarget {
2146
2279
  }
2147
2280
  /** Navigation is data, so agents do not have to coordinate route code. */
2148
2281
  interface MemberPageNavigation {
2282
+ /** A section id declared in `sections`, or (without `sections`) the section's display label. */
2149
2283
  section: string;
2150
2284
  order: number;
2151
2285
  parentId?: string;
2286
+ /** Schema version 2. */
2287
+ tag?: MemberPageTag;
2288
+ /** Schema version 2. */
2289
+ icon?: MemberPageIcon;
2152
2290
  }
2153
2291
  /** Explicit sets avoid unsafe assumptions that commercial tiers form a ladder. */
2154
2292
  type MemberPageAudience = {
@@ -2182,9 +2320,15 @@ interface MemberContentPage {
2182
2320
  audience: MemberPageAudience;
2183
2321
  /** Safe Markdown shown while the body is withheld. */
2184
2322
  teaserMarkdown?: string;
2185
- /** Never serialized to a viewer whose audience does not match. */
2186
- bodyMarkdown: string;
2323
+ /** Never serialized to a viewer whose audience does not match. Required for Markdown pages. */
2324
+ bodyMarkdown?: string;
2187
2325
  upsell?: MemberPageUpsell;
2326
+ /** Schema version 2; defaults to `markdown`. */
2327
+ kind?: MemberPageKind;
2328
+ /** Schema version 2; present exactly when `kind` is `placeholder`. */
2329
+ placeholder?: MemberPagePlaceholder;
2330
+ /** Schema version 2; present exactly when `kind` is `feature`. */
2331
+ feature?: MemberPageFeature;
2188
2332
  }
2189
2333
  /** Chapter-owned offer attached to a Parent page that delegated offer authority. */
2190
2334
  interface MemberPageUpsellOverride {
@@ -2193,13 +2337,15 @@ interface MemberPageUpsellOverride {
2193
2337
  }
2194
2338
  /** One complete source layer. Parent and Chapter layers are stored independently. */
2195
2339
  interface MemberContentDocument {
2196
- schemaVersion: typeof MEMBER_CONTENT_SCHEMA_VERSION;
2340
+ schemaVersion: MemberContentSchemaVersion;
2197
2341
  revision: number;
2198
2342
  generatedAt: number;
2199
2343
  source: MemberContentSource;
2200
2344
  target?: MemberContentTarget;
2201
2345
  pages: readonly MemberContentPage[];
2202
2346
  upsellOverrides?: readonly MemberPageUpsellOverride[];
2347
+ /** Schema version 2: navigation groups in display order. */
2348
+ sections?: readonly MemberContentSection[];
2203
2349
  }
2204
2350
  /** Canonical parent document and digest transmitted over the signed control edge. */
2205
2351
  interface MemberContentEnvelope {