mindoodb 0.0.3 → 0.0.4

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 (209) hide show
  1. package/README-server.md +1001 -0
  2. package/README.md +14 -26
  3. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +19 -0
  4. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
  5. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +58 -5
  6. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
  7. package/dist/appendonlystores/network/HttpTransport.d.ts +4 -0
  8. package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
  9. package/dist/appendonlystores/network/HttpTransport.js +43 -0
  10. package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
  11. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +3 -0
  12. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
  13. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +15 -1
  14. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
  15. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +5 -1
  16. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -1
  17. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +59 -3
  18. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -1
  19. package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts +21 -0
  20. package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts.map +1 -0
  21. package/dist/browser/cache/IndexedDBLocalCacheStore.js +106 -0
  22. package/dist/browser/cache/IndexedDBLocalCacheStore.js.map +1 -0
  23. package/dist/browser/index.d.ts +3 -0
  24. package/dist/browser/index.d.ts.map +1 -1
  25. package/dist/browser/index.js +9 -1
  26. package/dist/browser/index.js.map +1 -1
  27. package/dist/core/BaseMindooDB.d.ts +103 -13
  28. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  29. package/dist/core/BaseMindooDB.js +1066 -205
  30. package/dist/core/BaseMindooDB.js.map +1 -1
  31. package/dist/core/BaseMindooTenant.d.ts +30 -1
  32. package/dist/core/BaseMindooTenant.d.ts.map +1 -1
  33. package/dist/core/BaseMindooTenant.js +143 -108
  34. package/dist/core/BaseMindooTenant.js.map +1 -1
  35. package/dist/core/BaseMindooTenantDirectory.d.ts +13 -10
  36. package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
  37. package/dist/core/BaseMindooTenantDirectory.js +134 -27
  38. package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
  39. package/dist/core/BaseMindooTenantFactory.d.ts +5 -1
  40. package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
  41. package/dist/core/BaseMindooTenantFactory.js +46 -69
  42. package/dist/core/BaseMindooTenantFactory.js.map +1 -1
  43. package/dist/core/MindooDBServerAdmin.d.ts +238 -0
  44. package/dist/core/MindooDBServerAdmin.d.ts.map +1 -0
  45. package/dist/core/MindooDBServerAdmin.js +345 -0
  46. package/dist/core/MindooDBServerAdmin.js.map +1 -0
  47. package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +3 -1
  48. package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
  49. package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +22 -0
  50. package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
  51. package/dist/core/appendonlystores/MaterializationPlanner.d.ts +49 -0
  52. package/dist/core/appendonlystores/MaterializationPlanner.d.ts.map +1 -0
  53. package/dist/core/appendonlystores/MaterializationPlanner.js +325 -0
  54. package/dist/core/appendonlystores/MaterializationPlanner.js.map +1 -0
  55. package/dist/core/appendonlystores/network/NetworkTransport.d.ts +15 -0
  56. package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
  57. package/dist/core/appendonlystores/network/types.d.ts +2 -0
  58. package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
  59. package/dist/core/appendonlystores/network/types.js.map +1 -1
  60. package/dist/core/appendonlystores/types.d.ts +83 -0
  61. package/dist/core/appendonlystores/types.d.ts.map +1 -1
  62. package/dist/core/cache/CacheManager.d.ts +75 -0
  63. package/dist/core/cache/CacheManager.d.ts.map +1 -0
  64. package/dist/core/cache/CacheManager.js +101 -0
  65. package/dist/core/cache/CacheManager.js.map +1 -0
  66. package/dist/core/cache/EncryptedLocalCacheStore.d.ts +41 -0
  67. package/dist/core/cache/EncryptedLocalCacheStore.d.ts.map +1 -0
  68. package/dist/core/cache/EncryptedLocalCacheStore.js +120 -0
  69. package/dist/core/cache/EncryptedLocalCacheStore.js.map +1 -0
  70. package/dist/core/cache/LocalCacheStore.d.ts +50 -0
  71. package/dist/core/cache/LocalCacheStore.d.ts.map +1 -0
  72. package/dist/core/cache/LocalCacheStore.js +39 -0
  73. package/dist/core/cache/LocalCacheStore.js.map +1 -0
  74. package/dist/core/crypto/privateKeyEncryption.d.ts +5 -0
  75. package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -0
  76. package/dist/core/crypto/privateKeyEncryption.js +87 -0
  77. package/dist/core/crypto/privateKeyEncryption.js.map +1 -0
  78. package/dist/core/index.d.ts +13 -6
  79. package/dist/core/index.d.ts.map +1 -1
  80. package/dist/core/index.js +13 -1
  81. package/dist/core/index.js.map +1 -1
  82. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +4 -1
  83. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
  84. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +39 -11
  85. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
  86. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts +1 -0
  87. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts.map +1 -1
  88. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js +3 -0
  89. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js.map +1 -1
  90. package/dist/core/indexing/virtualviews/VirtualView.d.ts +43 -0
  91. package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
  92. package/dist/core/indexing/virtualviews/VirtualView.js +173 -0
  93. package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
  94. package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +7 -0
  95. package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
  96. package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +28 -0
  97. package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
  98. package/dist/core/keys/KeyBag.d.ts +38 -14
  99. package/dist/core/keys/KeyBag.d.ts.map +1 -1
  100. package/dist/core/keys/KeyBag.js +102 -76
  101. package/dist/core/keys/KeyBag.js.map +1 -1
  102. package/dist/core/keys/KeyContext.d.ts +3 -3
  103. package/dist/core/keys/KeyContext.d.ts.map +1 -1
  104. package/dist/core/keys/KeyContext.js +10 -4
  105. package/dist/core/keys/KeyContext.js.map +1 -1
  106. package/dist/core/types.d.ts +305 -21
  107. package/dist/core/types.d.ts.map +1 -1
  108. package/dist/core/types.js +7 -1
  109. package/dist/core/types.js.map +1 -1
  110. package/dist/core/utils/idGeneration.d.ts.map +1 -1
  111. package/dist/core/utils/idGeneration.js +37 -3
  112. package/dist/core/utils/idGeneration.js.map +1 -1
  113. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +4 -1
  114. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
  115. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +24 -0
  116. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
  117. package/dist/node/attachments/writeAttachmentToFile.d.ts +15 -0
  118. package/dist/node/attachments/writeAttachmentToFile.d.ts.map +1 -0
  119. package/dist/node/attachments/writeAttachmentToFile.js +73 -0
  120. package/dist/node/attachments/writeAttachmentToFile.js.map +1 -0
  121. package/dist/node/cache/FileSystemLocalCacheStore.d.ts +17 -0
  122. package/dist/node/cache/FileSystemLocalCacheStore.d.ts.map +1 -0
  123. package/dist/node/cache/FileSystemLocalCacheStore.js +128 -0
  124. package/dist/node/cache/FileSystemLocalCacheStore.js.map +1 -0
  125. package/dist/node/cli/change-identity-password.d.ts +7 -0
  126. package/dist/node/cli/change-identity-password.d.ts.map +1 -0
  127. package/dist/node/cli/change-identity-password.js +67 -0
  128. package/dist/node/cli/change-identity-password.js.map +1 -0
  129. package/dist/node/cli/cli-utils.d.ts +16 -0
  130. package/dist/node/cli/cli-utils.d.ts.map +1 -0
  131. package/dist/node/cli/cli-utils.js +113 -0
  132. package/dist/node/cli/cli-utils.js.map +1 -0
  133. package/dist/node/cli/identity-export-public.d.ts +4 -0
  134. package/dist/node/cli/identity-export-public.d.ts.map +1 -0
  135. package/dist/node/cli/identity-export-public.js +55 -0
  136. package/dist/node/cli/identity-export-public.js.map +1 -0
  137. package/dist/node/cli/identity-info.d.ts +4 -0
  138. package/dist/node/cli/identity-info.d.ts.map +1 -0
  139. package/dist/node/cli/identity-info.js +57 -0
  140. package/dist/node/cli/identity-info.js.map +1 -0
  141. package/dist/node/index.d.ts +1 -0
  142. package/dist/node/index.d.ts.map +1 -1
  143. package/dist/node/index.js +4 -1
  144. package/dist/node/index.js.map +1 -1
  145. package/dist/node/server/CapabilityMatcher.d.ts +45 -0
  146. package/dist/node/server/CapabilityMatcher.d.ts.map +1 -0
  147. package/dist/node/server/CapabilityMatcher.js +117 -0
  148. package/dist/node/server/CapabilityMatcher.js.map +1 -0
  149. package/dist/node/server/MindooDBServer.d.ts +87 -0
  150. package/dist/node/server/MindooDBServer.d.ts.map +1 -0
  151. package/dist/node/server/MindooDBServer.js +1040 -0
  152. package/dist/node/server/MindooDBServer.js.map +1 -0
  153. package/dist/node/server/ServerSync.d.ts +41 -0
  154. package/dist/node/server/ServerSync.d.ts.map +1 -0
  155. package/dist/node/server/ServerSync.js +187 -0
  156. package/dist/node/server/ServerSync.js.map +1 -0
  157. package/dist/node/server/StoreFactory.d.ts +45 -0
  158. package/dist/node/server/StoreFactory.d.ts.map +1 -0
  159. package/dist/node/server/StoreFactory.js +89 -0
  160. package/dist/node/server/StoreFactory.js.map +1 -0
  161. package/dist/node/server/SystemAdminAuth.d.ts +65 -0
  162. package/dist/node/server/SystemAdminAuth.d.ts.map +1 -0
  163. package/dist/node/server/SystemAdminAuth.js +200 -0
  164. package/dist/node/server/SystemAdminAuth.js.map +1 -0
  165. package/dist/node/server/SystemIpAllowlist.d.ts +21 -0
  166. package/dist/node/server/SystemIpAllowlist.d.ts.map +1 -0
  167. package/dist/node/server/SystemIpAllowlist.js +210 -0
  168. package/dist/node/server/SystemIpAllowlist.js.map +1 -0
  169. package/dist/node/server/TenantManager.d.ts +85 -0
  170. package/dist/node/server/TenantManager.d.ts.map +1 -0
  171. package/dist/node/server/TenantManager.js +493 -0
  172. package/dist/node/server/TenantManager.js.map +1 -0
  173. package/dist/node/server/add-to-network.d.ts +20 -0
  174. package/dist/node/server/add-to-network.d.ts.map +1 -0
  175. package/dist/node/server/add-to-network.js +275 -0
  176. package/dist/node/server/add-to-network.js.map +1 -0
  177. package/dist/node/server/config.d.ts +51 -0
  178. package/dist/node/server/config.d.ts.map +1 -0
  179. package/dist/node/server/config.js +218 -0
  180. package/dist/node/server/config.js.map +1 -0
  181. package/dist/node/server/resolveServerPassword.d.ts +7 -0
  182. package/dist/node/server/resolveServerPassword.d.ts.map +1 -0
  183. package/dist/node/server/resolveServerPassword.js +25 -0
  184. package/dist/node/server/resolveServerPassword.js.map +1 -0
  185. package/dist/node/server/server.d.ts +22 -0
  186. package/dist/node/server/server.d.ts.map +1 -0
  187. package/dist/node/server/server.js +225 -0
  188. package/dist/node/server/server.js.map +1 -0
  189. package/dist/node/server/serverinit.d.ts +21 -0
  190. package/dist/node/server/serverinit.d.ts.map +1 -0
  191. package/dist/node/server/serverinit.js +317 -0
  192. package/dist/node/server/serverinit.js.map +1 -0
  193. package/dist/node/server/types.d.ts +162 -0
  194. package/dist/node/server/types.d.ts.map +1 -0
  195. package/dist/node/server/types.js +24 -0
  196. package/dist/node/server/types.js.map +1 -0
  197. package/dist/node/server/validation.d.ts +47 -0
  198. package/dist/node/server/validation.d.ts.map +1 -0
  199. package/dist/node/server/validation.js +114 -0
  200. package/dist/node/server/validation.js.map +1 -0
  201. package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts +48 -0
  202. package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts.map +1 -0
  203. package/dist/reactnative/cache/MMKVLocalCacheStore.js +113 -0
  204. package/dist/reactnative/cache/MMKVLocalCacheStore.js.map +1 -0
  205. package/dist/reactnative/index.d.ts +1 -0
  206. package/dist/reactnative/index.d.ts.map +1 -1
  207. package/dist/reactnative/index.js +4 -1
  208. package/dist/reactnative/index.js.map +1 -1
  209. package/package.json +14 -3
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeDocumentMaterializationPlan = computeDocumentMaterializationPlan;
4
+ exports.computeBatchMaterializationPlan = computeBatchMaterializationPlan;
5
+ /**
6
+ * Shared, metadata-only planner for causal document materialization.
7
+ *
8
+ * Why this exists:
9
+ * - local and remote stores need the same causal replay behavior
10
+ * - planner must work without decrypting payloads
11
+ * - replay order must be deterministic across runs
12
+ *
13
+ * Core invariant:
14
+ * - `entryIdsToApply` contains exactly the replay entries needed to reconstruct
15
+ * latest state that are not already covered by the selected snapshot.
16
+ */
17
+ const DOC_REPLAY_TYPES = new Set(["doc_create", "doc_change", "doc_delete"]);
18
+ /**
19
+ * Returns true for entry types that can influence Automerge latest state replay.
20
+ */
21
+ function isReplayEntry(meta) {
22
+ return DOC_REPLAY_TYPES.has(meta.entryType);
23
+ }
24
+ /**
25
+ * Computes latest-state heads and all replay entries causally reachable from them.
26
+ *
27
+ * `latestReachable` intentionally excludes unrelated historical branches that are
28
+ * not ancestors of current heads, so coverage/replay decisions only operate on
29
+ * data needed for latest state materialization.
30
+ */
31
+ function buildLatestStateReachability(replayEntries) {
32
+ const byId = new Map();
33
+ const referenced = new Set();
34
+ for (const entry of replayEntries) {
35
+ byId.set(entry.id, entry);
36
+ }
37
+ for (const entry of replayEntries) {
38
+ for (const depId of entry.dependencyIds) {
39
+ if (byId.has(depId)) {
40
+ referenced.add(depId);
41
+ }
42
+ }
43
+ }
44
+ // Heads are entries that are not referenced as dependencies by any other replay entry.
45
+ const latestHeads = replayEntries
46
+ .filter((e) => !referenced.has(e.id))
47
+ .map((e) => e.id);
48
+ const latestReachable = new Set();
49
+ const stack = [...latestHeads];
50
+ while (stack.length > 0) {
51
+ const id = stack.pop();
52
+ if (latestReachable.has(id)) {
53
+ continue;
54
+ }
55
+ latestReachable.add(id);
56
+ const entry = byId.get(id);
57
+ if (!entry) {
58
+ continue;
59
+ }
60
+ for (const depId of entry.dependencyIds) {
61
+ if (byId.has(depId) && !latestReachable.has(depId)) {
62
+ stack.push(depId);
63
+ }
64
+ }
65
+ }
66
+ return { latestHeads, latestReachable };
67
+ }
68
+ /**
69
+ * Computes replay entries covered by the given snapshot.
70
+ *
71
+ * Coverage roots are chosen in this order:
72
+ * 1) explicit `snapshotHeadEntryIds` (preferred; most accurate)
73
+ * 2) snapshot `dependencyIds` (compatibility fallback)
74
+ */
75
+ function coveredBySnapshot(snapshot, replayById) {
76
+ if (!snapshot) {
77
+ return new Set();
78
+ }
79
+ const roots = snapshot.snapshotHeadEntryIds && snapshot.snapshotHeadEntryIds.length > 0
80
+ ? snapshot.snapshotHeadEntryIds
81
+ : snapshot.dependencyIds;
82
+ const covered = new Set();
83
+ const stack = [...roots];
84
+ while (stack.length > 0) {
85
+ const id = stack.pop();
86
+ if (covered.has(id)) {
87
+ continue;
88
+ }
89
+ const entry = replayById.get(id);
90
+ if (!entry) {
91
+ continue;
92
+ }
93
+ covered.add(id);
94
+ for (const depId of entry.dependencyIds) {
95
+ if (!covered.has(depId)) {
96
+ stack.push(depId);
97
+ }
98
+ }
99
+ }
100
+ return covered;
101
+ }
102
+ /**
103
+ * Produces a stable, dependency-first ordering of replay entries using
104
+ * Kahn's algorithm for topological sorting.
105
+ *
106
+ * The caller passes a set of entry IDs that need to be replayed (the
107
+ * "uncovered" set from {@link computeDocumentMaterializationPlan}) and the
108
+ * full metadata map so the function can inspect each entry's
109
+ * `dependencyIds`. The result is an array where every entry appears
110
+ * *after* all of its causal predecessors, which is the order
111
+ * `Automerge.applyChanges` requires to apply changes correctly.
112
+ *
113
+ * **Why Kahn's algorithm?** It processes nodes in BFS order starting from
114
+ * roots (entries with no in-set dependencies), decrementing the in-degree
115
+ * of each dependent as its predecessors are emitted. This naturally
116
+ * produces a valid topological order for any DAG.
117
+ *
118
+ * **Determinism:** When multiple entries become ready at the same time
119
+ * (in-degree drops to zero simultaneously), the queue is sorted
120
+ * lexicographically before the next dequeue. This guarantees the same
121
+ * output regardless of `Set` or `Map` iteration order, which can vary
122
+ * across JavaScript engines and process runs.
123
+ *
124
+ * **Cycle safety:** In a well-formed Automerge DAG, cycles are impossible.
125
+ * However, if corrupted metadata somehow introduces a cycle, the algorithm
126
+ * detects it (ordered.length < ids.size) and falls back to a simple
127
+ * lexicographic sort so the caller still receives a complete list rather
128
+ * than a partial one.
129
+ *
130
+ * @param ids The entry IDs to sort (typically the uncovered set).
131
+ * @param replayById Lookup map from entry ID to its metadata, used to
132
+ * read `dependencyIds` for graph edges.
133
+ * @returns Entry IDs in dependency-first order suitable for sequential
134
+ * application to an Automerge document.
135
+ */
136
+ function topologicalByDependencies(ids, replayById) {
137
+ // ── Build the in-degree and reverse-adjacency structures ──────────
138
+ // `indegree` — for each id, how many of its dependencies are also in `ids`
139
+ // `dependents` — for each id, which other ids in the set depend on it
140
+ const indegree = new Map();
141
+ const dependents = new Map();
142
+ for (const id of ids) {
143
+ indegree.set(id, 0);
144
+ dependents.set(id, []);
145
+ }
146
+ for (const id of ids) {
147
+ const entry = replayById.get(id);
148
+ if (!entry) {
149
+ continue;
150
+ }
151
+ for (const depId of entry.dependencyIds) {
152
+ if (!ids.has(depId)) {
153
+ // Dependency is outside the uncovered set (already covered by
154
+ // the snapshot or not part of the latest-state DAG) — skip it.
155
+ continue;
156
+ }
157
+ indegree.set(id, (indegree.get(id) || 0) + 1);
158
+ dependents.get(depId).push(id);
159
+ }
160
+ }
161
+ // ── Kahn's BFS ────────────────────────────────────────────────────
162
+ // Seed the queue with root entries (in-degree 0 within the set).
163
+ const queue = Array.from(ids).filter((id) => (indegree.get(id) || 0) === 0);
164
+ queue.sort();
165
+ const ordered = [];
166
+ while (queue.length > 0) {
167
+ const id = queue.shift();
168
+ ordered.push(id);
169
+ for (const dep of dependents.get(id) || []) {
170
+ const next = (indegree.get(dep) || 0) - 1;
171
+ indegree.set(dep, next);
172
+ if (next === 0) {
173
+ queue.push(dep);
174
+ }
175
+ }
176
+ // Re-sort after adding newly ready entries to maintain determinism.
177
+ queue.sort();
178
+ }
179
+ // ── Cycle fallback ────────────────────────────────────────────────
180
+ if (ordered.length !== ids.size) {
181
+ return Array.from(ids).sort();
182
+ }
183
+ return ordered;
184
+ }
185
+ /**
186
+ * Computes a causal materialization plan for one document.
187
+ *
188
+ * Given all store entries for a document, this function answers two questions:
189
+ *
190
+ * 1. **Which snapshot should we load first?**
191
+ * The planner evaluates every `doc_snapshot` entry and selects the one whose
192
+ * causal coverage overlaps the most with the entries needed for the latest
193
+ * document state. A snapshot that covers 90% of the DAG means only 10%
194
+ * of entries need to be replayed — a large win for documents with long
195
+ * histories. When two snapshots cover the same number of latest-state
196
+ * entries, the newer one (by `createdAt`) wins as a deterministic
197
+ * tie-breaker. Correctness never depends on timestamps.
198
+ *
199
+ * 2. **Which change entries must be replayed on top of that snapshot?**
200
+ * Every entry in the latest-state DAG that is *not* causally covered by
201
+ * the selected snapshot is collected and sorted in dependency-first
202
+ * (topological) order. This is the minimal set of Automerge changes
203
+ * the caller must decrypt and apply to reach the current document state.
204
+ *
205
+ * Snapshot selection strategy:
206
+ * - Choose the snapshot with maximal overlap against `latestReachable`.
207
+ * - Break equal-coverage ties by newer `createdAt` (optimization only).
208
+ * - If no snapshots exist, all replay entries are returned (full rebuild).
209
+ *
210
+ * Attachment entries (`attachment_chunk`) are never included — the planner
211
+ * operates exclusively on `doc_create`, `doc_change`, and `doc_delete`
212
+ * entries (the types tracked by `DOC_REPLAY_TYPES`).
213
+ *
214
+ * @param docId The document to plan for.
215
+ * @param allEntriesForDoc Every entry metadata record for this document,
216
+ * including snapshots and attachments (attachments
217
+ * are filtered out internally).
218
+ * @param options Pass `{ includeDiagnostics: true }` to populate the
219
+ * `diagnostics` field with head IDs and coverage counts.
220
+ * @returns A plan containing the snapshot to load (if any) and the ordered
221
+ * list of entry IDs to apply afterwards.
222
+ */
223
+ function computeDocumentMaterializationPlan(docId, allEntriesForDoc, options) {
224
+ // ── Step 1: Partition entries ──────────────────────────────────────
225
+ // Replay entries are the doc-lifecycle entries (create/change/delete) that
226
+ // form the Automerge DAG. Snapshots are evaluated separately as candidate
227
+ // starting points.
228
+ const replayEntries = allEntriesForDoc.filter(isReplayEntry);
229
+ const replayById = new Map(replayEntries.map((e) => [e.id, e]));
230
+ const snapshots = allEntriesForDoc.filter((e) => e.entryType === "doc_snapshot");
231
+ // ── Step 2: Handle empty replay set ─────────────────────────────────
232
+ // After a dense sync the local store may contain only a snapshot with no
233
+ // individual change entries. In that case select the newest snapshot so
234
+ // the caller can still load the document state.
235
+ if (replayEntries.length === 0) {
236
+ if (snapshots.length > 0) {
237
+ const best = snapshots.reduce((a, b) => (b.createdAt > a.createdAt ? b : a));
238
+ return {
239
+ docId,
240
+ snapshotEntryId: best.id,
241
+ entryIdsToApply: [],
242
+ diagnostics: options?.includeDiagnostics
243
+ ? { headEntryIds: [], coveredLatestEntryCount: 0, uncoveredLatestEntryCount: 0 }
244
+ : undefined,
245
+ };
246
+ }
247
+ return {
248
+ docId,
249
+ snapshotEntryId: null,
250
+ entryIdsToApply: [],
251
+ diagnostics: options?.includeDiagnostics
252
+ ? { headEntryIds: [], coveredLatestEntryCount: 0, uncoveredLatestEntryCount: 0 }
253
+ : undefined,
254
+ };
255
+ }
256
+ // ── Step 3: Build latest-state reachability ───────────────────────
257
+ // Identify the DAG heads (entries with no dependents) and walk backward
258
+ // to collect every entry causally needed for the current document state.
259
+ const { latestHeads, latestReachable } = buildLatestStateReachability(replayEntries);
260
+ // ── Step 4: Score each snapshot by how many latest-state entries it covers
261
+ let bestSnapshot = null;
262
+ let bestCoveredCount = -1;
263
+ for (const snapshot of snapshots) {
264
+ const covered = coveredBySnapshot(snapshot, replayById);
265
+ let coveredLatest = 0;
266
+ for (const id of latestReachable) {
267
+ if (covered.has(id)) {
268
+ coveredLatest++;
269
+ }
270
+ }
271
+ if (coveredLatest > bestCoveredCount ||
272
+ (coveredLatest === bestCoveredCount && bestSnapshot && snapshot.createdAt > bestSnapshot.createdAt)) {
273
+ bestSnapshot = snapshot;
274
+ bestCoveredCount = coveredLatest;
275
+ }
276
+ if (!bestSnapshot) {
277
+ bestSnapshot = snapshot;
278
+ bestCoveredCount = coveredLatest;
279
+ }
280
+ }
281
+ // ── Step 5: Compute the uncovered set ─────────────────────────────
282
+ // These are the entries that the selected snapshot does NOT already include.
283
+ // If no snapshot was selected, the entire latestReachable set is uncovered.
284
+ const covered = coveredBySnapshot(bestSnapshot, replayById);
285
+ const uncovered = new Set();
286
+ for (const id of latestReachable) {
287
+ if (!covered.has(id)) {
288
+ uncovered.add(id);
289
+ }
290
+ }
291
+ // ── Step 6: Sort uncovered entries in dependency-first order ──────
292
+ // This guarantees that Automerge.applyChanges sees each change only after
293
+ // all of its causal predecessors have already been applied.
294
+ const entryIdsToApply = topologicalByDependencies(uncovered, replayById);
295
+ return {
296
+ docId,
297
+ snapshotEntryId: bestSnapshot ? bestSnapshot.id : null,
298
+ entryIdsToApply,
299
+ diagnostics: options?.includeDiagnostics
300
+ ? {
301
+ headEntryIds: latestHeads,
302
+ coveredLatestEntryCount: bestCoveredCount < 0 ? 0 : bestCoveredCount,
303
+ uncoveredLatestEntryCount: uncovered.size,
304
+ }
305
+ : undefined,
306
+ };
307
+ }
308
+ /**
309
+ * Computes plans for many documents in one metadata pass.
310
+ *
311
+ * Batch planning is important for networked stores to reduce request/response
312
+ * chattiness during startup and dense sync operations.
313
+ */
314
+ function computeBatchMaterializationPlan(allEntries, docIds, options) {
315
+ const byDoc = new Map();
316
+ for (const entry of allEntries) {
317
+ if (!byDoc.has(entry.docId)) {
318
+ byDoc.set(entry.docId, []);
319
+ }
320
+ byDoc.get(entry.docId).push(entry);
321
+ }
322
+ const plans = docIds.map((docId) => computeDocumentMaterializationPlan(docId, byDoc.get(docId) || [], options));
323
+ return { plans };
324
+ }
325
+ //# sourceMappingURL=MaterializationPlanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaterializationPlanner.js","sourceRoot":"","sources":["../../../src/core/appendonlystores/MaterializationPlanner.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { StoreEntry, StoreEntryMetadata, StoreEntryType, StoreScanCursor, StoreScanFilters, StoreScanResult, StoreIdBloomSummary, StoreCompactionStatus } from "../../types";
2
+ import type { DocumentMaterializationBatchPlan, DocumentMaterializationPlan, MaterializationPlanOptions } from "../types";
2
3
  import type { NetworkEncryptedEntry, AuthResult, NetworkSyncCapabilities } from "./types";
3
4
  /**
4
5
  * Abstract interface for network communication in MindooDB sync.
@@ -19,6 +20,12 @@ import type { NetworkEncryptedEntry, AuthResult, NetworkSyncCapabilities } from
19
20
  * - Entry payloads are RSA-encrypted with recipient's public key
20
21
  */
21
22
  export interface NetworkTransport {
23
+ /**
24
+ * Optional stable identifier for this transport (e.g. the server URL).
25
+ * Used for local cache scoping so the same DB opened against different
26
+ * servers produces different cache entries.
27
+ */
28
+ getIdentity?(): string;
22
29
  /**
23
30
  * Request a challenge string for authentication.
24
31
  *
@@ -105,6 +112,14 @@ export interface NetworkTransport {
105
112
  * Optional compaction observability for remote store monitoring.
106
113
  */
107
114
  getCompactionStatus?(token: string): Promise<StoreCompactionStatus>;
115
+ /**
116
+ * Compute a causal materialization plan for one document on the remote store.
117
+ */
118
+ planDocumentMaterialization?(token: string, docId: string, options?: MaterializationPlanOptions): Promise<DocumentMaterializationPlan>;
119
+ /**
120
+ * Compute causal materialization plans for multiple documents on the remote store.
121
+ */
122
+ planDocumentMaterializationBatch?(token: string, docIds: string[], options?: MaterializationPlanOptions): Promise<DocumentMaterializationBatchPlan>;
108
123
  /**
109
124
  * Get entries from the remote store.
110
125
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkTransport.d.ts","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/NetworkTransport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NetworkTransport.d.ts","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/NetworkTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,gCAAgC,EAChC,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAE1F;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,WAAW,CAAC,IAAI,MAAM,CAAC;IAEvB;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5E;;;OAGG;IACH,eAAe,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAElE;;;;;;;;;;;OAWG;IACH,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEjC;;;;;;;;;;;OAWG;IACH,oBAAoB,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEjC;;;;;;;;;;;;OAYG;IACH,WAAW,CACT,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,EACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAC/B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEjC;;;;;OAKG;IACH,gBAAgB,CAAC,CACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAAC;IAE5B;;OAEG;IACH,iBAAiB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEhE;;OAEG;IACH,mBAAmB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEpE;;OAEG;IACH,2BAA2B,CAAC,CAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAExC;;OAEG;IACH,gCAAgC,CAAC,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAE7C;;;;;;;;;;;;OAYG;IACH,UAAU,CACR,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAEpC;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5C;;;;;;;;;;;;;;;OAeG;IACH,mBAAmB,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -115,6 +115,8 @@ export interface NetworkSyncCapabilities {
115
115
  supportsCursorScan: boolean;
116
116
  supportsIdBloomSummary: boolean;
117
117
  supportsCompactionStatus: boolean;
118
+ supportsMaterializationPlanning: boolean;
119
+ supportsBatchMaterializationPlanning: boolean;
118
120
  }
119
121
  /**
120
122
  * Network transport error types for error handling.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;;;;;;;;;OAUG;IACH,mBAAmB,EAAE,UAAU,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,oBAAY,gBAAgB;IAC1B,kCAAkC;IAClC,aAAa,kBAAkB;IAC/B,4BAA4B;IAC5B,YAAY,iBAAiB;IAC7B,oCAAoC;IACpC,iBAAiB,sBAAsB;IACvC,wCAAwC;IACxC,iBAAiB,sBAAsB;IACvC,kCAAkC;IAClC,aAAa,kBAAkB;IAC/B,wBAAwB;IACxB,YAAY,iBAAiB;IAC7B,kCAAkC;IAClC,cAAc,mBAAmB;CAClC;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;aAEnB,IAAI,EAAE,gBAAgB;gBAAtB,IAAI,EAAE,gBAAgB,EACtC,OAAO,EAAE,MAAM;CAKlB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;;;;;;;;;OAUG;IACH,mBAAmB,EAAE,UAAU,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,wBAAwB,EAAE,OAAO,CAAC;IAClC,+BAA+B,EAAE,OAAO,CAAC;IACzC,oCAAoC,EAAE,OAAO,CAAC;CAC/C;AAED;;GAEG;AACH,oBAAY,gBAAgB;IAC1B,kCAAkC;IAClC,aAAa,kBAAkB;IAC/B,4BAA4B;IAC5B,YAAY,iBAAiB;IAC7B,oCAAoC;IACpC,iBAAiB,sBAAsB;IACvC,wCAAwC;IACxC,iBAAiB,sBAAsB;IACvC,kCAAkC;IAClC,aAAa,kBAAkB;IAC/B,wBAAwB;IACxB,YAAY,iBAAiB;IAC7B,kCAAkC;IAClC,cAAc,mBAAmB;CAClC;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;aAEnB,IAAI,EAAE,gBAAgB;gBAAtB,IAAI,EAAE,gBAAgB,EACtC,OAAO,EAAE,MAAM;CAKlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/types.ts"],"names":[],"mappings":";;;AAwIA;;GAEG;AACH,IAAY,gBAeX;AAfD,WAAY,gBAAgB;IAC1B,kCAAkC;IAClC,mDAA+B,CAAA;IAC/B,4BAA4B;IAC5B,iDAA6B,CAAA;IAC7B,oCAAoC;IACpC,2DAAuC,CAAA;IACvC,wCAAwC;IACxC,2DAAuC,CAAA;IACvC,kCAAkC;IAClC,mDAA+B,CAAA;IAC/B,wBAAwB;IACxB,iDAA6B,CAAA;IAC7B,kCAAkC;IAClC,qDAAiC,CAAA;AACnC,CAAC,EAfW,gBAAgB,gCAAhB,gBAAgB,QAe3B;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,KAAK;IACrC,YACkB,IAAsB,EACtC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAkB;QAItC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/types.ts"],"names":[],"mappings":";;;AA0IA;;GAEG;AACH,IAAY,gBAeX;AAfD,WAAY,gBAAgB;IAC1B,kCAAkC;IAClC,mDAA+B,CAAA;IAC/B,4BAA4B;IAC5B,iDAA6B,CAAA;IAC7B,oCAAoC;IACpC,2DAAuC,CAAA;IACvC,wCAAwC;IACxC,2DAAuC,CAAA;IACvC,kCAAkC;IAClC,mDAA+B,CAAA;IAC/B,wBAAwB;IACxB,iDAA6B,CAAA;IAC7B,kCAAkC;IAClC,qDAAiC,CAAA;AACnC,CAAC,EAfW,gBAAgB,gCAAhB,gBAAgB,QAe3B;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,KAAK;IACrC,YACkB,IAAsB,EACtC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAkB;QAItC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC"}
@@ -104,6 +104,66 @@ export interface StoreIdBloomSummary {
104
104
  salt: string;
105
105
  bitsetBase64: string;
106
106
  }
107
+ /**
108
+ * Options for causal document materialization planning.
109
+ * The planner computes which snapshot (if any) should be used and which
110
+ * change entries still need to be applied to reconstruct the latest state.
111
+ */
112
+ export interface MaterializationPlanOptions {
113
+ /**
114
+ * If true, include planner diagnostics to aid debugging and tuning.
115
+ */
116
+ includeDiagnostics?: boolean;
117
+ }
118
+ /**
119
+ * Debug and observability details for materialization planning.
120
+ */
121
+ export interface MaterializationPlanDiagnostics {
122
+ /**
123
+ * Current tip entries for the document (entries with no descendants in the
124
+ * doc graph among change/create/delete entries).
125
+ */
126
+ headEntryIds: string[];
127
+ /**
128
+ * Number of latest-state entries causally covered by the selected snapshot.
129
+ */
130
+ coveredLatestEntryCount: number;
131
+ /**
132
+ * Number of latest-state entries not covered by the selected snapshot.
133
+ */
134
+ uncoveredLatestEntryCount: number;
135
+ }
136
+ /**
137
+ * Store-level causal replay plan for one document.
138
+ */
139
+ export interface DocumentMaterializationPlan {
140
+ /**
141
+ * Document ID this plan is for.
142
+ */
143
+ docId: string;
144
+ /**
145
+ * Snapshot entry to load first (if present).
146
+ */
147
+ snapshotEntryId: string | null;
148
+ /**
149
+ * Change entry IDs to apply after the snapshot (or from empty doc if no snapshot).
150
+ * The order is dependency-first (oldest first).
151
+ */
152
+ entryIdsToApply: string[];
153
+ /**
154
+ * Optional debug details.
155
+ */
156
+ diagnostics?: MaterializationPlanDiagnostics;
157
+ }
158
+ /**
159
+ * Batched materialization planning result.
160
+ */
161
+ export interface DocumentMaterializationBatchPlan {
162
+ /**
163
+ * Per-document plans.
164
+ */
165
+ plans: DocumentMaterializationPlan[];
166
+ }
107
167
  /**
108
168
  * Result of creating stores for a database.
109
169
  * Contains the document store and an optional separate attachment store.
@@ -240,6 +300,17 @@ export interface ContentAddressedStore {
240
300
  * Callers must still perform exact reconciliation for correctness.
241
301
  */
242
302
  getIdBloomSummary?(): Promise<StoreIdBloomSummary>;
303
+ /**
304
+ * Plan causal materialization for a single document.
305
+ * This allows callers to fetch only required entries instead of scanning/applying
306
+ * full history every time.
307
+ */
308
+ planDocumentMaterialization(docId: string, options?: MaterializationPlanOptions): Promise<DocumentMaterializationPlan>;
309
+ /**
310
+ * Plan causal materialization for multiple documents in one call.
311
+ * Batch planning is important for high-latency network stores to reduce round trips.
312
+ */
313
+ planDocumentMaterializationBatch(docIds: string[], options?: MaterializationPlanOptions): Promise<DocumentMaterializationBatchPlan>;
243
314
  /**
244
315
  * Resolve the dependency chain starting from an entry ID.
245
316
  * Returns IDs in dependency order, traversing backward through dependencyIds.
@@ -289,5 +360,17 @@ export interface ContentAddressedStore {
289
360
  * Optional status API for metadata-segment compaction observability.
290
361
  */
291
362
  getCompactionStatus?(): Promise<StoreCompactionStatus>;
363
+ /**
364
+ * Optional unique fingerprint for local cache scoping.
365
+ * Must be stable across restarts and unique per store backend/location.
366
+ *
367
+ * Examples:
368
+ * - On-disk store: "disk:/data/myapp/contacts"
369
+ * - IndexedDB store: "idb:default/contacts"
370
+ * - Network store: "net:https://sync.example.com/contacts"
371
+ *
372
+ * If not implemented, BaseMindooDB falls back to getId().
373
+ */
374
+ getCacheIdentity?(): string;
292
375
  }
293
376
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/appendonlystores/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/appendonlystores/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { LocalCacheStore } from "./LocalCacheStore";
2
+ import { Logger } from "../logging";
3
+ /**
4
+ * Interface that cacheable consumers (BaseMindooDB, VirtualView) implement
5
+ * so the CacheManager can flush their dirty state.
6
+ */
7
+ export interface ICacheable {
8
+ /**
9
+ * A unique key identifying this cacheable in the cache store.
10
+ * For BaseMindooDB: tenantId + "/" + store.getCacheIdentity()
11
+ * For VirtualView: viewId + "/" + version
12
+ */
13
+ getCachePrefix(): string;
14
+ /**
15
+ * Export the current dirty state to the cache store.
16
+ * Called by CacheManager during flush.
17
+ *
18
+ * @param store The cache store to write to
19
+ * @returns The number of entries written
20
+ */
21
+ flushToCache(store: LocalCacheStore): Promise<number>;
22
+ /**
23
+ * Clear the dirty tracking state after a successful flush.
24
+ */
25
+ clearDirty(): void;
26
+ /**
27
+ * Whether this cacheable has any dirty state to flush.
28
+ */
29
+ hasDirtyState(): boolean;
30
+ }
31
+ export interface CacheManagerOptions {
32
+ /** Flush interval in milliseconds. Default: 5000 (5s) */
33
+ flushIntervalMs?: number;
34
+ }
35
+ /**
36
+ * Coordinates periodic cache persistence for all registered cacheables
37
+ * (databases, virtual views) within a tenant.
38
+ *
39
+ * Tracks dirty state and flushes periodically or on demand.
40
+ */
41
+ export declare class CacheManager {
42
+ private store;
43
+ private cacheables;
44
+ private flushIntervalMs;
45
+ private timer;
46
+ private flushInProgress;
47
+ private disposed;
48
+ private logger;
49
+ constructor(store: LocalCacheStore, options?: CacheManagerOptions, logger?: Logger);
50
+ getStore(): LocalCacheStore;
51
+ /**
52
+ * Register a cacheable consumer. It will be included in periodic flushes.
53
+ */
54
+ register(cacheable: ICacheable): void;
55
+ /**
56
+ * Deregister a cacheable consumer (e.g. on db.close()).
57
+ * Triggers an immediate flush for this cacheable before removal.
58
+ */
59
+ deregister(cacheable: ICacheable): Promise<void>;
60
+ /**
61
+ * Notify the CacheManager that something changed.
62
+ * Schedules a flush if one is not already pending.
63
+ */
64
+ markDirty(): void;
65
+ private scheduleFlush;
66
+ /**
67
+ * Immediately flush all dirty cacheables.
68
+ */
69
+ flush(): Promise<void>;
70
+ /**
71
+ * Flush all pending state and stop the periodic timer.
72
+ */
73
+ dispose(): Promise<void>;
74
+ }
75
+ //# sourceMappingURL=CacheManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../../src/core/cache/CacheManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAoC,MAAM,YAAY,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,cAAc,IAAI,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD;;OAEG;IACH,UAAU,IAAI,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,MAAM;IAMlF,QAAQ,IAAI,eAAe;IAI3B;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IAIrC;;;OAGG;IACG,UAAU,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD;;;OAGG;IACH,SAAS,IAAI,IAAI;IAKjB,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ/B"}