@xnetjs/data 2.4.0 → 3.0.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.
Files changed (42) hide show
  1. package/README.md +5 -0
  2. package/dist/auth/index.d.ts +4 -4
  3. package/dist/{chunk-56EXPOJ4.js → chunk-ANMAR3KY.js} +34 -19
  4. package/dist/chunk-GJAOMEQO.js +114 -0
  5. package/dist/chunk-KY62NUOI.js +67 -0
  6. package/dist/chunk-N37U6ZPI.js +789 -0
  7. package/dist/chunk-NFPEFD2I.js +42 -0
  8. package/dist/{chunk-EGGRKSRH.js → chunk-QKVIKVAL.js} +70 -31
  9. package/dist/{chunk-CY6EJUNV.js → chunk-S7SEN4LH.js} +5 -1
  10. package/dist/{chunk-4HJZJMPI.js → chunk-TN7LGV66.js} +1 -1
  11. package/dist/{chunk-YRFCXKJC.js → chunk-UQ2VFHU3.js} +2 -2
  12. package/dist/chunk-VZSEZNYA.js +83 -0
  13. package/dist/chunk-WSINZHSR.js +90 -0
  14. package/dist/{chunk-CNGEXCIH.js → chunk-YCBJDT23.js} +69 -55
  15. package/dist/{clone-BsoRt89i.d.ts → clone-ywzFVkID.d.ts} +16 -6
  16. package/dist/course-C5DXOIVO.js +24 -0
  17. package/dist/database/index.d.ts +17 -5
  18. package/dist/database/index.js +7 -7
  19. package/dist/event-VW3FBN4F.js +20 -0
  20. package/dist/{form-types-Dkqm9UO2.d.ts → form-types-BrHYdpi0.d.ts} +1 -1
  21. package/dist/{game-NEQP7OFX.js → game-7AXW7XKS.js} +1 -1
  22. package/dist/{grant-expiration-cleaner-BwdmRFua.d.ts → grant-expiration-cleaner-CRS9OyhV.d.ts} +3 -3
  23. package/dist/index.d.ts +10 -320
  24. package/dist/index.js +522 -1097
  25. package/dist/{moderation-HRMMBFVH.js → moderation-5Z4LKOKN.js} +5 -3
  26. package/dist/{page-RUS2BKMX.js → page-W4G6433H.js} +1 -1
  27. package/dist/portability/index.d.ts +330 -0
  28. package/dist/portability/index.js +34 -0
  29. package/dist/post-7IOO64MD.js +14 -0
  30. package/dist/{profile-5H6XWCK4.js → profile-KLHCAQY2.js} +1 -1
  31. package/dist/publication-3MN3WWKP.js +10 -0
  32. package/dist/{query-ast-DYGcKxoa.d.ts → query-ast-DQJO7yRV.d.ts} +1 -1
  33. package/dist/{registry-D_3b1Lg6.d.ts → registry-C9IRLLeR.d.ts} +1 -1
  34. package/dist/schema/index.d.ts +375 -26
  35. package/dist/schema/index.js +213 -167
  36. package/dist/space-GBTEHZOK.js +1 -1
  37. package/dist/store/index.d.ts +4 -4
  38. package/dist/store/index.js +4 -4
  39. package/dist/{store-BMnhBWzM.d.ts → store-D1oiFQuF.d.ts} +19 -2
  40. package/dist/{types-cycApzib.d.ts → types-gws1tSf-.d.ts} +1 -1
  41. package/package.json +27 -25
  42. package/dist/chunk-Y2XWK7AA.js +0 -50
@@ -0,0 +1,42 @@
1
+ import {
2
+ spaceCascadeAuthorization
3
+ } from "./chunk-RLRAWZJE.js";
4
+ import {
5
+ checkbox,
6
+ defineSchema,
7
+ relation,
8
+ text
9
+ } from "./chunk-NH6OLO3X.js";
10
+
11
+ // src/schema/schemas/publication.ts
12
+ var PublicationSchema = defineSchema({
13
+ name: "Publication",
14
+ namespace: "xnet://xnet.fyi/",
15
+ properties: {
16
+ /** Display title, used as the feed title */
17
+ title: text({ required: true, maxLength: 200 }),
18
+ /** Feed description / tagline */
19
+ description: text({ maxLength: 1e3 }),
20
+ /** Absolute site root the posts publish under, e.g. `https://xnet.fyi` */
21
+ baseUrl: text({ maxLength: 500 }),
22
+ /** Path prefix beneath `baseUrl`, e.g. `/blog` */
23
+ basePath: text({ maxLength: 200 }),
24
+ /** Feed language tag (BCP 47), e.g. `en-gb` */
25
+ language: text({ maxLength: 20 }),
26
+ /** Canonical SECURITY home (exploration 0179) */
27
+ space: relation({ target: "xnet://xnet.fyi/Space@1.0.0" }),
28
+ /** Byline pool; a post may credit any subset (exploration 0269) */
29
+ authors: relation({ target: "xnet://xnet.fyi/Profile@1.0.0", multiple: true }),
30
+ /**
31
+ * Whether readers may follow this publication independently of its
32
+ * authors. Off makes it an archive: readable, but not subscribable.
33
+ */
34
+ followable: checkbox({ default: true })
35
+ },
36
+ // Inherits access from its home Space (exploration 0181/0192).
37
+ authorization: spaceCascadeAuthorization()
38
+ });
39
+
40
+ export {
41
+ PublicationSchema
42
+ };
@@ -1,24 +1,24 @@
1
+ import {
2
+ applyNodeQueryDescriptor,
3
+ getNodeQuerySearchTokens,
4
+ withoutNodeQueryMaterializedView,
5
+ withoutNodeQueryPagination
6
+ } from "./chunk-WOEFYS7Y.js";
1
7
  import {
2
8
  evaluateLedgerWrite,
3
9
  foldAccountRecord,
4
10
  ledgerAccountId,
5
11
  ledgerWriteKind
6
12
  } from "./chunk-3UOUVEZW.js";
7
- import {
8
- accountRecordId,
9
- revocationRecordId
10
- } from "./chunk-5ECIKN6Z.js";
11
13
  import {
12
14
  SYSTEM_SCHEMA_BASE_IRIS,
13
15
  isSystemNamespaceResource,
14
16
  isSystemSchemaIri
15
17
  } from "./chunk-ZNHLH7SC.js";
16
18
  import {
17
- applyNodeQueryDescriptor,
18
- getNodeQuerySearchTokens,
19
- withoutNodeQueryMaterializedView,
20
- withoutNodeQueryPagination
21
- } from "./chunk-WOEFYS7Y.js";
19
+ accountRecordId,
20
+ revocationRecordId
21
+ } from "./chunk-5ECIKN6Z.js";
22
22
  import {
23
23
  createNodeId,
24
24
  getBaseSchemaIRI
@@ -913,7 +913,7 @@ import {
913
913
  createUnsignedChange,
914
914
  createBatchId
915
915
  } from "@xnetjs/sync";
916
- import { verifyChange, verifyChangeHash } from "@xnetjs/sync";
916
+ import { verifyChange, verifyChangeHash, verifyChangesFast } from "@xnetjs/sync";
917
917
 
918
918
  // src/store/batch-write-orchestrator.ts
919
919
  var elapsedMs = (startedAt) => Math.max(0, Date.now() - startedAt);
@@ -2699,32 +2699,34 @@ var NodeStore = class {
2699
2699
  });
2700
2700
  }
2701
2701
  }
2702
- async applyRemoteChange(change) {
2702
+ async applyRemoteChange(change, options = {}) {
2703
2703
  const start = this.telemetry ? Date.now() : 0;
2704
2704
  try {
2705
- if (!verifyChangeHash(change)) {
2706
- const error = new Error(
2707
- `[NodeStore] Remote change ${change.id} failed hash verification - data may be corrupted`
2708
- );
2709
- this.telemetry?.reportSecurityEvent("data.hash_verification_failed", "high");
2710
- throw error;
2711
- }
2712
- try {
2713
- const publicKey = parseDID(change.authorDID);
2714
- if (!verifyChange(change, publicKey)) {
2705
+ if (!options.preVerified) {
2706
+ if (!verifyChangeHash(change)) {
2715
2707
  const error = new Error(
2716
- `[NodeStore] Remote change ${change.id} failed signature verification - signature does not match author ${change.authorDID}`
2708
+ `[NodeStore] Remote change ${change.id} failed hash verification - data may be corrupted`
2717
2709
  );
2718
- this.telemetry?.reportSecurityEvent("data.signature_verification_failed", "high");
2710
+ this.telemetry?.reportSecurityEvent("data.hash_verification_failed", "high");
2719
2711
  throw error;
2720
2712
  }
2721
- } catch (err) {
2722
- if (err instanceof Error && err.message.includes("failed")) {
2723
- throw err;
2713
+ try {
2714
+ const publicKey = parseDID(change.authorDID);
2715
+ if (!verifyChange(change, publicKey)) {
2716
+ const error = new Error(
2717
+ `[NodeStore] Remote change ${change.id} failed signature verification - signature does not match author ${change.authorDID}`
2718
+ );
2719
+ this.telemetry?.reportSecurityEvent("data.signature_verification_failed", "high");
2720
+ throw error;
2721
+ }
2722
+ } catch (err) {
2723
+ if (err instanceof Error && err.message.includes("failed")) {
2724
+ throw err;
2725
+ }
2726
+ throw new Error(
2727
+ `[NodeStore] Remote change ${change.id} failed verification: ${err instanceof Error ? err.message : String(err)}`
2728
+ );
2724
2729
  }
2725
- throw new Error(
2726
- `[NodeStore] Remote change ${change.id} failed verification: ${err instanceof Error ? err.message : String(err)}`
2727
- );
2728
2730
  }
2729
2731
  await this.enforceRemoteLedgerWrite(change);
2730
2732
  if (this.authEvaluator) {
@@ -2774,6 +2776,36 @@ var NodeStore = class {
2774
2776
  throw err;
2775
2777
  }
2776
2778
  }
2779
+ /**
2780
+ * Verify hash + signature for many remote changes at once.
2781
+ *
2782
+ * Results are positional and never short-circuit, so a caller can quarantine
2783
+ * exactly the changes that failed and still apply the rest. This runs the
2784
+ * SAME checks as {@link applyRemoteChange} — it just amortizes the native
2785
+ * crypto setup across the batch (exploration 0357).
2786
+ */
2787
+ async verifyRemoteChanges(changes) {
2788
+ const entries = [];
2789
+ const slots = [];
2790
+ for (const change of changes) {
2791
+ if (!verifyChangeHash(change)) {
2792
+ this.telemetry?.reportSecurityEvent("data.hash_verification_failed", "high");
2793
+ slots.push(-1);
2794
+ continue;
2795
+ }
2796
+ try {
2797
+ slots.push(entries.push({ change, publicKey: parseDID(change.authorDID) }) - 1);
2798
+ } catch {
2799
+ slots.push(-1);
2800
+ }
2801
+ }
2802
+ const signatureResults = await verifyChangesFast(entries);
2803
+ for (const [index, ok] of signatureResults.entries()) {
2804
+ if (!ok) this.telemetry?.reportSecurityEvent("data.signature_verification_failed", "high");
2805
+ void index;
2806
+ }
2807
+ return slots.map((slot) => slot === -1 ? false : signatureResults[slot]);
2808
+ }
2777
2809
  /**
2778
2810
  * Apply multiple remote changes (from sync).
2779
2811
  */
@@ -2784,9 +2816,16 @@ var NodeStore = class {
2784
2816
  { lamport: b.lamport, author: b.authorDID }
2785
2817
  )
2786
2818
  );
2787
- for (const change of sorted) {
2819
+ const verdicts = await this.verifyRemoteChanges(sorted);
2820
+ for (const [index, change] of sorted.entries()) {
2821
+ if (!verdicts[index]) {
2822
+ console.warn(
2823
+ `[NodeStore] skipping remote change ${change.hash} for node ${change.payload?.nodeId}: failed hash or signature verification`
2824
+ );
2825
+ continue;
2826
+ }
2788
2827
  try {
2789
- await this.applyRemoteChange(change);
2828
+ await this.applyRemoteChange(change, { preVerified: true });
2790
2829
  } catch (err) {
2791
2830
  console.warn(
2792
2831
  `[NodeStore] skipping un-appliable remote change for node ${change.payload?.nodeId}:`,
@@ -705,6 +705,9 @@ var ReviewTaskSchema = defineSchema({
705
705
  },
706
706
  authorization: reviewTaskAuthorization
707
707
  });
708
+ function publicInteractionPolicyId(targetId) {
709
+ return `pipolicy:${targetId}`;
710
+ }
708
711
 
709
712
  export {
710
713
  AbuseReportSchema,
@@ -718,5 +721,6 @@ export {
718
721
  QualitySignalSchema,
719
722
  ContentProvenanceSchema,
720
723
  AppealSchema,
721
- ReviewTaskSchema
724
+ ReviewTaskSchema,
725
+ publicInteractionPolicyId
722
726
  };
@@ -38,7 +38,7 @@ var ProfileSchema = defineSchema({
38
38
  /**
39
39
  * Linked ATProto identity (explorations 0301/0322/0337). These fields are
40
40
  * the xNet half of the bidirectional binding: the PDS half is the signed
41
- * `net.x.identity.binding` record at `atprotoBindingUri`. Foreign DIDs are
41
+ * `fyi.xnet.identity.binding` record at `atprotoBindingUri`. Foreign DIDs are
42
42
  * represent-only — they never sign xNet data — and a handle renders as
43
43
  * "verified" only after the hub has resolved the DID document, fetched the
44
44
  * binding record from the canonical PDS, and checked the xNet signature.
@@ -49,7 +49,7 @@ var PlayerIdentitySchema = defineSchema({
49
49
  properties: {
50
50
  /** Display / gamer name. */
51
51
  displayName: text({ required: true, maxLength: 200 }),
52
- /** The player's own XNet `did:key` — the portable login across publishers. */
52
+ /** The player's own xNet `did:key` — the portable login across publishers. */
53
53
  did: text({ maxLength: 512 }),
54
54
  /** Avatar asset (glTF/USD), stored by reference. */
55
55
  avatarAsset: file({ accept: [...GAME_ASSET_MIME_TYPES] }),
@@ -177,7 +177,7 @@ var GameAssetSchema = defineSchema({
177
177
  namespace: GAME_NAMESPACE,
178
178
  properties: {
179
179
  title: text({ required: true, maxLength: 300 }),
180
- /** The asset payload, by reference (CID) — never parsed by XNet. */
180
+ /** The asset payload, by reference (CID) — never parsed by xNet. */
181
181
  file: file({ required: true, accept: [...GAME_ASSET_MIME_TYPES] }),
182
182
  format: select({ options: GAME_ASSET_FORMATS, default: "glb" }),
183
183
  sourceGame: text({ maxLength: 200 }),
@@ -0,0 +1,83 @@
1
+ import {
2
+ spaceCascadeAuthorization,
3
+ spaceContributorAuthorization
4
+ } from "./chunk-RLRAWZJE.js";
5
+ import {
6
+ created,
7
+ createdBy,
8
+ defineSchema,
9
+ number,
10
+ relation,
11
+ select,
12
+ text
13
+ } from "./chunk-NH6OLO3X.js";
14
+
15
+ // src/schema/schemas/event.ts
16
+ var EVENT_SCHEMA_IRI = "xnet://xnet.fyi/Event@1.0.0";
17
+ var RSVP_SCHEMA_IRI = "xnet://xnet.fyi/Rsvp@1.0.0";
18
+ var EventSchema = defineSchema({
19
+ name: "Event",
20
+ namespace: "xnet://xnet.fyi/",
21
+ properties: {
22
+ title: text({ required: true, maxLength: 300 }),
23
+ description: text({ maxLength: 2e3 }),
24
+ space: relation({ target: "xnet://xnet.fyi/Space@1.0.0" }),
25
+ /** Start, ms since epoch. The field CalendarView sorts and places on. */
26
+ startsAt: number({ required: true }),
27
+ /** End, ms since epoch. Absent = a point in time rather than a range. */
28
+ endsAt: number({}),
29
+ /** Where — a URL for online, a place for in-person. Free text either way. */
30
+ location: text({ maxLength: 500 }),
31
+ /**
32
+ * IANA timezone the host scheduled in (e.g. `Europe/London`), so a
33
+ * recurring community call renders correctly for everyone else. Absent =
34
+ * render in the viewer's local zone.
35
+ */
36
+ timezone: text({ maxLength: 80 }),
37
+ cancelled: select({
38
+ options: [
39
+ { id: "scheduled", name: "Scheduled", color: "green" },
40
+ { id: "cancelled", name: "Cancelled", color: "red" }
41
+ ],
42
+ default: "scheduled"
43
+ }),
44
+ createdAt: created(),
45
+ createdBy: createdBy()
46
+ },
47
+ document: void 0,
48
+ authorization: spaceCascadeAuthorization()
49
+ });
50
+ var RsvpSchema = defineSchema({
51
+ name: "Rsvp",
52
+ namespace: "xnet://xnet.fyi/",
53
+ properties: {
54
+ event: relation({ target: "xnet://xnet.fyi/Event@1.0.0", required: true }),
55
+ space: relation({ target: "xnet://xnet.fyi/Space@1.0.0" }),
56
+ response: select({
57
+ options: [
58
+ { id: "going", name: "Going", color: "green" },
59
+ { id: "maybe", name: "Maybe", color: "yellow" },
60
+ { id: "declined", name: "Not going", color: "gray" }
61
+ ],
62
+ required: true,
63
+ default: "going"
64
+ }),
65
+ createdAt: created(),
66
+ createdBy: createdBy()
67
+ },
68
+ document: void 0,
69
+ authorization: spaceContributorAuthorization()
70
+ });
71
+ function rsvpId(eventId, memberDid) {
72
+ return `rsvp:${eventId}:${memberDid}`;
73
+ }
74
+ var upcomingEvents = (events, now) => events.filter((e) => e.cancelled !== "cancelled" && (e.endsAt ?? e.startsAt ?? 0) >= now).sort((a, b) => (a.startsAt ?? 0) - (b.startsAt ?? 0));
75
+
76
+ export {
77
+ EVENT_SCHEMA_IRI,
78
+ RSVP_SCHEMA_IRI,
79
+ EventSchema,
80
+ RsvpSchema,
81
+ rsvpId,
82
+ upcomingEvents
83
+ };
@@ -0,0 +1,90 @@
1
+ import {
2
+ spaceCascadeAuthorization
3
+ } from "./chunk-RLRAWZJE.js";
4
+ import {
5
+ date,
6
+ defineSchema,
7
+ file,
8
+ json,
9
+ relation,
10
+ select,
11
+ text
12
+ } from "./chunk-NH6OLO3X.js";
13
+
14
+ // src/schema/schemas/page.ts
15
+ var PageSchema = defineSchema({
16
+ name: "Page",
17
+ namespace: "xnet://xnet.fyi/",
18
+ properties: {
19
+ /** Page title */
20
+ title: text({ required: true, maxLength: 500 }),
21
+ /** Emoji or icon URL */
22
+ icon: text({}),
23
+ /** Cover image */
24
+ cover: file({ accept: ["image/*"] }),
25
+ /** Canonical home; empty = Unfiled (exploration 0169) */
26
+ folder: relation({ target: "xnet://xnet.fyi/Folder@1.0.0" }),
27
+ /** Order among folder siblings — fractional index */
28
+ sortKey: text({ maxLength: 500 }),
29
+ /** Workspace-wide labels, referenced by id (exploration 0169) */
30
+ tags: relation({ target: "xnet://xnet.fyi/Tag@1.0.0", multiple: true }),
31
+ /** Canonical SECURITY home; empty = personal/private (exploration 0179) */
32
+ space: relation({ target: "xnet://xnet.fyi/Space@1.0.0" }),
33
+ /** Per-node visibility; `inherit` defers to the Space (exploration 0179) */
34
+ visibility: select({
35
+ options: [
36
+ { id: "inherit", name: "Inherit", color: "gray" },
37
+ { id: "private", name: "Private", color: "gray" },
38
+ { id: "unlisted", name: "Unlisted", color: "yellow" },
39
+ { id: "public", name: "Public", color: "green" }
40
+ ],
41
+ default: "inherit"
42
+ }),
43
+ /**
44
+ * Page geometry (exploration 0346): how the page's frame children
45
+ * arrange — a linear stack (document, default), a tiled grid
46
+ * (dashboard-style), or free space (canvas-style). A view property:
47
+ * toggling never converts the frames themselves.
48
+ */
49
+ geometry: select({
50
+ options: [
51
+ { id: "stack", name: "Stack", color: "gray" },
52
+ { id: "grid", name: "Grid", color: "blue" },
53
+ { id: "space", name: "Space", color: "purple" }
54
+ ],
55
+ default: "stack"
56
+ }),
57
+ // ─── Publishing (exploration 0362) ──────────────────────────────────────
58
+ // A post is a Page with editorial metadata, not a separate document type:
59
+ // publishing is a lens over the page substrate (0346), not a fork of it.
60
+ /** Publication this page is a post in; empty = not a post */
61
+ publication: relation({ target: "xnet://xnet.fyi/Publication@1.0.0" }),
62
+ /** URL segment, unique within the publication. Empty = never published */
63
+ slug: text({ maxLength: 80 }),
64
+ /** Feed/meta description. Falls back to a generated excerpt when empty */
65
+ excerpt: text({ maxLength: 1e3 }),
66
+ /**
67
+ * First publication time. **Absence is what makes a post a draft** — it is
68
+ * the single source of truth for public visibility in feeds and sitemaps.
69
+ */
70
+ publishedAt: date({}),
71
+ /** Set when first published elsewhere, so search engines credit the original */
72
+ canonicalUrl: text({ maxLength: 500 }),
73
+ /**
74
+ * The published version: a frontier (`Record<NodeId, ChangeHash>`) pinned
75
+ * at publish time (exploration 0329). Editing the live page does not
76
+ * change what readers see until it is re-published.
77
+ *
78
+ * A pinned frontier is a pin: log pruning must respect it (0329's rule).
79
+ */
80
+ publishedFrontier: json({})
81
+ },
82
+ document: "yjs",
83
+ // Collaborative Y.Doc for rich text
84
+ // Inherits access from its home Space (exploration 0181/0192).
85
+ authorization: spaceCascadeAuthorization()
86
+ });
87
+
88
+ export {
89
+ PageSchema
90
+ };
@@ -1,3 +1,16 @@
1
+ import {
2
+ extKey
3
+ } from "./chunk-PMUQACPY.js";
4
+ import {
5
+ EXTENSION_FIELD_SCHEMA_IRI,
6
+ SCHEMA_EXTENSION_SCHEMA_IRI
7
+ } from "./chunk-2JROE7ML.js";
8
+ import {
9
+ PresenceSummarySchema,
10
+ SchemaDefinitionSchema,
11
+ buildSystemNodeId,
12
+ validateSchemaDefinitionNode
13
+ } from "./chunk-ZNHLH7SC.js";
1
14
  import {
2
15
  ACCOUNT_RECORD_SCHEMA_IRI,
3
16
  DEVICE_RECORD_SCHEMA_IRI,
@@ -8,19 +21,6 @@ import {
8
21
  revocationRecordId,
9
22
  revokedSubjects
10
23
  } from "./chunk-5ECIKN6Z.js";
11
- import {
12
- PresenceSummarySchema,
13
- SchemaDefinitionSchema,
14
- buildSystemNodeId,
15
- validateSchemaDefinitionNode
16
- } from "./chunk-ZNHLH7SC.js";
17
- import {
18
- extKey
19
- } from "./chunk-PMUQACPY.js";
20
- import {
21
- EXTENSION_FIELD_SCHEMA_IRI,
22
- SCHEMA_EXTENSION_SCHEMA_IRI
23
- } from "./chunk-2JROE7ML.js";
24
24
  import {
25
25
  checkbox,
26
26
  createNodeId,
@@ -353,7 +353,14 @@ function filterOrphanedComments(comments, resolvers) {
353
353
  // src/schema/schemas/index.ts
354
354
  var builtInSchemas = {
355
355
  // Versioned IRIs (canonical)
356
- "xnet://xnet.fyi/Page@1.0.0": () => import("./page-RUS2BKMX.js").then((m) => m.PageSchema),
356
+ "xnet://xnet.fyi/Page@1.0.0": () => import("./page-W4G6433H.js").then((m) => m.PageSchema),
357
+ "xnet://xnet.fyi/Post@1.0.0": () => import("./post-7IOO64MD.js").then((m) => m.PostSchema),
358
+ "xnet://xnet.fyi/Course@1.0.0": () => import("./course-C5DXOIVO.js").then((m) => m.CourseSchema),
359
+ "xnet://xnet.fyi/Lesson@1.0.0": () => import("./course-C5DXOIVO.js").then((m) => m.LessonSchema),
360
+ "xnet://xnet.fyi/LessonProgress@1.0.0": () => import("./course-C5DXOIVO.js").then((m) => m.LessonProgressSchema),
361
+ "xnet://xnet.fyi/Event@1.0.0": () => import("./event-VW3FBN4F.js").then((m) => m.EventSchema),
362
+ "xnet://xnet.fyi/Rsvp@1.0.0": () => import("./event-VW3FBN4F.js").then((m) => m.RsvpSchema),
363
+ "xnet://xnet.fyi/Publication@1.0.0": () => import("./publication-3MN3WWKP.js").then((m) => m.PublicationSchema),
357
364
  "xnet://xnet.fyi/Folder@1.0.0": () => import("./folder-D4IL7UHP.js").then((m) => m.FolderSchema),
358
365
  "xnet://xnet.fyi/Tag@1.0.0": () => import("./tag-LHP2J53R.js").then((m) => m.TagSchema),
359
366
  "xnet://xnet.fyi/Database@2.0.0": () => import("./database-VJSYCFXH.js").then((m) => m.DatabaseSchema),
@@ -402,7 +409,7 @@ var builtInSchemas = {
402
409
  "xnet://xnet.fyi/Draft@1.0.0": () => import("./draft-T5KDLPC4.js").then((m) => m.DraftSchema),
403
410
  "xnet://xnet.fyi/Reaction@1.0.0": () => import("./reaction-MRZHOGPW.js").then((m) => m.ReactionSchema),
404
411
  "xnet://xnet.fyi/DebugReport@1.0.0": () => import("./debug-report-JFSUVHHJ.js").then((m) => m.DebugReportSchema),
405
- "xnet://xnet.fyi/Profile@1.0.0": () => import("./profile-5H6XWCK4.js").then((m) => m.ProfileSchema),
412
+ "xnet://xnet.fyi/Profile@1.0.0": () => import("./profile-KLHCAQY2.js").then((m) => m.ProfileSchema),
406
413
  "xnet://xnet.fyi/Channel@1.0.0": () => import("./channel-DXLP6PEJ.js").then((m) => m.ChannelSchema),
407
414
  "xnet://xnet.fyi/ChatMessage@1.0.0": () => import("./chat-message-EZW77LY3.js").then((m) => m.ChatMessageSchema),
408
415
  // Integration schema pack (exploration 0213)
@@ -423,26 +430,26 @@ var builtInSchemas = {
423
430
  "xnet://xnet.fyi/SchemaCompatibility@1.0.0": () => import("./system-X2F6HN3K.js").then((m) => m.SchemaCompatibilitySchema),
424
431
  "xnet://xnet.fyi/SyncPolicy@1.0.0": () => import("./system-X2F6HN3K.js").then((m) => m.SyncPolicySchema),
425
432
  "xnet://xnet.fyi/PresenceSummary@1.0.0": () => import("./system-X2F6HN3K.js").then((m) => m.PresenceSummarySchema),
426
- "xnet://xnet.fyi/AbuseReport@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.AbuseReportSchema),
427
- "xnet://xnet.fyi/ModerationLabel@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.ModerationLabelSchema),
428
- "xnet://xnet.fyi/PolicyList@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.PolicyListSchema),
429
- "xnet://xnet.fyi/PolicySubscription@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.PolicySubscriptionSchema),
430
- "xnet://xnet.fyi/PublicInteractionPolicy@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.PublicInteractionPolicySchema),
431
- "xnet://xnet.fyi/MessageRequest@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.MessageRequestSchema),
432
- "xnet://xnet.fyi/CommunityNote@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.CommunityNoteSchema),
433
- "xnet://xnet.fyi/NoteRating@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.NoteRatingSchema),
434
- "xnet://xnet.fyi/QualitySignal@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.QualitySignalSchema),
435
- "xnet://xnet.fyi/ContentProvenance@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.ContentProvenanceSchema),
436
- "xnet://xnet.fyi/Appeal@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.AppealSchema),
437
- "xnet://xnet.fyi/ReviewTask@1.0.0": () => import("./moderation-HRMMBFVH.js").then((m) => m.ReviewTaskSchema),
433
+ "xnet://xnet.fyi/AbuseReport@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.AbuseReportSchema),
434
+ "xnet://xnet.fyi/ModerationLabel@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.ModerationLabelSchema),
435
+ "xnet://xnet.fyi/PolicyList@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.PolicyListSchema),
436
+ "xnet://xnet.fyi/PolicySubscription@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.PolicySubscriptionSchema),
437
+ "xnet://xnet.fyi/PublicInteractionPolicy@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.PublicInteractionPolicySchema),
438
+ "xnet://xnet.fyi/MessageRequest@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.MessageRequestSchema),
439
+ "xnet://xnet.fyi/CommunityNote@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.CommunityNoteSchema),
440
+ "xnet://xnet.fyi/NoteRating@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.NoteRatingSchema),
441
+ "xnet://xnet.fyi/QualitySignal@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.QualitySignalSchema),
442
+ "xnet://xnet.fyi/ContentProvenance@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.ContentProvenanceSchema),
443
+ "xnet://xnet.fyi/Appeal@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.AppealSchema),
444
+ "xnet://xnet.fyi/ReviewTask@1.0.0": () => import("./moderation-5Z4LKOKN.js").then((m) => m.ReviewTaskSchema),
438
445
  // Game-interop schema pack (exploration 0200)
439
- "xnet://xnet.fyi/PlayerIdentity@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.PlayerIdentitySchema),
440
- "xnet://xnet.fyi/Inventory@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.InventorySchema),
441
- "xnet://xnet.fyi/GameItem@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.GameItemSchema),
442
- "xnet://xnet.fyi/Achievement@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.AchievementSchema),
443
- "xnet://xnet.fyi/MatchSession@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.MatchSessionSchema),
444
- "xnet://xnet.fyi/GameEconomyEntry@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.GameEconomyEntrySchema),
445
- "xnet://xnet.fyi/GameAsset@1.0.0": () => import("./game-NEQP7OFX.js").then((m) => m.GameAssetSchema),
446
+ "xnet://xnet.fyi/PlayerIdentity@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.PlayerIdentitySchema),
447
+ "xnet://xnet.fyi/Inventory@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.InventorySchema),
448
+ "xnet://xnet.fyi/GameItem@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.GameItemSchema),
449
+ "xnet://xnet.fyi/Achievement@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.AchievementSchema),
450
+ "xnet://xnet.fyi/MatchSession@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.MatchSessionSchema),
451
+ "xnet://xnet.fyi/GameEconomyEntry@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.GameEconomyEntrySchema),
452
+ "xnet://xnet.fyi/GameAsset@1.0.0": () => import("./game-7AXW7XKS.js").then((m) => m.GameAssetSchema),
446
453
  // Memory schema pack (exploration 0211)
447
454
  "xnet://xnet.fyi/MemoryItem@1.0.0": () => import("./memory-PAPUIKWD.js").then((m) => m.MemoryItemSchema),
448
455
  // Agent schema pack (exploration 0337)
@@ -452,7 +459,14 @@ var builtInSchemas = {
452
459
  "xnet://xnet.fyi/AgentApproval@1.0.0": () => import("./agent-IJLOS2LA.js").then((m) => m.AgentApprovalSchema),
453
460
  "xnet://xnet.fyi/AgentNotification@1.0.0": () => import("./agent-IJLOS2LA.js").then((m) => m.AgentNotificationSchema),
454
461
  // Legacy unversioned IRIs (aliases for the current version)
455
- "xnet://xnet.fyi/Page": () => import("./page-RUS2BKMX.js").then((m) => m.PageSchema),
462
+ "xnet://xnet.fyi/Page": () => import("./page-W4G6433H.js").then((m) => m.PageSchema),
463
+ "xnet://xnet.fyi/Post": () => import("./post-7IOO64MD.js").then((m) => m.PostSchema),
464
+ "xnet://xnet.fyi/Course": () => import("./course-C5DXOIVO.js").then((m) => m.CourseSchema),
465
+ "xnet://xnet.fyi/Lesson": () => import("./course-C5DXOIVO.js").then((m) => m.LessonSchema),
466
+ "xnet://xnet.fyi/LessonProgress": () => import("./course-C5DXOIVO.js").then((m) => m.LessonProgressSchema),
467
+ "xnet://xnet.fyi/Event": () => import("./event-VW3FBN4F.js").then((m) => m.EventSchema),
468
+ "xnet://xnet.fyi/Rsvp": () => import("./event-VW3FBN4F.js").then((m) => m.RsvpSchema),
469
+ "xnet://xnet.fyi/Publication": () => import("./publication-3MN3WWKP.js").then((m) => m.PublicationSchema),
456
470
  "xnet://xnet.fyi/Folder": () => import("./folder-D4IL7UHP.js").then((m) => m.FolderSchema),
457
471
  "xnet://xnet.fyi/Tag": () => import("./tag-LHP2J53R.js").then((m) => m.TagSchema),
458
472
  "xnet://xnet.fyi/Database": () => import("./database-VJSYCFXH.js").then((m) => m.DatabaseSchema),
@@ -496,7 +510,7 @@ var builtInSchemas = {
496
510
  "xnet://xnet.fyi/Comment": () => import("./comment-2AS6EGH3.js").then((m) => m.CommentSchema),
497
511
  "xnet://xnet.fyi/Reaction": () => import("./reaction-MRZHOGPW.js").then((m) => m.ReactionSchema),
498
512
  "xnet://xnet.fyi/DebugReport": () => import("./debug-report-JFSUVHHJ.js").then((m) => m.DebugReportSchema),
499
- "xnet://xnet.fyi/Profile": () => import("./profile-5H6XWCK4.js").then((m) => m.ProfileSchema),
513
+ "xnet://xnet.fyi/Profile": () => import("./profile-KLHCAQY2.js").then((m) => m.ProfileSchema),
500
514
  "xnet://xnet.fyi/Channel": () => import("./channel-DXLP6PEJ.js").then((m) => m.ChannelSchema),
501
515
  "xnet://xnet.fyi/ChatMessage": () => import("./chat-message-EZW77LY3.js").then((m) => m.ChatMessageSchema),
502
516
  "xnet://xnet.fyi/Feed": () => import("./feed-WR4A7XUF.js").then((m) => m.FeedSchema),
@@ -516,26 +530,26 @@ var builtInSchemas = {
516
530
  "xnet://xnet.fyi/SchemaCompatibility": () => import("./system-X2F6HN3K.js").then((m) => m.SchemaCompatibilitySchema),
517
531
  "xnet://xnet.fyi/SyncPolicy": () => import("./system-X2F6HN3K.js").then((m) => m.SyncPolicySchema),
518
532
  "xnet://xnet.fyi/PresenceSummary": () => import("./system-X2F6HN3K.js").then((m) => m.PresenceSummarySchema),
519
- "xnet://xnet.fyi/AbuseReport": () => import("./moderation-HRMMBFVH.js").then((m) => m.AbuseReportSchema),
520
- "xnet://xnet.fyi/ModerationLabel": () => import("./moderation-HRMMBFVH.js").then((m) => m.ModerationLabelSchema),
521
- "xnet://xnet.fyi/PolicyList": () => import("./moderation-HRMMBFVH.js").then((m) => m.PolicyListSchema),
522
- "xnet://xnet.fyi/PolicySubscription": () => import("./moderation-HRMMBFVH.js").then((m) => m.PolicySubscriptionSchema),
523
- "xnet://xnet.fyi/PublicInteractionPolicy": () => import("./moderation-HRMMBFVH.js").then((m) => m.PublicInteractionPolicySchema),
524
- "xnet://xnet.fyi/MessageRequest": () => import("./moderation-HRMMBFVH.js").then((m) => m.MessageRequestSchema),
525
- "xnet://xnet.fyi/CommunityNote": () => import("./moderation-HRMMBFVH.js").then((m) => m.CommunityNoteSchema),
526
- "xnet://xnet.fyi/NoteRating": () => import("./moderation-HRMMBFVH.js").then((m) => m.NoteRatingSchema),
527
- "xnet://xnet.fyi/QualitySignal": () => import("./moderation-HRMMBFVH.js").then((m) => m.QualitySignalSchema),
528
- "xnet://xnet.fyi/ContentProvenance": () => import("./moderation-HRMMBFVH.js").then((m) => m.ContentProvenanceSchema),
529
- "xnet://xnet.fyi/Appeal": () => import("./moderation-HRMMBFVH.js").then((m) => m.AppealSchema),
530
- "xnet://xnet.fyi/ReviewTask": () => import("./moderation-HRMMBFVH.js").then((m) => m.ReviewTaskSchema),
533
+ "xnet://xnet.fyi/AbuseReport": () => import("./moderation-5Z4LKOKN.js").then((m) => m.AbuseReportSchema),
534
+ "xnet://xnet.fyi/ModerationLabel": () => import("./moderation-5Z4LKOKN.js").then((m) => m.ModerationLabelSchema),
535
+ "xnet://xnet.fyi/PolicyList": () => import("./moderation-5Z4LKOKN.js").then((m) => m.PolicyListSchema),
536
+ "xnet://xnet.fyi/PolicySubscription": () => import("./moderation-5Z4LKOKN.js").then((m) => m.PolicySubscriptionSchema),
537
+ "xnet://xnet.fyi/PublicInteractionPolicy": () => import("./moderation-5Z4LKOKN.js").then((m) => m.PublicInteractionPolicySchema),
538
+ "xnet://xnet.fyi/MessageRequest": () => import("./moderation-5Z4LKOKN.js").then((m) => m.MessageRequestSchema),
539
+ "xnet://xnet.fyi/CommunityNote": () => import("./moderation-5Z4LKOKN.js").then((m) => m.CommunityNoteSchema),
540
+ "xnet://xnet.fyi/NoteRating": () => import("./moderation-5Z4LKOKN.js").then((m) => m.NoteRatingSchema),
541
+ "xnet://xnet.fyi/QualitySignal": () => import("./moderation-5Z4LKOKN.js").then((m) => m.QualitySignalSchema),
542
+ "xnet://xnet.fyi/ContentProvenance": () => import("./moderation-5Z4LKOKN.js").then((m) => m.ContentProvenanceSchema),
543
+ "xnet://xnet.fyi/Appeal": () => import("./moderation-5Z4LKOKN.js").then((m) => m.AppealSchema),
544
+ "xnet://xnet.fyi/ReviewTask": () => import("./moderation-5Z4LKOKN.js").then((m) => m.ReviewTaskSchema),
531
545
  // Game-interop schema pack (exploration 0200)
532
- "xnet://xnet.fyi/PlayerIdentity": () => import("./game-NEQP7OFX.js").then((m) => m.PlayerIdentitySchema),
533
- "xnet://xnet.fyi/Inventory": () => import("./game-NEQP7OFX.js").then((m) => m.InventorySchema),
534
- "xnet://xnet.fyi/GameItem": () => import("./game-NEQP7OFX.js").then((m) => m.GameItemSchema),
535
- "xnet://xnet.fyi/Achievement": () => import("./game-NEQP7OFX.js").then((m) => m.AchievementSchema),
536
- "xnet://xnet.fyi/MatchSession": () => import("./game-NEQP7OFX.js").then((m) => m.MatchSessionSchema),
537
- "xnet://xnet.fyi/GameEconomyEntry": () => import("./game-NEQP7OFX.js").then((m) => m.GameEconomyEntrySchema),
538
- "xnet://xnet.fyi/GameAsset": () => import("./game-NEQP7OFX.js").then((m) => m.GameAssetSchema),
546
+ "xnet://xnet.fyi/PlayerIdentity": () => import("./game-7AXW7XKS.js").then((m) => m.PlayerIdentitySchema),
547
+ "xnet://xnet.fyi/Inventory": () => import("./game-7AXW7XKS.js").then((m) => m.InventorySchema),
548
+ "xnet://xnet.fyi/GameItem": () => import("./game-7AXW7XKS.js").then((m) => m.GameItemSchema),
549
+ "xnet://xnet.fyi/Achievement": () => import("./game-7AXW7XKS.js").then((m) => m.AchievementSchema),
550
+ "xnet://xnet.fyi/MatchSession": () => import("./game-7AXW7XKS.js").then((m) => m.MatchSessionSchema),
551
+ "xnet://xnet.fyi/GameEconomyEntry": () => import("./game-7AXW7XKS.js").then((m) => m.GameEconomyEntrySchema),
552
+ "xnet://xnet.fyi/GameAsset": () => import("./game-7AXW7XKS.js").then((m) => m.GameAssetSchema),
539
553
  // Memory schema pack (exploration 0211)
540
554
  "xnet://xnet.fyi/MemoryItem": () => import("./memory-PAPUIKWD.js").then((m) => m.MemoryItemSchema),
541
555
  // Agent schema pack (exploration 0337)