@opendatalabs/personal-server-ts-core 1.34.1 → 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 (421) 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 +19 -2
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/api/index.js +185 -13
  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 +89 -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 +17 -9
  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/data-point-feed.d.ts.map +1 -1
  390. package/dist/sync/data-point-feed.js +4 -1
  391. package/dist/sync/data-point-feed.js.map +1 -1
  392. package/dist/sync/delete-data-port.d.ts +15 -0
  393. package/dist/sync/delete-data-port.d.ts.map +1 -1
  394. package/dist/sync/delete-data-port.js +19 -7
  395. package/dist/sync/delete-data-port.js.map +1 -1
  396. package/dist/sync/index.d.ts +2 -1
  397. package/dist/sync/index.d.ts.map +1 -1
  398. package/dist/sync/index.js +2 -1
  399. package/dist/sync/index.js.map +1 -1
  400. package/dist/sync/pending-blob-deletions.d.ts +18 -2
  401. package/dist/sync/pending-blob-deletions.d.ts.map +1 -1
  402. package/dist/sync/pending-blob-deletions.js +69 -23
  403. package/dist/sync/pending-blob-deletions.js.map +1 -1
  404. package/dist/sync/scope-deletions.d.ts +2 -0
  405. package/dist/sync/scope-deletions.d.ts.map +1 -1
  406. package/dist/sync/scope-deletions.js +60 -19
  407. package/dist/sync/scope-deletions.js.map +1 -1
  408. package/dist/sync/workers/delete.d.ts.map +1 -1
  409. package/dist/sync/workers/delete.js +316 -142
  410. package/dist/sync/workers/delete.js.map +1 -1
  411. package/dist/sync/workers/download.d.ts.map +1 -1
  412. package/dist/sync/workers/download.js +53 -5
  413. package/dist/sync/workers/download.js.map +1 -1
  414. package/dist/sync/workers/upload.d.ts +24 -5
  415. package/dist/sync/workers/upload.d.ts.map +1 -1
  416. package/dist/sync/workers/upload.js +160 -275
  417. package/dist/sync/workers/upload.js.map +1 -1
  418. package/dist/test-utils/memory-storage.d.ts.map +1 -1
  419. package/dist/test-utils/memory-storage.js +17 -2
  420. package/dist/test-utils/memory-storage.js.map +1 -1
  421. package/package.json +24 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copies.d.ts","sourceRoot":"","sources":["../../src/replication/copies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,437 @@
1
+ /**
2
+ * Batch-copy retention, finalized-fact history and batch disposition
3
+ * (contract v3.1, replica-copy-promotion-contract-1021-v3.md), as storage
4
+ * effects that Node (`server/src/storage/pdpp-replica-copies.ts`) and
5
+ * PS-Lite (`lite/src/replication-engine.ts`) both run. Replica tables only;
6
+ * the host supplies canonical import, connection withdrawal, the pending
7
+ * preview and pending byte custody. Every transition is idempotent under
8
+ * replay; the caller owns the transaction.
9
+ */
10
+ import { sha256 } from "@noble/hashes/sha256";
11
+ import { bytesToHex } from "@noble/hashes/utils";
12
+ import { canonicalJson, REPLICA_TEXT_PART_BYTES, replicaTextParts, } from "./envelope.js";
13
+ import { decideCopyPromotion, indexEvidenceFromFacts, replicaCopyKey, } from "./copy-promotion.js";
14
+ import { replicaChainCommitment } from "./dpv2.js";
15
+ import { sql, } from "./effects.js";
16
+ export const REPLICA_COPY_MIGRATION = `
17
+ CREATE TABLE IF NOT EXISTS pdpp_replica_copies (
18
+ id TEXT NOT NULL,
19
+ copy_key TEXT NOT NULL,
20
+ writer_id TEXT NOT NULL,
21
+ batch_id TEXT NOT NULL,
22
+ sequence INTEGER NOT NULL,
23
+ previous_json TEXT,
24
+ fragment_count INTEGER NOT NULL CHECK (fragment_count >= 1),
25
+ fragment_commitments_json TEXT NOT NULL,
26
+ envelope_digest TEXT NOT NULL,
27
+ envelope_json TEXT NOT NULL,
28
+ blobs_json TEXT NOT NULL,
29
+ state TEXT NOT NULL CHECK (state IN ('pending','confirmed','quarantined')),
30
+ reason TEXT CHECK (reason IS NULL OR reason IN ('copy_conflict','finalized_conflict')),
31
+ CHECK ((state = 'quarantined') = (reason IS NOT NULL)),
32
+ PRIMARY KEY (id, copy_key)
33
+ );
34
+ CREATE TABLE IF NOT EXISTS pdpp_replica_copy_envelope_parts (
35
+ id TEXT NOT NULL, copy_key TEXT NOT NULL, part INTEGER NOT NULL,
36
+ json TEXT NOT NULL,
37
+ PRIMARY KEY (id, copy_key, part)
38
+ );
39
+ CREATE TABLE IF NOT EXISTS pdpp_replica_copy_blob_parts (
40
+ id TEXT NOT NULL, copy_key TEXT NOT NULL, part INTEGER NOT NULL,
41
+ json TEXT NOT NULL,
42
+ PRIMARY KEY (id, copy_key, part)
43
+ );
44
+ CREATE TABLE IF NOT EXISTS pdpp_replica_copy_rejects (
45
+ id TEXT NOT NULL, reject_key TEXT NOT NULL, claimed_copy_key TEXT,
46
+ reason TEXT NOT NULL, received_at INTEGER NOT NULL,
47
+ PRIMARY KEY (id, reject_key)
48
+ );
49
+ CREATE TRIGGER IF NOT EXISTS pdpp_copy_rejects_no_update BEFORE UPDATE ON pdpp_replica_copy_rejects BEGIN SELECT RAISE(ABORT, 'copy rejects are append-only'); END;
50
+ CREATE TRIGGER IF NOT EXISTS pdpp_copy_rejects_no_delete BEFORE DELETE ON pdpp_replica_copy_rejects BEGIN SELECT RAISE(ABORT, 'copy rejects are append-only'); END;
51
+ CREATE TABLE IF NOT EXISTS pdpp_replica_finalized_facts (
52
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
53
+ chain_id INTEGER NOT NULL, registry TEXT NOT NULL, owner TEXT NOT NULL,
54
+ scope TEXT NOT NULL, fragment_index INTEGER NOT NULL, id TEXT NOT NULL,
55
+ slot_version TEXT NOT NULL DEFAULT '1', current_version TEXT NOT NULL, status TEXT NOT NULL, commitment TEXT NOT NULL,
56
+ block_number TEXT NOT NULL, block_hash TEXT NOT NULL, eligible INTEGER NOT NULL,
57
+ observed_at INTEGER NOT NULL
58
+ );
59
+ CREATE INDEX IF NOT EXISTS pdpp_finalized_facts_id ON pdpp_replica_finalized_facts(id, fragment_index, seq);
60
+ CREATE INDEX IF NOT EXISTS pdpp_finalized_facts_scope ON pdpp_replica_finalized_facts(scope, seq);
61
+ CREATE TRIGGER IF NOT EXISTS pdpp_finalized_facts_no_update BEFORE UPDATE ON pdpp_replica_finalized_facts BEGIN SELECT RAISE(ABORT, 'finalized facts are append-only'); END;
62
+ CREATE TRIGGER IF NOT EXISTS pdpp_finalized_facts_no_delete BEFORE DELETE ON pdpp_replica_finalized_facts BEGIN SELECT RAISE(ABORT, 'finalized facts are append-only'); END;
63
+ CREATE TABLE IF NOT EXISTS pdpp_replica_batch_disposition (
64
+ id TEXT PRIMARY KEY,
65
+ writer_id TEXT NOT NULL,
66
+ sequence INTEGER NOT NULL,
67
+ state TEXT NOT NULL CHECK (state IN ('open','promoted','terminal')),
68
+ promoted_copy_key TEXT,
69
+ terminal_reason TEXT,
70
+ CHECK ((state = 'promoted') = (promoted_copy_key IS NOT NULL)),
71
+ CHECK ((state = 'terminal') = (terminal_reason IS NOT NULL))
72
+ );
73
+ CREATE INDEX IF NOT EXISTS pdpp_batch_disposition_writer ON pdpp_replica_batch_disposition(writer_id, sequence);
74
+ CREATE TRIGGER IF NOT EXISTS pdpp_batch_disposition_absorbing BEFORE UPDATE ON pdpp_replica_batch_disposition
75
+ WHEN OLD.state = 'terminal' OR (OLD.state = 'promoted' AND NEW.state = 'open')
76
+ BEGIN SELECT RAISE(ABORT, 'batch disposition transitions are absorbing'); END;
77
+ CREATE TABLE IF NOT EXISTS pdpp_replica_promotion_receipts (
78
+ id TEXT PRIMARY KEY, copy_key TEXT NOT NULL, envelope_digest TEXT NOT NULL
79
+ );
80
+ `;
81
+ /** Precondition failures a caller can act on; never exception text. */
82
+ export class ReplicaCopyRefused extends Error {
83
+ reason;
84
+ code = "replica_copy_refused";
85
+ constructor(reason) {
86
+ super(reason);
87
+ this.reason = reason;
88
+ this.name = "ReplicaCopyRefused";
89
+ }
90
+ }
91
+ const lowerHex = /^0x[0-9a-f]{64}$/;
92
+ const ROW_COLUMNS = "id,copy_key,writer_id,batch_id,sequence,previous_json,fragment_count,fragment_commitments_json,envelope_digest,state,reason";
93
+ /**
94
+ * A copy's envelope. Copies staged before the parts table keep it in
95
+ * `envelope_json`; later copies leave that empty and keep it in parts.
96
+ */
97
+ export function* replicaCopyEnvelope(id, copyKey) {
98
+ const whole = yield* sql.get("SELECT envelope_json FROM pdpp_replica_copies WHERE id=? AND copy_key=?", id, copyKey);
99
+ if (!whole)
100
+ throw new Error("unknown replica copy");
101
+ if (whole.envelope_json)
102
+ return JSON.parse(whole.envelope_json);
103
+ let json = "";
104
+ for (let part = 0;; part++) {
105
+ const row = yield* sql.get("SELECT json FROM pdpp_replica_copy_envelope_parts WHERE id=? AND copy_key=? AND part=?", id, copyKey, part);
106
+ if (!row)
107
+ break;
108
+ json += row.json;
109
+ }
110
+ return JSON.parse(json);
111
+ }
112
+ /**
113
+ * A copy's blob descriptors as JSON. Copies staged before the parts table
114
+ * keep them in `blobs_json`; later copies leave that empty and keep them in
115
+ * parts, so a batch of many small blobs never builds one SQL value above
116
+ * the phone's bound.
117
+ */
118
+ function* copyBlobsJson(id, copyKey) {
119
+ const whole = yield* sql.get("SELECT blobs_json FROM pdpp_replica_copies WHERE id=? AND copy_key=?", id, copyKey);
120
+ if (!whole)
121
+ throw new Error("unknown replica copy");
122
+ if (whole.blobs_json)
123
+ return whole.blobs_json;
124
+ let json = "";
125
+ for (let part = 0;; part++) {
126
+ const row = yield* sql.get("SELECT json FROM pdpp_replica_copy_blob_parts WHERE id=? AND copy_key=? AND part=?", id, copyKey, part);
127
+ if (!row)
128
+ break;
129
+ json += row.json;
130
+ }
131
+ return json;
132
+ }
133
+ export function replicaCopies(host) {
134
+ // Without the envelope: a phone's SQL call returns at most about 1 MiB.
135
+ const rows = (id) => sql.all(`SELECT ${ROW_COLUMNS} FROM pdpp_replica_copies WHERE id=? ORDER BY copy_key`, id);
136
+ const envelopeOf = (id, copyKey) => replicaCopyEnvelope(id, copyKey);
137
+ const blobsOf = function* (id, copyKey) {
138
+ return JSON.parse(yield* copyBlobsJson(id, copyKey));
139
+ };
140
+ const dispositionRow = (id) => sql.get("SELECT * FROM pdpp_replica_batch_disposition WHERE id=?", id);
141
+ function* disposition(id) {
142
+ const row = yield* dispositionRow(id);
143
+ if (!row || row.state === "open")
144
+ return { state: "open" };
145
+ if (row.state === "promoted")
146
+ return { state: "promoted", copyKey: row.promoted_copy_key };
147
+ return { state: "terminal", reason: row.terminal_reason };
148
+ }
149
+ function* evidence(id) {
150
+ const facts = yield* sql.all("SELECT * FROM pdpp_replica_finalized_facts WHERE id=? ORDER BY fragment_index,seq", id);
151
+ const byIndex = new Map();
152
+ for (const f of facts)
153
+ byIndex.set(f.fragment_index, [
154
+ ...(byIndex.get(f.fragment_index) ?? []),
155
+ {
156
+ chainId: f.chain_id,
157
+ registry: f.registry,
158
+ owner: f.owner,
159
+ version: f.slot_version,
160
+ currentVersion: f.current_version,
161
+ status: f.status,
162
+ commitment: f.commitment,
163
+ blockNumber: BigInt(f.block_number),
164
+ blockHash: f.block_hash,
165
+ eligible: f.eligible === 1,
166
+ },
167
+ ]);
168
+ return new Map([...byIndex].map(([index, list]) => [
169
+ index,
170
+ indexEvidenceFromFacts(list),
171
+ ]));
172
+ }
173
+ function* decide(id, refetch) {
174
+ return decideCopyPromotion({
175
+ id,
176
+ disposition: yield* disposition(id),
177
+ copies: (yield* rows(id)).map((row) => ({
178
+ copyKey: row.copy_key,
179
+ fragmentCommitments: JSON.parse(row.fragment_commitments_json),
180
+ validity: "valid",
181
+ })),
182
+ evidence: yield* evidence(id),
183
+ refetch,
184
+ });
185
+ }
186
+ /** Raise reasons only: copy_conflict < finalized_conflict; confirmed copies stay. */
187
+ function* quarantine(id, keys, reason, includeConfirmed = false) {
188
+ for (const key of keys) {
189
+ const row = yield* sql.get("SELECT state,reason FROM pdpp_replica_copies WHERE id=? AND copy_key=?", id, key);
190
+ if (!row)
191
+ continue;
192
+ if (row.state === "confirmed" && !includeConfirmed)
193
+ continue;
194
+ if (row.reason === "finalized_conflict")
195
+ continue;
196
+ if (row.reason === reason)
197
+ continue;
198
+ yield* sql.run("UPDATE pdpp_replica_copies SET state='quarantined',reason=? WHERE id=? AND copy_key=?", reason, id, key);
199
+ }
200
+ }
201
+ /** Keep the read side's single pending preview equal to the copy states. */
202
+ function* syncPreview(id) {
203
+ const all = yield* rows(id);
204
+ const pending = all.filter((row) => row.state === "pending");
205
+ if (pending.length === 1) {
206
+ const row = pending[0];
207
+ yield* host.preview.show(id, yield* envelopeOf(id, row.copy_key), yield* copyBlobsJson(id, row.copy_key));
208
+ }
209
+ else
210
+ yield* host.preview.hide(id, all.some((row) => row.state === "confirmed")
211
+ ? "confirmed"
212
+ : "quarantined");
213
+ }
214
+ function* apply(id, decision) {
215
+ if (decision.kind === "terminal")
216
+ yield* terminate(id, decision.reason);
217
+ else if (decision.kind !== "promote")
218
+ yield* quarantine(id, decision.quarantine, "copy_conflict");
219
+ yield* syncPreview(id);
220
+ }
221
+ /** The batch at (writer, sequence - 1), and whether it may precede this one. */
222
+ function* predecessorOf(row) {
223
+ const previous = row.previous_json
224
+ ? JSON.parse(row.previous_json)
225
+ : null;
226
+ if (row.sequence === 1)
227
+ return previous
228
+ ? { kind: "terminal", reason: "predecessor_mismatch" }
229
+ : undefined;
230
+ if (!previous)
231
+ return { kind: "terminal", reason: "predecessor_mismatch" };
232
+ const predecessor = canonicalJson([row.writer_id, previous.batch]);
233
+ const state = yield* dispositionRow(predecessor);
234
+ if (state?.state === "terminal")
235
+ return { kind: "terminal", reason: "predecessor_terminal" };
236
+ if (state?.state !== "promoted" || state.sequence !== row.sequence - 1)
237
+ return { kind: "wait_predecessor", predecessor };
238
+ const receipt = yield* sql.get("SELECT envelope_digest FROM pdpp_replica_promotion_receipts WHERE id=?", predecessor);
239
+ return receipt?.envelope_digest === previous.digest
240
+ ? undefined
241
+ : { kind: "terminal", reason: "predecessor_mismatch" };
242
+ }
243
+ /**
244
+ * Terminal transition (contract F3, amendments A and H): the batch and every
245
+ * later batch of its writer become terminal; their valid copies rise to
246
+ * finalized_conflict; every connection a promoted batch in that set touched
247
+ * is withdrawn from all readers in this same transaction.
248
+ */
249
+ function* terminate(id, reason) {
250
+ const root = yield* dispositionRow(id);
251
+ if (!root)
252
+ return;
253
+ const chain = yield* sql.all("SELECT id,state,promoted_copy_key FROM pdpp_replica_batch_disposition WHERE writer_id=? AND sequence>=? ORDER BY sequence", root.writer_id, root.sequence);
254
+ const connections = new Set();
255
+ for (const batch of chain) {
256
+ if (batch.state === "promoted" && batch.promoted_copy_key) {
257
+ for (const op of (yield* envelopeOf(batch.id, batch.promoted_copy_key))
258
+ .operations)
259
+ connections.add(op.connectionId);
260
+ }
261
+ if (batch.state !== "terminal")
262
+ yield* sql.run("UPDATE pdpp_replica_batch_disposition SET state='terminal',promoted_copy_key=NULL,terminal_reason=? WHERE id=?", batch.id === id ? reason : "predecessor_terminal", batch.id);
263
+ yield* quarantine(batch.id, (yield* rows(batch.id)).map((row) => row.copy_key), "finalized_conflict", true);
264
+ yield* syncPreview(batch.id);
265
+ }
266
+ for (const instance of connections)
267
+ yield* host.quarantineConnection(instance);
268
+ }
269
+ return {
270
+ decide,
271
+ disposition,
272
+ *copies(id) {
273
+ return (yield* rows(id)).map((row) => ({
274
+ copyKey: row.copy_key,
275
+ state: row.state,
276
+ reason: row.reason,
277
+ envelopeDigest: row.envelope_digest,
278
+ }));
279
+ },
280
+ /**
281
+ * Retain one valid copy (contract §3 "Stage copy", amendment C), then
282
+ * decide and apply the quarantine set. Returns the copy key and decision.
283
+ * An input failing a validity check is recorded as a reject only.
284
+ */
285
+ *stage(copy, refetch) {
286
+ const pairs = copy.fragments.map((f) => [f.dataHash, f.metadataHash]);
287
+ const invalid = copy.id !== canonicalJson([copy.writer, copy.batch])
288
+ ? "identity_mismatch"
289
+ : !copy.fragments.length
290
+ ? "empty"
291
+ : pairs.flat().some((h) => !lowerHex.test(h))
292
+ ? "hash_encoding"
293
+ : copy.envelope.owner !== host.owner
294
+ ? "owner"
295
+ : undefined;
296
+ if (invalid) {
297
+ yield* sql.run("INSERT OR IGNORE INTO pdpp_replica_copy_rejects VALUES (?,?,?,?,?)", copy.id, bytesToHex(sha256(new TextEncoder().encode(canonicalJson(pairs)))), null, invalid, host.now());
298
+ return {
299
+ copyKey: undefined,
300
+ decision: yield* decide(copy.id, refetch),
301
+ };
302
+ }
303
+ const commitments = copy.fragments.map((f) => replicaChainCommitment(f.dataHash, f.metadataHash).toLowerCase());
304
+ const copyKey = replicaCopyKey(commitments);
305
+ yield* sql.run("INSERT OR IGNORE INTO pdpp_replica_batch_disposition (id,writer_id,sequence,state) VALUES (?,?,?,'open')", copy.id, copy.writer, copy.sequence);
306
+ const existing = yield* sql.get("SELECT envelope_digest,fragment_commitments_json FROM pdpp_replica_copies WHERE id=? AND copy_key=?", copy.id, copyKey);
307
+ if (existing) {
308
+ // Same key, different content would need a keccak collision.
309
+ if (existing.envelope_digest !== copy.envelopeDigest ||
310
+ existing.fragment_commitments_json !== canonicalJson(commitments))
311
+ yield* terminate(copy.id, "finalized_conflict");
312
+ }
313
+ else {
314
+ yield* sql.run("INSERT INTO pdpp_replica_copies VALUES (?,?,?,?,?,?,?,?,?,'','','pending',NULL)", copy.id, copyKey, copy.writer, copy.batch, copy.sequence, copy.previous ? canonicalJson(copy.previous) : null, copy.fragments.length, canonicalJson(commitments), copy.envelopeDigest);
315
+ for (const [part, json] of replicaTextParts(canonicalJson(copy.blobs), REPLICA_TEXT_PART_BYTES).entries())
316
+ yield* sql.run("INSERT INTO pdpp_replica_copy_blob_parts VALUES (?,?,?,?)", copy.id, copyKey, part, json);
317
+ const parts = replicaTextParts(canonicalJson(copy.envelope), REPLICA_TEXT_PART_BYTES);
318
+ for (const [part, json] of parts.entries())
319
+ yield* sql.run("INSERT INTO pdpp_replica_copy_envelope_parts VALUES (?,?,?,?)", copy.id, copyKey, part, json);
320
+ }
321
+ // A later batch of a terminal writer chain is terminal on staging (H).
322
+ const earlierTerminal = yield* sql.get("SELECT 1 FROM pdpp_replica_batch_disposition WHERE writer_id=? AND sequence<? AND state='terminal' LIMIT 1", copy.writer, copy.sequence);
323
+ if (earlierTerminal && (yield* disposition(copy.id)).state !== "terminal")
324
+ yield* terminate(copy.id, "predecessor_terminal");
325
+ // A copy arriving after promotion decides reconcile_promoted, which
326
+ // quarantines it below; the confirmed copy is untouched.
327
+ const decision = yield* decide(copy.id, refetch);
328
+ if (decision.kind !== "promote")
329
+ yield* apply(copy.id, decision);
330
+ else {
331
+ yield* quarantine(copy.id, decision.quarantine, "copy_conflict");
332
+ yield* syncPreview(copy.id);
333
+ }
334
+ return { copyKey, decision };
335
+ },
336
+ /**
337
+ * Append a verified finalized fact for one registered slot (F2). A fact
338
+ * from another owner is refused (a diagnostic, never a fact). Returns
339
+ * true when it is new.
340
+ */
341
+ *recordFact(input) {
342
+ if (input.fact.owner.toLowerCase() !== host.owner.toLowerCase())
343
+ throw new ReplicaCopyRefused("fact_authority");
344
+ // A poll that observes the same state at a later block adds nothing a
345
+ // decision reads (the latest fact's content is unchanged), so polling
346
+ // a waiting slot does not grow the history.
347
+ const latest = (yield* sql.all("SELECT current_version,status,commitment,block_number,eligible FROM pdpp_replica_finalized_facts WHERE chain_id=? AND registry=? AND owner=? AND scope=? AND slot_version=? ORDER BY seq", input.fact.chainId, input.fact.registry.toLowerCase(), input.fact.owner.toLowerCase(), input.scope, input.fact.version)).reduce((a, b) => a === undefined || BigInt(b.block_number) >= BigInt(a.block_number)
348
+ ? b
349
+ : a, undefined);
350
+ if (latest &&
351
+ BigInt(latest.block_number) <= input.fact.blockNumber &&
352
+ latest.current_version === input.fact.currentVersion &&
353
+ latest.status === input.fact.status &&
354
+ latest.commitment === input.fact.commitment.toLowerCase() &&
355
+ latest.eligible === (input.fact.eligible ? 1 : 0))
356
+ return false;
357
+ return ((yield* sql.run("INSERT INTO pdpp_replica_finalized_facts (chain_id,registry,owner,scope,fragment_index,id,slot_version,current_version,status,commitment,block_number,block_hash,eligible,observed_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", input.fact.chainId, input.fact.registry.toLowerCase(), input.fact.owner.toLowerCase(), input.scope, input.fragmentIndex, input.id, input.fact.version, input.fact.currentVersion, input.fact.status, input.fact.commitment.toLowerCase(), input.fact.blockNumber.toString(), input.fact.blockHash.toLowerCase(), input.fact.eligible ? 1 : 0, host.now())).changes > 0);
358
+ },
359
+ /** Apply a non-promoting decision's durable effects (coordinator step). */
360
+ apply,
361
+ terminate,
362
+ /**
363
+ * Promote one copy (contract §3, amendments E and F): re-decide and
364
+ * re-check the predecessor; import the copy under a savepoint; confirm
365
+ * it, quarantine the rest, record the disposition and the receipt. A
366
+ * replay of a completed promotion returns the original receipt and
367
+ * changes nothing. A bare promote (no key) is refused when more than one
368
+ * copy is retained.
369
+ */
370
+ *promote(input) {
371
+ const all = yield* rows(input.id);
372
+ if (input.copyKey === undefined && all.length !== 1)
373
+ throw new ReplicaCopyRefused("ambiguous_copy");
374
+ const copyKey = (input.copyKey ?? all[0].copy_key).toLowerCase();
375
+ const receipt = yield* sql.get("SELECT copy_key,envelope_digest FROM pdpp_replica_promotion_receipts WHERE id=?", input.id);
376
+ const state = yield* disposition(input.id);
377
+ if (state.state === "terminal")
378
+ return { kind: "terminal", reason: state.reason };
379
+ if (state.state === "promoted" && receipt?.copy_key === copyKey)
380
+ return {
381
+ kind: "promoted",
382
+ copyKey: copyKey,
383
+ envelopeDigest: receipt.envelope_digest,
384
+ replay: true,
385
+ };
386
+ const decision = yield* decide(input.id, { attempts: 0, budget: 1 });
387
+ if (decision.kind === "terminal") {
388
+ yield* terminate(input.id, decision.reason);
389
+ return { kind: "terminal", reason: decision.reason };
390
+ }
391
+ if (decision.kind !== "promote" || decision.copyKey !== copyKey)
392
+ throw new ReplicaCopyRefused("not_promotable");
393
+ const row = all.find((r) => r.copy_key === copyKey);
394
+ const precondition = yield* predecessorOf(row);
395
+ if (precondition?.kind === "terminal") {
396
+ yield* terminate(input.id, precondition.reason);
397
+ return precondition;
398
+ }
399
+ if (precondition)
400
+ return precondition;
401
+ if (receipt && receipt.copy_key !== copyKey) {
402
+ yield* terminate(input.id, "receipt_conflict");
403
+ return { kind: "terminal", reason: "receipt_conflict" };
404
+ }
405
+ // The import runs in a savepoint: an invariant violation inside it
406
+ // rolls back the import alone, and the terminal transition commits.
407
+ const blobs = yield* blobsOf(input.id, copyKey);
408
+ try {
409
+ yield* host.savepoint(host.importEnvelope(yield* envelopeOf(input.id, copyKey), blobs, input.id));
410
+ }
411
+ catch (error) {
412
+ if (!(error instanceof ReplicaCopyRefused))
413
+ throw error;
414
+ yield* terminate(input.id, error.reason);
415
+ return { kind: "terminal", reason: error.reason };
416
+ }
417
+ yield* sql.run("UPDATE pdpp_replica_copies SET state='confirmed',reason=NULL WHERE id=? AND copy_key=?", input.id, copyKey);
418
+ yield* quarantine(input.id, decision.quarantine, "copy_conflict");
419
+ yield* sql.run("UPDATE pdpp_replica_batch_disposition SET state='promoted',promoted_copy_key=? WHERE id=?", copyKey, input.id);
420
+ yield* sql.run("INSERT INTO pdpp_replica_promotion_receipts VALUES (?,?,?)", input.id, copyKey, row.envelope_digest);
421
+ yield* syncPreview(input.id);
422
+ const kept = new Set();
423
+ for (const r of yield* rows(input.id))
424
+ if (r.copy_key !== copyKey)
425
+ for (const b of yield* blobsOf(input.id, r.copy_key))
426
+ kept.add(b.blobId);
427
+ yield* host.releaseBytes(input.id, blobs.map((b) => b.blobId).filter((b) => !kept.has(b)));
428
+ return {
429
+ kind: "promoted",
430
+ copyKey: copyKey,
431
+ envelopeDigest: row.envelope_digest,
432
+ replay: false,
433
+ };
434
+ },
435
+ };
436
+ }
437
+ //# sourceMappingURL=copies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copies.js","sourceRoot":"","sources":["../../src/replication/copies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Batch-copy promotion, contract v3.1
3
+ * (replica-copy-promotion-contract-1021-v3.md). Two or more payloads can claim
4
+ * one batch identity (writer, batch); each is a copy, named by `copyKey`. Only
5
+ * verified finalized chain facts choose between them. Pure: no I/O, no clock.
6
+ */
7
+ export type Hex = `0x${string}`;
8
+ /**
9
+ * keccak256(abi.encode(string "pdpp.replica.copy.v1", bytes32[] commitments)),
10
+ * commitments in slot order. A manifest-carried batch has one slot: its
11
+ * manifest. Always recomputed locally from the verified (dataHash,
12
+ * metadataHash) pairs, never taken from a sender.
13
+ */
14
+ export declare function replicaCopyKey(fragmentCommitments: readonly Hex[]): Hex;
15
+ export interface RetainedCopy {
16
+ copyKey: Hex;
17
+ /** Per fragment index; length is the copy's declared fragment count. */
18
+ fragmentCommitments: readonly Hex[];
19
+ /** Storage never passes a corrupt input (it is a reject); ignored if it does. */
20
+ validity: "valid" | "corrupt";
21
+ }
22
+ /** What the finalized chain says about one registered slot of a copy. */
23
+ export type IndexEvidence =
24
+ /** Never verified, or the last attempt was unavailable. */
25
+ {
26
+ kind: "unknown";
27
+ }
28
+ /** Finalized currentVersion below the slot: not registered yet. */
29
+ | {
30
+ kind: "absent";
31
+ }
32
+ /**
33
+ * Finalized currentVersion at or above the slot, any status. `eligible`:
34
+ * the registration state was "confirmed" at that fact (status Active,
35
+ * agreeing live head).
36
+ */
37
+ | {
38
+ kind: "committed";
39
+ commitment: Hex;
40
+ eligible: boolean;
41
+ }
42
+ /** Absorbing, derived from the fact history. */
43
+ | {
44
+ kind: "contradiction";
45
+ };
46
+ export type CopyDisposition = {
47
+ state: "open";
48
+ } | {
49
+ state: "promoted";
50
+ copyKey: Hex;
51
+ } | {
52
+ state: "terminal";
53
+ reason: string;
54
+ };
55
+ export interface CopyDecisionInput {
56
+ id: string;
57
+ disposition: CopyDisposition;
58
+ /** All retained copies of `id`. */
59
+ copies: readonly RetainedCopy[];
60
+ /** By fragment index. */
61
+ evidence: ReadonlyMap<number, IndexEvidence>;
62
+ refetch: {
63
+ attempts: number;
64
+ budget: number;
65
+ };
66
+ }
67
+ /** Every quarantine list is sorted, unique, and names only valid copies. */
68
+ export type CopyDecision = {
69
+ kind: "terminal";
70
+ reason: "finalized_conflict";
71
+ quarantine: Hex[];
72
+ } | {
73
+ kind: "wait";
74
+ on: "finality";
75
+ quarantine: Hex[];
76
+ } | {
77
+ kind: "promote";
78
+ copyKey: Hex;
79
+ quarantine: Hex[];
80
+ } | {
81
+ kind: "reconcile_promoted";
82
+ copyKey: Hex;
83
+ quarantine: Hex[];
84
+ } | {
85
+ kind: "refetch";
86
+ quarantine: Hex[];
87
+ } | {
88
+ kind: "owner";
89
+ reason: "copy_conflict_unresolved";
90
+ quarantine: Hex[];
91
+ };
92
+ /**
93
+ * The one copy-promotion rule (contract v2 §2 with amendments B, G and I).
94
+ * First matching rule wins:
95
+ * 1. terminal disposition or any contradiction → terminal;
96
+ * 2. promoted p: p missing or disproved → terminal, else reconcile_promoted;
97
+ * 3. more than one proven copy → terminal (needs a hash collision);
98
+ * 4. exactly one proven copy → promote;
99
+ * 5. every copy disproved and finality known → refetch, then owner at budget;
100
+ * 6. otherwise → wait for finality.
101
+ * Never arrival order, size, counter, deadline or hint. The predecessor check
102
+ * is the caller's precondition, not part of this decision.
103
+ */
104
+ /** Completed non-matching re-downloads before the owner decides (contract F4). */
105
+ export declare const REPLICA_REFETCH_BUDGET = 5;
106
+ export declare function decideCopyPromotion(input: CopyDecisionInput): CopyDecision;
107
+ /** One verified finalized fact for one registered slot (contract F2). */
108
+ export interface FinalizedFact {
109
+ chainId: number;
110
+ registry: string;
111
+ owner: string;
112
+ /** The slot's version. Its commitment is write-once on chain. */
113
+ version: string;
114
+ currentVersion: string;
115
+ status: string;
116
+ commitment: Hex;
117
+ blockNumber: bigint;
118
+ blockHash: Hex;
119
+ /** replicaRegistrationState(...) === "confirmed" when the fact was verified. */
120
+ eligible: boolean;
121
+ }
122
+ /**
123
+ * The evidence of one slot from its verified fact history (amendment D).
124
+ * Versions append, so a currentVersion above the slot is normal. A slot's
125
+ * commitment is write-once, so contradiction is absorbing: two commitments
126
+ * for the slot, an absent fact later than a committed one, facts about two
127
+ * slots, one block number with two hashes, or facts from two authorities.
128
+ * Otherwise the fact with the highest block number decides, and among facts
129
+ * at that block the last observed. `facts` must be in observation order.
130
+ */
131
+ export declare function indexEvidenceFromFacts(facts: readonly FinalizedFact[]): IndexEvidence;
132
+ //# sourceMappingURL=copy-promotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-promotion.d.ts","sourceRoot":"","sources":["../../src/replication/copy-promotion.ts"],"names":[],"mappings":"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"}