@batterai/host 0.1.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 (148) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +23 -0
  4. package/dist/cache/dependency-graph.d.ts +18 -0
  5. package/dist/cache/dependency-graph.d.ts.map +1 -0
  6. package/dist/cache/dependency-graph.js +30 -0
  7. package/dist/cache/dependency-graph.js.map +1 -0
  8. package/dist/cache/render-cache.d.ts +39 -0
  9. package/dist/cache/render-cache.d.ts.map +1 -0
  10. package/dist/cache/render-cache.js +60 -0
  11. package/dist/cache/render-cache.js.map +1 -0
  12. package/dist/client/mount.d.ts +9 -0
  13. package/dist/client/mount.d.ts.map +1 -0
  14. package/dist/client/mount.js +69 -0
  15. package/dist/client/mount.js.map +1 -0
  16. package/dist/client.d.ts +2 -0
  17. package/dist/client.d.ts.map +1 -0
  18. package/dist/client.js +2 -0
  19. package/dist/client.js.map +1 -0
  20. package/dist/collab/in-memory-page-draft-store.d.ts +44 -0
  21. package/dist/collab/in-memory-page-draft-store.d.ts.map +1 -0
  22. package/dist/collab/in-memory-page-draft-store.js +217 -0
  23. package/dist/collab/in-memory-page-draft-store.js.map +1 -0
  24. package/dist/collab/page-doc-page-draft-store.d.ts +41 -0
  25. package/dist/collab/page-doc-page-draft-store.d.ts.map +1 -0
  26. package/dist/collab/page-doc-page-draft-store.js +328 -0
  27. package/dist/collab/page-doc-page-draft-store.js.map +1 -0
  28. package/dist/collab/page-draft-store.d.ts +152 -0
  29. package/dist/collab/page-draft-store.d.ts.map +1 -0
  30. package/dist/collab/page-draft-store.js +61 -0
  31. package/dist/collab/page-draft-store.js.map +1 -0
  32. package/dist/content-source/conformance/cases-delegation.d.ts +3 -0
  33. package/dist/content-source/conformance/cases-delegation.d.ts.map +1 -0
  34. package/dist/content-source/conformance/cases-delegation.js +55 -0
  35. package/dist/content-source/conformance/cases-delegation.js.map +1 -0
  36. package/dist/content-source/conformance/cases-fidelity.d.ts +3 -0
  37. package/dist/content-source/conformance/cases-fidelity.d.ts.map +1 -0
  38. package/dist/content-source/conformance/cases-fidelity.js +67 -0
  39. package/dist/content-source/conformance/cases-fidelity.js.map +1 -0
  40. package/dist/content-source/conformance/cases-isolation.d.ts +3 -0
  41. package/dist/content-source/conformance/cases-isolation.d.ts.map +1 -0
  42. package/dist/content-source/conformance/cases-isolation.js +57 -0
  43. package/dist/content-source/conformance/cases-isolation.js.map +1 -0
  44. package/dist/content-source/conformance/cases-permissions.d.ts +3 -0
  45. package/dist/content-source/conformance/cases-permissions.d.ts.map +1 -0
  46. package/dist/content-source/conformance/cases-permissions.js +50 -0
  47. package/dist/content-source/conformance/cases-permissions.js.map +1 -0
  48. package/dist/content-source/conformance/cases-reads.d.ts +3 -0
  49. package/dist/content-source/conformance/cases-reads.d.ts.map +1 -0
  50. package/dist/content-source/conformance/cases-reads.js +216 -0
  51. package/dist/content-source/conformance/cases-reads.js.map +1 -0
  52. package/dist/content-source/conformance/cases-writes.d.ts +11 -0
  53. package/dist/content-source/conformance/cases-writes.d.ts.map +1 -0
  54. package/dist/content-source/conformance/cases-writes.js +73 -0
  55. package/dist/content-source/conformance/cases-writes.js.map +1 -0
  56. package/dist/content-source/conformance/session-required.d.ts +10 -0
  57. package/dist/content-source/conformance/session-required.d.ts.map +1 -0
  58. package/dist/content-source/conformance/session-required.js +11 -0
  59. package/dist/content-source/conformance/session-required.js.map +1 -0
  60. package/dist/content-source/conformance/sessionless-viewer.d.ts +12 -0
  61. package/dist/content-source/conformance/sessionless-viewer.d.ts.map +1 -0
  62. package/dist/content-source/conformance/sessionless-viewer.js +5 -0
  63. package/dist/content-source/conformance/sessionless-viewer.js.map +1 -0
  64. package/dist/content-source/conformance/target.d.ts +111 -0
  65. package/dist/content-source/conformance/target.d.ts.map +1 -0
  66. package/dist/content-source/conformance/target.js +2 -0
  67. package/dist/content-source/conformance/target.js.map +1 -0
  68. package/dist/content-source/conformance-kit.d.ts +4 -0
  69. package/dist/content-source/conformance-kit.d.ts.map +1 -0
  70. package/dist/content-source/conformance-kit.js +41 -0
  71. package/dist/content-source/conformance-kit.js.map +1 -0
  72. package/dist/content-source/content-source.d.ts +153 -0
  73. package/dist/content-source/content-source.d.ts.map +1 -0
  74. package/dist/content-source/content-source.js +12 -0
  75. package/dist/content-source/content-source.js.map +1 -0
  76. package/dist/content-source/permissions.d.ts +46 -0
  77. package/dist/content-source/permissions.d.ts.map +1 -0
  78. package/dist/content-source/permissions.js +33 -0
  79. package/dist/content-source/permissions.js.map +1 -0
  80. package/dist/content-source/viewer.d.ts +48 -0
  81. package/dist/content-source/viewer.d.ts.map +1 -0
  82. package/dist/content-source/viewer.js +24 -0
  83. package/dist/content-source/viewer.js.map +1 -0
  84. package/dist/index.d.ts +30 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +30 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/lifecycle/cms-lifecycle-store.d.ts +72 -0
  89. package/dist/lifecycle/cms-lifecycle-store.d.ts.map +1 -0
  90. package/dist/lifecycle/cms-lifecycle-store.js +150 -0
  91. package/dist/lifecycle/cms-lifecycle-store.js.map +1 -0
  92. package/dist/lifecycle/lifecycle-store.d.ts +35 -0
  93. package/dist/lifecycle/lifecycle-store.d.ts.map +1 -0
  94. package/dist/lifecycle/lifecycle-store.js +69 -0
  95. package/dist/lifecycle/lifecycle-store.js.map +1 -0
  96. package/dist/lifecycle/version-token.d.ts +30 -0
  97. package/dist/lifecycle/version-token.d.ts.map +1 -0
  98. package/dist/lifecycle/version-token.js +22 -0
  99. package/dist/lifecycle/version-token.js.map +1 -0
  100. package/dist/messages.d.ts +26 -0
  101. package/dist/messages.d.ts.map +1 -0
  102. package/dist/messages.js +31 -0
  103. package/dist/messages.js.map +1 -0
  104. package/dist/render/image-usage-preview.d.ts +19 -0
  105. package/dist/render/image-usage-preview.d.ts.map +1 -0
  106. package/dist/render/image-usage-preview.js +25 -0
  107. package/dist/render/image-usage-preview.js.map +1 -0
  108. package/dist/render/image-usage.d.ts +32 -0
  109. package/dist/render/image-usage.d.ts.map +1 -0
  110. package/dist/render/image-usage.js +116 -0
  111. package/dist/render/image-usage.js.map +1 -0
  112. package/dist/render/page-renderer.d.ts +44 -0
  113. package/dist/render/page-renderer.d.ts.map +1 -0
  114. package/dist/render/page-renderer.js +115 -0
  115. package/dist/render/page-renderer.js.map +1 -0
  116. package/dist/resolver/data-loader.d.ts +49 -0
  117. package/dist/resolver/data-loader.d.ts.map +1 -0
  118. package/dist/resolver/data-loader.js +121 -0
  119. package/dist/resolver/data-loader.js.map +1 -0
  120. package/dist/resolver/resolution-service.d.ts +49 -0
  121. package/dist/resolver/resolution-service.d.ts.map +1 -0
  122. package/dist/resolver/resolution-service.js +193 -0
  123. package/dist/resolver/resolution-service.js.map +1 -0
  124. package/dist/routing/route-resolver.d.ts +73 -0
  125. package/dist/routing/route-resolver.d.ts.map +1 -0
  126. package/dist/routing/route-resolver.js +114 -0
  127. package/dist/routing/route-resolver.js.map +1 -0
  128. package/dist/scope-engine/build-stack.d.ts +49 -0
  129. package/dist/scope-engine/build-stack.d.ts.map +1 -0
  130. package/dist/scope-engine/build-stack.js +77 -0
  131. package/dist/scope-engine/build-stack.js.map +1 -0
  132. package/dist/scope-engine/repeater-query.d.ts +9 -0
  133. package/dist/scope-engine/repeater-query.d.ts.map +1 -0
  134. package/dist/scope-engine/repeater-query.js +39 -0
  135. package/dist/scope-engine/repeater-query.js.map +1 -0
  136. package/dist/seo/metadata.d.ts +30 -0
  137. package/dist/seo/metadata.d.ts.map +1 -0
  138. package/dist/seo/metadata.js +118 -0
  139. package/dist/seo/metadata.js.map +1 -0
  140. package/dist/seo/sitemap.d.ts +11 -0
  141. package/dist/seo/sitemap.d.ts.map +1 -0
  142. package/dist/seo/sitemap.js +20 -0
  143. package/dist/seo/sitemap.js.map +1 -0
  144. package/dist/write/write-path.d.ts +63 -0
  145. package/dist/write/write-path.d.ts.map +1 -0
  146. package/dist/write/write-path.js +139 -0
  147. package/dist/write/write-path.js.map +1 -0
  148. package/package.json +44 -0
@@ -0,0 +1,41 @@
1
+ import { type PageDocPort } from "../lifecycle/cms-lifecycle-store";
2
+ import { type ContentVersionToken, type PublishedSnapshot } from "../lifecycle/version-token";
3
+ import type { PageRecord } from "../routing/route-resolver";
4
+ import { type CollaborationAuditEvent, type DurableAcceptedOp, type PageDraftRef, type PageDraftStore } from "./page-draft-store";
5
+ import type { InitialPageDraft, InMemoryPageDraftAuthorizer } from "./in-memory-page-draft-store";
6
+ interface DedupeEntry {
7
+ readonly key: string;
8
+ readonly seq: number;
9
+ readonly opDigest: string;
10
+ }
11
+ export interface PageDocStoredPageDraftRoom<TRecord = PageRecord, TOpPayload = unknown> {
12
+ readonly ref: PageDraftRef;
13
+ readonly record: TRecord;
14
+ readonly draftVersion?: ContentVersionToken;
15
+ readonly draftVersionCounter: number;
16
+ readonly publishVersionCounter: number;
17
+ readonly epochCounter: number;
18
+ readonly seq: number;
19
+ readonly epoch: string;
20
+ readonly compactedThroughSeq: number;
21
+ readonly flushedThroughSeq: number;
22
+ readonly ops: readonly DurableAcceptedOp<TOpPayload>[];
23
+ readonly dedupe: readonly DedupeEntry[];
24
+ readonly audit: readonly CollaborationAuditEvent<TOpPayload>[];
25
+ readonly snapshots: readonly PublishedSnapshot<TRecord>[];
26
+ }
27
+ export interface PageDocPageDraftStoreOptions<TRecord = PageRecord, TOpPayload = unknown> {
28
+ readonly port: PageDocPort<PageDocStoredPageDraftRoom<TRecord, TOpPayload>>;
29
+ readonly drafts?: readonly InitialPageDraft<TRecord>[];
30
+ readonly authorize?: InMemoryPageDraftAuthorizer;
31
+ readonly now?: () => string;
32
+ readonly keyPrefix?: string;
33
+ readonly maxSnapshots?: number;
34
+ }
35
+ export interface SeedablePageDraftStore<TRecord = PageRecord, TOpPayload = unknown> extends PageDraftStore<TRecord, TOpPayload> {
36
+ seedDraft(seed: InitialPageDraft<TRecord>): void;
37
+ refreshDraft(seed: InitialPageDraft<TRecord>): Promise<"created" | "unchanged" | "refreshed" | "pending">;
38
+ }
39
+ export declare function createPageDocPageDraftStore<TRecord = PageRecord, TOpPayload = unknown>(opts: PageDocPageDraftStoreOptions<TRecord, TOpPayload>): SeedablePageDraftStore<TRecord, TOpPayload>;
40
+ export {};
41
+ //# sourceMappingURL=page-doc-page-draft-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-doc-page-draft-store.d.ts","sourceRoot":"","sources":["../../src/collab/page-doc-page-draft-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,WAAW,EAAsB,MAAM,kCAAkC,CAAC;AACzG,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAQL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EAGtB,KAAK,YAAY,EAGjB,KAAK,cAAc,EAGpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAElG,UAAU,WAAW;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B,CAAC,OAAO,GAAG,UAAU,EAAE,UAAU,GAAG,OAAO;IACpF,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,SAAS,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;CAC3D;AAED,MAAM,WAAW,4BAA4B,CAAC,OAAO,GAAG,UAAU,EAAE,UAAU,GAAG,OAAO;IACtF,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACjD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB,CAAC,OAAO,GAAG,UAAU,EAAE,UAAU,GAAG,OAAO,CAChF,SAAQ,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC;IAC3C,SAAS,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACjD,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC,CAAC;CAC3G;AAOD,wBAAgB,2BAA2B,CAAC,OAAO,GAAG,UAAU,EAAE,UAAU,GAAG,OAAO,EACpF,IAAI,EAAE,4BAA4B,CAAC,OAAO,EAAE,UAAU,CAAC,GACtD,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CA8U7C"}
@@ -0,0 +1,328 @@
1
+ import { PageDocConflict } from "../lifecycle/cms-lifecycle-store.js";
2
+ import { versionNumber, versionToken, } from "../lifecycle/version-token.js";
3
+ import { PageDraftAccessDenied, PageDraftEpochMismatch, PageDraftOpsCompacted, PageDraftRoomNotFound, PageDraftSeqMismatch, PageDraftVersionConflict, } from "./page-draft-store.js";
4
+ export function createPageDocPageDraftStore(opts) {
5
+ const now = opts.now ?? (() => new Date().toISOString());
6
+ const authorize = opts.authorize ?? defaultAuthorize;
7
+ const maxSnapshots = opts.maxSnapshots ?? 50;
8
+ const seeds = new Map();
9
+ function cloneRef(ref) {
10
+ return { pageId: ref.pageId };
11
+ }
12
+ function roomKey(ref) {
13
+ return `${ref.pageId}`;
14
+ }
15
+ function portKey(ref) {
16
+ return `${opts.keyPrefix ?? "collab-draft"}:${roomKey(ref)}`;
17
+ }
18
+ function nextEpoch(counter) {
19
+ return `epoch-${String(counter).padStart(6, "0")}`;
20
+ }
21
+ function pruneSnapshots(snapshots) {
22
+ if (maxSnapshots <= 0)
23
+ return [];
24
+ return snapshots.slice(-maxSnapshots);
25
+ }
26
+ function makeRoom(seed) {
27
+ const draftVersionCounter = seed.draftVersion ? versionNumber(seed.draftVersion) : 0;
28
+ return {
29
+ ref: cloneRef(seed.ref),
30
+ record: structuredClone(seed.record),
31
+ draftVersion: seed.draftVersion,
32
+ draftVersionCounter,
33
+ publishVersionCounter: 0,
34
+ epochCounter: 1,
35
+ seq: 0,
36
+ epoch: seed.epoch ?? nextEpoch(1),
37
+ compactedThroughSeq: 0,
38
+ flushedThroughSeq: 0,
39
+ ops: [],
40
+ dedupe: [],
41
+ audit: [],
42
+ snapshots: [],
43
+ };
44
+ }
45
+ function normalizeDoc(doc) {
46
+ if (!doc)
47
+ return undefined;
48
+ return {
49
+ ...doc,
50
+ docVersion: Number.isInteger(doc.docVersion) && doc.docVersion >= 0 ? doc.docVersion : 0,
51
+ snapshots: doc.snapshots ?? [],
52
+ };
53
+ }
54
+ async function readRoom(ref) {
55
+ const key = portKey(ref);
56
+ const persisted = normalizeDoc(await opts.port.read(key));
57
+ if (persisted?.draft) {
58
+ return {
59
+ room: {
60
+ ...structuredClone(persisted.draft),
61
+ audit: structuredClone(persisted.draft.audit ?? []),
62
+ },
63
+ docVersion: persisted.docVersion,
64
+ };
65
+ }
66
+ const seed = seeds.get(roomKey(ref));
67
+ if (!seed)
68
+ return undefined;
69
+ const room = makeRoom(seed);
70
+ try {
71
+ await writeRoom(room, persisted?.docVersion ?? 0);
72
+ return { room, docVersion: (persisted?.docVersion ?? 0) + 1 };
73
+ }
74
+ catch (error) {
75
+ if (error instanceof PageDocConflict)
76
+ return readRoom(ref);
77
+ throw error;
78
+ }
79
+ }
80
+ async function writeRoom(room, expectedDocVersion) {
81
+ await opts.port.write(portKey(room.ref), { docVersion: expectedDocVersion + 1, draft: structuredClone(room), snapshots: [] }, { expectedDocVersion });
82
+ }
83
+ for (const seed of opts.drafts ?? []) {
84
+ seeds.set(roomKey(seed.ref), seed);
85
+ }
86
+ async function assertAllowed(viewer, ref, action) {
87
+ const result = await authorize(viewer, ref, action);
88
+ if (result !== true)
89
+ throw new PageDraftAccessDenied(ref, action, result);
90
+ const loaded = await readRoom(ref);
91
+ if (!loaded)
92
+ throw new PageDraftRoomNotFound(ref);
93
+ return loaded.room;
94
+ }
95
+ async function roomForEpoch(ref) {
96
+ const loaded = await readRoom(ref);
97
+ if (!loaded)
98
+ throw new PageDraftRoomNotFound(ref);
99
+ if (loaded.room.epoch !== ref.epoch)
100
+ throw new PageDraftEpochMismatch(ref.epoch, loaded.room.epoch);
101
+ return loaded;
102
+ }
103
+ async function mutateRoom(roomRef, update) {
104
+ let lastConflict;
105
+ for (let attempt = 0; attempt < 8; attempt += 1) {
106
+ const loaded = await roomForEpoch(roomRef);
107
+ const next = update(loaded.room);
108
+ try {
109
+ await writeRoom(next.room, loaded.docVersion);
110
+ return next.result;
111
+ }
112
+ catch (error) {
113
+ if (error instanceof PageDocConflict) {
114
+ lastConflict = error;
115
+ continue;
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ throw lastConflict ?? new PageDocConflict(portKey(roomRef), -1, undefined);
121
+ }
122
+ return {
123
+ /** Register a CMS-loaded page as a room seed. Safe to call repeatedly;
124
+ * persisted room state always wins over a newer seed. */
125
+ seedDraft(seed) {
126
+ seeds.set(roomKey(seed.ref), structuredClone(seed));
127
+ },
128
+ async refreshDraft(seed) {
129
+ seeds.set(roomKey(seed.ref), structuredClone(seed));
130
+ const loaded = await readRoom(seed.ref);
131
+ if (!loaded)
132
+ return "created";
133
+ if (JSON.stringify(loaded.room.record) === JSON.stringify(seed.record))
134
+ return "unchanged";
135
+ if (loaded.room.seq !== loaded.room.flushedThroughSeq)
136
+ return "pending";
137
+ const epochCounter = loaded.room.epochCounter + 1;
138
+ const next = {
139
+ ...makeRoom(seed),
140
+ epochCounter,
141
+ epoch: nextEpoch(epochCounter),
142
+ audit: loaded.room.audit,
143
+ snapshots: loaded.room.snapshots,
144
+ };
145
+ await writeRoom(next, loaded.docVersion);
146
+ return "refreshed";
147
+ },
148
+ async assertPageAccess(viewer, ref, action) {
149
+ const result = await authorize(viewer, ref, action);
150
+ if (result !== true)
151
+ return { ok: false, reason: result };
152
+ if (!(await readRoom(ref)))
153
+ return { ok: false, reason: "page not found" };
154
+ return { ok: true };
155
+ },
156
+ async openDraftRoom(viewer, ref) {
157
+ const room = await assertAllowed(viewer, ref, "read");
158
+ return {
159
+ ref: cloneRef(room.ref),
160
+ record: structuredClone(room.record),
161
+ draftVersion: room.draftVersion,
162
+ baseSeq: room.flushedThroughSeq,
163
+ epoch: room.epoch,
164
+ compactedThroughSeq: room.compactedThroughSeq,
165
+ };
166
+ },
167
+ async appendAcceptedOp(roomRef, op) {
168
+ return mutateRoom(roomRef, (room) => {
169
+ const dedupeKey = `${room.epoch}:${op.sessionId}:${op.clientOpId}`;
170
+ const existing = room.dedupe.find((entry) => entry.key === dedupeKey);
171
+ if (existing) {
172
+ if (existing.opDigest !== op.opDigest) {
173
+ return {
174
+ room,
175
+ result: {
176
+ kind: "op-replay-conflict",
177
+ existingSeq: existing.seq,
178
+ existingDigest: existing.opDigest,
179
+ attemptedDigest: op.opDigest,
180
+ },
181
+ };
182
+ }
183
+ return { room, result: { kind: "duplicate", seq: existing.seq, opDigest: existing.opDigest } };
184
+ }
185
+ const seq = room.seq + 1;
186
+ const entry = {
187
+ ...structuredClone(op),
188
+ seq,
189
+ epoch: room.epoch,
190
+ };
191
+ const auditEvent = {
192
+ eventId: `${room.epoch}:${seq}`,
193
+ pageId: String(room.ref.pageId),
194
+ roomEpoch: room.epoch,
195
+ roomSeq: seq,
196
+ clientOpId: op.clientOpId,
197
+ sessionId: op.sessionId,
198
+ actor: structuredClone(op.actor),
199
+ operationKind: String(op.op?.t ?? "unknown"),
200
+ operation: structuredClone(op.auditOperation),
201
+ target: structuredClone(op.auditTarget),
202
+ beforeDigest: op.beforeDigest,
203
+ afterDigest: op.afterDigest,
204
+ acceptedAt: op.acceptedAt,
205
+ source: "collaboration",
206
+ };
207
+ return {
208
+ room: {
209
+ ...room,
210
+ seq,
211
+ ops: [...room.ops, entry],
212
+ dedupe: [...room.dedupe, { key: dedupeKey, seq, opDigest: op.opDigest }],
213
+ audit: [...room.audit, auditEvent],
214
+ },
215
+ result: { kind: "appended", seq },
216
+ };
217
+ });
218
+ },
219
+ async readOpsSince(roomRef, seq) {
220
+ const { room } = await roomForEpoch(roomRef);
221
+ if (seq < room.compactedThroughSeq) {
222
+ throw new PageDraftOpsCompacted(seq, room.compactedThroughSeq);
223
+ }
224
+ return room.ops.filter((op) => op.seq > seq).map((op) => structuredClone(op));
225
+ },
226
+ async readAuditEvents(ref) {
227
+ const loaded = await readRoom(ref);
228
+ if (!loaded)
229
+ throw new PageDraftRoomNotFound(ref);
230
+ return structuredClone(loaded.room.audit);
231
+ },
232
+ async flushDraft(roomRef, input) {
233
+ return mutateRoom(roomRef, (room) => {
234
+ if (input.expectedSeq !== room.seq)
235
+ throw new PageDraftSeqMismatch(input.expectedSeq, room.seq);
236
+ if (input.previousDraftVersion !== undefined &&
237
+ input.previousDraftVersion !== room.draftVersion) {
238
+ throw new PageDraftVersionConflict(input.previousDraftVersion, room.draftVersion);
239
+ }
240
+ const draftVersionCounter = room.draftVersionCounter + 1;
241
+ const draftVersion = versionToken(draftVersionCounter);
242
+ return {
243
+ room: {
244
+ ...room,
245
+ record: structuredClone(input.record),
246
+ draftVersionCounter,
247
+ draftVersion,
248
+ flushedThroughSeq: input.expectedSeq,
249
+ audit: room.audit.map((event) => event.roomSeq <= input.expectedSeq && !event.persistedAt
250
+ ? { ...event, persistedAt: now() }
251
+ : event),
252
+ },
253
+ result: { draftVersion, flushedThroughSeq: input.expectedSeq },
254
+ };
255
+ });
256
+ },
257
+ async compactOps(roomRef, throughSeq) {
258
+ await mutateRoom(roomRef, (room) => {
259
+ if (throughSeq > room.flushedThroughSeq) {
260
+ throw new PageDraftSeqMismatch(throughSeq, room.flushedThroughSeq);
261
+ }
262
+ if (throughSeq <= room.compactedThroughSeq)
263
+ return { room, result: undefined };
264
+ return {
265
+ room: {
266
+ ...room,
267
+ compactedThroughSeq: throughSeq,
268
+ ops: room.ops.filter((op) => op.seq > throughSeq),
269
+ dedupe: room.dedupe.filter((entry) => entry.seq > throughSeq),
270
+ },
271
+ result: undefined,
272
+ };
273
+ });
274
+ },
275
+ async publishDraft(viewer, roomRef, input) {
276
+ await assertAllowed(viewer, roomRef, "publish");
277
+ return mutateRoom(roomRef, (room) => {
278
+ if (input.expectedSeq !== room.seq || input.expectedSeq !== room.flushedThroughSeq) {
279
+ throw new PageDraftSeqMismatch(input.expectedSeq, room.flushedThroughSeq);
280
+ }
281
+ if (input.expectedDraftVersion !== room.draftVersion) {
282
+ throw new PageDraftVersionConflict(input.expectedDraftVersion, room.draftVersion);
283
+ }
284
+ const publishVersionCounter = room.publishVersionCounter + 1;
285
+ const epochCounter = room.epochCounter + 1;
286
+ const snapshot = {
287
+ subject: { kind: "page", pageId: room.ref.pageId },
288
+ version: versionToken(publishVersionCounter),
289
+ publishedAt: now(),
290
+ data: structuredClone(room.record),
291
+ };
292
+ const nextRoom = {
293
+ ...room,
294
+ publishVersionCounter,
295
+ epochCounter,
296
+ compactedThroughSeq: room.seq,
297
+ ops: [],
298
+ dedupe: [],
299
+ snapshots: pruneSnapshots([...room.snapshots, snapshot]),
300
+ audit: room.audit.map((event) => event.roomSeq <= room.seq && !event.releaseId
301
+ ? {
302
+ ...event,
303
+ persistedAt: event.persistedAt ?? snapshot.publishedAt,
304
+ releaseId: String(snapshot.version),
305
+ publishedAt: snapshot.publishedAt,
306
+ }
307
+ : event),
308
+ epoch: nextEpoch(epochCounter),
309
+ };
310
+ return {
311
+ room: nextRoom,
312
+ result: { snapshot: structuredClone(snapshot), newEpoch: nextRoom.epoch },
313
+ };
314
+ });
315
+ },
316
+ };
317
+ }
318
+ function defaultAuthorize(viewer, _ref, _action) {
319
+ // battery-editor is not the access authority (decision 012, invariant D4):
320
+ // no identity-kind gate. The CMS authorizes real draft operations via
321
+ // the delegated session. We keep ONLY the behavioral D1 floor — a sessionless
322
+ // viewer never reaches a draft room (types forbid it; runtime attackers do
323
+ // not respect types).
324
+ if (viewer.session === undefined)
325
+ return "session required";
326
+ return true;
327
+ }
328
+ //# sourceMappingURL=page-doc-page-draft-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-doc-page-draft-store.js","sourceRoot":"","sources":["../../src/collab/page-doc-page-draft-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import type { PageId } from "@batterai/bind-core";
2
+ import type { Viewer } from "../content-source/viewer";
3
+ import type { ContentVersionToken, PublishedSnapshot } from "../lifecycle/version-token";
4
+ import type { PageRecord } from "../routing/route-resolver";
5
+ export type PageAccessAction = "read" | "edit" | "publish";
6
+ /** Draft rooms are addressed by pageKey/pageId alone (decision 012): tenancy is
7
+ * delegated to the CMS, which authorizes each delegated draft operation. */
8
+ export interface PageDraftRef {
9
+ readonly pageId: PageId;
10
+ }
11
+ export interface PageDraftRoomRef extends PageDraftRef {
12
+ readonly epoch: string;
13
+ }
14
+ export interface PageDraftSnapshot<TRecord = PageRecord> {
15
+ readonly ref: PageDraftRef;
16
+ readonly record: TRecord;
17
+ readonly draftVersion: ContentVersionToken | undefined;
18
+ readonly baseSeq: number;
19
+ readonly epoch: string;
20
+ readonly compactedThroughSeq: number;
21
+ }
22
+ export interface CollaborationAuditActor {
23
+ readonly userId: string;
24
+ readonly displayName: string;
25
+ readonly tenantId: string;
26
+ readonly roles: readonly string[];
27
+ }
28
+ export type CollaborationAuditTarget = {
29
+ readonly kind: "page";
30
+ readonly field?: string;
31
+ } | {
32
+ readonly kind: "block";
33
+ readonly blockId: string;
34
+ readonly field?: string;
35
+ } | {
36
+ readonly kind: "structure";
37
+ readonly blockId?: string;
38
+ readonly container?: string;
39
+ };
40
+ export interface CollaborationAuditEvent<TOpPayload = unknown> {
41
+ readonly eventId: string;
42
+ readonly pageId: string;
43
+ readonly roomEpoch: string;
44
+ readonly roomSeq: number;
45
+ readonly clientOpId: string;
46
+ readonly sessionId: string;
47
+ readonly actor: CollaborationAuditActor;
48
+ readonly operationKind: string;
49
+ /** Bounded, redacted operation metadata. Full content stays in the replay log. */
50
+ readonly operation: unknown;
51
+ readonly target: CollaborationAuditTarget;
52
+ readonly beforeDigest: string;
53
+ readonly afterDigest: string;
54
+ readonly acceptedAt: string;
55
+ readonly persistedAt?: string;
56
+ readonly releaseId?: string;
57
+ readonly publishedAt?: string;
58
+ readonly source: "collaboration";
59
+ }
60
+ export interface PendingAcceptedOp<TOpPayload = unknown> {
61
+ readonly sessionId: string;
62
+ readonly clientOpId: string;
63
+ readonly baseSeq: number;
64
+ readonly op: TOpPayload;
65
+ readonly opDigest: string;
66
+ readonly acceptedAt: string;
67
+ readonly protocolVersion: number;
68
+ /** Server-derived audit context. The browser never supplies this value. */
69
+ readonly actor: CollaborationAuditActor;
70
+ readonly auditTarget: CollaborationAuditTarget;
71
+ readonly auditOperation: unknown;
72
+ readonly beforeDigest: string;
73
+ readonly afterDigest: string;
74
+ }
75
+ export interface DurableAcceptedOp<TOpPayload = unknown> extends PendingAcceptedOp<TOpPayload> {
76
+ readonly seq: number;
77
+ readonly epoch: string;
78
+ }
79
+ export type AppendAcceptedOpResult = {
80
+ readonly kind: "appended";
81
+ readonly seq: number;
82
+ } | {
83
+ readonly kind: "duplicate";
84
+ readonly seq: number;
85
+ readonly opDigest: string;
86
+ } | {
87
+ readonly kind: "op-replay-conflict";
88
+ readonly existingSeq: number;
89
+ readonly existingDigest: string;
90
+ readonly attemptedDigest: string;
91
+ };
92
+ export interface FlushDraftResult {
93
+ readonly draftVersion: ContentVersionToken;
94
+ readonly flushedThroughSeq: number;
95
+ }
96
+ export interface PublishDraftResult<TRecord = PageRecord> {
97
+ readonly snapshot: PublishedSnapshot<TRecord>;
98
+ readonly newEpoch: string;
99
+ }
100
+ export interface PageDraftStore<TRecord = PageRecord, TOpPayload = unknown> {
101
+ assertPageAccess(viewer: Viewer, ref: PageDraftRef, action: PageAccessAction): Promise<{
102
+ readonly ok: true;
103
+ } | {
104
+ readonly ok: false;
105
+ readonly reason: string;
106
+ }>;
107
+ openDraftRoom(viewer: Viewer, ref: PageDraftRef): Promise<PageDraftSnapshot<TRecord>>;
108
+ appendAcceptedOp(room: PageDraftRoomRef, op: PendingAcceptedOp<TOpPayload>): Promise<AppendAcceptedOpResult>;
109
+ readOpsSince(room: PageDraftRoomRef, seq: number): Promise<readonly DurableAcceptedOp<TOpPayload>[]>;
110
+ readAuditEvents(ref: PageDraftRef): Promise<readonly CollaborationAuditEvent<TOpPayload>[]>;
111
+ flushDraft(room: PageDraftRoomRef, input: {
112
+ readonly expectedSeq: number;
113
+ readonly record: TRecord;
114
+ readonly previousDraftVersion?: ContentVersionToken;
115
+ }): Promise<FlushDraftResult>;
116
+ compactOps(room: PageDraftRoomRef, throughSeq: number): Promise<void>;
117
+ publishDraft(viewer: Viewer, room: PageDraftRoomRef, input: {
118
+ readonly expectedDraftVersion: ContentVersionToken;
119
+ readonly expectedSeq: number;
120
+ }): Promise<PublishDraftResult<TRecord>>;
121
+ }
122
+ export declare class PageDraftAccessDenied extends Error {
123
+ readonly ref: PageDraftRef;
124
+ readonly action: PageAccessAction;
125
+ readonly reason: string;
126
+ constructor(ref: PageDraftRef, action: PageAccessAction, reason: string);
127
+ }
128
+ export declare class PageDraftRoomNotFound extends Error {
129
+ readonly ref: PageDraftRef;
130
+ constructor(ref: PageDraftRef);
131
+ }
132
+ export declare class PageDraftEpochMismatch extends Error {
133
+ readonly expected: string;
134
+ readonly actual: string;
135
+ constructor(expected: string, actual: string);
136
+ }
137
+ export declare class PageDraftSeqMismatch extends Error {
138
+ readonly expected: number;
139
+ readonly actual: number;
140
+ constructor(expected: number, actual: number);
141
+ }
142
+ export declare class PageDraftVersionConflict extends Error {
143
+ readonly expected: ContentVersionToken | undefined;
144
+ readonly actual: ContentVersionToken | undefined;
145
+ constructor(expected: ContentVersionToken | undefined, actual: ContentVersionToken | undefined);
146
+ }
147
+ export declare class PageDraftOpsCompacted extends Error {
148
+ readonly requestedSeq: number;
149
+ readonly compactedThroughSeq: number;
150
+ constructor(requestedSeq: number, compactedThroughSeq: number);
151
+ }
152
+ //# sourceMappingURL=page-draft-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-draft-store.d.ts","sourceRoot":"","sources":["../../src/collab/page-draft-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ export class PageDraftAccessDenied extends Error {
2
+ ref;
3
+ action;
4
+ reason;
5
+ constructor(ref, action, reason) {
6
+ super(`PageDraftAccessDenied: ${action} ${ref.pageId}: ${reason}`);
7
+ this.ref = ref;
8
+ this.action = action;
9
+ this.reason = reason;
10
+ this.name = "PageDraftAccessDenied";
11
+ }
12
+ }
13
+ export class PageDraftRoomNotFound extends Error {
14
+ ref;
15
+ constructor(ref) {
16
+ super(`PageDraftRoomNotFound: ${ref.pageId}`);
17
+ this.ref = ref;
18
+ this.name = "PageDraftRoomNotFound";
19
+ }
20
+ }
21
+ export class PageDraftEpochMismatch extends Error {
22
+ expected;
23
+ actual;
24
+ constructor(expected, actual) {
25
+ super(`PageDraftEpochMismatch: expected ${expected}, got ${actual}`);
26
+ this.expected = expected;
27
+ this.actual = actual;
28
+ this.name = "PageDraftEpochMismatch";
29
+ }
30
+ }
31
+ export class PageDraftSeqMismatch extends Error {
32
+ expected;
33
+ actual;
34
+ constructor(expected, actual) {
35
+ super(`PageDraftSeqMismatch: expected ${expected}, got ${actual}`);
36
+ this.expected = expected;
37
+ this.actual = actual;
38
+ this.name = "PageDraftSeqMismatch";
39
+ }
40
+ }
41
+ export class PageDraftVersionConflict extends Error {
42
+ expected;
43
+ actual;
44
+ constructor(expected, actual) {
45
+ super(`PageDraftVersionConflict: expected ${expected ?? "none"}, got ${actual ?? "none"}`);
46
+ this.expected = expected;
47
+ this.actual = actual;
48
+ this.name = "PageDraftVersionConflict";
49
+ }
50
+ }
51
+ export class PageDraftOpsCompacted extends Error {
52
+ requestedSeq;
53
+ compactedThroughSeq;
54
+ constructor(requestedSeq, compactedThroughSeq) {
55
+ super(`PageDraftOpsCompacted: requested ${requestedSeq}, compacted through ${compactedThroughSeq}`);
56
+ this.requestedSeq = requestedSeq;
57
+ this.compactedThroughSeq = compactedThroughSeq;
58
+ this.name = "PageDraftOpsCompacted";
59
+ }
60
+ }
61
+ //# sourceMappingURL=page-draft-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-draft-store.js","sourceRoot":"","sources":["../../src/collab/page-draft-store.ts"],"names":[],"mappings":"AAuIA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACzB;IAA4B;IAAmC;IAApF,YAAqB,GAAiB,EAAW,MAAwB,EAAW,MAAc;QAChG,KAAK,CAAC,0BAA0B,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QADhD,QAAG,GAAH,GAAG,CAAc;QAAW,WAAM,GAAN,MAAM,CAAkB;QAAW,WAAM,GAAN,MAAM,CAAQ;QAEhG,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACzB;IAArB,YAAqB,GAAiB;QACpC,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAD3B,QAAG,GAAH,GAAG,CAAc;QAEpC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAA2B;IAAhD,YAAqB,QAAgB,EAAW,MAAc;QAC5D,KAAK,CAAC,oCAAoC,QAAQ,SAAS,MAAM,EAAE,CAAC,CAAC;QADlD,aAAQ,GAAR,QAAQ,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAQ;QAE5D,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACxB;IAA2B;IAAhD,YAAqB,QAAgB,EAAW,MAAc;QAC5D,KAAK,CAAC,kCAAkC,QAAQ,SAAS,MAAM,EAAE,CAAC,CAAC;QADhD,aAAQ,GAAR,QAAQ,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAQ;QAE5D,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAEtC;IACA;IAFX,YACW,QAAyC,EACzC,MAAuC;QAEhD,KAAK,CAAC,sCAAsC,QAAQ,IAAI,MAAM,SAAS,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QAHlF,aAAQ,GAAR,QAAQ,CAAiC;QACzC,WAAM,GAAN,MAAM,CAAiC;QAGhD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACzB;IAA+B;IAApD,YAAqB,YAAoB,EAAW,mBAA2B;QAC7E,KAAK,CAAC,oCAAoC,YAAY,uBAAuB,mBAAmB,EAAE,CAAC,CAAC;QADjF,iBAAY,GAAZ,YAAY,CAAQ;QAAW,wBAAmB,GAAnB,mBAAmB,CAAQ;QAE7E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { ConformanceHooks, ConformanceTarget } from "./target";
2
+ export declare function registerDelegationCases(target: ConformanceTarget, hooks: ConformanceHooks): void;
3
+ //# sourceMappingURL=cases-delegation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cases-delegation.d.ts","sourceRoot":"","sources":["../../../src/content-source/conformance/cases-delegation.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAmEhG"}