@powerhousedao/shared 6.2.3-dev.8 → 6.2.3-staging.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 (270) 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/{generate-CA916Fvj.mjs → generate-BOItUNvP.mjs} +40 -2
  24. package/dist/clis/args/generate-BOItUNvP.mjs.map +1 -0
  25. package/dist/clis/args/generate-BPBBLeUD.d.mts +103 -0
  26. package/dist/clis/args/generate-BPBBLeUD.d.mts.map +1 -0
  27. package/dist/clis/args/generate.d.mts +3 -2
  28. package/dist/clis/args/generate.mjs +1 -1
  29. package/dist/clis/args/{help-Bqbgbalu.mjs → help-DS1NlcJQ.mjs} +15 -15
  30. package/dist/clis/args/{help-Bqbgbalu.mjs.map → help-DS1NlcJQ.mjs.map} +1 -1
  31. package/dist/clis/args/help-DVPTARGn.d.mts +190 -0
  32. package/dist/clis/args/help-DVPTARGn.d.mts.map +1 -0
  33. package/dist/clis/args/help.d.mts +3 -2
  34. package/dist/clis/args/help.mjs +1 -1
  35. package/dist/clis/args/index.d.mts +20 -19
  36. package/dist/clis/args/index.mjs +18 -18
  37. package/dist/clis/args/init-CFeTq4Cq.d.mts +52 -0
  38. package/dist/clis/args/init-CFeTq4Cq.d.mts.map +1 -0
  39. package/dist/clis/args/{init-rz9Ei7nq.mjs → init-Dvb42Y87.mjs} +2 -2
  40. package/dist/clis/args/{init-rz9Ei7nq.mjs.map → init-Dvb42Y87.mjs.map} +1 -1
  41. package/dist/clis/args/init.d.mts +3 -2
  42. package/dist/clis/args/init.mjs +1 -1
  43. package/dist/clis/args/inspect-BjRmtB86.d.mts +13 -0
  44. package/dist/clis/args/inspect-BjRmtB86.d.mts.map +1 -0
  45. package/dist/clis/args/{inspect-tckH8mSw.mjs → inspect-UNQgtuR0.mjs} +2 -2
  46. package/dist/clis/args/{inspect-tckH8mSw.mjs.map → inspect-UNQgtuR0.mjs.map} +1 -1
  47. package/dist/clis/args/inspect.d.mts +3 -2
  48. package/dist/clis/args/inspect.mjs +1 -1
  49. package/dist/clis/args/install-B0tMyUMw.d.mts +37 -0
  50. package/dist/clis/args/install-B0tMyUMw.d.mts.map +1 -0
  51. package/dist/clis/args/{install-Sz2DlCHh.mjs → install-F-27kF6m.mjs} +2 -2
  52. package/dist/clis/args/{install-Sz2DlCHh.mjs.map → install-F-27kF6m.mjs.map} +1 -1
  53. package/dist/clis/args/install.d.mts +3 -2
  54. package/dist/clis/args/install.mjs +1 -1
  55. package/dist/clis/args/{list-DM2d6f1m.mjs → list-Bkfn8Yuo.mjs} +2 -2
  56. package/dist/clis/args/{list-DM2d6f1m.mjs.map → list-Bkfn8Yuo.mjs.map} +1 -1
  57. package/dist/clis/args/list-DrbxA7JJ.d.mts +10 -0
  58. package/dist/clis/args/list-DrbxA7JJ.d.mts.map +1 -0
  59. package/dist/clis/args/list.d.mts +3 -2
  60. package/dist/clis/args/list.mjs +1 -1
  61. package/dist/clis/args/{login-DiKT5Jfu.mjs → login-CIFkQExi.mjs} +2 -2
  62. package/dist/clis/args/{login-DiKT5Jfu.mjs.map → login-CIFkQExi.mjs.map} +1 -1
  63. package/dist/clis/args/login-CXRJXg71.d.mts +25 -0
  64. package/dist/clis/args/login-CXRJXg71.d.mts.map +1 -0
  65. package/dist/clis/args/login.d.mts +3 -2
  66. package/dist/clis/args/login.mjs +1 -1
  67. package/dist/clis/args/{magic-string.es-h_0HDQBQ.mjs → magic-string.es-BWtG0AyA.mjs} +33 -27
  68. package/dist/clis/args/magic-string.es-BWtG0AyA.mjs.map +1 -0
  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-BBx5GDTc.d.mts +27 -0
  88. package/dist/clis/args/service-BBx5GDTc.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 +285 -180
  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-CmdMi_wu.mjs +230 -0
  121. package/dist/clis/build-config-CmdMi_wu.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 +25 -8
  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 +1381 -1221
  138. package/dist/clis/index.d.mts.map +1 -1
  139. package/dist/clis/index.mjs +217 -65
  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-nzer4WIr.d.mts +541 -0
  152. package/dist/clis/types-nzer4WIr.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-C6dZB_iX.js} +28 -8
  157. package/dist/config-loader-C6dZB_iX.js.map +1 -0
  158. package/dist/connect/config-loader.d.ts +14 -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 +190 -56
  162. package/dist/connect/index.d.ts.map +1 -1
  163. package/dist/connect/index.js +303 -30
  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-BP_gjn8g.d.ts → constants-DO4IYxuR.d.ts} +2 -1
  169. package/dist/constants-DO4IYxuR.d.ts.map +1 -0
  170. package/dist/constants.d.ts +3 -2
  171. package/dist/constants.js.map +1 -1
  172. package/dist/document-drive/index.d.ts +104 -101
  173. package/dist/document-drive/index.d.ts.map +1 -1
  174. package/dist/document-drive/index.js +39 -19
  175. package/dist/document-drive/index.js.map +1 -1
  176. package/dist/document-model/index.d.ts +5 -4
  177. package/dist/document-model/index.js +605 -227
  178. package/dist/document-model/index.js.map +1 -1
  179. package/dist/document-model/mock.d.ts +2 -3
  180. package/dist/document-model/mock.d.ts.map +1 -1
  181. package/dist/document-model/mock.js +2 -1
  182. package/dist/document-model/mock.js.map +1 -1
  183. package/dist/document-model/utils.d.ts +3 -2
  184. package/dist/document-model/utils.js +1 -1
  185. package/dist/index-5gwOhPG5.d.ts +36 -0
  186. package/dist/index-5gwOhPG5.d.ts.map +1 -0
  187. package/dist/{index-DyYIJtVy.d.ts → index-D6833Siv.d.ts} +131 -28
  188. package/dist/index-D6833Siv.d.ts.map +1 -0
  189. package/dist/index.d.ts +7 -6
  190. package/dist/index.js.map +1 -1
  191. package/dist/processors/index.d.ts +3 -2
  192. package/dist/processors/index.js +5 -1
  193. package/dist/processors/index.js.map +1 -1
  194. package/dist/registry/index.d.ts +15 -15
  195. package/dist/registry/index.d.ts.map +1 -1
  196. package/dist/registry/index.js +14 -5
  197. package/dist/registry/index.js.map +1 -1
  198. package/dist/registry/manifest-slim.d.ts +4 -3
  199. package/dist/registry/manifest-slim.d.ts.map +1 -1
  200. package/dist/registry/manifest-slim.js +21 -0
  201. package/dist/registry/manifest-slim.js.map +1 -1
  202. package/dist/registry/updates.d.ts +3 -3
  203. package/dist/registry/updates.d.ts.map +1 -1
  204. package/dist/registry/updates.js.map +1 -1
  205. package/dist/registry/urls.d.ts +2 -2
  206. package/dist/registry/urls.d.ts.map +1 -1
  207. package/dist/registry/urls.js.map +1 -1
  208. package/dist/{types-C1in4fl3.d.ts → types-Bsp8VL2y.d.ts} +2 -2
  209. package/dist/types-Bsp8VL2y.d.ts.map +1 -0
  210. package/dist/{types-YqLqb0Zb.d.ts → types-CI3ren9F.d.ts} +23 -35
  211. package/dist/types-CI3ren9F.d.ts.map +1 -0
  212. package/dist/{types-CpnWmiFY.d.ts → types-CmeoQg_J.d.ts} +607 -437
  213. package/dist/types-CmeoQg_J.d.ts.map +1 -0
  214. package/dist/{utils-DP122OSS.d.ts → utils-BrKxCmKx.d.ts} +2 -2
  215. package/dist/utils-BrKxCmKx.d.ts.map +1 -0
  216. package/dist/{utils-aaTmfxFW.js → utils-CSF716ux.js} +10 -3
  217. package/dist/utils-CSF716ux.js.map +1 -0
  218. package/package.json +10 -5
  219. package/dist/clis/args/access-token--9H57y8J.d.mts +0 -18
  220. package/dist/clis/args/access-token--9H57y8J.d.mts.map +0 -1
  221. package/dist/clis/args/common-CcYbXrBx.mjs.map +0 -1
  222. package/dist/clis/args/common-Dsf1vpHV.d.mts +0 -183
  223. package/dist/clis/args/common-Dsf1vpHV.d.mts.map +0 -1
  224. package/dist/clis/args/connect-BVVvCmL9.mjs.map +0 -1
  225. package/dist/clis/args/connect-DetTnI8g.d.mts +0 -443
  226. package/dist/clis/args/connect-DetTnI8g.d.mts.map +0 -1
  227. package/dist/clis/args/generate-CA916Fvj.mjs.map +0 -1
  228. package/dist/clis/args/generate-DnV-bfXt.d.mts +0 -87
  229. package/dist/clis/args/generate-DnV-bfXt.d.mts.map +0 -1
  230. package/dist/clis/args/help-CjAsudUn.d.mts +0 -193
  231. package/dist/clis/args/help-CjAsudUn.d.mts.map +0 -1
  232. package/dist/clis/args/init-CUXyfquF.d.mts +0 -55
  233. package/dist/clis/args/init-CUXyfquF.d.mts.map +0 -1
  234. package/dist/clis/args/inspect-DtZeoA5c.d.mts +0 -15
  235. package/dist/clis/args/inspect-DtZeoA5c.d.mts.map +0 -1
  236. package/dist/clis/args/install-CkP8zcHb.d.mts +0 -40
  237. package/dist/clis/args/install-CkP8zcHb.d.mts.map +0 -1
  238. package/dist/clis/args/list-BGf8s_gj.d.mts +0 -12
  239. package/dist/clis/args/list-BGf8s_gj.d.mts.map +0 -1
  240. package/dist/clis/args/login-DNsHwvqk.d.mts +0 -27
  241. package/dist/clis/args/login-DNsHwvqk.d.mts.map +0 -1
  242. package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs.map +0 -1
  243. package/dist/clis/args/migrate-sixkWhxm.d.mts +0 -21
  244. package/dist/clis/args/migrate-sixkWhxm.d.mts.map +0 -1
  245. package/dist/clis/args/publish-Dqe5DUst.d.mts +0 -18
  246. package/dist/clis/args/publish-Dqe5DUst.d.mts.map +0 -1
  247. package/dist/clis/args/registry-C_RfTsKB.d.mts +0 -19
  248. package/dist/clis/args/registry-C_RfTsKB.d.mts.map +0 -1
  249. package/dist/clis/args/service-DhIkf8-O.d.mts +0 -22
  250. package/dist/clis/args/service-DhIkf8-O.d.mts.map +0 -1
  251. package/dist/clis/args/switchboard-BlPaq2at.d.mts +0 -72
  252. package/dist/clis/args/switchboard-BlPaq2at.d.mts.map +0 -1
  253. package/dist/clis/args/uninstall-BpA3YYbw.d.mts +0 -31
  254. package/dist/clis/args/uninstall-BpA3YYbw.d.mts.map +0 -1
  255. package/dist/clis/args/unpublish-CvwaIimG.d.mts +0 -24
  256. package/dist/clis/args/unpublish-CvwaIimG.d.mts.map +0 -1
  257. package/dist/clis/args/vetra-DLQ6lhLl.d.mts +0 -113
  258. package/dist/clis/args/vetra-DLQ6lhLl.d.mts.map +0 -1
  259. package/dist/clis/build-config.mjs.map +0 -1
  260. package/dist/clis/constants.d.mts.map +0 -1
  261. package/dist/config-loader-B845Hidf.js.map +0 -1
  262. package/dist/constants-BP_gjn8g.d.ts.map +0 -1
  263. package/dist/index-C_iVZe7f.d.ts +0 -7
  264. package/dist/index-C_iVZe7f.d.ts.map +0 -1
  265. package/dist/index-DyYIJtVy.d.ts.map +0 -1
  266. package/dist/types-C1in4fl3.d.ts.map +0 -1
  267. package/dist/types-CpnWmiFY.d.ts.map +0 -1
  268. package/dist/types-YqLqb0Zb.d.ts.map +0 -1
  269. package/dist/utils-DP122OSS.d.ts.map +0 -1
  270. package/dist/utils-aaTmfxFW.js.map +0 -1
@@ -1,9 +1,176 @@
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
2
  import { ZodError, z } from "zod";
3
3
  import { stringify } from "safe-stable-stringify";
4
+ import { sha256 } from "@noble/hashes/sha2.js";
4
5
  import { strFromU8, strToU8, unzip, zip } from "fflate";
5
- import { castDraft, create, unsafe } from "mutative";
6
+ import { castDraft, create, isDraft, original, unsafe } from "mutative";
6
7
  import { constantCase, pascalCase } from "change-case";
8
+ //#region document-model/action-signature.ts
9
+ const ACTION_SIGNATURE_V2_PREFIX = "v2:";
10
+ const V2_HASH = /^v2:[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
11
+ const V2_TIMESTAMP = /^[0-9]+$/;
12
+ const V2_SIGNATURE = /^0x[0-9a-f]{128}$/;
13
+ const LONE_SURROGATE = /\p{Cs}/u;
14
+ const PREIMAGE_FIELDS = [
15
+ "version",
16
+ "documentId",
17
+ "branch",
18
+ "scope",
19
+ "type",
20
+ "id",
21
+ "timestampUtcMs",
22
+ "input",
23
+ "signer.user.address",
24
+ "signer.user.networkId",
25
+ "signer.user.chainId",
26
+ "signer.app.key"
27
+ ];
28
+ /** A value that would not survive a JSON store round trip unchanged. */
29
+ var CanonicalJsonError = class extends Error {
30
+ constructor(path, detail) {
31
+ super(`Cannot canonicalize ${path}: ${detail}`);
32
+ this.name = "CanonicalJsonError";
33
+ }
34
+ };
35
+ /** Sorted-key JSON, as the state hash encodes; drops `undefined` properties. */
36
+ function canonicalJson(value, label = "value") {
37
+ assertCanonical(value, label, /* @__PURE__ */ new Set());
38
+ return stringify(value);
39
+ }
40
+ /** Actions the reactor reduces itself, onto the document scope. */
41
+ const DOCUMENT_SCOPE_ACTION_TYPES = /* @__PURE__ */ new Set([
42
+ "CREATE_DOCUMENT",
43
+ "DELETE_DOCUMENT",
44
+ "UPGRADE_DOCUMENT",
45
+ "ADD_RELATIONSHIP",
46
+ "REMOVE_RELATIONSHIP",
47
+ "UPDATE_RELATIONSHIP"
48
+ ]);
49
+ /** Where a document-scope action writes: `sourceId` or `documentId`. */
50
+ function targetDocumentId(action, fallback) {
51
+ const input = action.input;
52
+ if (action.type === "ADD_RELATIONSHIP" || action.type === "REMOVE_RELATIONSHIP" || action.type === "UPDATE_RELATIONSHIP") return typeof input?.sourceId === "string" && input.sourceId.length > 0 ? input.sourceId : fallback;
53
+ return typeof input?.documentId === "string" && input.documentId.length > 0 ? input.documentId : fallback;
54
+ }
55
+ /** The log an action submitted to a job on `documentId` is stored in. */
56
+ function actionSigningTarget(action, documentId, branch) {
57
+ return {
58
+ documentId: DOCUMENT_SCOPE_ACTION_TYPES.has(action.type) ? targetDocumentId(action, documentId) : documentId,
59
+ branch
60
+ };
61
+ }
62
+ /** The identity a signer writes into `context.signer`, and signs over. */
63
+ function actionSignerIdentity(signer) {
64
+ return {
65
+ user: {
66
+ address: signer.user?.address ?? "",
67
+ networkId: signer.user?.networkId ?? "",
68
+ chainId: signer.user?.chainId ?? 0
69
+ },
70
+ app: {
71
+ name: signer.app?.name ?? "",
72
+ key: signer.app?.key ?? ""
73
+ }
74
+ };
75
+ }
76
+ /** The v2 preimage; throws `CanonicalJsonError` on an unsignable action. */
77
+ function actionPreimageV2(action, target, signer) {
78
+ if (!target.documentId) throw new CanonicalJsonError("documentId", "must not be empty");
79
+ if (!target.branch) throw new CanonicalJsonError("branch", "must not be empty");
80
+ if (action.input === void 0) throw new CanonicalJsonError("input", `action ${action.id} (${action.type}) has no input`);
81
+ const fields = [
82
+ "v2",
83
+ target.documentId,
84
+ target.branch,
85
+ action.scope,
86
+ action.type,
87
+ action.id,
88
+ action.timestampUtcMs,
89
+ action.input,
90
+ signer.user.address,
91
+ signer.user.networkId,
92
+ signer.user.chainId,
93
+ signer.app.key
94
+ ];
95
+ fields.forEach((field, i) => {
96
+ assertCanonical(field, PREIMAGE_FIELDS[i], /* @__PURE__ */ new Set());
97
+ });
98
+ return stringify(fields);
99
+ }
100
+ /** `"v2:" + base64url(sha256(preimage))`, unpadded. */
101
+ async function hashActionV2(action, target, signer) {
102
+ const preimage = actionPreimageV2(action, target, signer);
103
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(preimage));
104
+ return "v2:" + bytesToBase64Url$1(new Uint8Array(digest));
105
+ }
106
+ /** Signs `action` as a v2 tuple; the message layout is the legacy one. */
107
+ async function signActionV2(params) {
108
+ const { action, target, signer, sign } = params;
109
+ const previousStateHash = params.previousStateHash ?? "";
110
+ if (previousStateHash.includes(", ")) throw new Error(`Cannot sign action ${action.id}: the previous state hash contains ", "`);
111
+ const tuple = [
112
+ (Date.now() / 1e3).toFixed(0),
113
+ signer.app.key,
114
+ await hashActionV2(action, target, signer),
115
+ previousStateHash
116
+ ];
117
+ const signature = await sign(buildOperationSignatureMessage(tuple));
118
+ if (signature.length !== 64) throw new Error(`Cannot sign action ${action.id}: expected a 64-byte P-256 signature, got ${signature.length} bytes`);
119
+ return [...tuple, `0x${bytesToHex(signature)}`];
120
+ }
121
+ /** Element [2] carries the v2 prefix, whether or not it is well formed. */
122
+ function isV2ActionHash(hash) {
123
+ return hash.startsWith("v2:");
124
+ }
125
+ /** The strict shape of a v2 tuple, apart from what its hash covers. */
126
+ function v2TupleProblem(tuple) {
127
+ if (!V2_TIMESTAMP.test(tuple[0])) return "signing time is not decimal seconds";
128
+ if (!V2_HASH.test(tuple[2])) return "hash is not v2: and 43 base64url characters";
129
+ if (!V2_SIGNATURE.test(tuple[4])) return "signature is not 0x and 128 lowercase hex digits";
130
+ }
131
+ function assertCanonical(value, path, ancestors) {
132
+ switch (typeof value) {
133
+ case "string":
134
+ if (LONE_SURROGATE.test(value)) throw new CanonicalJsonError(path, "string holds a lone surrogate");
135
+ return;
136
+ case "boolean": return;
137
+ case "number":
138
+ if (!Number.isFinite(value)) throw new CanonicalJsonError(path, `${value} is not a JSON number`);
139
+ return;
140
+ case "undefined": throw new CanonicalJsonError(path, "undefined is not a JSON value");
141
+ case "bigint": throw new CanonicalJsonError(path, "BigInt is not a JSON value");
142
+ case "function":
143
+ case "symbol": throw new CanonicalJsonError(path, `${typeof value} is not a JSON value`);
144
+ }
145
+ if (value === null) return;
146
+ const object = value;
147
+ if (ancestors.has(object)) throw new CanonicalJsonError(path, "value is circular");
148
+ const toJSON = object.toJSON;
149
+ if (typeof toJSON === "function") {
150
+ assertCanonical(toJSON.call(object), path, new Set(ancestors).add(object));
151
+ return;
152
+ }
153
+ ancestors.add(object);
154
+ if (Array.isArray(object)) for (let i = 0; i < object.length; i++) {
155
+ if (!(i in object)) throw new CanonicalJsonError(`${path}[${i}]`, "array is sparse");
156
+ assertCanonical(object[i], `${path}[${i}]`, ancestors);
157
+ }
158
+ else for (const [key, child] of Object.entries(object)) {
159
+ if (LONE_SURROGATE.test(key)) throw new CanonicalJsonError(path, "key holds a lone surrogate");
160
+ if (child === void 0) continue;
161
+ assertCanonical(child, `${path}.${key}`, ancestors);
162
+ }
163
+ ancestors.delete(object);
164
+ }
165
+ function bytesToBase64Url$1(bytes) {
166
+ let binary = "";
167
+ for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);
168
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
169
+ }
170
+ function bytesToHex(bytes) {
171
+ return Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
172
+ }
173
+ //#endregion
7
174
  //#region document-model/signatures.ts
8
175
  /**
9
176
  * What separates a signature's params when it travels as one string.
@@ -198,7 +365,7 @@ var GrantNotFoundError = class extends Error {
198
365
  }
199
366
  };
200
367
  /**
201
- * Thrown when a disallowed action (UNDO, REDO, PRUNE) targets the auth scope.
368
+ * Thrown when a disallowed action (UNDO, REDO) targets the auth scope.
202
369
  */
203
370
  var AuthActionNotAllowedError = class extends Error {
204
371
  actionType;
@@ -257,8 +424,6 @@ var UnsupportedDocumentModelVersionError = class extends Error {
257
424
  //#region document-model/schemas.ts
258
425
  const isDefinedNonNullAny = (v) => v !== void 0 && v !== null;
259
426
  const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v));
260
- const Load_StateSchema = z.enum(["LOAD_STATE"]);
261
- const PruneSchema = z.enum(["PRUNE"]);
262
427
  const RedoSchema = z.enum(["REDO"]);
263
428
  const Set_NameSchema = z.enum(["SET_NAME"]);
264
429
  const Set_PreferredEditorSchema = z.enum(["SET_PREFERRED_EDITOR"]);
@@ -268,50 +433,12 @@ function OperationScopeSchema() {
268
433
  }
269
434
  function DocumentActionSchema() {
270
435
  return z.union([
271
- LoadStateActionSchema(),
272
- PruneActionSchema(),
273
436
  RedoActionSchema(),
274
437
  SetNameActionSchema(),
275
438
  SetPreferredEditorActionSchema(),
276
439
  UndoActionSchema()
277
440
  ]);
278
441
  }
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
442
  function RedoActionInputSchema() {
316
443
  return z.object({ count: z.number() });
317
444
  }
@@ -729,6 +856,13 @@ const PowerhouseModuleSchema = z.object({
729
856
  documentTypes: z.array(z.string()).optional()
730
857
  });
731
858
  const PowerhouseModulesSchema = z.array(PowerhouseModuleSchema).optional();
859
+ const PieceModuleSchema = PowerhouseModuleSchema.extend({
860
+ version: z.string().optional(),
861
+ description: z.string().optional(),
862
+ bundle: z.string().optional(),
863
+ descriptor: z.string().optional()
864
+ });
865
+ const PieceModulesSchema = z.array(PieceModuleSchema).optional();
732
866
  const PublisherSchema = z.object({
733
867
  name: z.string().optional(),
734
868
  url: z.string().optional()
@@ -739,7 +873,7 @@ const ConfigEntrySchema = z.object({
739
873
  type: ConfigEntryTypeSchema,
740
874
  description: z.string().optional(),
741
875
  required: z.boolean().optional(),
742
- default: z.boolean().optional()
876
+ default: z.string().optional()
743
877
  });
744
878
  const PwaUrlPatternSchema = z.union([z.string(), z.strictObject({
745
879
  source: z.string(),
@@ -835,6 +969,7 @@ const ManifestSchema = z.object({
835
969
  editors: PowerhouseModulesSchema,
836
970
  processors: PowerhouseModulesSchema,
837
971
  subgraphs: PowerhouseModulesSchema,
972
+ pieces: PieceModulesSchema,
838
973
  config: z.array(ConfigEntrySchema).optional(),
839
974
  pwa: PwaConfigSchema.optional()
840
975
  });
@@ -854,35 +989,6 @@ const undo = (count = 1, scope = "global") => createAction("UNDO", { count }, vo
854
989
  * @category Actions
855
990
  */
856
991
  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
992
  const noop = (scope = "global") => createAction("NOOP", {}, void 0, void 0, scope);
887
993
  /**
888
994
  * Helper function to be used by action creators.
@@ -980,6 +1086,7 @@ async function buildOperationSignature(context, signMethod) {
980
1086
  const signature = await signMethod(buildOperationSignatureMessage(params));
981
1087
  return [...params, `0x${ab2hex(signature)}`];
982
1088
  }
1089
+ /** @deprecated Emits a legacy SHA-1 tuple; sign through `ISigner.signAction`. */
983
1090
  async function buildSignedAction(action, reducer, document, signer, signHandler) {
984
1091
  const scopeOperations = reducer(document, action, void 0, { reuseOperationResultingState: true }).operations[action.scope];
985
1092
  if (!scopeOperations) throw new Error(`No operations found for scope: ${action.scope}`);
@@ -992,8 +1099,10 @@ async function buildSignedAction(action, reducer, document, signer, signHandler)
992
1099
  action,
993
1100
  previousStateHash
994
1101
  }, signHandler);
995
- return operationWithContext(operation, { signer: actionSigner(signer.user, signer.app, [...signer.signatures, signature]) });
1102
+ const actionContext = { signer: actionSigner(signer.user, signer.app, [...signer.signatures, signature]) };
1103
+ return operationWithContext(operation, actionContext);
996
1104
  }
1105
+ /** @deprecated Use `verifyActionSignature` from `@powerhousedao/reactor`. */
997
1106
  async function verifyOperationSignature(signature, signer, verifyHandler) {
998
1107
  const publicKey = signer.app.key;
999
1108
  const params = signature.slice(0, 4);
@@ -1068,8 +1177,6 @@ const baseActions = {
1068
1177
  setPreferredEditor,
1069
1178
  undo,
1070
1179
  redo,
1071
- prune,
1072
- loadState,
1073
1180
  noop
1074
1181
  };
1075
1182
  const documentModelActions = {
@@ -1187,7 +1294,7 @@ var AuthAdministrationMissingError = class extends Error {
1187
1294
  this.name = "AuthAdministrationMissingError";
1188
1295
  }
1189
1296
  };
1190
- const GRANT_KEYS = new Set([
1297
+ const GRANT_KEYS = /* @__PURE__ */ new Set([
1191
1298
  "id",
1192
1299
  "description",
1193
1300
  "effect",
@@ -1195,13 +1302,13 @@ const GRANT_KEYS = new Set([
1195
1302
  "capability",
1196
1303
  "where"
1197
1304
  ]);
1198
- const PRINCIPAL_KINDS = new Set([
1305
+ const PRINCIPAL_KINDS = /* @__PURE__ */ new Set([
1199
1306
  "anyone",
1200
1307
  "address",
1201
1308
  "group",
1202
1309
  "match"
1203
1310
  ]);
1204
- const COMPARISON_CONDITION_KINDS = new Set([
1311
+ const COMPARISON_CONDITION_KINDS = /* @__PURE__ */ new Set([
1205
1312
  "eq",
1206
1313
  "ne",
1207
1314
  "lt",
@@ -2530,12 +2637,12 @@ function assertAuthPreservedOnDuplicate(documentId, source, duplicated) {
2530
2637
  * The auth scope a state snapshot may install, given the policy already there.
2531
2638
  *
2532
2639
  * `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.
2640
+ * snapshot (UPGRADE_DOCUMENT's `initialState`) replaces the scope wholesale and
2641
+ * is authorized as a `document`-scope write. Without this, a subject holding
2642
+ * `execute` on `document` and no auth grant at all can install a policy of its
2643
+ * choosing, name itself `creator` (which exempts the policy from the retention
2644
+ * rule for good), or wipe an existing policy by carrying the default
2645
+ * uninitialized one.
2539
2646
  *
2540
2647
  * Three cases:
2541
2648
  *
@@ -2562,13 +2669,9 @@ function resolveSnapshotAuth(documentId, documentType, current, incoming) {
2562
2669
  assertValidInitialGrants(incoming.grants, documentType, incoming.creator);
2563
2670
  return incoming;
2564
2671
  }
2565
- /** UNDO, REDO and PRUNE are rejected on the auth scope. */
2672
+ /** UNDO and REDO are rejected on the auth scope. */
2566
2673
  function assertAuthScopeActionAllowed(action) {
2567
- if (action.scope === "auth" && [
2568
- "UNDO",
2569
- "REDO",
2570
- "PRUNE"
2571
- ].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
2674
+ if (action.scope === "auth" && ["UNDO", "REDO"].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
2572
2675
  }
2573
2676
  /**
2574
2677
  * Evaluates the auth policy for a single request and reports why it refused.
@@ -2674,6 +2777,63 @@ function assertIsDocumentModelDocument(document) {
2674
2777
  DocumentModelSchema.parse(document);
2675
2778
  }
2676
2779
  //#endregion
2780
+ //#region document-model/signature-policy.ts
2781
+ /** The `protocolVersions` key that fixes a document's signature requirement. */
2782
+ const SIGNATURE_PROTOCOL = "signature";
2783
+ /** `protocolVersions.signature` of a document that requires v2 tuples. */
2784
+ const SIGNATURE_PROTOCOL_V2 = 2;
2785
+ /** What a new document is created as unless the caller or host says otherwise. */
2786
+ const DEFAULT_SIGNATURE_POLICY = "v2-required";
2787
+ function isSignaturePolicy(value) {
2788
+ return value === "legacy" || value === "v2-required";
2789
+ }
2790
+ const DERIVED_ID = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
2791
+ /** Read from a header, a CREATE_DOCUMENT input or a bare map. */
2792
+ function signaturePolicyOf(source) {
2793
+ const version = (source && "protocolVersions" in source ? source.protocolVersions : source)?.[SIGNATURE_PROTOCOL];
2794
+ return typeof version === "number" && version >= 2 ? "v2-required" : "legacy";
2795
+ }
2796
+ /** `protocolVersions` for a new v2-required document. */
2797
+ function v2RequiredProtocolVersions(base = {}) {
2798
+ return {
2799
+ "base-reducer": 2,
2800
+ ...base,
2801
+ [SIGNATURE_PROTOCOL]: 2
2802
+ };
2803
+ }
2804
+ /**
2805
+ * The policy a create call asks for: `signaturePolicy`, else the `signature`
2806
+ * key of its `protocolVersions`, else `fallback`, the host's default.
2807
+ */
2808
+ function requestedSignaturePolicy(request, fallback) {
2809
+ if (request?.signaturePolicy) return request.signaturePolicy;
2810
+ if (request?.protocolVersions?.["signature"] !== void 0) return signaturePolicyOf(request.protocolVersions);
2811
+ return fallback;
2812
+ }
2813
+ /** `protocolVersions` for a new document under `policy`, over `base`. */
2814
+ function protocolVersionsFor(policy, base = {}) {
2815
+ if (policy === "v2-required") return v2RequiredProtocolVersions(base);
2816
+ const { [SIGNATURE_PROTOCOL]: _signature, ...rest } = base;
2817
+ return {
2818
+ "base-reducer": 2,
2819
+ ...rest
2820
+ };
2821
+ }
2822
+ /** `base64url(sha256(canonicalJson(params)))`, unpadded. */
2823
+ function deriveDocumentId(params) {
2824
+ const preimage = canonicalJson({
2825
+ documentType: params.documentType,
2826
+ createdAtUtcIso: params.createdAtUtcIso,
2827
+ nonce: params.nonce,
2828
+ protocolVersions: params.protocolVersions
2829
+ }, "document id");
2830
+ return bytesToBase64Url(sha256(new TextEncoder().encode(preimage)));
2831
+ }
2832
+ /** Whether `id` has the shape `deriveDocumentId` produces. */
2833
+ function isDerivedDocumentId(id) {
2834
+ return DERIVED_ID.test(id);
2835
+ }
2836
+ //#endregion
2677
2837
  //#region document-model/header.ts
2678
2838
  /**
2679
2839
  * Generates a deterministic payload from signing parameters
@@ -2693,11 +2853,11 @@ async function createVerificationSigner(pubKey) {
2693
2853
  }, true, ["verify"]);
2694
2854
  return {
2695
2855
  publicKey: cryptoKey,
2696
- async sign(_data) {
2697
- throw new Error("verification-only signer cannot sign data");
2856
+ sign(_data) {
2857
+ return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign data"));
2698
2858
  },
2699
- async signAction(_action, _abortSignal) {
2700
- throw new Error("verification-only signer cannot sign actions");
2859
+ signAction(_action, _target, _abortSignal) {
2860
+ return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign actions"));
2701
2861
  },
2702
2862
  async verify(data, signature) {
2703
2863
  let isValid;
@@ -2767,26 +2927,68 @@ const validateHeader = async (header) => {
2767
2927
  * Creates a header that has yet to be signed. This header is not valid, but
2768
2928
  * can be input into {@link createSignedHeader} to create a signed header.
2769
2929
  *
2930
+ * With `protocolVersions` requiring v2 signatures the header takes a random
2931
+ * nonce and the id {@link deriveDocumentId} gives, so `id` must be omitted.
2932
+ *
2770
2933
  * @returns An unsigned header for a document.
2771
2934
  */
2772
- const createPresignedHeader = (id = generateId(), documentType = "") => {
2773
- return {
2774
- id,
2935
+ const createPresignedHeader = (id, documentType = "", protocolVersions) => {
2936
+ const createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();
2937
+ const header = {
2938
+ id: id ?? generateId(),
2775
2939
  sig: {
2776
2940
  publicKey: {},
2777
2941
  nonce: ""
2778
2942
  },
2779
2943
  documentType,
2780
- createdAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),
2944
+ createdAtUtcIso,
2781
2945
  slug: "",
2782
2946
  name: "",
2783
2947
  branch: "main",
2784
2948
  revision: { document: 0 },
2785
- lastModifiedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),
2949
+ lastModifiedAtUtcIso: createdAtUtcIso,
2786
2950
  meta: {}
2787
2951
  };
2952
+ if (protocolVersions === void 0) return header;
2953
+ header.protocolVersions = { ...protocolVersions };
2954
+ if (signaturePolicyOf(header) === "legacy") return header;
2955
+ if (id !== void 0) throw new Error(`A v2-required document's id is derived from its header; cannot use ${id}`);
2956
+ header.sig.nonce = generateId();
2957
+ header.id = deriveDocumentId({
2958
+ documentType,
2959
+ createdAtUtcIso,
2960
+ nonce: header.sig.nonce,
2961
+ protocolVersions: header.protocolVersions
2962
+ });
2963
+ return header;
2788
2964
  };
2789
2965
  /**
2966
+ * A header for a copy of a document headed `source`. A copy is v2-required
2967
+ * when its source is or when `policy` asks for it, and then takes a derived id;
2968
+ * otherwise it takes `id`. It keeps the source's other protocol versions.
2969
+ */
2970
+ function createCopyHeader(source, id, policy = DEFAULT_SIGNATURE_POLICY) {
2971
+ const base = source.protocolVersions ?? {};
2972
+ if (signaturePolicyOf(source) === "v2-required" || policy === "v2-required") return createPresignedHeader(void 0, source.documentType, protocolVersionsFor("v2-required", base));
2973
+ const header = createPresignedHeader(id, source.documentType);
2974
+ if (source.protocolVersions) header.protocolVersions = { ...source.protocolVersions };
2975
+ return header;
2976
+ }
2977
+ /** Whether a v2-required `header` carries the id its params derive. */
2978
+ function hasDerivedDocumentId(header) {
2979
+ if (signaturePolicyOf(header) === "legacy" || !header.protocolVersions) return false;
2980
+ try {
2981
+ return deriveDocumentId({
2982
+ documentType: header.documentType,
2983
+ createdAtUtcIso: header.createdAtUtcIso,
2984
+ nonce: header.sig.nonce,
2985
+ protocolVersions: header.protocolVersions
2986
+ }) === header.id;
2987
+ } catch {
2988
+ return false;
2989
+ }
2990
+ }
2991
+ /**
2790
2992
  * Creates a new, signed header for a document. This will replace the id of the
2791
2993
  * document.
2792
2994
  *
@@ -2829,7 +3031,8 @@ const createSignedHeader = async (unsignedHeader, documentType, signer) => {
2829
3031
  * some are not. See the PHDocumentHeader type for more information.
2830
3032
  */
2831
3033
  const createSignedHeaderForSigner = async (documentType, signer) => {
2832
- return await createSignedHeader(createPresignedHeader(), documentType, signer);
3034
+ const unsignedHeader = createPresignedHeader();
3035
+ return await createSignedHeader(unsignedHeader, documentType, signer);
2833
3036
  };
2834
3037
  //#endregion
2835
3038
  //#region document-model/documents.ts
@@ -2847,9 +3050,7 @@ function isDocumentAction(action) {
2847
3050
  "SET_NAME",
2848
3051
  "SET_PREFERRED_EDITOR",
2849
3052
  "UNDO",
2850
- "REDO",
2851
- "PRUNE",
2852
- "LOAD_STATE"
3053
+ "REDO"
2853
3054
  ].includes(action.type);
2854
3055
  }
2855
3056
  /**
@@ -2905,12 +3106,16 @@ function createDocumentScopeOperations(header, state) {
2905
3106
  }
2906
3107
  /**
2907
3108
  * Creates a new document. When `documentType` is given the header is stamped
2908
- * with it and the document-scope operations are seeded.
3109
+ * with it and the document-scope operations are seeded. Without
3110
+ * `protocolVersions` the document is v2-required and takes a derived id; with
3111
+ * them it is v2-required only if they say so (see {@link protocolVersionsFor}).
2909
3112
  */
2910
- function baseCreateDocument(createState, initialState, documentType = "") {
3113
+ function baseCreateDocument(createState, initialState, documentType = "", protocolVersions) {
2911
3114
  const state = createState(initialState);
2912
- const header = createPresignedHeader(generateId(), documentType);
2913
- header.protocolVersions = { "base-reducer": 2 };
3115
+ const header = createPresignedHeader(void 0, documentType, protocolVersions === void 0 ? protocolVersionsFor("v2-required") : {
3116
+ "base-reducer": 2,
3117
+ ...protocolVersions
3118
+ });
2914
3119
  return {
2915
3120
  header,
2916
3121
  state,
@@ -2926,8 +3131,39 @@ function baseCreateDocument(createState, initialState, documentType = "") {
2926
3131
  clipboard: []
2927
3132
  };
2928
3133
  }
3134
+ /**
3135
+ * `document`, not yet created, under a fresh header for `policy`. A legacy
3136
+ * header takes `id` when given; a v2-required one ignores `id` and derives its
3137
+ * own, so a caller that needs a fixed id must ask for legacy.
3138
+ * `protocolVersions` are merged over the document's. Name, slug, branch and
3139
+ * meta carry over. A document already under `policy` is returned as is unless
3140
+ * a legacy `id` or `protocolVersions` are given.
3141
+ */
3142
+ function withSignaturePolicy(document, policy, options = {}) {
3143
+ const id = policy === "legacy" ? options.id : void 0;
3144
+ if (id === void 0 && options.protocolVersions === void 0 && signaturePolicyOf(document.header) === policy) return document;
3145
+ const source = document.header;
3146
+ const header = createPresignedHeader(id, source.documentType, protocolVersionsFor(policy, {
3147
+ ...source.protocolVersions,
3148
+ ...options.protocolVersions
3149
+ }));
3150
+ header.name = source.name;
3151
+ header.slug = source.slug;
3152
+ header.branch = source.branch;
3153
+ header.meta = source.meta;
3154
+ const operations = document.operations.document ? {
3155
+ ...document.operations,
3156
+ document: createDocumentScopeOperations(header, document.state)
3157
+ } : document.operations;
3158
+ return {
3159
+ ...document,
3160
+ header,
3161
+ operations
3162
+ };
3163
+ }
2929
3164
  function hashDocumentStateForScope(document, scope = "global") {
2930
- return hashBrowser(stringify(document.state[scope] || ""));
3165
+ const stateString = stringify(document.state[scope] || "");
3166
+ return hashBrowser(stateString);
2931
3167
  }
2932
3168
  function readOnly(value) {
2933
3169
  return Object.freeze(value);
@@ -3058,7 +3294,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
3058
3294
  const backfilledInitialState = backfillAuthState(initialState);
3059
3295
  let documentState = backfilledInitialState;
3060
3296
  const operationsToReplay = [];
3061
- const allScopes = new Set([
3297
+ const allScopes = /* @__PURE__ */ new Set([
3062
3298
  ...Object.keys(operations),
3063
3299
  "global",
3064
3300
  "local"
@@ -3116,7 +3352,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
3116
3352
  if (operation.hash !== hashDocumentStateForScope(result, scope)) throw new HashMismatchError(scope, result, operation);
3117
3353
  else break;
3118
3354
  }
3119
- const allResultScopes = new Set([
3355
+ const allResultScopes = /* @__PURE__ */ new Set([
3120
3356
  ...Object.keys(result.operations),
3121
3357
  ...Object.keys(operations),
3122
3358
  "global",
@@ -3179,8 +3415,8 @@ function checkCleanedOperationsIntegrity(sortedOperations) {
3179
3415
  index: nextOperation.index,
3180
3416
  skip: nextOperation.skip
3181
3417
  },
3182
- issue: IntegrityIssueType.UNEXPECTED_INDEX,
3183
- category: nextIndex > currentIndex + 1 ? IntegrityIssueSubType.MISSING_INDEX : IntegrityIssueSubType.DUPLICATED_INDEX,
3418
+ issue: "UNEXPECTED_INDEX",
3419
+ category: nextIndex > currentIndex + 1 ? "MISSING_INDEX" : "DUPLICATED_INDEX",
3184
3420
  message: `Expected index ${currentIndex + 1} with skip 0 or equivalent, got index ${nextOperation.index} with skip ${nextOperation.skip}`
3185
3421
  });
3186
3422
  currentIndex = nextOperation.index;
@@ -3290,12 +3526,14 @@ function attachBranch(trunk, newBranch) {
3290
3526
  nextTrunkOperation = trunkCopy.shift();
3291
3527
  }
3292
3528
  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;
3529
+ else if (!enteredBranch) {
3530
+ if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {
3531
+ newOperations.shift();
3532
+ result.push(nextTrunkOperation);
3533
+ } else {
3534
+ trunkCopy.unshift(nextTrunkOperation);
3535
+ enteredBranch = true;
3536
+ }
3299
3537
  }
3300
3538
  if (enteredBranch) {
3301
3539
  let nextAppend = newOperations.shift();
@@ -3326,13 +3564,14 @@ function split(sortedTargetOperations, sortedMergeOperations) {
3326
3564
  for (let i = 0; i < maxLength; i++) {
3327
3565
  const targetOperation = sortedTargetOperations[i];
3328
3566
  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);
3567
+ if (targetOperation && mergeOperation) {
3568
+ if (!splitHappened && operationsAreEqual(targetOperation, mergeOperation)) commonOperations.push(targetOperation);
3569
+ else {
3570
+ splitHappened = true;
3571
+ targetDiffOperations.push(targetOperation);
3572
+ mergeDiffOperations.push(mergeOperation);
3573
+ }
3574
+ } else if (targetOperation) targetDiffOperations.push(targetOperation);
3336
3575
  else if (mergeOperation) mergeDiffOperations.push(mergeOperation);
3337
3576
  }
3338
3577
  return [
@@ -3384,14 +3623,14 @@ function prepareOperations(operationsHistory, newOperations) {
3384
3623
  const sortedOperationsHistory = sortOperations(operationsHistory);
3385
3624
  const sortedOperations = sortOperations(newOperations);
3386
3625
  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;
3626
+ const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category === "MISSING_INDEX")].sort((a, b) => b.operation.index - a.operation.index).pop()?.operation;
3388
3627
  for (const newOperation of sortedOperations) {
3389
3628
  if (firstMissingIndexOperation && newOperation.index >= firstMissingIndexOperation.index) {
3390
3629
  result.invalidOperations.push(newOperation);
3391
3630
  continue;
3392
3631
  }
3393
3632
  if (integrityErrors.some((integrityError) => {
3394
- return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === IntegrityIssueSubType.DUPLICATED_INDEX;
3633
+ return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === "DUPLICATED_INDEX";
3395
3634
  })) {
3396
3635
  result.duplicatedOperations.push(newOperation);
3397
3636
  continue;
@@ -3620,18 +3859,6 @@ function redoOperation(document, action, skip) {
3620
3859
  });
3621
3860
  });
3622
3861
  }
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
3862
  /**
3636
3863
  * Reads an operation's outcome. A denial takes precedence over a reducer
3637
3864
  * error, since a denied operation never reaches its reducer.
@@ -3664,15 +3891,12 @@ function replayOperations(initialState, clearedOperations, stateReducer, header,
3664
3891
  * @returns The updated document state.
3665
3892
  */
3666
3893
  function updateOperationsForAction(document, action, reuseLastOperationIndex, skip, context) {
3667
- if ([
3668
- "UNDO",
3669
- "REDO",
3670
- "PRUNE"
3671
- ].includes(action.type)) return document;
3894
+ if (["UNDO", "REDO"].includes(action.type)) return document;
3672
3895
  const scope = action.scope;
3673
3896
  const existing = document.operations[scope];
3674
3897
  const lastOperationIndex = existing?.at(-1)?.index ?? -1;
3675
- const newOperation = operationFromAction(action, reuseLastOperationIndex ? lastOperationIndex : lastOperationIndex + 1, skip, context);
3898
+ const index = reuseLastOperationIndex ? lastOperationIndex : lastOperationIndex + 1;
3899
+ const newOperation = operationFromAction(action, index, skip, context);
3676
3900
  const operations = [...existing ?? [], newOperation];
3677
3901
  return {
3678
3902
  ...document,
@@ -3716,20 +3940,17 @@ function updateDocument(document, action, reuseLastOperationIndex, skip, context
3716
3940
  return newDocument;
3717
3941
  }
3718
3942
  /**
3719
- * The base document reducer function that wraps a custom reducer function.
3943
+ * The base document reducer function.
3720
3944
  *
3721
3945
  * @param state The current state of the document.
3722
3946
  * @param action The action being applied to the document.
3723
- * @param wrappedReducer The custom reducer function being wrapped by the base reducer.
3724
3947
  * @returns The updated document state.
3725
3948
  */
3726
- function _baseReducer(document, action, wrappedReducer) {
3949
+ function _baseReducer(document, action) {
3727
3950
  const parsedAction = DocumentActionSchema().parse(action);
3728
3951
  switch (parsedAction.type) {
3729
3952
  case "SET_NAME": return setNameOperation(document, parsedAction.input);
3730
3953
  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
3954
  default: return document;
3734
3955
  }
3735
3956
  }
@@ -3807,7 +4028,7 @@ function processUndoOperation(document, scope, customReducer, reuseOperationResu
3807
4028
  }
3808
4029
  /**
3809
4030
  * Base document reducer that wraps a custom document reducer and handles
3810
- * document-level actions such as undo, redo, prune, and set name.
4031
+ * document-level actions such as undo, redo, and set name.
3811
4032
  *
3812
4033
  * @template TGlobalState - The type of the state of the custom reducer.
3813
4034
  * @template TAction - The type of the actions of the custom reducer.
@@ -3835,7 +4056,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
3835
4056
  ...newDocument,
3836
4057
  clipboard: []
3837
4058
  };
3838
- if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action, customReducer);
4059
+ if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action);
3839
4060
  const operationContext = {
3840
4061
  documentId: document.header.id,
3841
4062
  scope: _action.scope,
@@ -3898,11 +4119,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
3898
4119
  }
3899
4120
  }
3900
4121
  });
3901
- if ([
3902
- "UNDO",
3903
- "REDO",
3904
- "PRUNE"
3905
- ].includes(_action.type)) return newDocument;
4122
+ if (["UNDO", "REDO"].includes(_action.type)) return newDocument;
3906
4123
  const scope = _action.scope || "global";
3907
4124
  const replayHash = options.replayOptions?.operation.hash;
3908
4125
  const hash = replayHash ? replayHash : hashDocumentStateForScope(newDocument, scope);
@@ -3922,7 +4139,6 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
3922
4139
  * - `SET_NAME`
3923
4140
  * - `UNDO`
3924
4141
  * - `REDO`
3925
- * - `PRUNE`
3926
4142
  *
3927
4143
  * It also updates the document-related attributes on every operation.
3928
4144
  *
@@ -3937,46 +4153,6 @@ function createReducer(stateReducer, documentReducer = baseReducer) {
3937
4153
  };
3938
4154
  return reducer;
3939
4155
  }
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
4156
  //#endregion
3981
4157
  //#region document-model/validation.ts
3982
4158
  /**
@@ -3986,8 +4162,6 @@ function pruneOperation(document, input, wrappedReducer) {
3986
4162
  const RESERVED_OPERATION_NAMES = [
3987
4163
  "UNDO",
3988
4164
  "REDO",
3989
- "PRUNE",
3990
- "LOAD_STATE",
3991
4165
  "SET_NAME",
3992
4166
  "SET_PREFERRED_EDITOR",
3993
4167
  "NOOP"
@@ -4226,6 +4400,15 @@ function orderBy(items, order) {
4226
4400
  return (rank.get(a.item.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.item.id) ?? Number.MAX_SAFE_INTEGER) || a.index - b.index;
4227
4401
  }).map(({ item }) => item);
4228
4402
  }
4403
+ /**
4404
+ * The untouched base of a mutative draft, or the value itself when it is not a
4405
+ * draft. Build replacement lists from it and freeze them before assigning, as
4406
+ * the drive node reducer does, so finalize skips the walk over the assigned
4407
+ * list. Read before writing: the base does not see this action's mutations.
4408
+ */
4409
+ function readBase(value) {
4410
+ return isDraft(value) ? original(value) : value;
4411
+ }
4229
4412
  const documentModelHeaderReducer = {
4230
4413
  setModelNameOperation(state, action) {
4231
4414
  state.name = action.input.name;
@@ -4275,7 +4458,8 @@ const documentModelModuleReducer = {
4275
4458
  deleteModuleOperation(state, action) {
4276
4459
  findModuleOrThrow(state, action.input.id);
4277
4460
  const latestSpec = state.specifications[state.specifications.length - 1];
4278
- latestSpec.modules = latestSpec.modules.filter((m) => m.id != action.input.id);
4461
+ const modules = readBase(latestSpec).modules.filter((m) => m.id != action.input.id);
4462
+ latestSpec.modules = Object.freeze(modules);
4279
4463
  },
4280
4464
  reorderModulesOperation(state, action) {
4281
4465
  const latestSpec = state.specifications[state.specifications.length - 1];
@@ -4393,14 +4577,20 @@ const documentModelOperationReducer = {
4393
4577
  const matches = latestSpec.modules.flatMap((mod) => mod.operations.filter((op) => op.id === action.input.operationId));
4394
4578
  if (matches.length === 0) throw new Error(`Operation "${action.input.operationId}" not found in the latest specification`);
4395
4579
  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);
4580
+ const moved = readBase(matches[0]);
4581
+ for (const mod of latestSpec.modules) {
4582
+ const operations = readBase(mod).operations.filter((op) => op.id !== action.input.operationId);
4583
+ if (mod === targetModule) operations.push(moved);
4584
+ mod.operations = Object.freeze(operations);
4585
+ }
4399
4586
  },
4400
4587
  deleteOperationOperation(state, action) {
4401
4588
  findOperationOrThrow(state, action.input.id);
4402
4589
  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);
4590
+ for (const mod of latestSpec.modules) {
4591
+ const operations = readBase(mod).operations.filter((operation) => operation.id != action.input.id);
4592
+ mod.operations = Object.freeze(operations);
4593
+ }
4404
4594
  },
4405
4595
  reorderModuleOperationsOperation(state, action) {
4406
4596
  const targetModule = findModuleOrThrow(state, action.input.moduleId);
@@ -4438,7 +4628,8 @@ const documentModelStateSchemaReducer = {
4438
4628
  if (!Object.keys(latestSpec.state).includes(action.input.scope)) throw new Error(`Invalid scope: ${action.input.scope}`);
4439
4629
  const scopeState = latestSpec.state[action.input.scope];
4440
4630
  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);
4631
+ const examples = readBase(scopeState).examples.filter((e) => e.id != action.input.id);
4632
+ scopeState.examples = Object.freeze(examples);
4442
4633
  },
4443
4634
  reorderStateExamplesOperation(state, action) {
4444
4635
  const latestSpec = state.specifications[state.specifications.length - 1];
@@ -4708,7 +4899,11 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
4708
4899
  const toVersion = action.input.toVersion;
4709
4900
  if (fromVersion === toVersion && fromVersion > 0) return document;
4710
4901
  if (fromVersion > toVersion) throw new DowngradeNotSupportedError(document.header.documentType, fromVersion, toVersion);
4711
- if (upgradePath) for (const transition of upgradePath) document = transition.upgradeReducer(document, action);
4902
+ if (upgradePath) {
4903
+ const protocolVersions = document.header.protocolVersions;
4904
+ for (const transition of upgradePath) document = transition.upgradeReducer(document, action);
4905
+ document = withProtocolVersions(document, protocolVersions);
4906
+ }
4712
4907
  applyInitialState(document, action);
4713
4908
  document.state.document = {
4714
4909
  ...document.state.document,
@@ -4716,6 +4911,16 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
4716
4911
  };
4717
4912
  return document;
4718
4913
  }
4914
+ /** CREATE_DOCUMENT fixes `protocolVersions`; this puts them back after a reducer. */
4915
+ function withProtocolVersions(document, protocolVersions) {
4916
+ const header = { ...document.header };
4917
+ if (protocolVersions === void 0) delete header.protocolVersions;
4918
+ else header.protocolVersions = { ...protocolVersions };
4919
+ return {
4920
+ ...document,
4921
+ header
4922
+ };
4923
+ }
4719
4924
  /**
4720
4925
  * Applies a DELETE_DOCUMENT action to a document.
4721
4926
  * Marks the document as deleted in the document scope state.
@@ -4841,7 +5046,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
4841
5046
  const curr = boundaries[i]?.[s] ?? 0;
4842
5047
  if (boundaries[i]) boundaries[i][s] = Math.max(prev, curr);
4843
5048
  }
4844
- const allScopes = new Set([
5049
+ const allScopes = /* @__PURE__ */ new Set([
4845
5050
  ...Object.keys(operations),
4846
5051
  "global",
4847
5052
  "local"
@@ -4928,7 +5133,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
4928
5133
  }
4929
5134
  }
4930
5135
  }
4931
- const allResultScopes = new Set([
5136
+ const allResultScopes = /* @__PURE__ */ new Set([
4932
5137
  ...Object.keys(document.operations),
4933
5138
  ...Object.keys(operations),
4934
5139
  "global",
@@ -5012,22 +5217,22 @@ async function createZip(document) {
5012
5217
  */
5013
5218
  async function createMinimalZip(data) {
5014
5219
  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
5220
  return zipAsync({
5030
- "header.json": jsonEntry(header),
5221
+ "header.json": jsonEntry({
5222
+ id: data.documentId,
5223
+ sig: {
5224
+ publicKey: {},
5225
+ nonce: ""
5226
+ },
5227
+ documentType: data.documentType,
5228
+ createdAtUtcIso: now,
5229
+ slug: data.name,
5230
+ name: data.name,
5231
+ branch: data.branch,
5232
+ revision: {},
5233
+ lastModifiedAtUtcIso: now,
5234
+ ...data.protocolVersions && { protocolVersions: data.protocolVersions }
5235
+ }),
5031
5236
  "state.json": jsonEntry(data.state),
5032
5237
  "current-state.json": jsonEntry(data.state),
5033
5238
  "operations.json": jsonEntry({})
@@ -5051,7 +5256,10 @@ async function parseZipData(data) {
5051
5256
  if (!files["header.json"]) throw new Error("Document header not found - file format may be outdated");
5052
5257
  const header = JSON.parse(readEntry(files, "header.json"));
5053
5258
  if (!files["operations.json"]) throw new Error("Operations history not found");
5054
- const clearedOperations = garbageCollectDocumentOperations(JSON.parse(readEntry(files, "operations.json")));
5259
+ const operations = JSON.parse(readEntry(files, "operations.json"));
5260
+ const clearedOperations = garbageCollectDocumentOperations(operations);
5261
+ pinProtocolVersionsToCreate(header, operations);
5262
+ backfillBaseReducerVersion(header);
5055
5263
  const operationsError = validateOperations(clearedOperations);
5056
5264
  if (operationsError.length) {
5057
5265
  const errorMessages = operationsError.map((err) => err.message);
@@ -5063,6 +5271,25 @@ async function parseZipData(data) {
5063
5271
  clearedOperations
5064
5272
  };
5065
5273
  }
5274
+ /** header.json is a snapshot; the stored CREATE_DOCUMENT input wins. */
5275
+ function pinProtocolVersionsToCreate(header, operations) {
5276
+ const create = operations.document?.find((operation) => operation.action.type === "CREATE_DOCUMENT");
5277
+ if (!create) return;
5278
+ const input = create.action.input;
5279
+ if (input?.protocolVersions) header.protocolVersions = { ...input.protocolVersions };
5280
+ else if (header.protocolVersions) {
5281
+ const { [SIGNATURE_PROTOCOL]: _dropped, ...rest } = header.protocolVersions;
5282
+ header.protocolVersions = rest;
5283
+ }
5284
+ }
5285
+ /** A zip with no recorded base-reducer version predates it: replay as v1. */
5286
+ function backfillBaseReducerVersion(header) {
5287
+ if (typeof header.protocolVersions?.["base-reducer"] === "number") return;
5288
+ header.protocolVersions = {
5289
+ ...header.protocolVersions,
5290
+ "base-reducer": 1
5291
+ };
5292
+ }
5066
5293
  async function loadFromZipData(data, reducer, options) {
5067
5294
  const { initialState, header, clearedOperations } = await parseZipData(data);
5068
5295
  return {
@@ -5138,6 +5365,157 @@ const getFileBrowser = (file) => {
5138
5365
  return Promise.resolve().then(() => readFileBrowser(file));
5139
5366
  };
5140
5367
  //#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 };
5368
+ //#region document-model/peer-agreement.ts
5369
+ const PEER_CAPABILITIES = [{
5370
+ kind: "protocol",
5371
+ name: "base-reducer",
5372
+ baseline: [1, 2],
5373
+ supported: () => [1, 2],
5374
+ preferred: () => 2,
5375
+ optional: false
5376
+ }, {
5377
+ kind: "protocol",
5378
+ name: "signature",
5379
+ baseline: [2],
5380
+ supported: () => [2],
5381
+ optional: true
5382
+ }];
5383
+ /** `base` plus `extra`; an extra replaces a base entry of the same name. */
5384
+ function mergePeerCapabilities(base, extra) {
5385
+ const key = (capability) => `${capability.kind}:${capability.name}`;
5386
+ const replaced = new Set(extra.map(key));
5387
+ return [...base.filter((capability) => !replaced.has(key(capability))), ...extra];
5388
+ }
5389
+ const PEER_MANIFEST_FORMAT = 1;
5390
+ function versionSet(values) {
5391
+ return [...new Set(values)].sort((a, b) => a - b);
5392
+ }
5393
+ function supportsFrom(capabilities, values) {
5394
+ const supports = {
5395
+ protocols: {},
5396
+ features: {}
5397
+ };
5398
+ for (const capability of capabilities) {
5399
+ const target = capability.kind === "protocol" ? supports.protocols : supports.features;
5400
+ target[capability.name] = versionSet(values(capability));
5401
+ }
5402
+ return supports;
5403
+ }
5404
+ /** What this reactor supports, for every capability it registers. */
5405
+ function localSupports(capabilities, flags) {
5406
+ return supportsFrom(capabilities, (capability) => capability.supported(flags));
5407
+ }
5408
+ /** What a peer that announces nothing supports. */
5409
+ function legacySupports(capabilities) {
5410
+ return supportsFrom(capabilities, (capability) => capability.baseline);
5411
+ }
5412
+ function manifestRevision(supports, sequence = 0) {
5413
+ const preimage = canonicalJson({
5414
+ protocols: supports.protocols,
5415
+ features: supports.features,
5416
+ sequence
5417
+ }, "peer manifest");
5418
+ return bytesToBase64Url(sha256(new TextEncoder().encode(preimage)));
5419
+ }
5420
+ function localPeerManifest(capabilities, flags, appKey, sequence = 0) {
5421
+ const supports = localSupports(capabilities, flags);
5422
+ return {
5423
+ format: 1,
5424
+ ...appKey !== void 0 ? { appKey } : {},
5425
+ sequence,
5426
+ revision: manifestRevision(supports, sequence),
5427
+ protocols: supports.protocols,
5428
+ features: supports.features
5429
+ };
5430
+ }
5431
+ /** A manifest sent before the one already held; silence carries no sequence. */
5432
+ function isOlderManifest(next, held) {
5433
+ return next !== null && held != null && next.sequence < held.sequence;
5434
+ }
5435
+ /** A peer's manifest, or the baselines for a peer that announced none. */
5436
+ function peerSupports(manifest, capabilities) {
5437
+ return manifest ?? legacySupports(capabilities);
5438
+ }
5439
+ function readVersionMap(value) {
5440
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return;
5441
+ const map = {};
5442
+ for (const [name, versions] of Object.entries(value)) {
5443
+ if (!Array.isArray(versions) || !versions.every((v) => Number.isInteger(v))) return;
5444
+ map[name] = versionSet(versions);
5445
+ }
5446
+ return map;
5447
+ }
5448
+ /**
5449
+ * A manifest as received from a peer, or null when it is not one. Formats only
5450
+ * add fields, so one of an unknown format is read as its two maps.
5451
+ */
5452
+ function readPeerManifest(value) {
5453
+ if (typeof value !== "object" || value === null) return null;
5454
+ const raw = value;
5455
+ const protocols = readVersionMap(raw.protocols);
5456
+ const features = readVersionMap(raw.features ?? {});
5457
+ if (!protocols || !features) return null;
5458
+ const sequence = Number.isSafeInteger(raw.sequence) ? raw.sequence : 0;
5459
+ return {
5460
+ format: 1,
5461
+ ...typeof raw.appKey === "string" ? { appKey: raw.appKey } : {},
5462
+ sequence,
5463
+ revision: typeof raw.revision === "string" ? raw.revision : manifestRevision({
5464
+ protocols,
5465
+ features
5466
+ }, sequence),
5467
+ protocols,
5468
+ features
5469
+ };
5470
+ }
5471
+ /** Only keys this reactor registers are judged; an absent key agrees. */
5472
+ function holdReason(peer, versions, capabilities) {
5473
+ for (const capability of capabilities) {
5474
+ if (capability.kind !== "protocol") continue;
5475
+ const version = versions[capability.name];
5476
+ if (version === void 0) continue;
5477
+ const supported = peer.protocols[capability.name] ?? [];
5478
+ if (!supported.includes(version)) return {
5479
+ protocol: capability.name,
5480
+ version,
5481
+ peerSupports: supported
5482
+ };
5483
+ }
5484
+ }
5485
+ /** Whether a peer runs every version this reactor does, so nothing is held. */
5486
+ function coversLocal(peer, local, capabilities) {
5487
+ for (const capability of capabilities) {
5488
+ if (capability.kind !== "protocol") continue;
5489
+ const theirs = peer.protocols[capability.name] ?? [];
5490
+ if (!(local.protocols[capability.name] ?? []).every((version) => theirs.includes(version))) return false;
5491
+ }
5492
+ return true;
5493
+ }
5494
+ /**
5495
+ * protocolVersions for a new document: per negotiated protocol, the highest
5496
+ * version up to the local preference that every member supports, else the
5497
+ * lowest local one. `requested` wins over what is selected.
5498
+ */
5499
+ function selectProtocolVersions(input) {
5500
+ const members = [...input.members];
5501
+ const selected = {};
5502
+ for (const capability of input.capabilities) {
5503
+ if (capability.kind !== "protocol" || !capability.preferred) continue;
5504
+ const preferred = capability.preferred(input.flags);
5505
+ const supported = capability.supported(input.flags);
5506
+ let agreed = supported.filter((version) => version <= preferred);
5507
+ for (const member of members) {
5508
+ const theirs = member.protocols[capability.name] ?? [];
5509
+ agreed = agreed.filter((version) => theirs.includes(version));
5510
+ }
5511
+ selected[capability.name] = agreed.length > 0 ? Math.max(...agreed) : Math.min(...supported);
5512
+ }
5513
+ return {
5514
+ ...selected,
5515
+ ...input.requested
5516
+ };
5517
+ }
5518
+ //#endregion
5519
+ 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_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, 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, 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, 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, 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
5520
 
5143
5521
  //# sourceMappingURL=index.js.map