@powerhousedao/shared 6.2.3-dev.5 → 6.2.3-dev.50

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 (282) hide show
  1. package/dist/analytics/index.d.ts +4 -4
  2. package/dist/analytics/index.d.ts.map +1 -1
  3. package/dist/analytics/index.js +25 -24
  4. package/dist/analytics/index.js.map +1 -1
  5. package/dist/clis/args/{access-token-To5LaIfL.mjs → access-token-3Hqv_U8I.mjs} +2 -2
  6. package/dist/clis/args/{access-token-To5LaIfL.mjs.map → access-token-3Hqv_U8I.mjs.map} +1 -1
  7. package/dist/clis/args/access-token-C5sKsH2O.d.mts +16 -0
  8. package/dist/clis/args/access-token-C5sKsH2O.d.mts.map +1 -0
  9. package/dist/clis/args/access-token.d.mts +3 -2
  10. package/dist/clis/args/access-token.mjs +1 -1
  11. package/dist/clis/args/{common-CcYbXrBx.mjs → common-BXabdhiO.mjs} +30 -7
  12. package/dist/clis/args/common-BXabdhiO.mjs.map +1 -0
  13. package/dist/clis/args/common-Bnm859xU.d.mts +186 -0
  14. package/dist/clis/args/common-Bnm859xU.d.mts.map +1 -0
  15. package/dist/clis/args/common.d.mts +3 -2
  16. package/dist/clis/args/common.mjs +1 -1
  17. package/dist/clis/args/{connect-BVVvCmL9.mjs → connect-BG3HkYBk.mjs} +8 -3
  18. package/dist/clis/args/connect-BG3HkYBk.mjs.map +1 -0
  19. package/dist/clis/args/connect-DjeiqXus.d.mts +450 -0
  20. package/dist/clis/args/connect-DjeiqXus.d.mts.map +1 -0
  21. package/dist/clis/args/connect.d.mts +3 -2
  22. package/dist/clis/args/connect.mjs +1 -1
  23. package/dist/clis/args/dist-CorQTQL-.mjs +1533 -0
  24. package/dist/clis/args/dist-CorQTQL-.mjs.map +1 -0
  25. package/dist/clis/args/{generate-CA916Fvj.mjs → generate-BOItUNvP.mjs} +40 -2
  26. package/dist/clis/args/generate-BOItUNvP.mjs.map +1 -0
  27. package/dist/clis/args/generate-BPBBLeUD.d.mts +103 -0
  28. package/dist/clis/args/generate-BPBBLeUD.d.mts.map +1 -0
  29. package/dist/clis/args/generate.d.mts +3 -2
  30. package/dist/clis/args/generate.mjs +1 -1
  31. package/dist/clis/args/{help-Bqbgbalu.mjs → help-DS1NlcJQ.mjs} +15 -15
  32. package/dist/clis/args/{help-Bqbgbalu.mjs.map → help-DS1NlcJQ.mjs.map} +1 -1
  33. package/dist/clis/args/help-DVPTARGn.d.mts +190 -0
  34. package/dist/clis/args/help-DVPTARGn.d.mts.map +1 -0
  35. package/dist/clis/args/help.d.mts +3 -2
  36. package/dist/clis/args/help.mjs +1 -1
  37. package/dist/clis/args/index.d.mts +20 -19
  38. package/dist/clis/args/index.mjs +18 -18
  39. package/dist/clis/args/init-CFeTq4Cq.d.mts +52 -0
  40. package/dist/clis/args/init-CFeTq4Cq.d.mts.map +1 -0
  41. package/dist/clis/args/{init-rz9Ei7nq.mjs → init-Dvb42Y87.mjs} +2 -2
  42. package/dist/clis/args/{init-rz9Ei7nq.mjs.map → init-Dvb42Y87.mjs.map} +1 -1
  43. package/dist/clis/args/init.d.mts +3 -2
  44. package/dist/clis/args/init.mjs +1 -1
  45. package/dist/clis/args/inspect-BjRmtB86.d.mts +13 -0
  46. package/dist/clis/args/inspect-BjRmtB86.d.mts.map +1 -0
  47. package/dist/clis/args/{inspect-tckH8mSw.mjs → inspect-UNQgtuR0.mjs} +2 -2
  48. package/dist/clis/args/{inspect-tckH8mSw.mjs.map → inspect-UNQgtuR0.mjs.map} +1 -1
  49. package/dist/clis/args/inspect.d.mts +3 -2
  50. package/dist/clis/args/inspect.mjs +1 -1
  51. package/dist/clis/args/install-B0tMyUMw.d.mts +37 -0
  52. package/dist/clis/args/install-B0tMyUMw.d.mts.map +1 -0
  53. package/dist/clis/args/{install-Sz2DlCHh.mjs → install-F-27kF6m.mjs} +2 -2
  54. package/dist/clis/args/{install-Sz2DlCHh.mjs.map → install-F-27kF6m.mjs.map} +1 -1
  55. package/dist/clis/args/install.d.mts +3 -2
  56. package/dist/clis/args/install.mjs +1 -1
  57. package/dist/clis/args/{list-DM2d6f1m.mjs → list-Bkfn8Yuo.mjs} +2 -2
  58. package/dist/clis/args/{list-DM2d6f1m.mjs.map → list-Bkfn8Yuo.mjs.map} +1 -1
  59. package/dist/clis/args/list-DrbxA7JJ.d.mts +10 -0
  60. package/dist/clis/args/list-DrbxA7JJ.d.mts.map +1 -0
  61. package/dist/clis/args/list.d.mts +3 -2
  62. package/dist/clis/args/list.mjs +1 -1
  63. package/dist/clis/args/{login-DiKT5Jfu.mjs → login-CIFkQExi.mjs} +2 -2
  64. package/dist/clis/args/{login-DiKT5Jfu.mjs.map → login-CIFkQExi.mjs.map} +1 -1
  65. package/dist/clis/args/login-CXRJXg71.d.mts +25 -0
  66. package/dist/clis/args/login-CXRJXg71.d.mts.map +1 -0
  67. package/dist/clis/args/login.d.mts +3 -2
  68. package/dist/clis/args/login.mjs +1 -1
  69. package/dist/clis/args/migrate-DkCQRL2D.d.mts +19 -0
  70. package/dist/clis/args/migrate-DkCQRL2D.d.mts.map +1 -0
  71. package/dist/clis/args/{migrate-CG_gWc4k.mjs → migrate-DwJGhc2d.mjs} +2 -2
  72. package/dist/clis/args/{migrate-CG_gWc4k.mjs.map → migrate-DwJGhc2d.mjs.map} +1 -1
  73. package/dist/clis/args/migrate.d.mts +3 -2
  74. package/dist/clis/args/migrate.mjs +1 -1
  75. package/dist/clis/args/publish-CeW4bOrl.d.mts +16 -0
  76. package/dist/clis/args/publish-CeW4bOrl.d.mts.map +1 -0
  77. package/dist/clis/args/{publish-DDZYsUfV.mjs → publish-DHqlGWmL.mjs} +2 -2
  78. package/dist/clis/args/{publish-DDZYsUfV.mjs.map → publish-DHqlGWmL.mjs.map} +1 -1
  79. package/dist/clis/args/publish.d.mts +3 -2
  80. package/dist/clis/args/publish.mjs +1 -1
  81. package/dist/clis/args/{registry-C_OVFQmI.mjs → registry-DIwES3l2.mjs} +2 -2
  82. package/dist/clis/args/{registry-C_OVFQmI.mjs.map → registry-DIwES3l2.mjs.map} +1 -1
  83. package/dist/clis/args/registry-DNH8xuaE.d.mts +17 -0
  84. package/dist/clis/args/registry-DNH8xuaE.d.mts.map +1 -0
  85. package/dist/clis/args/registry.d.mts +3 -2
  86. package/dist/clis/args/registry.mjs +1 -1
  87. package/dist/clis/args/service-CHjY5epu.d.mts +27 -0
  88. package/dist/clis/args/service-CHjY5epu.d.mts.map +1 -0
  89. package/dist/clis/args/{service-CHOOr0Gg.mjs → service-Cpjlyeu5.mjs} +2 -2
  90. package/dist/clis/args/{service-CHOOr0Gg.mjs.map → service-Cpjlyeu5.mjs.map} +1 -1
  91. package/dist/clis/args/service.d.mts +3 -2
  92. package/dist/clis/args/service.mjs +1 -1
  93. package/dist/clis/args/{switchboard-Dsp7nosi.mjs → switchboard-CCaAtU56.mjs} +2 -2
  94. package/dist/clis/args/{switchboard-Dsp7nosi.mjs.map → switchboard-CCaAtU56.mjs.map} +1 -1
  95. package/dist/clis/args/switchboard-RrNb1fUH.d.mts +70 -0
  96. package/dist/clis/args/switchboard-RrNb1fUH.d.mts.map +1 -0
  97. package/dist/clis/args/switchboard.d.mts +3 -2
  98. package/dist/clis/args/switchboard.mjs +1 -1
  99. package/dist/clis/args/{uninstall-CTwTX0u_.mjs → uninstall-3U0B8g5c.mjs} +2 -2
  100. package/dist/clis/args/{uninstall-CTwTX0u_.mjs.map → uninstall-3U0B8g5c.mjs.map} +1 -1
  101. package/dist/clis/args/uninstall-CDx7lwxn.d.mts +28 -0
  102. package/dist/clis/args/uninstall-CDx7lwxn.d.mts.map +1 -0
  103. package/dist/clis/args/uninstall.d.mts +3 -2
  104. package/dist/clis/args/uninstall.mjs +1 -1
  105. package/dist/clis/args/unpublish-CEDsk6uv.d.mts +22 -0
  106. package/dist/clis/args/unpublish-CEDsk6uv.d.mts.map +1 -0
  107. package/dist/clis/args/{unpublish-BPMkGEg5.mjs → unpublish-s9zUh6Gw.mjs} +2 -2
  108. package/dist/clis/args/{unpublish-BPMkGEg5.mjs.map → unpublish-s9zUh6Gw.mjs.map} +1 -1
  109. package/dist/clis/args/unpublish.d.mts +3 -2
  110. package/dist/clis/args/unpublish.mjs +1 -1
  111. package/dist/clis/args/{vetra-b4KUu1Ax.mjs → vetra-BUNlAAPp.mjs} +2 -2
  112. package/dist/clis/args/{vetra-b4KUu1Ax.mjs.map → vetra-BUNlAAPp.mjs.map} +1 -1
  113. package/dist/clis/args/vetra-DkDaWFPi.d.mts +111 -0
  114. package/dist/clis/args/vetra-DkDaWFPi.d.mts.map +1 -0
  115. package/dist/clis/args/vetra-ports.test.d.mts +2 -1
  116. package/dist/clis/args/vetra-ports.test.mjs +7366 -5728
  117. package/dist/clis/args/vetra-ports.test.mjs.map +1 -1
  118. package/dist/clis/args/vetra.d.mts +3 -2
  119. package/dist/clis/args/vetra.mjs +1 -1
  120. package/dist/clis/build-config-CR5lvv_A.mjs +231 -0
  121. package/dist/clis/build-config-CR5lvv_A.mjs.map +1 -0
  122. package/dist/clis/build-config.d.mts +44 -10614
  123. package/dist/clis/build-config.d.mts.map +1 -1
  124. package/dist/clis/build-config.mjs +2 -88
  125. package/dist/clis/build-pieces.d.mts +100 -0
  126. package/dist/clis/build-pieces.d.mts.map +1 -0
  127. package/dist/clis/build-pieces.mjs +371 -0
  128. package/dist/clis/build-pieces.mjs.map +1 -0
  129. package/dist/clis/command-names.d.mts +2 -2
  130. package/dist/clis/command-names.d.mts.map +1 -1
  131. package/dist/clis/command-names.mjs.map +1 -1
  132. package/dist/clis/constants.d.mts +3 -462
  133. package/dist/clis/constants.mjs +27 -10
  134. package/dist/clis/constants.mjs.map +1 -1
  135. package/dist/clis/index-6CZwrmQi.d.mts +11154 -0
  136. package/dist/clis/index-6CZwrmQi.d.mts.map +1 -0
  137. package/dist/clis/index.d.mts +1385 -1224
  138. package/dist/clis/index.d.mts.map +1 -1
  139. package/dist/clis/index.mjs +259 -74
  140. package/dist/clis/index.mjs.map +1 -1
  141. package/dist/clis/project-env.d.mts +4 -4
  142. package/dist/clis/project-env.d.mts.map +1 -1
  143. package/dist/clis/project-env.mjs.map +1 -1
  144. package/dist/clis/project-ports.d.mts +5 -5
  145. package/dist/clis/project-ports.d.mts.map +1 -1
  146. package/dist/clis/project-ports.mjs +1 -1
  147. package/dist/clis/project-ports.mjs.map +1 -1
  148. package/dist/clis/services/telemetry.d.mts +7 -7
  149. package/dist/clis/services/telemetry.d.mts.map +1 -1
  150. package/dist/clis/services/telemetry.mjs.map +1 -1
  151. package/dist/clis/types-Cc_rB0Yx.d.mts +541 -0
  152. package/dist/clis/types-Cc_rB0Yx.d.mts.map +1 -0
  153. package/dist/clis/utils.d.mts +4 -4
  154. package/dist/clis/utils.d.mts.map +1 -1
  155. package/dist/clis/utils.mjs.map +1 -1
  156. package/dist/{config-loader-B845Hidf.js → config-loader-CXhzL512.js} +33 -8
  157. package/dist/config-loader-CXhzL512.js.map +1 -0
  158. package/dist/connect/config-loader.d.ts +15 -8
  159. package/dist/connect/config-loader.d.ts.map +1 -1
  160. package/dist/connect/config-loader.js +2 -2
  161. package/dist/connect/index.d.ts +198 -57
  162. package/dist/connect/index.d.ts.map +1 -1
  163. package/dist/connect/index.js +313 -31
  164. package/dist/connect/index.js.map +1 -1
  165. package/dist/connect/json-adapter.d.ts +3 -4
  166. package/dist/connect/json-adapter.d.ts.map +1 -1
  167. package/dist/connect/json-adapter.js.map +1 -1
  168. package/dist/constants-C2K-m7pp.d.ts +9 -0
  169. package/dist/constants-C2K-m7pp.d.ts.map +1 -0
  170. package/dist/constants.d.ts +3 -2
  171. package/dist/constants.js +10 -5
  172. package/dist/constants.js.map +1 -1
  173. package/dist/document-drive/index.d.ts +131 -105
  174. package/dist/document-drive/index.d.ts.map +1 -1
  175. package/dist/document-drive/index.js +116 -54
  176. package/dist/document-drive/index.js.map +1 -1
  177. package/dist/document-model/errors.d.ts +3 -0
  178. package/dist/document-model/errors.js +152 -0
  179. package/dist/document-model/errors.js.map +1 -0
  180. package/dist/document-model/index.d.ts +5 -4
  181. package/dist/document-model/index.js +295 -390
  182. package/dist/document-model/index.js.map +1 -1
  183. package/dist/document-model/mock.d.ts +2 -3
  184. package/dist/document-model/mock.d.ts.map +1 -1
  185. package/dist/document-model/mock.js +2 -1
  186. package/dist/document-model/mock.js.map +1 -1
  187. package/dist/document-model/utils.d.ts +3 -2
  188. package/dist/document-model/utils.js +1 -1
  189. package/dist/document-model/version.d.ts +3 -0
  190. package/dist/document-model/version.js +8 -0
  191. package/dist/document-model/version.js.map +1 -0
  192. package/dist/index-BhqNGLu9.d.ts +36 -0
  193. package/dist/index-BhqNGLu9.d.ts.map +1 -0
  194. package/dist/index.d.ts +7 -6
  195. package/dist/index.js.map +1 -1
  196. package/dist/processors/index.d.ts +3 -2
  197. package/dist/processors/index.js +63 -4
  198. package/dist/processors/index.js.map +1 -1
  199. package/dist/purge-v06m_oGz.js +381 -0
  200. package/dist/purge-v06m_oGz.js.map +1 -0
  201. package/dist/registry/index.d.ts +15 -15
  202. package/dist/registry/index.d.ts.map +1 -1
  203. package/dist/registry/index.js +24 -6
  204. package/dist/registry/index.js.map +1 -1
  205. package/dist/registry/manifest-slim.d.ts +4 -3
  206. package/dist/registry/manifest-slim.d.ts.map +1 -1
  207. package/dist/registry/manifest-slim.js +21 -0
  208. package/dist/registry/manifest-slim.js.map +1 -1
  209. package/dist/registry/updates.d.ts +3 -3
  210. package/dist/registry/updates.d.ts.map +1 -1
  211. package/dist/registry/updates.js.map +1 -1
  212. package/dist/registry/urls.d.ts +2 -2
  213. package/dist/registry/urls.d.ts.map +1 -1
  214. package/dist/registry/urls.js.map +1 -1
  215. package/dist/{types-CpnWmiFY.d.ts → types-BRJfX8ck.d.ts} +2003 -821
  216. package/dist/types-BRJfX8ck.d.ts.map +1 -0
  217. package/dist/{types-YqLqb0Zb.d.ts → types-BTfv_ZzS.d.ts} +39 -43
  218. package/dist/types-BTfv_ZzS.d.ts.map +1 -0
  219. package/dist/{types-C1in4fl3.d.ts → types-Bsp8VL2y.d.ts} +2 -2
  220. package/dist/types-Bsp8VL2y.d.ts.map +1 -0
  221. package/dist/{utils-DP122OSS.d.ts → utils-BrKxCmKx.d.ts} +2 -2
  222. package/dist/utils-BrKxCmKx.d.ts.map +1 -0
  223. package/dist/{utils-aaTmfxFW.js → utils-CSF716ux.js} +10 -3
  224. package/dist/utils-CSF716ux.js.map +1 -0
  225. package/dist/version-BxLITo9P.d.ts +6 -0
  226. package/dist/version-BxLITo9P.d.ts.map +1 -0
  227. package/package.json +11 -6
  228. package/dist/clis/args/access-token--9H57y8J.d.mts +0 -18
  229. package/dist/clis/args/access-token--9H57y8J.d.mts.map +0 -1
  230. package/dist/clis/args/common-CcYbXrBx.mjs.map +0 -1
  231. package/dist/clis/args/common-Y8yh4ax1.d.mts +0 -183
  232. package/dist/clis/args/common-Y8yh4ax1.d.mts.map +0 -1
  233. package/dist/clis/args/connect-BUwHSfdh.d.mts +0 -443
  234. package/dist/clis/args/connect-BUwHSfdh.d.mts.map +0 -1
  235. package/dist/clis/args/connect-BVVvCmL9.mjs.map +0 -1
  236. package/dist/clis/args/generate-CA916Fvj.mjs.map +0 -1
  237. package/dist/clis/args/generate-DnV-bfXt.d.mts +0 -87
  238. package/dist/clis/args/generate-DnV-bfXt.d.mts.map +0 -1
  239. package/dist/clis/args/help-CjAsudUn.d.mts +0 -193
  240. package/dist/clis/args/help-CjAsudUn.d.mts.map +0 -1
  241. package/dist/clis/args/init-CUXyfquF.d.mts +0 -55
  242. package/dist/clis/args/init-CUXyfquF.d.mts.map +0 -1
  243. package/dist/clis/args/inspect-DtZeoA5c.d.mts +0 -15
  244. package/dist/clis/args/inspect-DtZeoA5c.d.mts.map +0 -1
  245. package/dist/clis/args/install-CkP8zcHb.d.mts +0 -40
  246. package/dist/clis/args/install-CkP8zcHb.d.mts.map +0 -1
  247. package/dist/clis/args/list-BGf8s_gj.d.mts +0 -12
  248. package/dist/clis/args/list-BGf8s_gj.d.mts.map +0 -1
  249. package/dist/clis/args/login-DNsHwvqk.d.mts +0 -27
  250. package/dist/clis/args/login-DNsHwvqk.d.mts.map +0 -1
  251. package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs +0 -1013
  252. package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs.map +0 -1
  253. package/dist/clis/args/migrate-sixkWhxm.d.mts +0 -21
  254. package/dist/clis/args/migrate-sixkWhxm.d.mts.map +0 -1
  255. package/dist/clis/args/publish-Dqe5DUst.d.mts +0 -18
  256. package/dist/clis/args/publish-Dqe5DUst.d.mts.map +0 -1
  257. package/dist/clis/args/registry-C_RfTsKB.d.mts +0 -19
  258. package/dist/clis/args/registry-C_RfTsKB.d.mts.map +0 -1
  259. package/dist/clis/args/service-DhIkf8-O.d.mts +0 -22
  260. package/dist/clis/args/service-DhIkf8-O.d.mts.map +0 -1
  261. package/dist/clis/args/switchboard-BlPaq2at.d.mts +0 -72
  262. package/dist/clis/args/switchboard-BlPaq2at.d.mts.map +0 -1
  263. package/dist/clis/args/uninstall-BpA3YYbw.d.mts +0 -31
  264. package/dist/clis/args/uninstall-BpA3YYbw.d.mts.map +0 -1
  265. package/dist/clis/args/unpublish-CvwaIimG.d.mts +0 -24
  266. package/dist/clis/args/unpublish-CvwaIimG.d.mts.map +0 -1
  267. package/dist/clis/args/vetra-DUhIB7Zk.d.mts +0 -113
  268. package/dist/clis/args/vetra-DUhIB7Zk.d.mts.map +0 -1
  269. package/dist/clis/build-config.mjs.map +0 -1
  270. package/dist/clis/constants.d.mts.map +0 -1
  271. package/dist/config-loader-B845Hidf.js.map +0 -1
  272. package/dist/constants-BP_gjn8g.d.ts +0 -8
  273. package/dist/constants-BP_gjn8g.d.ts.map +0 -1
  274. package/dist/index-C_iVZe7f.d.ts +0 -7
  275. package/dist/index-C_iVZe7f.d.ts.map +0 -1
  276. package/dist/index-DyYIJtVy.d.ts +0 -836
  277. package/dist/index-DyYIJtVy.d.ts.map +0 -1
  278. package/dist/types-C1in4fl3.d.ts.map +0 -1
  279. package/dist/types-CpnWmiFY.d.ts.map +0 -1
  280. package/dist/types-YqLqb0Zb.d.ts.map +0 -1
  281. package/dist/utils-DP122OSS.d.ts.map +0 -1
  282. package/dist/utils-aaTmfxFW.js.map +0 -1
@@ -1,8 +1,12 @@
1
- import { a as base58Decode, c as buildOperationSignatureParams, d as hex2ab, i as ab2hex, l as getUnixTimestamp, n as generateId, o as base64UrlToBytes, r as generateMock, s as buildOperationSignatureMessage, t as deriveOperationId, u as hashBrowser } from "../utils-aaTmfxFW.js";
1
+ import { a as base58Decode, c as buildOperationSignatureParams, d as hashBrowser, f as hex2ab, i as ab2hex, l as bytesToBase64Url, n as generateId, o as base64UrlToBytes, r as generateMock, s as buildOperationSignatureMessage, t as deriveOperationId, u as getUnixTimestamp } from "../utils-CSF716ux.js";
2
+ import { A as signActionV2, C as DOCUMENT_SCOPE_ACTION_TYPES, D as canonicalJson, E as actionSigningTarget, M as v2TupleProblem, O as hashActionV2, S as CanonicalJsonError, T as actionSignerIdentity, _ as mergePeerCapabilities, a as purgedProtocolVersions, b as selectProtocolVersions, c as PEER_CAPABILITIES, d as holdReason, f as isOlderManifest, g as manifestRevision, h as localSupports, i as purgeMarkerOperation, j as targetDocumentId, k as isV2ActionHash, l as PEER_MANIFEST_FORMAT, m as localPeerManifest, n as isPurgeMarker, o as DOCUMENT_PURGE_PROTOCOL, p as legacySupports, r as purgeDocumentAction, s as MARKER_REFUSAL_FEATURE, t as PURGE_DOCUMENT, u as coversLocal, v as peerSupports, w as actionPreimageV2, x as ACTION_SIGNATURE_V2_PREFIX, y as readPeerManifest } from "../purge-v06m_oGz.js";
3
+ import { AuthActionNotAllowedError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, HashMismatchError, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, UnsupportedDocumentModelVersionError } from "./errors.js";
4
+ import { normalizeDocumentModelVersion } from "./version.js";
2
5
  import { ZodError, z } from "zod";
3
6
  import { stringify } from "safe-stable-stringify";
7
+ import { sha256 } from "@noble/hashes/sha2.js";
4
8
  import { strFromU8, strToU8, unzip, zip } from "fflate";
5
- import { castDraft, create, unsafe } from "mutative";
9
+ import { castDraft, create, isDraft, original, unsafe } from "mutative";
6
10
  import { constantCase, pascalCase } from "change-case";
7
11
  //#region document-model/signatures.ts
8
12
  /**
@@ -105,160 +109,9 @@ function toTransportSignerApp(app) {
105
109
  };
106
110
  }
107
111
  //#endregion
108
- //#region document-model/errors.ts
109
- const FileSystemError = /* @__PURE__ */ new Error("File system not available.");
110
- var InvalidActionInputError = class extends Error {
111
- data;
112
- constructor(data) {
113
- super();
114
- this.name = "InvalidActionInputError";
115
- this.data = data;
116
- this.message = this.message || `Invalid action input: ${JSON.stringify(data, null, 2)}`;
117
- }
118
- };
119
- var InvalidActionInputZodError = class extends InvalidActionInputError {
120
- issues;
121
- constructor(issues) {
122
- super(issues);
123
- this.issues = issues;
124
- this.name = "InvalidActionInputZodError";
125
- }
126
- };
127
- /**
128
- * Error thrown when attempting to downgrade a document version.
129
- */
130
- var DowngradeNotSupportedError = class extends Error {
131
- documentType;
132
- fromVersion;
133
- toVersion;
134
- constructor(documentType, fromVersion, toVersion) {
135
- super(`Downgrade not supported for ${documentType}: cannot upgrade from version ${fromVersion} to ${toVersion}`);
136
- this.name = "DowngradeNotSupportedError";
137
- this.documentType = documentType;
138
- this.fromVersion = fromVersion;
139
- this.toVersion = toVersion;
140
- }
141
- };
142
- /**
143
- * Thrown when INITIALIZE_AUTH is applied to an already-initialized auth scope.
144
- * The genesis action is valid only at auth revision zero.
145
- */
146
- var AuthAlreadyInitializedError = class extends Error {
147
- documentId;
148
- constructor(documentId) {
149
- super(`Auth scope already initialized for document ${documentId}: INITIALIZE_AUTH is valid only at auth revision zero`);
150
- this.name = "AuthAlreadyInitializedError";
151
- this.documentId = documentId;
152
- }
153
- };
154
- /**
155
- * Thrown when INITIALIZE_AUTH is not signed by the document creator (its signer
156
- * does not match `header.sig.publicKey`), so it cannot set the auth policy.
157
- */
158
- var AuthInitializerNotCreatorError = class extends Error {
159
- documentId;
160
- constructor(documentId) {
161
- super(`INITIALIZE_AUTH for document ${documentId} must be signed by the document creator`);
162
- this.name = "AuthInitializerNotCreatorError";
163
- this.documentId = documentId;
164
- }
165
- };
166
- /**
167
- * Thrown when INITIALIZE_AUTH carries a version below 1. Version 0 is reserved
168
- * for the uninitialized auth scope.
169
- */
170
- var InvalidAuthVersionError = class extends Error {
171
- documentId;
172
- version;
173
- constructor(documentId, version) {
174
- super(`Invalid auth policy version ${version} for document ${documentId}: INITIALIZE_AUTH requires an integer version >= 1`);
175
- this.name = "InvalidAuthVersionError";
176
- this.documentId = documentId;
177
- this.version = version;
178
- }
179
- };
180
- /** Thrown when a duplicate would lose the source policy's version or creator binding. */
181
- var AuthPolicyNotPreservedError = class extends Error {
182
- documentId;
183
- constructor(documentId) {
184
- super(`Duplicating document ${documentId} would not preserve its auth policy: the copy loses the policy version or its creator binding`);
185
- this.name = "AuthPolicyNotPreservedError";
186
- this.documentId = documentId;
187
- }
188
- };
189
- /**
190
- * Thrown when a grant referenced by REMOVE_GRANT or MOVE_GRANT does not exist.
191
- */
192
- var GrantNotFoundError = class extends Error {
193
- grantId;
194
- constructor(grantId) {
195
- super(`Grant not found in auth scope: ${grantId}`);
196
- this.name = "GrantNotFoundError";
197
- this.grantId = grantId;
198
- }
199
- };
200
- /**
201
- * Thrown when a disallowed action (UNDO, REDO, PRUNE) targets the auth scope.
202
- */
203
- var AuthActionNotAllowedError = class extends Error {
204
- actionType;
205
- constructor(actionType) {
206
- super(`${actionType} is not permitted on the auth scope`);
207
- this.name = "AuthActionNotAllowedError";
208
- this.actionType = actionType;
209
- }
210
- };
211
- var HashMismatchError = class extends Error {
212
- _scope;
213
- _document;
214
- _operation;
215
- constructor(scope, document, operation) {
216
- super();
217
- this.name = "HashMismatchError";
218
- this._document = document;
219
- this._scope = scope;
220
- this._operation = operation;
221
- this.message = JSON.stringify({
222
- error: `Hash mismatch on document ${document.header.id}, scope ${scope}, index ${operation.index}`,
223
- document,
224
- operation
225
- }, null, 1);
226
- }
227
- get document() {
228
- return this._document;
229
- }
230
- get scope() {
231
- return this._scope;
232
- }
233
- get operation() {
234
- return this._operation;
235
- }
236
- };
237
- /**
238
- * Thrown when replay or import requires a document model version that is not
239
- * registered. Carries the data the UI needs to explain the mismatch.
240
- */
241
- var UnsupportedDocumentModelVersionError = class extends Error {
242
- documentType;
243
- requiredVersion;
244
- availableVersions;
245
- constructor(documentType, requiredVersion, availableVersions) {
246
- super(`No reducer registered for document version ${requiredVersion}. Available versions: ${availableVersions.join(", ")}`);
247
- this.name = "UnsupportedDocumentModelVersionError";
248
- this.documentType = documentType;
249
- this.requiredVersion = requiredVersion;
250
- this.availableVersions = availableVersions;
251
- }
252
- static isError(error) {
253
- return Error.isError(error) && error.name === "UnsupportedDocumentModelVersionError";
254
- }
255
- };
256
- //#endregion
257
112
  //#region document-model/schemas.ts
258
113
  const isDefinedNonNullAny = (v) => v !== void 0 && v !== null;
259
114
  const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v));
260
- const Load_StateSchema = z.enum(["LOAD_STATE"]);
261
- const PruneSchema = z.enum(["PRUNE"]);
262
115
  const RedoSchema = z.enum(["REDO"]);
263
116
  const Set_NameSchema = z.enum(["SET_NAME"]);
264
117
  const Set_PreferredEditorSchema = z.enum(["SET_PREFERRED_EDITOR"]);
@@ -268,50 +121,12 @@ function OperationScopeSchema() {
268
121
  }
269
122
  function DocumentActionSchema() {
270
123
  return z.union([
271
- LoadStateActionSchema(),
272
- PruneActionSchema(),
273
124
  RedoActionSchema(),
274
125
  SetNameActionSchema(),
275
126
  SetPreferredEditorActionSchema(),
276
127
  UndoActionSchema()
277
128
  ]);
278
129
  }
279
- function LoadStateActionSchema() {
280
- return z.object({
281
- id: z.string(),
282
- timestampUtcMs: z.string(),
283
- input: z.lazy(() => LoadStateActionInputSchema()),
284
- type: Load_StateSchema,
285
- scope: OperationScopeSchema()
286
- });
287
- }
288
- function LoadStateActionInputSchema() {
289
- return z.object({
290
- operations: z.number(),
291
- state: z.lazy(() => LoadStateActionStateInputSchema())
292
- });
293
- }
294
- function LoadStateActionStateInputSchema() {
295
- return z.object({
296
- data: z.unknown().nullish(),
297
- name: z.string()
298
- });
299
- }
300
- function PruneActionSchema() {
301
- return z.object({
302
- id: z.string(),
303
- timestampUtcMs: z.string(),
304
- input: z.lazy(() => PruneActionInputSchema()),
305
- type: PruneSchema,
306
- scope: OperationScopeSchema()
307
- });
308
- }
309
- function PruneActionInputSchema() {
310
- return z.object({
311
- end: z.number().nullish(),
312
- start: z.number().nullish()
313
- });
314
- }
315
130
  function RedoActionInputSchema() {
316
131
  return z.object({ count: z.number() });
317
132
  }
@@ -729,6 +544,13 @@ const PowerhouseModuleSchema = z.object({
729
544
  documentTypes: z.array(z.string()).optional()
730
545
  });
731
546
  const PowerhouseModulesSchema = z.array(PowerhouseModuleSchema).optional();
547
+ const PieceModuleSchema = PowerhouseModuleSchema.extend({
548
+ version: z.string().optional(),
549
+ description: z.string().optional(),
550
+ bundle: z.string().optional(),
551
+ descriptor: z.string().optional()
552
+ });
553
+ const PieceModulesSchema = z.array(PieceModuleSchema).optional();
732
554
  const PublisherSchema = z.object({
733
555
  name: z.string().optional(),
734
556
  url: z.string().optional()
@@ -739,7 +561,7 @@ const ConfigEntrySchema = z.object({
739
561
  type: ConfigEntryTypeSchema,
740
562
  description: z.string().optional(),
741
563
  required: z.boolean().optional(),
742
- default: z.boolean().optional()
564
+ default: z.string().optional()
743
565
  });
744
566
  const PwaUrlPatternSchema = z.union([z.string(), z.strictObject({
745
567
  source: z.string(),
@@ -835,6 +657,7 @@ const ManifestSchema = z.object({
835
657
  editors: PowerhouseModulesSchema,
836
658
  processors: PowerhouseModulesSchema,
837
659
  subgraphs: PowerhouseModulesSchema,
660
+ pieces: PieceModulesSchema,
838
661
  config: z.array(ConfigEntrySchema).optional(),
839
662
  pwa: PwaConfigSchema.optional()
840
663
  });
@@ -854,35 +677,6 @@ const undo = (count = 1, scope = "global") => createAction("UNDO", { count }, vo
854
677
  * @category Actions
855
678
  */
856
679
  const redo = (count = 1, scope = "global") => createAction("REDO", { count }, void 0, RedoActionInputSchema, scope);
857
- /**
858
- * Joins multiple operations into a single {@link loadState | LOAD_STATE} operation.
859
- *
860
- * @remarks
861
- * Useful to keep operations history smaller. Operations to prune are selected by index,
862
- * similar to the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | slice} method in Arrays.
863
- *
864
- * @param start - Index of the first operation to prune
865
- * @param end - Index of the last operation to prune
866
- * @category Actions
867
- */
868
- const prune = (start, end, scope = "global") => createAction("PRUNE", {
869
- start,
870
- end
871
- }, void 0, PruneActionInputSchema, scope);
872
- /**
873
- * Replaces the state of the document.
874
- *
875
- * @remarks
876
- * This action shouldn't be used directly. It is dispatched by the {@link prune} action.
877
- *
878
- * @param state - State to be set in the document.
879
- * @param operations - Number of operations that were removed from the previous state.
880
- * @category Actions
881
- */
882
- const loadState = (state, operations) => createAction("LOAD_STATE", {
883
- state,
884
- operations
885
- }, void 0, LoadStateActionInputSchema);
886
680
  const noop = (scope = "global") => createAction("NOOP", {}, void 0, void 0, scope);
887
681
  /**
888
682
  * Helper function to be used by action creators.
@@ -980,6 +774,7 @@ async function buildOperationSignature(context, signMethod) {
980
774
  const signature = await signMethod(buildOperationSignatureMessage(params));
981
775
  return [...params, `0x${ab2hex(signature)}`];
982
776
  }
777
+ /** @deprecated Emits a legacy SHA-1 tuple; sign through `ISigner.signAction`. */
983
778
  async function buildSignedAction(action, reducer, document, signer, signHandler) {
984
779
  const scopeOperations = reducer(document, action, void 0, { reuseOperationResultingState: true }).operations[action.scope];
985
780
  if (!scopeOperations) throw new Error(`No operations found for scope: ${action.scope}`);
@@ -992,8 +787,10 @@ async function buildSignedAction(action, reducer, document, signer, signHandler)
992
787
  action,
993
788
  previousStateHash
994
789
  }, signHandler);
995
- return operationWithContext(operation, { signer: actionSigner(signer.user, signer.app, [...signer.signatures, signature]) });
790
+ const actionContext = { signer: actionSigner(signer.user, signer.app, [...signer.signatures, signature]) };
791
+ return operationWithContext(operation, actionContext);
996
792
  }
793
+ /** @deprecated Use `verifyActionSignature` from `@powerhousedao/reactor`. */
997
794
  async function verifyOperationSignature(signature, signer, verifyHandler) {
998
795
  const publicKey = signer.app.key;
999
796
  const params = signature.slice(0, 4);
@@ -1068,8 +865,6 @@ const baseActions = {
1068
865
  setPreferredEditor,
1069
866
  undo,
1070
867
  redo,
1071
- prune,
1072
- loadState,
1073
868
  noop
1074
869
  };
1075
870
  const documentModelActions = {
@@ -1187,7 +982,7 @@ var AuthAdministrationMissingError = class extends Error {
1187
982
  this.name = "AuthAdministrationMissingError";
1188
983
  }
1189
984
  };
1190
- const GRANT_KEYS = new Set([
985
+ const GRANT_KEYS = /* @__PURE__ */ new Set([
1191
986
  "id",
1192
987
  "description",
1193
988
  "effect",
@@ -1195,13 +990,13 @@ const GRANT_KEYS = new Set([
1195
990
  "capability",
1196
991
  "where"
1197
992
  ]);
1198
- const PRINCIPAL_KINDS = new Set([
993
+ const PRINCIPAL_KINDS = /* @__PURE__ */ new Set([
1199
994
  "anyone",
1200
995
  "address",
1201
996
  "group",
1202
997
  "match"
1203
998
  ]);
1204
- const COMPARISON_CONDITION_KINDS = new Set([
999
+ const COMPARISON_CONDITION_KINDS = /* @__PURE__ */ new Set([
1205
1000
  "eq",
1206
1001
  "ne",
1207
1002
  "lt",
@@ -2530,12 +2325,12 @@ function assertAuthPreservedOnDuplicate(documentId, source, duplicated) {
2530
2325
  * The auth scope a state snapshot may install, given the policy already there.
2531
2326
  *
2532
2327
  * `applyAuthAction` is the validated door onto `state.auth`, but a whole-state
2533
- * snapshot (UPGRADE_DOCUMENT's `initialState`, LOAD_STATE's `data`) replaces the
2534
- * scope wholesale and is authorized as a `document`-scope write. Without this,
2535
- * a subject holding `execute` on `document` and no auth grant at all can install
2536
- * a policy of its choosing, name itself `creator` (which exempts the policy from
2537
- * the retention rule for good), or wipe an existing policy by carrying the
2538
- * default uninitialized one.
2328
+ * snapshot (UPGRADE_DOCUMENT's `initialState`) replaces the scope wholesale and
2329
+ * is authorized as a `document`-scope write. Without this, a subject holding
2330
+ * `execute` on `document` and no auth grant at all can install a policy of its
2331
+ * choosing, name itself `creator` (which exempts the policy from the retention
2332
+ * rule for good), or wipe an existing policy by carrying the default
2333
+ * uninitialized one.
2539
2334
  *
2540
2335
  * Three cases:
2541
2336
  *
@@ -2562,13 +2357,9 @@ function resolveSnapshotAuth(documentId, documentType, current, incoming) {
2562
2357
  assertValidInitialGrants(incoming.grants, documentType, incoming.creator);
2563
2358
  return incoming;
2564
2359
  }
2565
- /** UNDO, REDO and PRUNE are rejected on the auth scope. */
2360
+ /** UNDO and REDO are rejected on the auth scope. */
2566
2361
  function assertAuthScopeActionAllowed(action) {
2567
- if (action.scope === "auth" && [
2568
- "UNDO",
2569
- "REDO",
2570
- "PRUNE"
2571
- ].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
2362
+ if (action.scope === "auth" && ["UNDO", "REDO"].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
2572
2363
  }
2573
2364
  /**
2574
2365
  * Evaluates the auth policy for a single request and reports why it refused.
@@ -2674,6 +2465,63 @@ function assertIsDocumentModelDocument(document) {
2674
2465
  DocumentModelSchema.parse(document);
2675
2466
  }
2676
2467
  //#endregion
2468
+ //#region document-model/signature-policy.ts
2469
+ /** The `protocolVersions` key that fixes a document's signature requirement. */
2470
+ const SIGNATURE_PROTOCOL = "signature";
2471
+ /** `protocolVersions.signature` of a document that requires v2 tuples. */
2472
+ const SIGNATURE_PROTOCOL_V2 = 2;
2473
+ /** What a new document is created as unless the caller or host says otherwise. */
2474
+ const DEFAULT_SIGNATURE_POLICY = "v2-required";
2475
+ function isSignaturePolicy(value) {
2476
+ return value === "legacy" || value === "v2-required";
2477
+ }
2478
+ const DERIVED_ID = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
2479
+ /** Read from a header, a CREATE_DOCUMENT input or a bare map. */
2480
+ function signaturePolicyOf(source) {
2481
+ const version = (source && "protocolVersions" in source ? source.protocolVersions : source)?.[SIGNATURE_PROTOCOL];
2482
+ return typeof version === "number" && version >= 2 ? "v2-required" : "legacy";
2483
+ }
2484
+ /** `protocolVersions` for a new v2-required document. */
2485
+ function v2RequiredProtocolVersions(base = {}) {
2486
+ return {
2487
+ "base-reducer": 2,
2488
+ ...base,
2489
+ [SIGNATURE_PROTOCOL]: 2
2490
+ };
2491
+ }
2492
+ /**
2493
+ * The policy a create call asks for: `signaturePolicy`, else the `signature`
2494
+ * key of its `protocolVersions`, else `fallback`, the host's default.
2495
+ */
2496
+ function requestedSignaturePolicy(request, fallback) {
2497
+ if (request?.signaturePolicy) return request.signaturePolicy;
2498
+ if (request?.protocolVersions?.["signature"] !== void 0) return signaturePolicyOf(request.protocolVersions);
2499
+ return fallback;
2500
+ }
2501
+ /** `protocolVersions` for a new document under `policy`, over `base`. */
2502
+ function protocolVersionsFor(policy, base = {}) {
2503
+ if (policy === "v2-required") return v2RequiredProtocolVersions(base);
2504
+ const { [SIGNATURE_PROTOCOL]: _signature, ...rest } = base;
2505
+ return {
2506
+ "base-reducer": 2,
2507
+ ...rest
2508
+ };
2509
+ }
2510
+ /** `base64url(sha256(canonicalJson(params)))`, unpadded. */
2511
+ function deriveDocumentId(params) {
2512
+ const preimage = canonicalJson({
2513
+ documentType: params.documentType,
2514
+ createdAtUtcIso: params.createdAtUtcIso,
2515
+ nonce: params.nonce,
2516
+ protocolVersions: params.protocolVersions
2517
+ }, "document id");
2518
+ return bytesToBase64Url(sha256(new TextEncoder().encode(preimage)));
2519
+ }
2520
+ /** Whether `id` has the shape `deriveDocumentId` produces. */
2521
+ function isDerivedDocumentId(id) {
2522
+ return DERIVED_ID.test(id);
2523
+ }
2524
+ //#endregion
2677
2525
  //#region document-model/header.ts
2678
2526
  /**
2679
2527
  * Generates a deterministic payload from signing parameters
@@ -2693,11 +2541,11 @@ async function createVerificationSigner(pubKey) {
2693
2541
  }, true, ["verify"]);
2694
2542
  return {
2695
2543
  publicKey: cryptoKey,
2696
- async sign(_data) {
2697
- throw new Error("verification-only signer cannot sign data");
2544
+ sign(_data) {
2545
+ return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign data"));
2698
2546
  },
2699
- async signAction(_action, _abortSignal) {
2700
- throw new Error("verification-only signer cannot sign actions");
2547
+ signAction(_action, _target, _abortSignal) {
2548
+ return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign actions"));
2701
2549
  },
2702
2550
  async verify(data, signature) {
2703
2551
  let isValid;
@@ -2767,26 +2615,68 @@ const validateHeader = async (header) => {
2767
2615
  * Creates a header that has yet to be signed. This header is not valid, but
2768
2616
  * can be input into {@link createSignedHeader} to create a signed header.
2769
2617
  *
2618
+ * With `protocolVersions` requiring v2 signatures the header takes a random
2619
+ * nonce and the id {@link deriveDocumentId} gives, so `id` must be omitted.
2620
+ *
2770
2621
  * @returns An unsigned header for a document.
2771
2622
  */
2772
- const createPresignedHeader = (id = generateId(), documentType = "") => {
2773
- return {
2774
- id,
2623
+ const createPresignedHeader = (id, documentType = "", protocolVersions) => {
2624
+ const createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();
2625
+ const header = {
2626
+ id: id ?? generateId(),
2775
2627
  sig: {
2776
2628
  publicKey: {},
2777
2629
  nonce: ""
2778
2630
  },
2779
2631
  documentType,
2780
- createdAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),
2632
+ createdAtUtcIso,
2781
2633
  slug: "",
2782
2634
  name: "",
2783
2635
  branch: "main",
2784
2636
  revision: { document: 0 },
2785
- lastModifiedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),
2637
+ lastModifiedAtUtcIso: createdAtUtcIso,
2786
2638
  meta: {}
2787
2639
  };
2640
+ if (protocolVersions === void 0) return header;
2641
+ header.protocolVersions = { ...protocolVersions };
2642
+ if (signaturePolicyOf(header) === "legacy") return header;
2643
+ if (id !== void 0) throw new Error(`A v2-required document's id is derived from its header; cannot use ${id}`);
2644
+ header.sig.nonce = generateId();
2645
+ header.id = deriveDocumentId({
2646
+ documentType,
2647
+ createdAtUtcIso,
2648
+ nonce: header.sig.nonce,
2649
+ protocolVersions: header.protocolVersions
2650
+ });
2651
+ return header;
2788
2652
  };
2789
2653
  /**
2654
+ * A header for a copy of a document headed `source`. A copy is v2-required
2655
+ * when its source is or when `policy` asks for it, and then takes a derived id;
2656
+ * otherwise it takes `id`. It keeps the source's other protocol versions.
2657
+ */
2658
+ function createCopyHeader(source, id, policy = DEFAULT_SIGNATURE_POLICY) {
2659
+ const base = source.protocolVersions ?? {};
2660
+ if (signaturePolicyOf(source) === "v2-required" || policy === "v2-required") return createPresignedHeader(void 0, source.documentType, protocolVersionsFor("v2-required", base));
2661
+ const header = createPresignedHeader(id, source.documentType);
2662
+ if (source.protocolVersions) header.protocolVersions = { ...source.protocolVersions };
2663
+ return header;
2664
+ }
2665
+ /** Whether a v2-required `header` carries the id its params derive. */
2666
+ function hasDerivedDocumentId(header) {
2667
+ if (signaturePolicyOf(header) === "legacy" || !header.protocolVersions) return false;
2668
+ try {
2669
+ return deriveDocumentId({
2670
+ documentType: header.documentType,
2671
+ createdAtUtcIso: header.createdAtUtcIso,
2672
+ nonce: header.sig.nonce,
2673
+ protocolVersions: header.protocolVersions
2674
+ }) === header.id;
2675
+ } catch {
2676
+ return false;
2677
+ }
2678
+ }
2679
+ /**
2790
2680
  * Creates a new, signed header for a document. This will replace the id of the
2791
2681
  * document.
2792
2682
  *
@@ -2829,7 +2719,8 @@ const createSignedHeader = async (unsignedHeader, documentType, signer) => {
2829
2719
  * some are not. See the PHDocumentHeader type for more information.
2830
2720
  */
2831
2721
  const createSignedHeaderForSigner = async (documentType, signer) => {
2832
- return await createSignedHeader(createPresignedHeader(), documentType, signer);
2722
+ const unsignedHeader = createPresignedHeader();
2723
+ return await createSignedHeader(unsignedHeader, documentType, signer);
2833
2724
  };
2834
2725
  //#endregion
2835
2726
  //#region document-model/documents.ts
@@ -2847,9 +2738,7 @@ function isDocumentAction(action) {
2847
2738
  "SET_NAME",
2848
2739
  "SET_PREFERRED_EDITOR",
2849
2740
  "UNDO",
2850
- "REDO",
2851
- "PRUNE",
2852
- "LOAD_STATE"
2741
+ "REDO"
2853
2742
  ].includes(action.type);
2854
2743
  }
2855
2744
  /**
@@ -2905,12 +2794,16 @@ function createDocumentScopeOperations(header, state) {
2905
2794
  }
2906
2795
  /**
2907
2796
  * Creates a new document. When `documentType` is given the header is stamped
2908
- * with it and the document-scope operations are seeded.
2797
+ * with it and the document-scope operations are seeded. Without
2798
+ * `protocolVersions` the document is v2-required and takes a derived id; with
2799
+ * them it is v2-required only if they say so (see {@link protocolVersionsFor}).
2909
2800
  */
2910
- function baseCreateDocument(createState, initialState, documentType = "") {
2801
+ function baseCreateDocument(createState, initialState, documentType = "", protocolVersions) {
2911
2802
  const state = createState(initialState);
2912
- const header = createPresignedHeader(generateId(), documentType);
2913
- header.protocolVersions = { "base-reducer": 2 };
2803
+ const header = createPresignedHeader(void 0, documentType, protocolVersions === void 0 ? protocolVersionsFor("v2-required") : {
2804
+ "base-reducer": 2,
2805
+ ...protocolVersions
2806
+ });
2914
2807
  return {
2915
2808
  header,
2916
2809
  state,
@@ -2926,8 +2819,39 @@ function baseCreateDocument(createState, initialState, documentType = "") {
2926
2819
  clipboard: []
2927
2820
  };
2928
2821
  }
2822
+ /**
2823
+ * `document`, not yet created, under a fresh header for `policy`. A legacy
2824
+ * header takes `id` when given; a v2-required one ignores `id` and derives its
2825
+ * own, so a caller that needs a fixed id must ask for legacy.
2826
+ * `protocolVersions` are merged over the document's. Name, slug, branch and
2827
+ * meta carry over. A document already under `policy` is returned as is unless
2828
+ * a legacy `id` or `protocolVersions` are given.
2829
+ */
2830
+ function withSignaturePolicy(document, policy, options = {}) {
2831
+ const id = policy === "legacy" ? options.id : void 0;
2832
+ if (id === void 0 && options.protocolVersions === void 0 && signaturePolicyOf(document.header) === policy) return document;
2833
+ const source = document.header;
2834
+ const header = createPresignedHeader(id, source.documentType, protocolVersionsFor(policy, {
2835
+ ...source.protocolVersions,
2836
+ ...options.protocolVersions
2837
+ }));
2838
+ header.name = source.name;
2839
+ header.slug = source.slug;
2840
+ header.branch = source.branch;
2841
+ header.meta = source.meta;
2842
+ const operations = document.operations.document ? {
2843
+ ...document.operations,
2844
+ document: createDocumentScopeOperations(header, document.state)
2845
+ } : document.operations;
2846
+ return {
2847
+ ...document,
2848
+ header,
2849
+ operations
2850
+ };
2851
+ }
2929
2852
  function hashDocumentStateForScope(document, scope = "global") {
2930
- return hashBrowser(stringify(document.state[scope] || ""));
2853
+ const stateString = stringify(document.state[scope] || "");
2854
+ return hashBrowser(stateString);
2931
2855
  }
2932
2856
  function readOnly(value) {
2933
2857
  return Object.freeze(value);
@@ -3058,7 +2982,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
3058
2982
  const backfilledInitialState = backfillAuthState(initialState);
3059
2983
  let documentState = backfilledInitialState;
3060
2984
  const operationsToReplay = [];
3061
- const allScopes = new Set([
2985
+ const allScopes = /* @__PURE__ */ new Set([
3062
2986
  ...Object.keys(operations),
3063
2987
  "global",
3064
2988
  "local"
@@ -3116,7 +3040,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
3116
3040
  if (operation.hash !== hashDocumentStateForScope(result, scope)) throw new HashMismatchError(scope, result, operation);
3117
3041
  else break;
3118
3042
  }
3119
- const allResultScopes = new Set([
3043
+ const allResultScopes = /* @__PURE__ */ new Set([
3120
3044
  ...Object.keys(result.operations),
3121
3045
  ...Object.keys(operations),
3122
3046
  "global",
@@ -3179,8 +3103,8 @@ function checkCleanedOperationsIntegrity(sortedOperations) {
3179
3103
  index: nextOperation.index,
3180
3104
  skip: nextOperation.skip
3181
3105
  },
3182
- issue: IntegrityIssueType.UNEXPECTED_INDEX,
3183
- category: nextIndex > currentIndex + 1 ? IntegrityIssueSubType.MISSING_INDEX : IntegrityIssueSubType.DUPLICATED_INDEX,
3106
+ issue: "UNEXPECTED_INDEX",
3107
+ category: nextIndex > currentIndex + 1 ? "MISSING_INDEX" : "DUPLICATED_INDEX",
3184
3108
  message: `Expected index ${currentIndex + 1} with skip 0 or equivalent, got index ${nextOperation.index} with skip ${nextOperation.skip}`
3185
3109
  });
3186
3110
  currentIndex = nextOperation.index;
@@ -3290,12 +3214,14 @@ function attachBranch(trunk, newBranch) {
3290
3214
  nextTrunkOperation = trunkCopy.shift();
3291
3215
  }
3292
3216
  if (!nextTrunkOperation) enteredBranch = true;
3293
- else if (!enteredBranch) if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {
3294
- newOperations.shift();
3295
- result.push(nextTrunkOperation);
3296
- } else {
3297
- trunkCopy.unshift(nextTrunkOperation);
3298
- enteredBranch = true;
3217
+ else if (!enteredBranch) {
3218
+ if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {
3219
+ newOperations.shift();
3220
+ result.push(nextTrunkOperation);
3221
+ } else {
3222
+ trunkCopy.unshift(nextTrunkOperation);
3223
+ enteredBranch = true;
3224
+ }
3299
3225
  }
3300
3226
  if (enteredBranch) {
3301
3227
  let nextAppend = newOperations.shift();
@@ -3326,13 +3252,14 @@ function split(sortedTargetOperations, sortedMergeOperations) {
3326
3252
  for (let i = 0; i < maxLength; i++) {
3327
3253
  const targetOperation = sortedTargetOperations[i];
3328
3254
  const mergeOperation = sortedMergeOperations[i];
3329
- if (targetOperation && mergeOperation) if (!splitHappened && operationsAreEqual(targetOperation, mergeOperation)) commonOperations.push(targetOperation);
3330
- else {
3331
- splitHappened = true;
3332
- targetDiffOperations.push(targetOperation);
3333
- mergeDiffOperations.push(mergeOperation);
3334
- }
3335
- else if (targetOperation) targetDiffOperations.push(targetOperation);
3255
+ if (targetOperation && mergeOperation) {
3256
+ if (!splitHappened && operationsAreEqual(targetOperation, mergeOperation)) commonOperations.push(targetOperation);
3257
+ else {
3258
+ splitHappened = true;
3259
+ targetDiffOperations.push(targetOperation);
3260
+ mergeDiffOperations.push(mergeOperation);
3261
+ }
3262
+ } else if (targetOperation) targetDiffOperations.push(targetOperation);
3336
3263
  else if (mergeOperation) mergeDiffOperations.push(mergeOperation);
3337
3264
  }
3338
3265
  return [
@@ -3384,14 +3311,14 @@ function prepareOperations(operationsHistory, newOperations) {
3384
3311
  const sortedOperationsHistory = sortOperations(operationsHistory);
3385
3312
  const sortedOperations = sortOperations(newOperations);
3386
3313
  const integrityErrors = checkCleanedOperationsIntegrity([...sortedOperationsHistory, ...sortedOperations]);
3387
- const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category === IntegrityIssueSubType.MISSING_INDEX)].sort((a, b) => b.operation.index - a.operation.index).pop()?.operation;
3314
+ const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category === "MISSING_INDEX")].sort((a, b) => b.operation.index - a.operation.index).pop()?.operation;
3388
3315
  for (const newOperation of sortedOperations) {
3389
3316
  if (firstMissingIndexOperation && newOperation.index >= firstMissingIndexOperation.index) {
3390
3317
  result.invalidOperations.push(newOperation);
3391
3318
  continue;
3392
3319
  }
3393
3320
  if (integrityErrors.some((integrityError) => {
3394
- return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === IntegrityIssueSubType.DUPLICATED_INDEX;
3321
+ return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === "DUPLICATED_INDEX";
3395
3322
  })) {
3396
3323
  result.duplicatedOperations.push(newOperation);
3397
3324
  continue;
@@ -3620,18 +3547,6 @@ function redoOperation(document, action, skip) {
3620
3547
  });
3621
3548
  });
3622
3549
  }
3623
- function loadStateOperation(document, action) {
3624
- const loaded = backfillAuthState(action.state.data);
3625
- loaded.auth = resolveSnapshotAuth(document.header.id, document.header.documentType, backfillAuthState({ ...document.state }).auth, loaded.auth);
3626
- return {
3627
- ...document,
3628
- header: {
3629
- ...document.header,
3630
- name: action.state.name
3631
- },
3632
- state: loaded
3633
- };
3634
- }
3635
3550
  /**
3636
3551
  * Reads an operation's outcome. A denial takes precedence over a reducer
3637
3552
  * error, since a denied operation never reaches its reducer.
@@ -3664,15 +3579,12 @@ function replayOperations(initialState, clearedOperations, stateReducer, header,
3664
3579
  * @returns The updated document state.
3665
3580
  */
3666
3581
  function updateOperationsForAction(document, action, reuseLastOperationIndex, skip, context) {
3667
- if ([
3668
- "UNDO",
3669
- "REDO",
3670
- "PRUNE"
3671
- ].includes(action.type)) return document;
3582
+ if (["UNDO", "REDO"].includes(action.type)) return document;
3672
3583
  const scope = action.scope;
3673
3584
  const existing = document.operations[scope];
3674
3585
  const lastOperationIndex = existing?.at(-1)?.index ?? -1;
3675
- const newOperation = operationFromAction(action, reuseLastOperationIndex ? lastOperationIndex : lastOperationIndex + 1, skip, context);
3586
+ const index = reuseLastOperationIndex ? lastOperationIndex : lastOperationIndex + 1;
3587
+ const newOperation = operationFromAction(action, index, skip, context);
3676
3588
  const operations = [...existing ?? [], newOperation];
3677
3589
  return {
3678
3590
  ...document,
@@ -3716,20 +3628,17 @@ function updateDocument(document, action, reuseLastOperationIndex, skip, context
3716
3628
  return newDocument;
3717
3629
  }
3718
3630
  /**
3719
- * The base document reducer function that wraps a custom reducer function.
3631
+ * The base document reducer function.
3720
3632
  *
3721
3633
  * @param state The current state of the document.
3722
3634
  * @param action The action being applied to the document.
3723
- * @param wrappedReducer The custom reducer function being wrapped by the base reducer.
3724
3635
  * @returns The updated document state.
3725
3636
  */
3726
- function _baseReducer(document, action, wrappedReducer) {
3637
+ function _baseReducer(document, action) {
3727
3638
  const parsedAction = DocumentActionSchema().parse(action);
3728
3639
  switch (parsedAction.type) {
3729
3640
  case "SET_NAME": return setNameOperation(document, parsedAction.input);
3730
3641
  case "SET_PREFERRED_EDITOR": return setPreferredEditorOperation(document, parsedAction.input);
3731
- case "PRUNE": return pruneOperation(document, parsedAction.input, wrappedReducer);
3732
- case "LOAD_STATE": return loadStateOperation(document, parsedAction.input);
3733
3642
  default: return document;
3734
3643
  }
3735
3644
  }
@@ -3807,7 +3716,7 @@ function processUndoOperation(document, scope, customReducer, reuseOperationResu
3807
3716
  }
3808
3717
  /**
3809
3718
  * Base document reducer that wraps a custom document reducer and handles
3810
- * document-level actions such as undo, redo, prune, and set name.
3719
+ * document-level actions such as undo, redo, and set name.
3811
3720
  *
3812
3721
  * @template TGlobalState - The type of the state of the custom reducer.
3813
3722
  * @template TAction - The type of the actions of the custom reducer.
@@ -3835,7 +3744,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
3835
3744
  ...newDocument,
3836
3745
  clipboard: []
3837
3746
  };
3838
- if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action, customReducer);
3747
+ if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action);
3839
3748
  const operationContext = {
3840
3749
  documentId: document.header.id,
3841
3750
  scope: _action.scope,
@@ -3898,11 +3807,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
3898
3807
  }
3899
3808
  }
3900
3809
  });
3901
- if ([
3902
- "UNDO",
3903
- "REDO",
3904
- "PRUNE"
3905
- ].includes(_action.type)) return newDocument;
3810
+ if (["UNDO", "REDO"].includes(_action.type)) return newDocument;
3906
3811
  const scope = _action.scope || "global";
3907
3812
  const replayHash = options.replayOptions?.operation.hash;
3908
3813
  const hash = replayHash ? replayHash : hashDocumentStateForScope(newDocument, scope);
@@ -3922,7 +3827,6 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
3922
3827
  * - `SET_NAME`
3923
3828
  * - `UNDO`
3924
3829
  * - `REDO`
3925
- * - `PRUNE`
3926
3830
  *
3927
3831
  * It also updates the document-related attributes on every operation.
3928
3832
  *
@@ -3937,46 +3841,6 @@ function createReducer(stateReducer, documentReducer = baseReducer) {
3937
3841
  };
3938
3842
  return reducer;
3939
3843
  }
3940
- function pruneOperation(document, input, wrappedReducer) {
3941
- const operations = document.operations.global;
3942
- if (!operations) throw new Error("No global operations found");
3943
- let { start, end } = input;
3944
- start = start || 0;
3945
- end = end || operations.length;
3946
- const actionsToPrune = operations.slice(start, end);
3947
- const actionsToKeepStart = operations.slice(0, start);
3948
- const actionsToKeepEnd = operations.slice(end);
3949
- const newDocument = replayOperations(document.initialState, {
3950
- ...document.operations,
3951
- global: actionsToKeepStart.concat(actionsToPrune)
3952
- }, wrappedReducer, document.header);
3953
- const newState = newDocument.state;
3954
- const name = newDocument.header.name;
3955
- const loadStateIndex = actionsToKeepStart.length;
3956
- const loadStateTimestamp = actionsToKeepStart.length ? actionsToKeepStart[actionsToKeepStart.length - 1].timestampUtcMs : actionsToKeepEnd.length ? actionsToKeepEnd[0].timestampUtcMs : (/* @__PURE__ */ new Date()).toISOString();
3957
- const action = loadState({
3958
- name,
3959
- ...newState
3960
- }, actionsToPrune.length);
3961
- return replayOperations(document.initialState, {
3962
- ...document.operations,
3963
- global: [
3964
- ...actionsToKeepStart,
3965
- {
3966
- skip: 0,
3967
- ...action,
3968
- action,
3969
- timestampUtcMs: loadStateTimestamp,
3970
- index: loadStateIndex,
3971
- hash: hashDocumentStateForScope({ state: newState }, "global")
3972
- },
3973
- ...actionsToKeepEnd.map((action, index) => ({
3974
- ...action,
3975
- index: loadStateIndex + index + 1
3976
- }))
3977
- ]
3978
- }, wrappedReducer, document.header);
3979
- }
3980
3844
  //#endregion
3981
3845
  //#region document-model/validation.ts
3982
3846
  /**
@@ -3986,11 +3850,10 @@ function pruneOperation(document, input, wrappedReducer) {
3986
3850
  const RESERVED_OPERATION_NAMES = [
3987
3851
  "UNDO",
3988
3852
  "REDO",
3989
- "PRUNE",
3990
- "LOAD_STATE",
3991
3853
  "SET_NAME",
3992
3854
  "SET_PREFERRED_EDITOR",
3993
- "NOOP"
3855
+ "NOOP",
3856
+ "PURGE_DOCUMENT"
3994
3857
  ];
3995
3858
  /**
3996
3859
  * Operation names become the literal action `type` string at runtime and the
@@ -4226,6 +4089,15 @@ function orderBy(items, order) {
4226
4089
  return (rank.get(a.item.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.item.id) ?? Number.MAX_SAFE_INTEGER) || a.index - b.index;
4227
4090
  }).map(({ item }) => item);
4228
4091
  }
4092
+ /**
4093
+ * The untouched base of a mutative draft, or the value itself when it is not a
4094
+ * draft. Build replacement lists from it and freeze them before assigning, as
4095
+ * the drive node reducer does, so finalize skips the walk over the assigned
4096
+ * list. Read before writing: the base does not see this action's mutations.
4097
+ */
4098
+ function readBase(value) {
4099
+ return isDraft(value) ? original(value) : value;
4100
+ }
4229
4101
  const documentModelHeaderReducer = {
4230
4102
  setModelNameOperation(state, action) {
4231
4103
  state.name = action.input.name;
@@ -4275,7 +4147,8 @@ const documentModelModuleReducer = {
4275
4147
  deleteModuleOperation(state, action) {
4276
4148
  findModuleOrThrow(state, action.input.id);
4277
4149
  const latestSpec = state.specifications[state.specifications.length - 1];
4278
- latestSpec.modules = latestSpec.modules.filter((m) => m.id != action.input.id);
4150
+ const modules = readBase(latestSpec).modules.filter((m) => m.id != action.input.id);
4151
+ latestSpec.modules = Object.freeze(modules);
4279
4152
  },
4280
4153
  reorderModulesOperation(state, action) {
4281
4154
  const latestSpec = state.specifications[state.specifications.length - 1];
@@ -4393,14 +4266,20 @@ const documentModelOperationReducer = {
4393
4266
  const matches = latestSpec.modules.flatMap((mod) => mod.operations.filter((op) => op.id === action.input.operationId));
4394
4267
  if (matches.length === 0) throw new Error(`Operation "${action.input.operationId}" not found in the latest specification`);
4395
4268
  if (matches.length > 1) throw new Error(`Operation "${action.input.operationId}" is duplicated in the latest specification`);
4396
- const moved = matches[0];
4397
- for (const mod of latestSpec.modules) mod.operations = mod.operations.filter((op) => op.id !== action.input.operationId);
4398
- targetModule.operations.push(moved);
4269
+ const moved = readBase(matches[0]);
4270
+ for (const mod of latestSpec.modules) {
4271
+ const operations = readBase(mod).operations.filter((op) => op.id !== action.input.operationId);
4272
+ if (mod === targetModule) operations.push(moved);
4273
+ mod.operations = Object.freeze(operations);
4274
+ }
4399
4275
  },
4400
4276
  deleteOperationOperation(state, action) {
4401
4277
  findOperationOrThrow(state, action.input.id);
4402
4278
  const latestSpec = state.specifications[state.specifications.length - 1];
4403
- for (const mod of latestSpec.modules) mod.operations = mod.operations.filter((operation) => operation.id != action.input.id);
4279
+ for (const mod of latestSpec.modules) {
4280
+ const operations = readBase(mod).operations.filter((operation) => operation.id != action.input.id);
4281
+ mod.operations = Object.freeze(operations);
4282
+ }
4404
4283
  },
4405
4284
  reorderModuleOperationsOperation(state, action) {
4406
4285
  const targetModule = findModuleOrThrow(state, action.input.moduleId);
@@ -4438,7 +4317,8 @@ const documentModelStateSchemaReducer = {
4438
4317
  if (!Object.keys(latestSpec.state).includes(action.input.scope)) throw new Error(`Invalid scope: ${action.input.scope}`);
4439
4318
  const scopeState = latestSpec.state[action.input.scope];
4440
4319
  if (!scopeState.examples.some((e) => e.id == action.input.id)) throw new Error(`State example "${action.input.id}" not found in scope "${action.input.scope}"`);
4441
- scopeState.examples = scopeState.examples.filter((e) => e.id != action.input.id);
4320
+ const examples = readBase(scopeState).examples.filter((e) => e.id != action.input.id);
4321
+ scopeState.examples = Object.freeze(examples);
4442
4322
  },
4443
4323
  reorderStateExamplesOperation(state, action) {
4444
4324
  const latestSpec = state.specifications[state.specifications.length - 1];
@@ -4670,17 +4550,6 @@ const documentModelStateReducer = (state, action) => {
4670
4550
  const documentModelReducer = createReducer(documentModelStateReducer);
4671
4551
  //#endregion
4672
4552
  //#region document-model/upgrades.ts
4673
- /**
4674
- * Canonical document-model version normalization: documents stamped with 0
4675
- * or nothing at all predate versioning and are treated as version 1, the
4676
- * same version the registry assigns unversioned modules. Every consumer
4677
- * that resolves a module or compares versions must use this rule; resolving
4678
- * 0 to "latest" instead re-pins a legacy document's history to whichever
4679
- * module happens to be newest.
4680
- */
4681
- function normalizeDocumentModelVersion(version) {
4682
- return version && version > 0 ? version : 1;
4683
- }
4684
4553
  function applyInitialState(document, action) {
4685
4554
  const input = action.input;
4686
4555
  const newState = input.initialState || input.state;
@@ -4708,7 +4577,11 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
4708
4577
  const toVersion = action.input.toVersion;
4709
4578
  if (fromVersion === toVersion && fromVersion > 0) return document;
4710
4579
  if (fromVersion > toVersion) throw new DowngradeNotSupportedError(document.header.documentType, fromVersion, toVersion);
4711
- if (upgradePath) for (const transition of upgradePath) document = transition.upgradeReducer(document, action);
4580
+ if (upgradePath) {
4581
+ const protocolVersions = document.header.protocolVersions;
4582
+ for (const transition of upgradePath) document = transition.upgradeReducer(document, action);
4583
+ document = withProtocolVersions(document, protocolVersions);
4584
+ }
4712
4585
  applyInitialState(document, action);
4713
4586
  document.state.document = {
4714
4587
  ...document.state.document,
@@ -4716,12 +4589,22 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
4716
4589
  };
4717
4590
  return document;
4718
4591
  }
4592
+ /** CREATE_DOCUMENT fixes `protocolVersions`; this puts them back after a reducer. */
4593
+ function withProtocolVersions(document, protocolVersions) {
4594
+ const header = { ...document.header };
4595
+ if (protocolVersions === void 0) delete header.protocolVersions;
4596
+ else header.protocolVersions = { ...protocolVersions };
4597
+ return {
4598
+ ...document,
4599
+ header
4600
+ };
4601
+ }
4719
4602
  /**
4720
- * Applies a DELETE_DOCUMENT action to a document.
4603
+ * Applies a DELETE_DOCUMENT action, or a PURGE_DOCUMENT marker, to a document.
4721
4604
  * Marks the document as deleted in the document scope state.
4722
4605
  */
4723
4606
  function applyDeleteDocumentAction(document, action) {
4724
- const deletedAt = action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();
4607
+ const deletedAt = isPurgeMarker(action) ? action.input.purgedAtUtcIso : action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();
4725
4608
  document.state = {
4726
4609
  ...document.state,
4727
4610
  document: {
@@ -4841,7 +4724,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
4841
4724
  const curr = boundaries[i]?.[s] ?? 0;
4842
4725
  if (boundaries[i]) boundaries[i][s] = Math.max(prev, curr);
4843
4726
  }
4844
- const allScopes = new Set([
4727
+ const allScopes = /* @__PURE__ */ new Set([
4845
4728
  ...Object.keys(operations),
4846
4729
  "global",
4847
4730
  "local"
@@ -4886,7 +4769,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
4886
4769
  const spineActionType = spineOp.action.type;
4887
4770
  if (spineActionType === "CREATE_DOCUMENT" || spineActionType === "UPGRADE_DOCUMENT") continue;
4888
4771
  if (isDenied(spineOp)) continue;
4889
- if (spineActionType === "DELETE_DOCUMENT") document = applyDeleteDocumentAction(document, spineOp.action);
4772
+ if (spineActionType === "DELETE_DOCUMENT" || spineActionType === "PURGE_DOCUMENT") document = applyDeleteDocumentAction(document, spineOp.action);
4890
4773
  else document = reducer(document, spineOp.action, dispatch, {
4891
4774
  ignoreSkipOperations: true,
4892
4775
  checkHashes,
@@ -4928,7 +4811,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
4928
4811
  }
4929
4812
  }
4930
4813
  }
4931
- const allResultScopes = new Set([
4814
+ const allResultScopes = /* @__PURE__ */ new Set([
4932
4815
  ...Object.keys(document.operations),
4933
4816
  ...Object.keys(operations),
4934
4817
  "global",
@@ -5012,22 +4895,22 @@ async function createZip(document) {
5012
4895
  */
5013
4896
  async function createMinimalZip(data) {
5014
4897
  const now = (/* @__PURE__ */ new Date()).toISOString();
5015
- const header = {
5016
- id: data.documentId,
5017
- sig: {
5018
- publicKey: {},
5019
- nonce: ""
5020
- },
5021
- documentType: data.documentType,
5022
- createdAtUtcIso: now,
5023
- slug: data.name,
5024
- name: data.name,
5025
- branch: data.branch,
5026
- revision: {},
5027
- lastModifiedAtUtcIso: now
5028
- };
5029
4898
  return zipAsync({
5030
- "header.json": jsonEntry(header),
4899
+ "header.json": jsonEntry({
4900
+ id: data.documentId,
4901
+ sig: {
4902
+ publicKey: {},
4903
+ nonce: ""
4904
+ },
4905
+ documentType: data.documentType,
4906
+ createdAtUtcIso: now,
4907
+ slug: data.name,
4908
+ name: data.name,
4909
+ branch: data.branch,
4910
+ revision: {},
4911
+ lastModifiedAtUtcIso: now,
4912
+ ...data.protocolVersions && { protocolVersions: data.protocolVersions }
4913
+ }),
5031
4914
  "state.json": jsonEntry(data.state),
5032
4915
  "current-state.json": jsonEntry(data.state),
5033
4916
  "operations.json": jsonEntry({})
@@ -5051,7 +4934,10 @@ async function parseZipData(data) {
5051
4934
  if (!files["header.json"]) throw new Error("Document header not found - file format may be outdated");
5052
4935
  const header = JSON.parse(readEntry(files, "header.json"));
5053
4936
  if (!files["operations.json"]) throw new Error("Operations history not found");
5054
- const clearedOperations = garbageCollectDocumentOperations(JSON.parse(readEntry(files, "operations.json")));
4937
+ const operations = JSON.parse(readEntry(files, "operations.json"));
4938
+ const clearedOperations = garbageCollectDocumentOperations(operations);
4939
+ pinProtocolVersionsToCreate(header, operations);
4940
+ backfillBaseReducerVersion(header);
5055
4941
  const operationsError = validateOperations(clearedOperations);
5056
4942
  if (operationsError.length) {
5057
4943
  const errorMessages = operationsError.map((err) => err.message);
@@ -5063,6 +4949,25 @@ async function parseZipData(data) {
5063
4949
  clearedOperations
5064
4950
  };
5065
4951
  }
4952
+ /** header.json is a snapshot; the stored CREATE_DOCUMENT input wins. */
4953
+ function pinProtocolVersionsToCreate(header, operations) {
4954
+ const create = operations.document?.find((operation) => operation.action.type === "CREATE_DOCUMENT");
4955
+ if (!create) return;
4956
+ const input = create.action.input;
4957
+ if (input?.protocolVersions) header.protocolVersions = { ...input.protocolVersions };
4958
+ else if (header.protocolVersions) {
4959
+ const { [SIGNATURE_PROTOCOL]: _dropped, ...rest } = header.protocolVersions;
4960
+ header.protocolVersions = rest;
4961
+ }
4962
+ }
4963
+ /** A zip with no recorded base-reducer version predates it: replay as v1. */
4964
+ function backfillBaseReducerVersion(header) {
4965
+ if (typeof header.protocolVersions?.["base-reducer"] === "number") return;
4966
+ header.protocolVersions = {
4967
+ ...header.protocolVersions,
4968
+ "base-reducer": 1
4969
+ };
4970
+ }
5066
4971
  async function loadFromZipData(data, reducer, options) {
5067
4972
  const { initialState, header, clearedOperations } = await parseZipData(data);
5068
4973
  return {
@@ -5138,6 +5043,6 @@ const getFileBrowser = (file) => {
5138
5043
  return Promise.resolve().then(() => readFileBrowser(file));
5139
5044
  };
5140
5045
  //#endregion
5141
- export { AUTH_ACTION_TYPES, AUTH_DENIED_BY_GRANT_REASON, AUTH_NO_GRANT_REASON, AUTH_VERSION_UNSUPPORTED_REASON, AddChangeLogItemInputSchema, AddModuleInputSchema, AddOperationErrorInputSchema, AddOperationExampleInputSchema, AddOperationInputSchema, AddStateExampleInputSchema, AuthActionNotAllowedError, AuthAdministrationLockoutError, AuthAdministrationMissingError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, AuthorSchema, BaseDocumentHeaderSchema, BaseDocumentStateSchema, CodeExampleSchema, ConfigEntrySchema, ConfigEntryTypeSchema, DOCUMENT_DELETED_REASON, DeleteChangeLogItemInputSchema, DeleteModuleInputSchema, DeleteOperationErrorInputSchema, DeleteOperationExampleInputSchema, DeleteOperationInputSchema, DeleteStateExampleInputSchema, DocumentActionSchema, DocumentModelGlobalStateSchema, DocumentModelHeaderSchema, DocumentModelInputSchema, DocumentModelPHStateSchema, DocumentModelSchema, DocumentSpecificationSchema, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, GrantSchema, GroupPrincipalNotAllowedError, HASH_ALGORITHM_SHA1, HASH_ALGORITHM_SHA256, HASH_ALGORITHM_SHA512, HASH_ENCODING_BASE64, HASH_ENCODING_HEX, HashMismatchError, InitializeAuthActionInputSchema, IntegrityIssueSubType, IntegrityIssueType, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, InvalidGrantError, LoadStateActionInputSchema, LoadStateActionSchema, LoadStateActionStateInputSchema, Load_StateSchema, MAX_AUTH_GRANTS, MAX_CAPABILITY_OPERATIONS, MAX_CONDITION_DEPTH, MAX_CONDITION_NODES, MAX_SUPPORTED_AUTH_VERSION, ManifestSchema, ModuleSchema, MoveGrantActionInputSchema, MoveOperationInputSchema, OPERATION_NAME_PATTERN, OperationErrorSchema, OperationScopeSchema, OperationSpecificationSchema, PowerhouseModuleSchema, PowerhouseModulesSchema, PruneActionInputSchema, PruneActionSchema, PruneSchema, PublisherSchema, PwaConfigSchema, RESERVED_OPERATION_NAMES, RedoActionInputSchema, RedoActionSchema, RedoSchema, RemoveGrantActionInputSchema, ReorderChangeLogItemsInputSchema, ReorderModuleOperationsInputSchema, ReorderModulesInputSchema, ReorderOperationErrorsInputSchema, ReorderOperationExamplesInputSchema, ReorderStateExamplesInputSchema, ScopeStateSchema, SetAuthorNameInputSchema, SetAuthorWebsiteInputSchema, SetGrantActionInputSchema, SetInitialStateInputSchema, SetModelDescriptionInputSchema, SetModelExtensionInputSchema, SetModelIdInputSchema, SetModelNameInputSchema, SetModuleDescriptionInputSchema, SetModuleNameInputSchema, SetNameActionInputSchema, SetNameActionSchema, SetOperationDescriptionInputSchema, SetOperationErrorCodeInputSchema, SetOperationErrorDescriptionInputSchema, SetOperationErrorNameInputSchema, SetOperationErrorTemplateInputSchema, SetOperationNameInputSchema, SetOperationReducerInputSchema, SetOperationSchemaInputSchema, SetOperationScopeInputSchema, SetOperationTemplateInputSchema, SetPreferredEditorActionInputSchema, SetPreferredEditorActionSchema, SetStateSchemaInputSchema, Set_NameSchema, Set_PreferredEditorSchema, StateSchema, UndoActionInputSchema, UndoActionSchema, UndoSchema, UnsupportedDocumentModelVersionError, UpdateChangeLogItemInputSchema, UpdateOperationExampleInputSchema, UpdateStateExampleInputSchema, ab2hex, actionContext, actionFromAction, actionSigner, actions, addChangeLogItem, addModule, addOperation, addOperationError, addOperationExample, addStateExample, addUndo, appendWithoutApplying, applyAuthAction, applyDeleteDocumentAction, applyInitializeAuthAction, applyMoveGrantAction, applyRemoveGrantAction, applySetGrantAction, applyUpgradeDocumentAction, assertAuthAdministrationRetained, assertAuthPreservedOnDuplicate, assertAuthScopeActionAllowed, assertIsDocumentModelDocument, assertIsDocumentModelState, assertModuleIdUnique, assertOperationErrorIdUnique, assertOperationExampleIdUnique, assertOperationIdUnique, assertValidGrant, assertValidGrantUpsert, assertValidInitialGrants, attachBranch, backfillAuthState, base58Decode, base64UrlToBytes, baseActions, baseCreateDocument, baseLoadFromInput, baseLoadFromInputVersioned, baseReducer, baseReducerVersion, baseSaveToFileHandle, buildOperationSignature, buildOperationSignatureMessage, buildOperationSignatureParams, buildSignedAction, checkCleanedOperationsIntegrity, checkOperationsIntegrity, computeUpgradeTransitions, createAction, createAuthState, createBaseState, createDocumentState, createGlobalState, createLocalState, createMinimalZip, createPresignedHeader, createReducer, createSignedHeader, createSignedHeaderForSigner, createState, createVerificationSigner, createZip, decide, defaultAuthState, defaultBaseState, defaultDocumentState, defaultGlobalState, defaultLocalState, defaultPHState, definedNonNullAnySchema, deleteChangeLogItem, deleteModule, deleteOperation, deleteOperationError, deleteOperationExample, deleteStateExample, deriveOperationId, deserializeSignature, diffOperations, documentModelActions, documentModelDocumentType, documentModelFileExtension, documentModelGlobalState, documentModelHeaderReducer, documentModelInitialGlobalState, documentModelInitialLocalState, documentModelLoadFromInput, documentModelModuleReducer, documentModelOperationErrorReducer, documentModelOperationExampleReducer, documentModelOperationReducer, documentModelReducer, documentModelSaveToFileHandle, documentModelStateReducer, documentModelStateSchemaReducer, documentModelVersioningReducer, evaluate, evaluateCondition, evaluateGrantStack, evaluateGrants, fetchFileBrowser, filterDocumentOperationsResultingState, filterDuplicatedOperations, findModuleOrThrow, findOperationErrorOrThrow, findOperationExampleOrThrow, findOperationOrThrow, garbageCollect, garbageCollectDocumentOperations, garbageCollectV2, generateId, generateMock, getAllOperationNames, getDocumentLastModified, getFileBrowser, getUnixTimestamp, grantProblem, groupDocumentType, groupMembershipActionTypes, groupOperationsByScope, hashBrowser, hashDocumentStateForScope, hex2ab, initializeAuth, isAuthAction, isDefinedNonNullAny, isDenied, isDocumentAction, isDocumentCreator, isDocumentModelDocument, isDocumentModelState, isDocumentZip, isNoopOperation, isPlainValue, isReservedOperationName, isUndo, isUndoRedo, isValidOperationNameFormat, loadState, loadStateOperation, mapSkippedOperations, mapSkippedOperationsV2, mentionedGroupIds, merge, moveGrant, moveOperation, nextSkipNumber, noop, normalizeDocumentModelVersion, operationExampleCreators, operationFromAction, operationFromOperation, operationOutcome, operationWithContext, operationsAreEqual, parseBulkArchive, parseResultingState, precedes, prepareOperations, processUndoRedo, prune, pruneOperation, readFileBrowser, readOnly, redo, redoOperation, referencedGroupIds, releaseNewVersion, removeExistingOperations, removeGrant, reorderChangeLogItems, reorderModuleOperations, reorderModules, reorderOperationErrors, reorderOperationExamples, reorderStateExamples, replayDocument, replayDocumentVersioned, replayOperations, reshuffleByTimestamp, reshuffleByTimestampAndIndex, resolveSnapshotAuth, serializeSignature, setAuthorName, setAuthorWebsite, setGrant, setInitialState, setModelDescription, setModelExtension, setModelId, setModelName, setModuleDescription, setModuleName, setName, setNameOperation, setOperationDescription, setOperationErrorCode, setOperationErrorDescription, setOperationErrorName, setOperationErrorTemplate, setOperationName, setOperationReducer, setOperationSchema, setOperationScope, setOperationTemplate, setPreferredEditor, setPreferredEditorOperation, setStateSchema, sign, skipHeaderOperations, sortMappedOperations, sortOperations, split, toTransportAction, undo, undoOperation, undoOperationV2, updateChangeLogItem, updateDocument, updateHeaderRevision, updateOperationExample, updateStateExample, validateHeader, validateInitialState, validateModule, validateModuleOperation, validateModules, validateOperationName, validateOperations, validateStateSchemaName, verify, verifyOperationSignature, writeFileBrowser, zipEntries };
5046
+ export { ACTION_SIGNATURE_V2_PREFIX, AUTH_ACTION_TYPES, AUTH_DENIED_BY_GRANT_REASON, AUTH_NO_GRANT_REASON, AUTH_VERSION_UNSUPPORTED_REASON, AddChangeLogItemInputSchema, AddModuleInputSchema, AddOperationErrorInputSchema, AddOperationExampleInputSchema, AddOperationInputSchema, AddStateExampleInputSchema, AuthActionNotAllowedError, AuthAdministrationLockoutError, AuthAdministrationMissingError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, AuthorSchema, BaseDocumentHeaderSchema, BaseDocumentStateSchema, CanonicalJsonError, CodeExampleSchema, ConfigEntrySchema, ConfigEntryTypeSchema, DEFAULT_SIGNATURE_POLICY, DOCUMENT_DELETED_REASON, DOCUMENT_PURGE_PROTOCOL, DOCUMENT_SCOPE_ACTION_TYPES, DeleteChangeLogItemInputSchema, DeleteModuleInputSchema, DeleteOperationErrorInputSchema, DeleteOperationExampleInputSchema, DeleteOperationInputSchema, DeleteStateExampleInputSchema, DocumentActionSchema, DocumentModelGlobalStateSchema, DocumentModelHeaderSchema, DocumentModelInputSchema, DocumentModelPHStateSchema, DocumentModelSchema, DocumentSpecificationSchema, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, GrantSchema, GroupPrincipalNotAllowedError, HASH_ALGORITHM_SHA1, HASH_ALGORITHM_SHA256, HASH_ALGORITHM_SHA512, HASH_ENCODING_BASE64, HASH_ENCODING_HEX, HashMismatchError, InitializeAuthActionInputSchema, IntegrityIssueSubType, IntegrityIssueType, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, InvalidGrantError, MARKER_REFUSAL_FEATURE, MAX_AUTH_GRANTS, MAX_CAPABILITY_OPERATIONS, MAX_CONDITION_DEPTH, MAX_CONDITION_NODES, MAX_SUPPORTED_AUTH_VERSION, ManifestSchema, ModuleSchema, MoveGrantActionInputSchema, MoveOperationInputSchema, OPERATION_NAME_PATTERN, OperationErrorSchema, OperationScopeSchema, OperationSpecificationSchema, PEER_CAPABILITIES, PEER_MANIFEST_FORMAT, PURGE_DOCUMENT, PieceModuleSchema, PieceModulesSchema, PowerhouseModuleSchema, PowerhouseModulesSchema, PublisherSchema, PwaConfigSchema, RESERVED_OPERATION_NAMES, RedoActionInputSchema, RedoActionSchema, RedoSchema, RemoveGrantActionInputSchema, ReorderChangeLogItemsInputSchema, ReorderModuleOperationsInputSchema, ReorderModulesInputSchema, ReorderOperationErrorsInputSchema, ReorderOperationExamplesInputSchema, ReorderStateExamplesInputSchema, SIGNATURE_PROTOCOL, SIGNATURE_PROTOCOL_V2, ScopeStateSchema, SetAuthorNameInputSchema, SetAuthorWebsiteInputSchema, SetGrantActionInputSchema, SetInitialStateInputSchema, SetModelDescriptionInputSchema, SetModelExtensionInputSchema, SetModelIdInputSchema, SetModelNameInputSchema, SetModuleDescriptionInputSchema, SetModuleNameInputSchema, SetNameActionInputSchema, SetNameActionSchema, SetOperationDescriptionInputSchema, SetOperationErrorCodeInputSchema, SetOperationErrorDescriptionInputSchema, SetOperationErrorNameInputSchema, SetOperationErrorTemplateInputSchema, SetOperationNameInputSchema, SetOperationReducerInputSchema, SetOperationSchemaInputSchema, SetOperationScopeInputSchema, SetOperationTemplateInputSchema, SetPreferredEditorActionInputSchema, SetPreferredEditorActionSchema, SetStateSchemaInputSchema, Set_NameSchema, Set_PreferredEditorSchema, StateSchema, UndoActionInputSchema, UndoActionSchema, UndoSchema, UnsupportedDocumentModelVersionError, UpdateChangeLogItemInputSchema, UpdateOperationExampleInputSchema, UpdateStateExampleInputSchema, ab2hex, actionContext, actionFromAction, actionPreimageV2, actionSigner, actionSignerIdentity, actionSigningTarget, actions, addChangeLogItem, addModule, addOperation, addOperationError, addOperationExample, addStateExample, addUndo, appendWithoutApplying, applyAuthAction, applyDeleteDocumentAction, applyInitializeAuthAction, applyMoveGrantAction, applyRemoveGrantAction, applySetGrantAction, applyUpgradeDocumentAction, assertAuthAdministrationRetained, assertAuthPreservedOnDuplicate, assertAuthScopeActionAllowed, assertIsDocumentModelDocument, assertIsDocumentModelState, assertModuleIdUnique, assertOperationErrorIdUnique, assertOperationExampleIdUnique, assertOperationIdUnique, assertValidGrant, assertValidGrantUpsert, assertValidInitialGrants, attachBranch, backfillAuthState, base58Decode, base64UrlToBytes, baseActions, baseCreateDocument, baseLoadFromInput, baseLoadFromInputVersioned, baseReducer, baseReducerVersion, baseSaveToFileHandle, buildOperationSignature, buildOperationSignatureMessage, buildOperationSignatureParams, buildSignedAction, bytesToBase64Url, canonicalJson, checkCleanedOperationsIntegrity, checkOperationsIntegrity, computeUpgradeTransitions, coversLocal, createAction, createAuthState, createBaseState, createCopyHeader, createDocumentState, createGlobalState, createLocalState, createMinimalZip, createPresignedHeader, createReducer, createSignedHeader, createSignedHeaderForSigner, createState, createVerificationSigner, createZip, decide, defaultAuthState, defaultBaseState, defaultDocumentState, defaultGlobalState, defaultLocalState, defaultPHState, definedNonNullAnySchema, deleteChangeLogItem, deleteModule, deleteOperation, deleteOperationError, deleteOperationExample, deleteStateExample, deriveDocumentId, deriveOperationId, deserializeSignature, diffOperations, documentModelActions, documentModelDocumentType, documentModelFileExtension, documentModelGlobalState, documentModelHeaderReducer, documentModelInitialGlobalState, documentModelInitialLocalState, documentModelLoadFromInput, documentModelModuleReducer, documentModelOperationErrorReducer, documentModelOperationExampleReducer, documentModelOperationReducer, documentModelReducer, documentModelSaveToFileHandle, documentModelStateReducer, documentModelStateSchemaReducer, documentModelVersioningReducer, evaluate, evaluateCondition, evaluateGrantStack, evaluateGrants, fetchFileBrowser, filterDocumentOperationsResultingState, filterDuplicatedOperations, findModuleOrThrow, findOperationErrorOrThrow, findOperationExampleOrThrow, findOperationOrThrow, garbageCollect, garbageCollectDocumentOperations, garbageCollectV2, generateId, generateMock, getAllOperationNames, getDocumentLastModified, getFileBrowser, getUnixTimestamp, grantProblem, groupDocumentType, groupMembershipActionTypes, groupOperationsByScope, hasDerivedDocumentId, hashActionV2, hashBrowser, hashDocumentStateForScope, hex2ab, holdReason, initializeAuth, isAuthAction, isDefinedNonNullAny, isDenied, isDerivedDocumentId, isDocumentAction, isDocumentCreator, isDocumentModelDocument, isDocumentModelState, isDocumentZip, isNoopOperation, isOlderManifest, isPlainValue, isPurgeMarker, isReservedOperationName, isSignaturePolicy, isUndo, isUndoRedo, isV2ActionHash, isValidOperationNameFormat, legacySupports, localPeerManifest, localSupports, manifestRevision, mapSkippedOperations, mapSkippedOperationsV2, mentionedGroupIds, merge, mergePeerCapabilities, moveGrant, moveOperation, nextSkipNumber, noop, normalizeDocumentModelVersion, operationExampleCreators, operationFromAction, operationFromOperation, operationOutcome, operationWithContext, operationsAreEqual, parseBulkArchive, parseResultingState, peerSupports, precedes, prepareOperations, processUndoRedo, protocolVersionsFor, purgeDocumentAction, purgeMarkerOperation, purgedProtocolVersions, readFileBrowser, readOnly, readPeerManifest, redo, redoOperation, referencedGroupIds, releaseNewVersion, removeExistingOperations, removeGrant, reorderChangeLogItems, reorderModuleOperations, reorderModules, reorderOperationErrors, reorderOperationExamples, reorderStateExamples, replayDocument, replayDocumentVersioned, replayOperations, requestedSignaturePolicy, reshuffleByTimestamp, reshuffleByTimestampAndIndex, resolveSnapshotAuth, selectProtocolVersions, serializeSignature, setAuthorName, setAuthorWebsite, setGrant, setInitialState, setModelDescription, setModelExtension, setModelId, setModelName, setModuleDescription, setModuleName, setName, setNameOperation, setOperationDescription, setOperationErrorCode, setOperationErrorDescription, setOperationErrorName, setOperationErrorTemplate, setOperationName, setOperationReducer, setOperationSchema, setOperationScope, setOperationTemplate, setPreferredEditor, setPreferredEditorOperation, setStateSchema, sign, signActionV2, signaturePolicyOf, skipHeaderOperations, sortMappedOperations, sortOperations, split, targetDocumentId, toTransportAction, undo, undoOperation, undoOperationV2, updateChangeLogItem, updateDocument, updateHeaderRevision, updateOperationExample, updateStateExample, v2RequiredProtocolVersions, v2TupleProblem, validateHeader, validateInitialState, validateModule, validateModuleOperation, validateModules, validateOperationName, validateOperations, validateStateSchemaName, verify, verifyOperationSignature, withProtocolVersions, withSignaturePolicy, writeFileBrowser, zipEntries };
5142
5047
 
5143
5048
  //# sourceMappingURL=index.js.map