@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.
- package/README.md +5 -0
- package/dist/auth/index.d.ts +4 -4
- package/dist/{chunk-56EXPOJ4.js → chunk-ANMAR3KY.js} +34 -19
- package/dist/chunk-GJAOMEQO.js +114 -0
- package/dist/chunk-KY62NUOI.js +67 -0
- package/dist/chunk-N37U6ZPI.js +789 -0
- package/dist/chunk-NFPEFD2I.js +42 -0
- package/dist/{chunk-EGGRKSRH.js → chunk-QKVIKVAL.js} +70 -31
- package/dist/{chunk-CY6EJUNV.js → chunk-S7SEN4LH.js} +5 -1
- package/dist/{chunk-4HJZJMPI.js → chunk-TN7LGV66.js} +1 -1
- package/dist/{chunk-YRFCXKJC.js → chunk-UQ2VFHU3.js} +2 -2
- package/dist/chunk-VZSEZNYA.js +83 -0
- package/dist/chunk-WSINZHSR.js +90 -0
- package/dist/{chunk-CNGEXCIH.js → chunk-YCBJDT23.js} +69 -55
- package/dist/{clone-BsoRt89i.d.ts → clone-ywzFVkID.d.ts} +16 -6
- package/dist/course-C5DXOIVO.js +24 -0
- package/dist/database/index.d.ts +17 -5
- package/dist/database/index.js +7 -7
- package/dist/event-VW3FBN4F.js +20 -0
- package/dist/{form-types-Dkqm9UO2.d.ts → form-types-BrHYdpi0.d.ts} +1 -1
- package/dist/{game-NEQP7OFX.js → game-7AXW7XKS.js} +1 -1
- package/dist/{grant-expiration-cleaner-BwdmRFua.d.ts → grant-expiration-cleaner-CRS9OyhV.d.ts} +3 -3
- package/dist/index.d.ts +10 -320
- package/dist/index.js +522 -1097
- package/dist/{moderation-HRMMBFVH.js → moderation-5Z4LKOKN.js} +5 -3
- package/dist/{page-RUS2BKMX.js → page-W4G6433H.js} +1 -1
- package/dist/portability/index.d.ts +330 -0
- package/dist/portability/index.js +34 -0
- package/dist/post-7IOO64MD.js +14 -0
- package/dist/{profile-5H6XWCK4.js → profile-KLHCAQY2.js} +1 -1
- package/dist/publication-3MN3WWKP.js +10 -0
- package/dist/{query-ast-DYGcKxoa.d.ts → query-ast-DQJO7yRV.d.ts} +1 -1
- package/dist/{registry-D_3b1Lg6.d.ts → registry-C9IRLLeR.d.ts} +1 -1
- package/dist/schema/index.d.ts +375 -26
- package/dist/schema/index.js +213 -167
- package/dist/space-GBTEHZOK.js +1 -1
- package/dist/store/index.d.ts +4 -4
- package/dist/store/index.js +4 -4
- package/dist/{store-BMnhBWzM.d.ts → store-D1oiFQuF.d.ts} +19 -2
- package/dist/{types-cycApzib.d.ts → types-gws1tSf-.d.ts} +1 -1
- package/package.json +27 -25
- 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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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 (!
|
|
2706
|
-
|
|
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
|
|
2708
|
+
`[NodeStore] Remote change ${change.id} failed hash verification - data may be corrupted`
|
|
2717
2709
|
);
|
|
2718
|
-
this.telemetry?.reportSecurityEvent("data.
|
|
2710
|
+
this.telemetry?.reportSecurityEvent("data.hash_verification_failed", "high");
|
|
2719
2711
|
throw error;
|
|
2720
2712
|
}
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
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
|
-
|
|
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
|
-
* `
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
427
|
-
"xnet://xnet.fyi/ModerationLabel@1.0.0": () => import("./moderation-
|
|
428
|
-
"xnet://xnet.fyi/PolicyList@1.0.0": () => import("./moderation-
|
|
429
|
-
"xnet://xnet.fyi/PolicySubscription@1.0.0": () => import("./moderation-
|
|
430
|
-
"xnet://xnet.fyi/PublicInteractionPolicy@1.0.0": () => import("./moderation-
|
|
431
|
-
"xnet://xnet.fyi/MessageRequest@1.0.0": () => import("./moderation-
|
|
432
|
-
"xnet://xnet.fyi/CommunityNote@1.0.0": () => import("./moderation-
|
|
433
|
-
"xnet://xnet.fyi/NoteRating@1.0.0": () => import("./moderation-
|
|
434
|
-
"xnet://xnet.fyi/QualitySignal@1.0.0": () => import("./moderation-
|
|
435
|
-
"xnet://xnet.fyi/ContentProvenance@1.0.0": () => import("./moderation-
|
|
436
|
-
"xnet://xnet.fyi/Appeal@1.0.0": () => import("./moderation-
|
|
437
|
-
"xnet://xnet.fyi/ReviewTask@1.0.0": () => import("./moderation-
|
|
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-
|
|
440
|
-
"xnet://xnet.fyi/Inventory@1.0.0": () => import("./game-
|
|
441
|
-
"xnet://xnet.fyi/GameItem@1.0.0": () => import("./game-
|
|
442
|
-
"xnet://xnet.fyi/Achievement@1.0.0": () => import("./game-
|
|
443
|
-
"xnet://xnet.fyi/MatchSession@1.0.0": () => import("./game-
|
|
444
|
-
"xnet://xnet.fyi/GameEconomyEntry@1.0.0": () => import("./game-
|
|
445
|
-
"xnet://xnet.fyi/GameAsset@1.0.0": () => import("./game-
|
|
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-
|
|
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-
|
|
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-
|
|
520
|
-
"xnet://xnet.fyi/ModerationLabel": () => import("./moderation-
|
|
521
|
-
"xnet://xnet.fyi/PolicyList": () => import("./moderation-
|
|
522
|
-
"xnet://xnet.fyi/PolicySubscription": () => import("./moderation-
|
|
523
|
-
"xnet://xnet.fyi/PublicInteractionPolicy": () => import("./moderation-
|
|
524
|
-
"xnet://xnet.fyi/MessageRequest": () => import("./moderation-
|
|
525
|
-
"xnet://xnet.fyi/CommunityNote": () => import("./moderation-
|
|
526
|
-
"xnet://xnet.fyi/NoteRating": () => import("./moderation-
|
|
527
|
-
"xnet://xnet.fyi/QualitySignal": () => import("./moderation-
|
|
528
|
-
"xnet://xnet.fyi/ContentProvenance": () => import("./moderation-
|
|
529
|
-
"xnet://xnet.fyi/Appeal": () => import("./moderation-
|
|
530
|
-
"xnet://xnet.fyi/ReviewTask": () => import("./moderation-
|
|
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-
|
|
533
|
-
"xnet://xnet.fyi/Inventory": () => import("./game-
|
|
534
|
-
"xnet://xnet.fyi/GameItem": () => import("./game-
|
|
535
|
-
"xnet://xnet.fyi/Achievement": () => import("./game-
|
|
536
|
-
"xnet://xnet.fyi/MatchSession": () => import("./game-
|
|
537
|
-
"xnet://xnet.fyi/GameEconomyEntry": () => import("./game-
|
|
538
|
-
"xnet://xnet.fyi/GameAsset": () => import("./game-
|
|
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)
|