@opendatalabs/personal-server-ts-core 1.34.2 → 1.35.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 (414) hide show
  1. package/dist/additions/durable.d.ts +32 -2
  2. package/dist/additions/durable.d.ts.map +1 -1
  3. package/dist/additions/durable.js +237 -88
  4. package/dist/additions/durable.js.map +1 -1
  5. package/dist/additions/version-inventory.d.ts +4 -0
  6. package/dist/additions/version-inventory.d.ts.map +1 -1
  7. package/dist/additions/version-inventory.js +11 -1
  8. package/dist/additions/version-inventory.js.map +1 -1
  9. package/dist/api/index.d.ts +18 -1
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/api/index.js +172 -4
  12. package/dist/api/index.js.map +1 -1
  13. package/dist/api/oura-collection-requirements.d.ts +16 -0
  14. package/dist/api/oura-collection-requirements.d.ts.map +1 -0
  15. package/dist/api/oura-collection-requirements.js +70 -0
  16. package/dist/api/oura-collection-requirements.js.map +1 -0
  17. package/dist/api/scope-upload-batches.d.ts +18 -0
  18. package/dist/api/scope-upload-batches.d.ts.map +1 -0
  19. package/dist/api/scope-upload-batches.js +71 -0
  20. package/dist/api/scope-upload-batches.js.map +1 -0
  21. package/dist/api/scope-uploads.d.ts +112 -0
  22. package/dist/api/scope-uploads.d.ts.map +1 -0
  23. package/dist/api/scope-uploads.js +369 -0
  24. package/dist/api/scope-uploads.js.map +1 -0
  25. package/dist/client.d.ts +70 -0
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +1 -0
  28. package/dist/client.js.map +1 -1
  29. package/dist/contracts/data.d.ts +8 -0
  30. package/dist/contracts/data.d.ts.map +1 -1
  31. package/dist/contracts/data.js +31 -1
  32. package/dist/contracts/data.js.map +1 -1
  33. package/dist/contracts/grants.d.ts.map +1 -1
  34. package/dist/contracts/grants.js +3 -0
  35. package/dist/contracts/grants.js.map +1 -1
  36. package/dist/contracts/index.d.ts +3 -1
  37. package/dist/contracts/index.d.ts.map +1 -1
  38. package/dist/contracts/index.js +3 -1
  39. package/dist/contracts/index.js.map +1 -1
  40. package/dist/contracts/oura-collection-requirements.d.ts +17 -0
  41. package/dist/contracts/oura-collection-requirements.d.ts.map +1 -0
  42. package/dist/contracts/oura-collection-requirements.js +49 -0
  43. package/dist/contracts/oura-collection-requirements.js.map +1 -0
  44. package/dist/legacy-projection/bindings.d.ts +1 -7
  45. package/dist/legacy-projection/bindings.d.ts.map +1 -1
  46. package/dist/legacy-projection/bindings.js +162 -28
  47. package/dist/legacy-projection/bindings.js.map +1 -1
  48. package/dist/legacy-projection/index.d.ts +6 -5
  49. package/dist/legacy-projection/index.d.ts.map +1 -1
  50. package/dist/legacy-projection/index.js +9 -21
  51. package/dist/legacy-projection/index.js.map +1 -1
  52. package/dist/legacy-projection/oura-browser-bindings.d.ts +2 -0
  53. package/dist/legacy-projection/oura-browser-bindings.d.ts.map +1 -1
  54. package/dist/legacy-projection/oura-browser-bindings.js +2 -0
  55. package/dist/legacy-projection/oura-browser-bindings.js.map +1 -1
  56. package/dist/legacy-projection/strava-browser-bindings.d.ts +3 -0
  57. package/dist/legacy-projection/strava-browser-bindings.d.ts.map +1 -0
  58. package/dist/legacy-projection/strava-browser-bindings.js +32 -0
  59. package/dist/legacy-projection/strava-browser-bindings.js.map +1 -0
  60. package/dist/legacy-projection/types.d.ts +44 -12
  61. package/dist/legacy-projection/types.d.ts.map +1 -1
  62. package/dist/mcp/connection-api.d.ts +11 -1
  63. package/dist/mcp/connection-api.d.ts.map +1 -1
  64. package/dist/mcp/connection-api.js +94 -9
  65. package/dist/mcp/connection-api.js.map +1 -1
  66. package/dist/mcp/index.d.ts +1 -0
  67. package/dist/mcp/index.d.ts.map +1 -1
  68. package/dist/mcp/index.js +1 -0
  69. package/dist/mcp/index.js.map +1 -1
  70. package/dist/mcp/server.d.ts +9 -0
  71. package/dist/mcp/server.d.ts.map +1 -1
  72. package/dist/mcp/server.js +19 -6
  73. package/dist/mcp/server.js.map +1 -1
  74. package/dist/mcp/store.d.ts +10 -1
  75. package/dist/mcp/store.d.ts.map +1 -1
  76. package/dist/mcp/store.js +51 -0
  77. package/dist/mcp/store.js.map +1 -1
  78. package/dist/mcp/tools.d.ts +52 -2
  79. package/dist/mcp/tools.d.ts.map +1 -1
  80. package/dist/mcp/tools.js +395 -11
  81. package/dist/mcp/tools.js.map +1 -1
  82. package/dist/mcp/types.d.ts +36 -2
  83. package/dist/mcp/types.d.ts.map +1 -1
  84. package/dist/mcp/types.js +12 -0
  85. package/dist/mcp/types.js.map +1 -1
  86. package/dist/mcp/write-client.d.ts +81 -0
  87. package/dist/mcp/write-client.d.ts.map +1 -0
  88. package/dist/mcp/write-client.js +140 -0
  89. package/dist/mcp/write-client.js.map +1 -0
  90. package/dist/oura/history-policy.d.ts +12 -0
  91. package/dist/oura/history-policy.d.ts.map +1 -0
  92. package/dist/oura/history-policy.js +54 -0
  93. package/dist/oura/history-policy.js.map +1 -0
  94. package/dist/oura/index.d.ts +51 -0
  95. package/dist/oura/index.d.ts.map +1 -0
  96. package/dist/oura/index.js +315 -0
  97. package/dist/oura/index.js.map +1 -0
  98. package/dist/pdpp/approval.d.ts +1 -1
  99. package/dist/pdpp/approval.d.ts.map +1 -1
  100. package/dist/pdpp/approval.js +29 -10
  101. package/dist/pdpp/approval.js.map +1 -1
  102. package/dist/pdpp/declaration-limits.d.ts +7 -0
  103. package/dist/pdpp/declaration-limits.d.ts.map +1 -0
  104. package/dist/pdpp/declaration-limits.js +7 -0
  105. package/dist/pdpp/declaration-limits.js.map +1 -0
  106. package/dist/pdpp/declaration.d.ts +2 -1
  107. package/dist/pdpp/declaration.d.ts.map +1 -1
  108. package/dist/pdpp/declaration.js +2 -1
  109. package/dist/pdpp/declaration.js.map +1 -1
  110. package/dist/pdpp/index.d.ts +3 -2
  111. package/dist/pdpp/index.d.ts.map +1 -1
  112. package/dist/pdpp/index.js +3 -2
  113. package/dist/pdpp/index.js.map +1 -1
  114. package/dist/pdpp/issuance.d.ts.map +1 -1
  115. package/dist/pdpp/issuance.js +6 -2
  116. package/dist/pdpp/issuance.js.map +1 -1
  117. package/dist/pdpp/resolve.d.ts +12 -1
  118. package/dist/pdpp/resolve.d.ts.map +1 -1
  119. package/dist/pdpp/resolve.js +156 -58
  120. package/dist/pdpp/resolve.js.map +1 -1
  121. package/dist/pdpp/selection.d.ts +30 -1
  122. package/dist/pdpp/selection.d.ts.map +1 -1
  123. package/dist/pdpp/selection.js +77 -26
  124. package/dist/pdpp/selection.js.map +1 -1
  125. package/dist/pdpp/time.d.ts +39 -0
  126. package/dist/pdpp/time.d.ts.map +1 -0
  127. package/dist/pdpp/time.js +173 -0
  128. package/dist/pdpp/time.js.map +1 -0
  129. package/dist/pdpp/tokens.d.ts.map +1 -1
  130. package/dist/pdpp/tokens.js +4 -2
  131. package/dist/pdpp/tokens.js.map +1 -1
  132. package/dist/pdpp/types.d.ts +18 -2
  133. package/dist/pdpp/types.d.ts.map +1 -1
  134. package/dist/pdpp/types.js +7 -0
  135. package/dist/pdpp/types.js.map +1 -1
  136. package/dist/policy/reserved-scopes.d.ts +7 -0
  137. package/dist/policy/reserved-scopes.d.ts.map +1 -1
  138. package/dist/policy/reserved-scopes.js +12 -1
  139. package/dist/policy/reserved-scopes.js.map +1 -1
  140. package/dist/ports/index.d.ts +85 -1
  141. package/dist/ports/index.d.ts.map +1 -1
  142. package/dist/ports/index.js.map +1 -1
  143. package/dist/ports/pdpp-auth.d.ts +17 -27
  144. package/dist/ports/pdpp-auth.d.ts.map +1 -1
  145. package/dist/ports/pdpp-auth.js +14 -28
  146. package/dist/ports/pdpp-auth.js.map +1 -1
  147. package/dist/publication/publish.d.ts +96 -0
  148. package/dist/publication/publish.d.ts.map +1 -0
  149. package/dist/publication/publish.js +261 -0
  150. package/dist/publication/publish.js.map +1 -0
  151. package/dist/replication/completion.d.ts +20 -0
  152. package/dist/replication/completion.d.ts.map +1 -0
  153. package/dist/replication/completion.js +73 -0
  154. package/dist/replication/completion.js.map +1 -0
  155. package/dist/replication/coordinator-state.d.ts +29 -0
  156. package/dist/replication/coordinator-state.d.ts.map +1 -0
  157. package/dist/replication/coordinator-state.js +88 -0
  158. package/dist/replication/coordinator-state.js.map +1 -0
  159. package/dist/replication/coordinator-state.test-utils.d.ts +32 -0
  160. package/dist/replication/coordinator-state.test-utils.d.ts.map +1 -0
  161. package/dist/replication/coordinator-state.test-utils.js +113 -0
  162. package/dist/replication/coordinator-state.test-utils.js.map +1 -0
  163. package/dist/replication/coordinator.d.ts +264 -0
  164. package/dist/replication/coordinator.d.ts.map +1 -0
  165. package/dist/replication/coordinator.js +499 -0
  166. package/dist/replication/coordinator.js.map +1 -0
  167. package/dist/replication/copies.d.ts +126 -0
  168. package/dist/replication/copies.d.ts.map +1 -0
  169. package/dist/replication/copies.js +437 -0
  170. package/dist/replication/copies.js.map +1 -0
  171. package/dist/replication/copy-promotion.d.ts +132 -0
  172. package/dist/replication/copy-promotion.d.ts.map +1 -0
  173. package/dist/replication/copy-promotion.js +126 -0
  174. package/dist/replication/copy-promotion.js.map +1 -0
  175. package/dist/replication/door.d.ts +33 -0
  176. package/dist/replication/door.d.ts.map +1 -0
  177. package/dist/replication/door.js +10 -0
  178. package/dist/replication/door.js.map +1 -0
  179. package/dist/replication/dpv2.d.ts +141 -0
  180. package/dist/replication/dpv2.d.ts.map +1 -0
  181. package/dist/replication/dpv2.js +320 -0
  182. package/dist/replication/dpv2.js.map +1 -0
  183. package/dist/replication/effects.d.ts +68 -0
  184. package/dist/replication/effects.d.ts.map +1 -0
  185. package/dist/replication/effects.js +89 -0
  186. package/dist/replication/effects.js.map +1 -0
  187. package/dist/replication/engine.d.ts +378 -0
  188. package/dist/replication/engine.d.ts.map +1 -0
  189. package/dist/replication/engine.js +3197 -0
  190. package/dist/replication/engine.js.map +1 -0
  191. package/dist/replication/envelope.d.ts +481 -0
  192. package/dist/replication/envelope.d.ts.map +1 -0
  193. package/dist/replication/envelope.js +192 -0
  194. package/dist/replication/envelope.js.map +1 -0
  195. package/dist/replication/evidence.d.ts +118 -0
  196. package/dist/replication/evidence.d.ts.map +1 -0
  197. package/dist/replication/evidence.js +198 -0
  198. package/dist/replication/evidence.js.map +1 -0
  199. package/dist/replication/finality.d.ts +16 -0
  200. package/dist/replication/finality.d.ts.map +1 -0
  201. package/dist/replication/finality.js +11 -0
  202. package/dist/replication/finality.js.map +1 -0
  203. package/dist/replication/fixtures.d.ts +16 -0
  204. package/dist/replication/fixtures.d.ts.map +1 -0
  205. package/dist/replication/fixtures.js +47 -0
  206. package/dist/replication/fixtures.js.map +1 -0
  207. package/dist/replication/host-config.d.ts +52 -0
  208. package/dist/replication/host-config.d.ts.map +1 -0
  209. package/dist/replication/host-config.js +111 -0
  210. package/dist/replication/host-config.js.map +1 -0
  211. package/dist/replication/host-driver.d.ts +95 -0
  212. package/dist/replication/host-driver.d.ts.map +1 -0
  213. package/dist/replication/host-driver.js +202 -0
  214. package/dist/replication/host-driver.js.map +1 -0
  215. package/dist/replication/host-ports.d.ts +48 -0
  216. package/dist/replication/host-ports.d.ts.map +1 -0
  217. package/dist/replication/host-ports.js +69 -0
  218. package/dist/replication/host-ports.js.map +1 -0
  219. package/dist/replication/identity.d.ts +13 -0
  220. package/dist/replication/identity.d.ts.map +1 -0
  221. package/dist/replication/identity.js +22 -0
  222. package/dist/replication/identity.js.map +1 -0
  223. package/dist/replication/limits.d.ts +124 -0
  224. package/dist/replication/limits.d.ts.map +1 -0
  225. package/dist/replication/limits.js +182 -0
  226. package/dist/replication/limits.js.map +1 -0
  227. package/dist/replication/merge-plan.d.ts +92 -0
  228. package/dist/replication/merge-plan.d.ts.map +1 -0
  229. package/dist/replication/merge-plan.js +229 -0
  230. package/dist/replication/merge-plan.js.map +1 -0
  231. package/dist/replication/namespace.d.ts +4 -0
  232. package/dist/replication/namespace.d.ts.map +1 -0
  233. package/dist/replication/namespace.js +7 -0
  234. package/dist/replication/namespace.js.map +1 -0
  235. package/dist/replication/outcome.d.ts +178 -0
  236. package/dist/replication/outcome.d.ts.map +1 -0
  237. package/dist/replication/outcome.js +83 -0
  238. package/dist/replication/outcome.js.map +1 -0
  239. package/dist/replication/payload.d.ts +39 -0
  240. package/dist/replication/payload.d.ts.map +1 -0
  241. package/dist/replication/payload.js +137 -0
  242. package/dist/replication/payload.js.map +1 -0
  243. package/dist/replication/preparation.d.ts +42 -0
  244. package/dist/replication/preparation.d.ts.map +1 -0
  245. package/dist/replication/preparation.js +118 -0
  246. package/dist/replication/preparation.js.map +1 -0
  247. package/dist/replication/rebaseline.d.ts +33 -0
  248. package/dist/replication/rebaseline.d.ts.map +1 -0
  249. package/dist/replication/rebaseline.js +40 -0
  250. package/dist/replication/rebaseline.js.map +1 -0
  251. package/dist/replication/rebinding.d.ts +43 -0
  252. package/dist/replication/rebinding.d.ts.map +1 -0
  253. package/dist/replication/rebinding.js +52 -0
  254. package/dist/replication/rebinding.js.map +1 -0
  255. package/dist/replication/receive.d.ts +57 -0
  256. package/dist/replication/receive.d.ts.map +1 -0
  257. package/dist/replication/receive.js +114 -0
  258. package/dist/replication/receive.js.map +1 -0
  259. package/dist/replication/record-reducer.d.ts +16 -0
  260. package/dist/replication/record-reducer.d.ts.map +1 -0
  261. package/dist/replication/record-reducer.js +52 -0
  262. package/dist/replication/record-reducer.js.map +1 -0
  263. package/dist/replication/revision.d.ts +24 -0
  264. package/dist/replication/revision.d.ts.map +1 -0
  265. package/dist/replication/revision.js +35 -0
  266. package/dist/replication/revision.js.map +1 -0
  267. package/dist/replication/roster.d.ts +53 -0
  268. package/dist/replication/roster.d.ts.map +1 -0
  269. package/dist/replication/roster.js +115 -0
  270. package/dist/replication/roster.js.map +1 -0
  271. package/dist/replication/schedule.d.ts +73 -0
  272. package/dist/replication/schedule.d.ts.map +1 -0
  273. package/dist/replication/schedule.js +182 -0
  274. package/dist/replication/schedule.js.map +1 -0
  275. package/dist/replication/stream.d.ts +73 -0
  276. package/dist/replication/stream.d.ts.map +1 -0
  277. package/dist/replication/stream.js +542 -0
  278. package/dist/replication/stream.js.map +1 -0
  279. package/dist/replication/transport.d.ts +236 -0
  280. package/dist/replication/transport.d.ts.map +1 -0
  281. package/dist/replication/transport.js +440 -0
  282. package/dist/replication/transport.js.map +1 -0
  283. package/dist/replication/visibility-engine.d.ts +337 -0
  284. package/dist/replication/visibility-engine.d.ts.map +1 -0
  285. package/dist/replication/visibility-engine.js +602 -0
  286. package/dist/replication/visibility-engine.js.map +1 -0
  287. package/dist/replication/visibility-policy.d.ts +26 -0
  288. package/dist/replication/visibility-policy.d.ts.map +1 -0
  289. package/dist/replication/visibility-policy.js +33 -0
  290. package/dist/replication/visibility-policy.js.map +1 -0
  291. package/dist/replication/writer-identity-store.d.ts +100 -0
  292. package/dist/replication/writer-identity-store.d.ts.map +1 -0
  293. package/dist/replication/writer-identity-store.js +218 -0
  294. package/dist/replication/writer-identity-store.js.map +1 -0
  295. package/dist/replication/writer-identity.d.ts +252 -0
  296. package/dist/replication/writer-identity.d.ts.map +1 -0
  297. package/dist/replication/writer-identity.js +281 -0
  298. package/dist/replication/writer-identity.js.map +1 -0
  299. package/dist/replication/writer-identity.test-utils.d.ts +24 -0
  300. package/dist/replication/writer-identity.test-utils.d.ts.map +1 -0
  301. package/dist/replication/writer-identity.test-utils.js +86 -0
  302. package/dist/replication/writer-identity.test-utils.js.map +1 -0
  303. package/dist/schemas/server-config.d.ts +13 -0
  304. package/dist/schemas/server-config.d.ts.map +1 -1
  305. package/dist/schemas/server-config.js +24 -0
  306. package/dist/schemas/server-config.js.map +1 -1
  307. package/dist/storage/adapters/index.d.ts +3 -1
  308. package/dist/storage/adapters/index.d.ts.map +1 -1
  309. package/dist/storage/adapters/index.js +2 -0
  310. package/dist/storage/adapters/index.js.map +1 -1
  311. package/dist/storage/adapters/interface.d.ts +18 -1
  312. package/dist/storage/adapters/interface.d.ts.map +1 -1
  313. package/dist/storage/adapters/interface.js +13 -1
  314. package/dist/storage/adapters/interface.js.map +1 -1
  315. package/dist/storage/adapters/sdk.d.ts +2 -1
  316. package/dist/storage/adapters/sdk.d.ts.map +1 -1
  317. package/dist/storage/adapters/sdk.js +21 -3
  318. package/dist/storage/adapters/sdk.js.map +1 -1
  319. package/dist/storage/adapters/vana-audience.d.ts +17 -5
  320. package/dist/storage/adapters/vana-audience.d.ts.map +1 -1
  321. package/dist/storage/adapters/vana-audience.js +24 -9
  322. package/dist/storage/adapters/vana-audience.js.map +1 -1
  323. package/dist/storage/adapters/vana.d.ts +2 -2
  324. package/dist/storage/adapters/vana.d.ts.map +1 -1
  325. package/dist/storage/adapters/vana.js +30 -22
  326. package/dist/storage/adapters/vana.js.map +1 -1
  327. package/dist/storage/canonical-legacy-projection.d.ts +1 -1
  328. package/dist/storage/canonical-legacy-projection.d.ts.map +1 -1
  329. package/dist/storage/canonical-legacy-projection.js +13 -15
  330. package/dist/storage/canonical-legacy-projection.js.map +1 -1
  331. package/dist/storage/legacy-projection.d.ts.map +1 -1
  332. package/dist/storage/legacy-projection.js +16 -1
  333. package/dist/storage/legacy-projection.js.map +1 -1
  334. package/dist/storage/legacy-scope-coverage-exceptions.d.ts +5 -0
  335. package/dist/storage/legacy-scope-coverage-exceptions.d.ts.map +1 -1
  336. package/dist/storage/legacy-scope-coverage-exceptions.js +4 -0
  337. package/dist/storage/legacy-scope-coverage-exceptions.js.map +1 -1
  338. package/dist/storage/legacy-scope-coverage.d.ts.map +1 -1
  339. package/dist/storage/legacy-scope-coverage.js +14 -1
  340. package/dist/storage/legacy-scope-coverage.js.map +1 -1
  341. package/dist/storage/legacy-scope-entity-keys.d.ts +14 -1
  342. package/dist/storage/legacy-scope-entity-keys.d.ts.map +1 -1
  343. package/dist/storage/legacy-scope-entity-keys.js +18 -1
  344. package/dist/storage/legacy-scope-entity-keys.js.map +1 -1
  345. package/dist/storage/legacy-scope-view.d.ts +57 -5
  346. package/dist/storage/legacy-scope-view.d.ts.map +1 -1
  347. package/dist/storage/legacy-scope-view.js +644 -318
  348. package/dist/storage/legacy-scope-view.js.map +1 -1
  349. package/dist/storage/pdpp-records/cursor.d.ts +47 -2
  350. package/dist/storage/pdpp-records/cursor.d.ts.map +1 -1
  351. package/dist/storage/pdpp-records/cursor.js +7 -0
  352. package/dist/storage/pdpp-records/cursor.js.map +1 -1
  353. package/dist/storage/pdpp-records/enforcement.d.ts +3 -16
  354. package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -1
  355. package/dist/storage/pdpp-records/enforcement.js +40 -13
  356. package/dist/storage/pdpp-records/enforcement.js.map +1 -1
  357. package/dist/storage/pdpp-records/index.d.ts +2 -0
  358. package/dist/storage/pdpp-records/index.d.ts.map +1 -1
  359. package/dist/storage/pdpp-records/index.js +1 -0
  360. package/dist/storage/pdpp-records/index.js.map +1 -1
  361. package/dist/storage/pdpp-records/interface.d.ts +8 -1
  362. package/dist/storage/pdpp-records/interface.d.ts.map +1 -1
  363. package/dist/storage/pdpp-records/list-page.d.ts +35 -0
  364. package/dist/storage/pdpp-records/list-page.d.ts.map +1 -0
  365. package/dist/storage/pdpp-records/list-page.js +106 -0
  366. package/dist/storage/pdpp-records/list-page.js.map +1 -0
  367. package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -1
  368. package/dist/storage/pdpp-records/memory-store.js +95 -99
  369. package/dist/storage/pdpp-records/memory-store.js.map +1 -1
  370. package/dist/storage/pdpp-records/portable.d.ts +3 -0
  371. package/dist/storage/pdpp-records/portable.d.ts.map +1 -1
  372. package/dist/storage/pdpp-records/portable.js +3 -0
  373. package/dist/storage/pdpp-records/portable.js.map +1 -1
  374. package/dist/storage/pdpp-records/replication-journal.d.ts +20 -0
  375. package/dist/storage/pdpp-records/replication-journal.d.ts.map +1 -0
  376. package/dist/storage/pdpp-records/replication-journal.js +2 -0
  377. package/dist/storage/pdpp-records/replication-journal.js.map +1 -0
  378. package/dist/storage/pdpp-records/stream-declaration.d.ts +0 -2
  379. package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -1
  380. package/dist/storage/pdpp-records/stream-declaration.js +0 -9
  381. package/dist/storage/pdpp-records/stream-declaration.js.map +1 -1
  382. package/dist/storage/pdpp-records/sync-selection.d.ts +4 -0
  383. package/dist/storage/pdpp-records/sync-selection.d.ts.map +1 -0
  384. package/dist/storage/pdpp-records/sync-selection.js +37 -0
  385. package/dist/storage/pdpp-records/sync-selection.js.map +1 -0
  386. package/dist/storage/pdpp-records/types.d.ts +64 -0
  387. package/dist/storage/pdpp-records/types.d.ts.map +1 -1
  388. package/dist/storage/pdpp-records/types.js.map +1 -1
  389. package/dist/sync/delete-data-port.d.ts +15 -0
  390. package/dist/sync/delete-data-port.d.ts.map +1 -1
  391. package/dist/sync/delete-data-port.js +19 -7
  392. package/dist/sync/delete-data-port.js.map +1 -1
  393. package/dist/sync/index.d.ts +2 -1
  394. package/dist/sync/index.d.ts.map +1 -1
  395. package/dist/sync/index.js +2 -1
  396. package/dist/sync/index.js.map +1 -1
  397. package/dist/sync/pending-blob-deletions.d.ts +18 -2
  398. package/dist/sync/pending-blob-deletions.d.ts.map +1 -1
  399. package/dist/sync/pending-blob-deletions.js +69 -23
  400. package/dist/sync/pending-blob-deletions.js.map +1 -1
  401. package/dist/sync/workers/delete.d.ts.map +1 -1
  402. package/dist/sync/workers/delete.js +316 -142
  403. package/dist/sync/workers/delete.js.map +1 -1
  404. package/dist/sync/workers/download.d.ts.map +1 -1
  405. package/dist/sync/workers/download.js +53 -5
  406. package/dist/sync/workers/download.js.map +1 -1
  407. package/dist/sync/workers/upload.d.ts +24 -5
  408. package/dist/sync/workers/upload.d.ts.map +1 -1
  409. package/dist/sync/workers/upload.js +160 -275
  410. package/dist/sync/workers/upload.js.map +1 -1
  411. package/dist/test-utils/memory-storage.d.ts.map +1 -1
  412. package/dist/test-utils/memory-storage.js +17 -2
  413. package/dist/test-utils/memory-storage.js.map +1 -1
  414. package/package.json +24 -2
@@ -1,14 +1,28 @@
1
1
  import { type ByteBudget } from "./budget.js";
2
2
  import { type GatewayClient } from "@opendatalabs/vana-sdk/browser";
3
3
  import type { StorageAdapter } from "../storage/adapters/interface.js";
4
+ import { type FencedPublicationPort, NeedsFencedPublicationError } from "../publication/publish.js";
4
5
  import type { ServerSigner } from "../signing/signer.js";
5
6
  import { type VersionToFold } from "./first-added.js";
6
7
  import { type AdditionsSummary } from "./summary.js";
7
- import { type VersionInventoryClient } from "./version-inventory.js";
8
+ import { type VersionInventory, type VersionInventoryClient } from "./version-inventory.js";
8
9
  export declare const ADDITIONS_SUMMARY_SCOPE = "vana.system.additions";
9
10
  /** The separate hash namespace cannot collide with a literal source suffix. */
10
11
  export declare function additionsLedgerScope(scope: string): string;
12
+ export type AdditionsRecoveryCode = "compressed_packet" | "decrypt_failed" | "data_hash_mismatch" | "metadata_hash_mismatch" | "invalid_envelope" | "unsupported_source_data" | "replay_failed" | "checkpoint_search_exhausted" | "budget_exceeded" | "cancelled";
13
+ export interface AdditionsRecoveryDiagnostic {
14
+ scope: string;
15
+ version: string;
16
+ code: AdditionsRecoveryCode;
17
+ }
18
+ /** Fixed operator codes only: never retain payloads or raw exception text. */
19
+ export declare class AdditionsRecoveryError extends Error {
20
+ readonly code: AdditionsRecoveryCode;
21
+ constructor(code: AdditionsRecoveryCode, message?: string);
22
+ }
11
23
  export interface DurableAdditionsOptions {
24
+ /** Transient operator observation; never persisted in ledgers or summaries. */
25
+ onRecoveryDiagnostic?: (event: AdditionsRecoveryDiagnostic) => void;
12
26
  ownerAddress: string;
13
27
  /** Include chain and Gateway origin. A service instance belongs to one owner/network. */
14
28
  network: string;
@@ -17,7 +31,11 @@ export interface DurableAdditionsOptions {
17
31
  masterKey: Uint8Array;
18
32
  signer: Pick<ServerSigner, "signAddData">;
19
33
  gateway: Pick<GatewayClient, "registerDataPoint">;
20
- /** Full PS defaults remain unlimited. Bounded hosts must also supply boundedWork. */
34
+ fencedPublication?: FencedPublicationPort;
35
+ /** Summaries remain behind; hosts can expose the retryable recovery reason. */
36
+ onPublicationBlocked?: (error: NeedsFencedPublicationError) => void;
37
+ /** Full PS source replay defaults remain unlimited; checkpoint discovery is capped.
38
+ * Bounded hosts must also supply boundedWork. */
21
39
  byteBudget?: number;
22
40
  /** Host operations must cancel and settle all work before returning on abort.
23
41
  * Crypto must enforce a plaintext limit before decompression/allocation.
@@ -56,6 +74,18 @@ export interface DurableAdditionsService {
56
74
  signal?: AbortSignal;
57
75
  }): Promise<void>;
58
76
  }
77
+ /** Reuse only a commitment still visible after the current registry deletion boundary. */
78
+ export declare function findCheckpointRegistration(snapshot: VersionInventory, version: string, commitment: {
79
+ dataHash: string;
80
+ metadataHash: string;
81
+ }): {
82
+ expectedVersion: string;
83
+ dataHash: string;
84
+ metadataHash: string;
85
+ status: string;
86
+ addedAt: string;
87
+ isTombstone: boolean;
88
+ } | undefined;
59
89
  /**
60
90
  * Revalidates commitments, rather than trusting a numeric watermark or a local
61
91
  * mutex. Persisted lost/lower-prefix writes are repaired from the next inventory.
@@ -1 +1 @@
1
- {"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../src/additions/durable.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,sBAAsB,EAE5B,MAAM,wBAAwB,CAAC;AAGhC,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAyB/D,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,sBAAsB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,UAAU,CAAC;IACtB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IAClD,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,kFAAkF;QAClF,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,CACL,SAAS,EAAE,UAAU,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,CACL,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC;YACT,eAAe,EAAE,MAAM,CAAC;YACxB,QAAQ,EAAE,MAAM,CAAC;YACjB,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC,CAAC;KACJ,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,KAAK,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,IAAI,CAAC;KACX,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9B,YAAY,CACV,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,EACrD,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;+EAC2E;IAC3E,WAAW,CACT,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACpD,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAsED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,uBAAuB,CAymBzB"}
1
+ {"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../src/additions/durable.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { AdditionsBudget, AdditionsBudgetExceeded as BudgetExceeded, } from "./budget.js";
2
2
  import { z } from "zod";
3
- import { getAddress, keccak256, stringToHex } from "viem";
4
- import { createDataFileEnvelope, DataFileEnvelopeSchema, decryptWithPassword, deriveScopeKey, encryptWithPassword, } from "@opendatalabs/vana-sdk/browser";
3
+ import { keccak256, stringToHex } from "viem";
4
+ import { createDataFileEnvelope, DataFileEnvelopeSchema, decryptWithPassword, deriveScopeKey, } from "@opendatalabs/vana-sdk/browser";
5
+ import { publishVersion, NeedsFencedPublicationError, } from "../publication/publish.js";
6
+ import { computeDataPointId } from "../sync/data-point-id.js";
5
7
  import { foldVersion, extractRecordKeys, readScopeFirstSeenLedger, } from "./first-added.js";
6
8
  import { summarizeAdditions, ADDITIONS_SUMMARY_MAX_BYTES, } from "./summary.js";
7
9
  import { fingerprintVersionInventory, } from "./version-inventory.js";
@@ -33,14 +35,28 @@ export function additionsLedgerScope(scope) {
33
35
  ? literal
34
36
  : `vana.system.additions-hash.${keccak256(stringToHex(scope)).slice(2)}`;
35
37
  }
38
+ /** Fixed operator codes only: never retain payloads or raw exception text. */
39
+ export class AdditionsRecoveryError extends Error {
40
+ code;
41
+ constructor(code, message = code) {
42
+ super(message);
43
+ this.code = code;
44
+ this.name = "AdditionsRecoveryError";
45
+ }
46
+ }
36
47
  class InaccessibleLedger extends Error {
37
48
  }
49
+ class CheckpointSearchExceeded extends BudgetExceeded {
50
+ }
51
+ const CHECKPOINT_READ_LIMIT = 256;
38
52
  class BoundedWorkUnavailable extends Error {
39
53
  }
40
54
  class ReadBudget extends AdditionsBudget {
41
55
  limited;
56
+ checkpoints;
42
57
  constructor(options, parent) {
43
58
  super(options.byteBudget, options.timeBudgetMs, options.signal, parent);
59
+ this.checkpoints = parent?.checkpoints ?? { reads: 0, rejected: new Map() };
44
60
  this.limited =
45
61
  options.byteBudget !== undefined || options.timeBudgetMs !== undefined;
46
62
  }
@@ -81,6 +97,33 @@ function sameInventory(a, b) {
81
97
  function settled(slot) {
82
98
  return slot.status === "confirmed" || slot.status === "finalized";
83
99
  }
100
+ function eligible(slot) {
101
+ return (!slot.isTombstone &&
102
+ ["confirmed", "finalized", "pending", "submitting"].includes(slot.status));
103
+ }
104
+ function sourceWindow(snapshot) {
105
+ const end = BigInt(snapshot.head?.expectedVersion ?? "0");
106
+ const rows = snapshot.versions.filter((slot) => BigInt(slot.expectedVersion) <= end);
107
+ const after = BigInt(rows.filter((slot) => slot.isTombstone && settled(slot)).at(-1)
108
+ ?.expectedVersion ?? "0");
109
+ return {
110
+ end,
111
+ after,
112
+ relevant: rows.filter((slot) => BigInt(slot.expectedVersion) > after),
113
+ };
114
+ }
115
+ /** Reuse only a commitment still visible after the current registry deletion boundary. */
116
+ export function findCheckpointRegistration(snapshot, version, commitment) {
117
+ if (!snapshot.head || snapshot.head.deletedAt !== null)
118
+ return undefined;
119
+ const { end, after } = sourceWindow(snapshot);
120
+ if (BigInt(version) > end || BigInt(version) <= after)
121
+ return undefined;
122
+ return snapshot.versions.find((row) => row.expectedVersion === version &&
123
+ eligible(row) &&
124
+ row.dataHash.toLowerCase() === commitment.dataHash.toLowerCase() &&
125
+ row.metadataHash.toLowerCase() === commitment.metadataHash.toLowerCase());
126
+ }
84
127
  function sourceData(data) {
85
128
  if (data === null || typeof data !== "object" || Array.isArray(data))
86
129
  return null;
@@ -105,14 +148,31 @@ export function createDurableAdditions(options) {
105
148
  if (!budget.limited)
106
149
  budget.check(encrypted.byteLength);
107
150
  const password = hex(deriveScopeKey(options.masterKey, scope));
108
- const plaintext = budget.limited && options.boundedWork
109
- ? await options.boundedWork.decrypt(encrypted, password, budget)
110
- : await decryptWithPassword(encrypted, password);
151
+ let plaintext;
152
+ try {
153
+ plaintext =
154
+ budget.limited && options.boundedWork
155
+ ? await options.boundedWork.decrypt(encrypted, password, budget)
156
+ : await decryptWithPassword(encrypted, password);
157
+ }
158
+ catch (error) {
159
+ if (error instanceof AdditionsRecoveryError ||
160
+ error instanceof BudgetExceeded ||
161
+ budget.signal?.aborted)
162
+ throw error;
163
+ throw new AdditionsRecoveryError("decrypt_failed");
164
+ }
111
165
  budget.check(plaintext.byteLength);
112
166
  if (keccak256(plaintext).toLowerCase() !== slot.dataHash.toLowerCase())
113
- throw new Error("Additions content commitment mismatch");
167
+ throw new AdditionsRecoveryError("data_hash_mismatch", "Additions content commitment mismatch");
114
168
  budget.check(plaintext.byteLength * 3);
115
- const envelope = DataFileEnvelopeSchema.parse(JSON.parse(new TextDecoder().decode(plaintext)));
169
+ let envelope;
170
+ try {
171
+ envelope = DataFileEnvelopeSchema.parse(JSON.parse(new TextDecoder().decode(plaintext)));
172
+ }
173
+ catch {
174
+ throw new AdditionsRecoveryError("invalid_envelope");
175
+ }
116
176
  const metadataHash = keccak256(stringToHex(JSON.stringify({
117
177
  scope,
118
178
  collectedAt: envelope.collectedAt,
@@ -121,7 +181,7 @@ export function createDurableAdditions(options) {
121
181
  if (envelope.scope !== scope ||
122
182
  !Number.isFinite(Date.parse(envelope.collectedAt)) ||
123
183
  metadataHash.toLowerCase() !== slot.metadataHash.toLowerCase())
124
- throw new Error("Additions metadata commitment mismatch");
184
+ throw new AdditionsRecoveryError("metadata_hash_mismatch", "Additions metadata commitment mismatch");
125
185
  budget.check();
126
186
  return envelope;
127
187
  }
@@ -132,27 +192,61 @@ export function createDurableAdditions(options) {
132
192
  const head = snapshot.head;
133
193
  if (!head || head.deletedAt !== null)
134
194
  return null;
135
- const slot = snapshot.versions.find((row) => row.expectedVersion === head.expectedVersion &&
136
- !row.isTombstone &&
137
- row.dataHash === head.dataHash &&
138
- row.metadataHash === head.metadataHash);
195
+ const slot = findCheckpointRegistration(snapshot, head.expectedVersion, head);
139
196
  if (!slot)
140
197
  throw new Error("Additions head missing from inventory");
141
198
  return { snapshot, envelope: await readEnvelope(scope, slot, budget) };
142
199
  }
143
- async function readDocument(scope, budget) {
200
+ async function readDocument(scope, budget, source, search) {
201
+ const { relevant, after } = sourceWindow(source);
144
202
  const systemScope = additionsLedgerScope(scope);
145
203
  const snapshot = await inventory.list(systemScope, budget.readOptions);
146
204
  if (!snapshot.head || snapshot.head.deletedAt !== null)
147
205
  return null;
148
- const boundary = snapshot.versions.filter((row) => row.isTombstone).at(-1)
149
- ?.expectedVersion ?? "0";
206
+ // Same visibility as source recovery: only settled tombstones at or below the head delete history.
207
+ const boundary = snapshot.versions
208
+ .filter((row) => row.isTombstone &&
209
+ settled(row) &&
210
+ BigInt(row.expectedVersion) <=
211
+ BigInt(snapshot.head.expectedVersion))
212
+ .at(-1)?.expectedVersion ?? "0";
150
213
  let inaccessible = false;
151
- for (const slot of [...snapshot.versions].reverse()) {
214
+ const sourceFingerprint = fingerprintVersionInventory(source);
215
+ for (let index = snapshot.versions.length - 1; index >= 0; index--) {
216
+ budget.check();
217
+ const slot = snapshot.versions[index];
152
218
  if (BigInt(slot.expectedVersion) <= BigInt(boundary) ||
153
219
  BigInt(slot.expectedVersion) > BigInt(snapshot.head.expectedVersion) ||
154
- slot.isTombstone)
220
+ (search && BigInt(slot.expectedVersion) >= BigInt(search.before)) ||
221
+ !eligible(slot))
222
+ continue;
223
+ const identity = JSON.stringify([
224
+ systemScope,
225
+ slot.expectedVersion,
226
+ slot.dataHash.toLowerCase(),
227
+ slot.metadataHash.toLowerCase(),
228
+ sourceFingerprint,
229
+ ]);
230
+ const rejected = budget.checkpoints.rejected.get(identity);
231
+ if (rejected !== undefined) {
232
+ inaccessible ||= rejected === "inaccessible";
155
233
  continue;
234
+ }
235
+ if (budget.checkpoints.reads >= CHECKPOINT_READ_LIMIT) {
236
+ try {
237
+ options.onRecoveryDiagnostic?.({
238
+ scope,
239
+ version: slot.expectedVersion,
240
+ code: "checkpoint_search_exhausted",
241
+ });
242
+ }
243
+ catch {
244
+ /* Observation cannot alter recovery. */
245
+ }
246
+ throw new CheckpointSearchExceeded("Retained checkpoint search exhausted");
247
+ }
248
+ budget.check(identity.length * 2 + 64);
249
+ budget.checkpoints.reads++;
156
250
  let envelope;
157
251
  try {
158
252
  envelope = await readEnvelope(systemScope, slot, budget);
@@ -161,25 +255,38 @@ export function createDurableAdditions(options) {
161
255
  if (error instanceof BudgetExceeded || budget.signal?.aborted)
162
256
  throw error;
163
257
  inaccessible = true;
258
+ budget.checkpoints.rejected.set(identity, "inaccessible");
164
259
  continue;
165
260
  }
166
261
  const parsed = documentSchema.safeParse(envelope.data);
167
262
  if (!parsed.success ||
168
263
  parsed.data.owner !== owner ||
169
264
  parsed.data.network !== options.network ||
170
- parsed.data.scope !== scope)
265
+ parsed.data.scope !== scope) {
266
+ budget.checkpoints.rejected.set(identity, "invalid");
171
267
  continue;
268
+ }
172
269
  const ledger = parsed.data.ledger === null
173
270
  ? null
174
271
  : readScopeFirstSeenLedger(parsed.data.ledger);
175
- if (parsed.data.ledger !== null && (!ledger || ledger.scope !== scope))
272
+ if (parsed.data.ledger !== null && (!ledger || ledger.scope !== scope)) {
273
+ budget.checkpoints.rejected.set(identity, "invalid");
274
+ continue;
275
+ }
276
+ const candidate = { ...parsed.data, ledger };
277
+ if (candidate.slots.length > relevant.length ||
278
+ !candidate.slots.every((row, i) => eligible(relevant[i]) && sameCommitment(row, relevant[i])) ||
279
+ candidate.through !==
280
+ (candidate.slots.at(-1)?.expectedVersion ?? String(after))) {
281
+ budget.checkpoints.rejected.set(identity, "invalid");
282
+ continue;
283
+ }
284
+ if (search && candidate.slots.length <= search.longerThan)
176
285
  continue;
177
286
  return {
178
- ...parsed.data,
179
- ledger,
180
- ...(slot.expectedVersion !== snapshot.head.expectedVersion
181
- ? { repairHead: true }
182
- : {}),
287
+ document: candidate,
288
+ publicationVersion: slot.expectedVersion,
289
+ repairHead: slot.expectedVersion !== snapshot.head.expectedVersion,
183
290
  };
184
291
  }
185
292
  if (inaccessible)
@@ -194,9 +301,7 @@ export function createDurableAdditions(options) {
194
301
  const proof = await options.boundedWork.publish(scope, data, budget);
195
302
  budget.check();
196
303
  const check = await inventory.list(scope, budget.readOptions);
197
- const slot = check.versions.find((row) => row.expectedVersion === proof.expectedVersion &&
198
- row.dataHash === proof.dataHash &&
199
- row.metadataHash === proof.metadataHash);
304
+ const slot = findCheckpointRegistration(check, proof.expectedVersion, proof);
200
305
  if (!slot)
201
306
  throw new Error("Bounded checkpoint registration was replaced");
202
307
  const envelope = await readEnvelope(scope, slot, budget);
@@ -207,38 +312,34 @@ export function createDurableAdditions(options) {
207
312
  return;
208
313
  }
209
314
  const snapshot = await inventory.list(scope, budget.readOptions);
210
- const version = BigInt(snapshot.versions.at(-1)?.expectedVersion ?? "0") + 1n;
211
- const envelope = createDataFileEnvelope(scope, new Date().toISOString(), data);
212
- const plaintext = new TextEncoder().encode(JSON.stringify(envelope));
213
- const encrypted = await encryptWithPassword(plaintext, hex(deriveScopeKey(options.masterKey, scope)));
214
- const dataHash = keccak256(plaintext);
215
- const metadataHash = keccak256(stringToHex(JSON.stringify({
216
- scope,
217
- collectedAt: envelope.collectedAt,
218
- sizeBytes: encrypted.byteLength,
219
- })));
220
- await storageAdapter.upload(`${scope}/${version}`, encrypted);
221
- const signature = await options.signer.signAddData({
222
- ownerAddress: getAddress(owner),
223
- scope,
224
- dataHash,
225
- metadataHash,
226
- expectedVersion: version,
227
- });
228
- await options.gateway.registerDataPoint({
315
+ const toHead = (state) => state.head
316
+ ? {
317
+ ...state.head,
318
+ id: computeDataPointId(owner, scope),
319
+ }
320
+ : null;
321
+ const proof = await publishVersion({
229
322
  ownerAddress: owner,
230
- scope,
231
- dataHash,
232
- metadataHash,
233
- expectedVersion: String(version),
234
- signature,
323
+ envelope: createDataFileEnvelope(scope, new Date().toISOString(), data),
324
+ preferredVersion: BigInt(snapshot.versions.at(-1)?.expectedVersion ?? "0") + 1n,
325
+ masterKey: options.masterKey,
326
+ storageAdapter,
327
+ signer: options.signer,
328
+ gateway: options.gateway,
329
+ fencedPublication: options.fencedPublication,
330
+ head: toHead(snapshot),
331
+ readHead: async () => toHead(await inventory.list(scope, budget.readOptions)),
332
+ // Rebuilding an explicitly deleted system document is a deliberate re-add.
333
+ acknowledgedDeletionVersion: snapshot.head?.deletedAt
334
+ ? BigInt(snapshot.head.expectedVersion)
335
+ : undefined,
336
+ }).catch((error) => {
337
+ if (error instanceof NeedsFencedPublicationError)
338
+ options.onPublicationBlocked?.(error);
339
+ throw error;
235
340
  });
236
- // A concurrent upload can replace the bytes at this shared version key
237
- // independently of registration. Never claim durability without checking.
238
341
  const check = await inventory.list(scope, budget.readOptions);
239
- const registered = check.versions.find((slot) => slot.expectedVersion === String(version) &&
240
- slot.dataHash === dataHash &&
241
- slot.metadataHash === metadataHash);
342
+ const registered = findCheckpointRegistration(check, String(proof.version), proof);
242
343
  if (!registered)
243
344
  throw new Error("Concurrent additions publication replaced the registration");
244
345
  await readEnvelope(scope, registered, budget);
@@ -273,28 +374,19 @@ export function createDurableAdditions(options) {
273
374
  : "complete",
274
375
  };
275
376
  }
276
- const end = BigInt(head.expectedVersion);
277
- const rows = snapshot.versions.filter((slot) => BigInt(slot.expectedVersion) <= end);
278
- const boundary = rows
279
- .filter((slot) => slot.isTombstone && settled(slot))
280
- .at(-1);
281
- const after = BigInt(boundary?.expectedVersion ?? "0");
282
- const relevant = rows.filter((slot) => BigInt(slot.expectedVersion) > after);
283
- let existing = null;
377
+ const { end, after, relevant } = sourceWindow(snapshot);
378
+ let checkpoint = null;
284
379
  let inaccessibleExisting = false;
285
380
  try {
286
- existing = await readDocument(scope, budget);
381
+ checkpoint = await readDocument(scope, budget, snapshot);
287
382
  }
288
383
  catch (error) {
289
384
  if (error instanceof BudgetExceeded || budget.signal?.aborted)
290
385
  throw error;
291
386
  inaccessibleExisting = true;
292
387
  }
293
- const prefixValid = existing !== null &&
294
- existing.slots.length <= relevant.length &&
295
- existing.slots.every((slot, i) => sameCommitment(slot, relevant[i])) &&
296
- existing.through ===
297
- (existing.slots.at(-1)?.expectedVersion ?? String(after));
388
+ let existing = checkpoint?.document ?? null;
389
+ const prefixValid = existing !== null;
298
390
  let ledger = prefixValid ? existing.ledger : null;
299
391
  const folded = prefixValid ? relevant.slice(0, existing.slots.length) : [];
300
392
  let currentTotal = prefixValid ? existing.currentTotal : 0;
@@ -309,6 +401,7 @@ export function createDurableAdditions(options) {
309
401
  coverage = "partial";
310
402
  expected = BigInt(slot.expectedVersion) + 1n;
311
403
  }
404
+ const sourceCoverage = coverage;
312
405
  const checkpointBytes = (candidate, count) => 128 * 1024 +
313
406
  128 *
314
407
  new TextEncoder().encode(JSON.stringify({
@@ -320,23 +413,20 @@ export function createDurableAdditions(options) {
320
413
  through,
321
414
  currentTotal,
322
415
  })).byteLength;
323
- for (const slot of relevant.slice(folded.length)) {
416
+ while (folded.length < relevant.length) {
417
+ const slot = relevant[folded.length];
418
+ let unitBudget = budget;
324
419
  try {
325
420
  // Keep publication capacity in the same owner-wide allowance. Exhaustion
326
421
  // of the child leaves the already-folded prefix publishable.
327
- const unitBudget = budget.limited
422
+ unitBudget = budget.limited
328
423
  ? budget.excluding(checkpointBytes(ledger, folded.length))
329
424
  : budget;
330
425
  unitBudget.check();
331
426
  if (BigInt(slot.expectedVersion) !== BigInt(through) + 1n)
332
427
  coverage = "partial";
333
428
  // Mutable slots are provisional; failed/unknown slots cannot advance the prefix.
334
- if (slot.status === "failed" ||
335
- !["confirmed", "finalized", "pending", "submitting"].includes(slot.status)) {
336
- coverage = "partial";
337
- break;
338
- }
339
- if (slot.isTombstone) {
429
+ if (!eligible(slot)) {
340
430
  coverage = "partial";
341
431
  break;
342
432
  }
@@ -362,14 +452,14 @@ export function createDurableAdditions(options) {
362
452
  metadata === slot.metadataHash) {
363
453
  const data = sourceData(inMemory.data.data);
364
454
  if (!data)
365
- throw new Error("Unsupported source envelope");
455
+ throw new AdditionsRecoveryError("unsupported_source_data");
366
456
  version = { scope, collectedAt: inMemory.data.collectedAt, data };
367
457
  }
368
458
  else {
369
459
  const envelope = await readEnvelope(scope, slot, unitBudget);
370
460
  const data = sourceData(envelope.data);
371
461
  if (!data)
372
- throw new Error("Unsupported source envelope");
462
+ throw new AdditionsRecoveryError("unsupported_source_data");
373
463
  version = { scope, collectedAt: envelope.collectedAt, data };
374
464
  }
375
465
  const hadBaseline = ledger !== null && ledger.baseline !== null;
@@ -391,8 +481,61 @@ export function createDurableAdditions(options) {
391
481
  through = slot.expectedVersion;
392
482
  }
393
483
  catch (error) {
484
+ // Normal advancement needs one checkpoint, not the complete publication
485
+ // history. Search older evidence only when replay cannot advance, keeping
486
+ // the bytes reserved for publishing our best verified source prefix.
487
+ if (checkpoint && !budget.signal?.aborted) {
488
+ const searchBudget = budget.limited
489
+ ? budget.excluding(checkpointBytes(ledger, folded.length))
490
+ : budget;
491
+ try {
492
+ const fallback = await readDocument(scope, searchBudget, snapshot, {
493
+ before: checkpoint.publicationVersion,
494
+ longerThan: folded.length,
495
+ });
496
+ if (fallback) {
497
+ checkpoint = fallback;
498
+ existing = fallback.document;
499
+ ledger = existing.ledger;
500
+ currentTotal = existing.currentTotal;
501
+ through = existing.through;
502
+ folded.splice(0, folded.length, ...relevant.slice(0, existing.slots.length));
503
+ coverage = sourceCoverage;
504
+ continue;
505
+ }
506
+ }
507
+ catch (failure) {
508
+ // Keep the verified prefix and its publication reserve, but expose
509
+ // a bounded search that could not finish as retryable coverage.
510
+ if (failure instanceof BudgetExceeded)
511
+ error = failure;
512
+ else if (searchBudget.signal?.aborted)
513
+ error = new BudgetExceeded("Checkpoint fallback allowance exhausted");
514
+ }
515
+ }
516
+ try {
517
+ options.onRecoveryDiagnostic?.({
518
+ scope,
519
+ version: slot.expectedVersion,
520
+ code: error instanceof BudgetExceeded ||
521
+ (unitBudget.signal?.aborted &&
522
+ unitBudget.signal.reason instanceof DOMException &&
523
+ unitBudget.signal.reason.name === "TimeoutError")
524
+ ? "budget_exceeded"
525
+ : budget.signal?.aborted
526
+ ? "cancelled"
527
+ : error instanceof AdditionsRecoveryError
528
+ ? error.code
529
+ : "replay_failed",
530
+ });
531
+ }
532
+ catch {
533
+ /* Observation cannot alter recovery. */
534
+ }
394
535
  coverage =
395
- error instanceof BudgetExceeded || budget.signal?.aborted
536
+ error instanceof BudgetExceeded ||
537
+ budget.signal?.aborted ||
538
+ unitBudget.signal?.aborted
396
539
  ? "behind"
397
540
  : "partial";
398
541
  break;
@@ -428,7 +571,8 @@ export function createDurableAdditions(options) {
428
571
  if (((!existing && !inaccessibleExisting) ||
429
572
  prefixValid ||
430
573
  coverage === "complete") &&
431
- JSON.stringify(document) !== JSON.stringify(existing)) {
574
+ (checkpoint?.repairHead ||
575
+ JSON.stringify(document) !== JSON.stringify(existing))) {
432
576
  // A write failure affects durability, never hides the verified in-memory result.
433
577
  try {
434
578
  await publish(additionsLedgerScope(scope), { ...document }, budget);
@@ -558,11 +702,10 @@ export function createDurableAdditions(options) {
558
702
  if (proof &&
559
703
  keccak256(new TextEncoder().encode(JSON.stringify(proof.envelope))) !== head.dataHash)
560
704
  return;
561
- const previous = await readDocument(version.scope, budget);
562
- const boundary = snapshot.versions
563
- .filter((slot) => slot.isTombstone && settled(slot))
564
- .at(-1)?.expectedVersion ?? "0";
565
- const startsFresh = BigInt(head.expectedVersion) === BigInt(boundary) + 1n;
705
+ const previous = (await readDocument(version.scope, budget, snapshot))
706
+ ?.document;
707
+ const { after } = sourceWindow(snapshot);
708
+ const startsFresh = BigInt(head.expectedVersion) === after + 1n;
566
709
  if (!startsFresh &&
567
710
  (!previous ||
568
711
  BigInt(previous.through) + 1n !== BigInt(head.expectedVersion)))
@@ -576,9 +719,15 @@ export function createDurableAdditions(options) {
576
719
  /* Next reader retries. */
577
720
  }
578
721
  },
579
- async deleteScope(scope) {
722
+ async deleteScope(scope, deletion) {
723
+ deletion?.signal?.throwIfAborted();
724
+ options.signal?.throwIfAborted();
580
725
  if (isSystemScope(scope))
581
726
  return;
727
+ // Lite owns a separate bounded registry/journal deleter. This core host
728
+ // only has ordinary cleanup and must not silently use it for durableOnly.
729
+ if (deletion?.durableOnly)
730
+ throw new Error("Bounded additions deletion is unavailable");
582
731
  if (!options.deleteSystemScope)
583
732
  throw new Error("Durable additions deletion is unavailable");
584
733
  await options.deleteSystemScope(additionsLedgerScope(scope));