emdash 0.40.1 → 0.41.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 (1240) hide show
  1. package/dist/action-token-CbKDcPJi.mjs +26 -0
  2. package/dist/action-token-CbKDcPJi.mjs.map +1 -0
  3. package/dist/activation-PtniBLt9.mjs +382 -0
  4. package/dist/activation-PtniBLt9.mjs.map +1 -0
  5. package/dist/adapters-C_Tf5x90.d.mts +171 -0
  6. package/dist/adapters-C_Tf5x90.d.mts.map +1 -0
  7. package/dist/allowed-origins-U1z4TdEZ.mjs +116 -0
  8. package/dist/allowed-origins-U1z4TdEZ.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +4 -4
  10. package/dist/api/route-utils.mjs +46 -45
  11. package/dist/api/route-utils.mjs.map +1 -1
  12. package/dist/api/schemas/index.d.mts +2 -2
  13. package/dist/api/schemas/index.mjs +10 -10
  14. package/dist/api-CXwQkV_m.mjs +5122 -0
  15. package/dist/api-CXwQkV_m.mjs.map +1 -0
  16. package/dist/api-tokens-89WlohEN.mjs +166 -0
  17. package/dist/api-tokens-89WlohEN.mjs.map +1 -0
  18. package/dist/apply-Do3KNnUk.mjs +1659 -0
  19. package/dist/apply-Do3KNnUk.mjs.map +1 -0
  20. package/dist/approvals-CAX9Yw33.mjs +460 -0
  21. package/dist/approvals-CAX9Yw33.mjs.map +1 -0
  22. package/dist/artifact-fetch-B9W4CEST.mjs +659 -0
  23. package/dist/artifact-fetch-B9W4CEST.mjs.map +1 -0
  24. package/dist/astro/index.d.mts +14 -14
  25. package/dist/astro/index.mjs +20 -24
  26. package/dist/astro/index.mjs.map +1 -1
  27. package/dist/astro/middleware/auth.d.mts +12 -12
  28. package/dist/astro/middleware/auth.mjs +10 -10
  29. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  30. package/dist/astro/middleware/redirect.mjs +7 -7
  31. package/dist/astro/middleware/request-context.mjs +3 -3
  32. package/dist/astro/middleware/setup.mjs +1 -1
  33. package/dist/astro/middleware.d.mts +12 -12
  34. package/dist/astro/middleware.mjs +109 -106
  35. package/dist/astro/middleware.mjs.map +1 -1
  36. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
  37. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
  38. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  39. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  40. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  41. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
  42. package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
  43. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
  44. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
  45. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
  46. package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
  47. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
  48. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  49. package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
  50. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  51. package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
  52. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  53. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  54. package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
  55. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
  56. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
  57. package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
  58. package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
  59. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
  60. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
  61. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  62. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  63. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  64. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  65. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
  66. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  68. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
  69. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
  71. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
  73. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
  75. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
  78. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  79. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +81 -77
  80. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  81. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
  82. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
  84. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +83 -79
  86. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
  88. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
  89. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  91. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
  92. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  93. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
  94. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  95. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  96. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
  97. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +5 -5
  99. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
  100. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  101. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  102. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
  103. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
  104. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
  105. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
  106. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
  107. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
  108. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
  109. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
  110. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
  111. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
  112. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
  113. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
  114. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
  115. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
  116. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
  117. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
  118. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
  119. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
  120. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
  121. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
  122. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
  123. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  124. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  125. package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
  126. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  127. package/dist/astro/routes/api/admin/users/index.mjs +14 -14
  128. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  129. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  130. package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
  131. package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
  132. package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
  133. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  134. package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
  135. package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
  136. package/dist/astro/routes/api/auth/me.mjs +15 -15
  137. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  138. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  139. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  140. package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
  141. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  142. package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
  143. package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
  144. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
  145. package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
  146. package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
  147. package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
  148. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  149. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
  150. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
  151. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  152. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
  153. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  154. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
  155. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  156. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
  157. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
  158. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
  159. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
  160. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  161. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
  162. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  163. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -29
  164. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  165. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  166. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  167. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
  168. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
  169. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  170. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  171. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
  172. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  173. package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
  174. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  175. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  176. package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
  177. package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
  178. package/dist/astro/routes/api/dashboard.mjs +10 -9
  179. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  180. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  181. package/dist/astro/routes/api/health.mjs +6 -6
  182. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  183. package/dist/astro/routes/api/import/probe.mjs +23 -23
  184. package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
  185. package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
  186. package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
  187. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  188. package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
  189. package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
  190. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  191. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
  192. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  193. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
  194. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  195. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
  196. package/dist/astro/routes/api/manifest.mjs +6 -6
  197. package/dist/astro/routes/api/mcp.mjs +91 -91
  198. package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
  199. package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
  200. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  201. package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
  202. package/dist/astro/routes/api/media/_id_.mjs +31 -31
  203. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  204. package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
  205. package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
  206. package/dist/astro/routes/api/media/folders/index.mjs +16 -16
  207. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  208. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  209. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  210. package/dist/astro/routes/api/media/upload-url.mjs +18 -18
  211. package/dist/astro/routes/api/media.mjs +35 -35
  212. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
  213. package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
  214. package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
  215. package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
  216. package/dist/astro/routes/api/menus/_name_.mjs +17 -17
  217. package/dist/astro/routes/api/menus/index.mjs +17 -17
  218. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  219. package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
  220. package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
  221. package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
  222. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
  223. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  224. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  225. package/dist/astro/routes/api/oauth/register.mjs +5 -5
  226. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  227. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  228. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  229. package/dist/astro/routes/api/openapi.json.mjs +20 -20
  230. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
  231. package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
  232. package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
  233. package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
  234. package/dist/astro/routes/api/redirects/index.mjs +19 -19
  235. package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
  236. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  237. package/dist/astro/routes/api/relations/index.mjs +36 -31
  238. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  239. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  240. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
  241. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
  242. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  243. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
  244. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  245. package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
  246. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  247. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
  248. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  249. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -67
  250. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  251. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -67
  252. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  253. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
  254. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  255. package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
  256. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  257. package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
  258. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  259. package/dist/astro/routes/api/schema/index.mjs +16 -16
  260. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
  261. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  262. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
  263. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  264. package/dist/astro/routes/api/search/enable.mjs +19 -19
  265. package/dist/astro/routes/api/search/index.mjs +18 -18
  266. package/dist/astro/routes/api/search/rebuild.mjs +19 -19
  267. package/dist/astro/routes/api/search/stats.mjs +9 -9
  268. package/dist/astro/routes/api/search/suggest.mjs +18 -18
  269. package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
  270. package/dist/astro/routes/api/sections/index.mjs +18 -18
  271. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  272. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  273. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  274. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  275. package/dist/astro/routes/api/settings/email.mjs +6 -6
  276. package/dist/astro/routes/api/settings.mjs +21 -21
  277. package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
  278. package/dist/astro/routes/api/setup/admin.mjs +18 -18
  279. package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
  280. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  281. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  282. package/dist/astro/routes/api/setup/index.mjs +50 -44
  283. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  284. package/dist/astro/routes/api/setup/status.mjs +6 -6
  285. package/dist/astro/routes/api/snapshot.mjs +8 -8
  286. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
  287. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
  288. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
  289. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
  290. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
  291. package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
  292. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
  293. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  294. package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
  295. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  296. package/dist/astro/routes/api/typegen.mjs +8 -8
  297. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  298. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
  299. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  300. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  301. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  302. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  303. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +16 -16
  304. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
  305. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
  306. package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
  307. package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
  308. package/dist/astro/routes/api/widget-components.mjs +5 -5
  309. package/dist/astro/routes/robots.txt.mjs +6 -6
  310. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  311. package/dist/astro/routes/sitemap.xml.mjs +7 -7
  312. package/dist/astro/types.d.mts +24 -18
  313. package/dist/astro/types.d.mts.map +1 -1
  314. package/dist/audit-CrgmE9LE.mjs +127 -0
  315. package/dist/audit-CrgmE9LE.mjs.map +1 -0
  316. package/dist/auth/providers/github.d.mts +1 -1
  317. package/dist/auth/providers/google.d.mts +1 -1
  318. package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
  319. package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
  320. package/dist/authorize-WgdKF8QY.mjs +49 -0
  321. package/dist/authorize-WgdKF8QY.mjs.map +1 -0
  322. package/dist/backup-Ck8_lMO3.mjs +246 -0
  323. package/dist/backup-Ck8_lMO3.mjs.map +1 -0
  324. package/dist/block-types-BQ90asVI.mjs +132 -0
  325. package/dist/block-types-BQ90asVI.mjs.map +1 -0
  326. package/dist/block-values-ACFqgB1D.mjs +175 -0
  327. package/dist/block-values-ACFqgB1D.mjs.map +1 -0
  328. package/dist/bundle-Db1iNMv_.mjs +667 -0
  329. package/dist/bundle-Db1iNMv_.mjs.map +1 -0
  330. package/dist/byline-BayaYGoj.mjs +909 -0
  331. package/dist/byline-BayaYGoj.mjs.map +1 -0
  332. package/dist/byline-fields-B8HH-35f.mjs +254 -0
  333. package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
  334. package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
  335. package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
  336. package/dist/byline-registry-B_EK_TQf.mjs +406 -0
  337. package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
  338. package/dist/bylines-DFAaFXWi.mjs +214 -0
  339. package/dist/bylines-DFAaFXWi.mjs.map +1 -0
  340. package/dist/bylines-DkIxUxmr.mjs +232 -0
  341. package/dist/bylines-DkIxUxmr.mjs.map +1 -0
  342. package/dist/cache-DkvhQ8XE.mjs +108 -0
  343. package/dist/cache-DkvhQ8XE.mjs.map +1 -0
  344. package/dist/canonical-CcSuuTlH.mjs +174 -0
  345. package/dist/canonical-CcSuuTlH.mjs.map +1 -0
  346. package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
  347. package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
  348. package/dist/challenge-store-CvBl81AQ.mjs +51 -0
  349. package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
  350. package/dist/checksum-CClweQzI.mjs +162 -0
  351. package/dist/checksum-CClweQzI.mjs.map +1 -0
  352. package/dist/chrome-tags-D5caJwwp.mjs +24 -0
  353. package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
  354. package/dist/chunks-DwBaj8aT.mjs +25 -0
  355. package/dist/chunks-DwBaj8aT.mjs.map +1 -0
  356. package/dist/cli/index.mjs +374 -761
  357. package/dist/cli/index.mjs.map +1 -1
  358. package/dist/client/cf-access.d.mts +1 -1
  359. package/dist/client/index.d.mts +32 -32
  360. package/dist/client/index.mjs +2 -2
  361. package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
  362. package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
  363. package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
  364. package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
  365. package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
  366. package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
  367. package/dist/comment-D2uvL63j.mjs +313 -0
  368. package/dist/comment-D2uvL63j.mjs.map +1 -0
  369. package/dist/comment-reaction-DevUuzg4.mjs +85 -0
  370. package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
  371. package/dist/comments-Cq0s7_hO.mjs +195 -0
  372. package/dist/comments-Cq0s7_hO.mjs.map +1 -0
  373. package/dist/comments-M4EDYAHw.mjs +99 -0
  374. package/dist/comments-M4EDYAHw.mjs.map +1 -0
  375. package/dist/components-CuIGwXMs.mjs +108 -0
  376. package/dist/components-CuIGwXMs.mjs.map +1 -0
  377. package/dist/config-52Ea5IWt.d.mts +39 -0
  378. package/dist/config-52Ea5IWt.d.mts.map +1 -0
  379. package/dist/config-CCz3xOLc.mjs +242 -0
  380. package/dist/config-CCz3xOLc.mjs.map +1 -0
  381. package/dist/config-D3d5Qudq.d.mts +6669 -0
  382. package/dist/config-D3d5Qudq.d.mts.map +1 -0
  383. package/dist/content-CbnufDsM.mjs +2018 -0
  384. package/dist/content-CbnufDsM.mjs.map +1 -0
  385. package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
  386. package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
  387. package/dist/content-policy-CYu6K1KB.mjs +46 -0
  388. package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
  389. package/dist/content-repair-DlDUgFGp.mjs +442 -0
  390. package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
  391. package/dist/context-CGQLA1-a.mjs +1922 -0
  392. package/dist/context-CGQLA1-a.mjs.map +1 -0
  393. package/dist/cron-c4D5C5Fx.mjs +284 -0
  394. package/dist/cron-c4D5C5Fx.mjs.map +1 -0
  395. package/dist/dashboard-CBq9kmOn.mjs +151 -0
  396. package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
  397. package/dist/db/index.d.mts +3 -3
  398. package/dist/db/index.mjs +1 -1
  399. package/dist/db/libsql-migrations.d.mts +1 -1
  400. package/dist/db/libsql-migrations.mjs +4 -4
  401. package/dist/db/libsql.d.mts +1 -1
  402. package/dist/db/postgres-migrations.d.mts +1 -1
  403. package/dist/db/postgres-migrations.mjs +4 -4
  404. package/dist/db/postgres.d.mts +1 -1
  405. package/dist/db/sqlite-migrations.d.mts +1 -1
  406. package/dist/db/sqlite-migrations.mjs +4 -4
  407. package/dist/db/sqlite.d.mts +1 -1
  408. package/dist/db/sqlite.mjs +1 -1
  409. package/dist/default-DPsys51U.mjs +81 -0
  410. package/dist/default-DPsys51U.mjs.map +1 -0
  411. package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
  412. package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
  413. package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
  414. package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
  415. package/dist/device-flow-OcSqE9uY.mjs +521 -0
  416. package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
  417. package/dist/digest-DVZ--cE9.mjs +194 -0
  418. package/dist/digest-DVZ--cE9.mjs.map +1 -0
  419. package/dist/direct-executor-DyjAqkpT.mjs +104 -0
  420. package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
  421. package/dist/dist-FPR93_xf.mjs +810 -0
  422. package/dist/dist-FPR93_xf.mjs.map +1 -0
  423. package/dist/email-console-DyQIgEnz.mjs +50 -0
  424. package/dist/email-console-DyQIgEnz.mjs.map +1 -0
  425. package/dist/email-locale-BYb16rVd.mjs +25 -0
  426. package/dist/email-locale-BYb16rVd.mjs.map +1 -0
  427. package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
  428. package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
  429. package/dist/enrich-DBtCncE2.mjs +194 -0
  430. package/dist/enrich-DBtCncE2.mjs.map +1 -0
  431. package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
  432. package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
  433. package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
  434. package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
  435. package/dist/entry-lock-C6NcnZPV.mjs +163 -0
  436. package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
  437. package/dist/entry-locks-BTyQLdbC.mjs +167 -0
  438. package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
  439. package/dist/error-BfsNNrIE.mjs +90 -0
  440. package/dist/error-BfsNNrIE.mjs.map +1 -0
  441. package/dist/errors-BN1QAnEY.mjs +460 -0
  442. package/dist/errors-BN1QAnEY.mjs.map +1 -0
  443. package/dist/errors-Bt3goF8I.mjs +120 -0
  444. package/dist/errors-Bt3goF8I.mjs.map +1 -0
  445. package/dist/escape-BveidMa2.mjs +9 -0
  446. package/dist/escape-BveidMa2.mjs.map +1 -0
  447. package/dist/fence-Bb_IbCxI.mjs +162 -0
  448. package/dist/fence-Bb_IbCxI.mjs.map +1 -0
  449. package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
  450. package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
  451. package/dist/field-map-6m9rF49t.mjs +83 -0
  452. package/dist/field-map-6m9rF49t.mjs.map +1 -0
  453. package/dist/focal-point-CZ3d1wK5.mjs +23 -0
  454. package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
  455. package/dist/fts-manager-CCaZTp8y.mjs +443 -0
  456. package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
  457. package/dist/gc-xowRjczI.mjs +75 -0
  458. package/dist/gc-xowRjczI.mjs.map +1 -0
  459. package/dist/hash-COVK27Pc.mjs +37 -0
  460. package/dist/hash-COVK27Pc.mjs.map +1 -0
  461. package/dist/hook-result-CYSk0XFe.d.mts +31 -0
  462. package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
  463. package/dist/hreflang-CChPV7jx.mjs +105 -0
  464. package/dist/hreflang-CChPV7jx.mjs.map +1 -0
  465. package/dist/hreflang-DRslq3QI.d.mts +50 -0
  466. package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
  467. package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
  468. package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
  469. package/dist/identity-NVTOOQyq.mjs +35 -0
  470. package/dist/identity-NVTOOQyq.mjs.map +1 -0
  471. package/dist/import-wpSO2N0x.mjs +2020 -0
  472. package/dist/import-wpSO2N0x.mjs.map +1 -0
  473. package/dist/index-CDs2wq4X.d.mts +623 -0
  474. package/dist/index-CDs2wq4X.d.mts.map +1 -0
  475. package/dist/index.d.mts +24 -24
  476. package/dist/index.mjs +103 -101
  477. package/dist/install-finalization-D9R9R-W8.mjs +58 -0
  478. package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
  479. package/dist/keys-Bck6LBfF.mjs +61 -0
  480. package/dist/keys-Bck6LBfF.mjs.map +1 -0
  481. package/dist/kinds-CYmRESWj.mjs +974 -0
  482. package/dist/kinds-CYmRESWj.mjs.map +1 -0
  483. package/dist/lifecycle-C815ZQfV.mjs +25 -0
  484. package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
  485. package/dist/load-D99axixL.mjs +28 -0
  486. package/dist/load-D99axixL.mjs.map +1 -0
  487. package/dist/loader-CrRPfkHS.mjs +1197 -0
  488. package/dist/loader-CrRPfkHS.mjs.map +1 -0
  489. package/dist/loops-DMKlygqX.mjs +203 -0
  490. package/dist/loops-DMKlygqX.mjs.map +1 -0
  491. package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
  492. package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
  493. package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
  494. package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
  495. package/dist/media/image-endpoint.mjs +1 -1
  496. package/dist/media/index.d.mts +1 -1
  497. package/dist/media/index.mjs +4 -4
  498. package/dist/media/local-runtime.d.mts +14 -14
  499. package/dist/media/local-runtime.mjs +6 -6
  500. package/dist/media-BUQePMxP.mjs +373 -0
  501. package/dist/media-BUQePMxP.mjs.map +1 -0
  502. package/dist/media-DH8ibNlY.mjs +294 -0
  503. package/dist/media-DH8ibNlY.mjs.map +1 -0
  504. package/dist/media-OEIQ3bVc.mjs +408 -0
  505. package/dist/media-OEIQ3bVc.mjs.map +1 -0
  506. package/dist/media-allowlist-pYtaBA95.mjs +44 -0
  507. package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
  508. package/dist/media-folders-Bf8_s4de.mjs +210 -0
  509. package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
  510. package/dist/media-url-C6klEuNd.mjs +43 -0
  511. package/dist/media-url-C6klEuNd.mjs.map +1 -0
  512. package/dist/media-usage-D7Y64m6v.mjs +1629 -0
  513. package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
  514. package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
  515. package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
  516. package/dist/media-usage-work-DommYhYA.mjs +152 -0
  517. package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
  518. package/dist/media-usage-work-HU63hNDu.mjs +586 -0
  519. package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
  520. package/dist/menus-BQfusWEC.mjs +3608 -0
  521. package/dist/menus-BQfusWEC.mjs.map +1 -0
  522. package/dist/menus-BtwjQt5s.mjs +753 -0
  523. package/dist/menus-BtwjQt5s.mjs.map +1 -0
  524. package/dist/menus-p_M1V7J_.mjs +139 -0
  525. package/dist/menus-p_M1V7J_.mjs.map +1 -0
  526. package/dist/migrations/index.d.mts +1 -1
  527. package/dist/migrations/index.mjs +3 -3
  528. package/dist/mime-C94qBG-P.mjs +36 -0
  529. package/dist/mime-C94qBG-P.mjs.map +1 -0
  530. package/dist/mode-DpYW3w6U.mjs +23 -0
  531. package/dist/mode-DpYW3w6U.mjs.map +1 -0
  532. package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
  533. package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
  534. package/dist/normalize-DduyxBjf.mjs +191 -0
  535. package/dist/normalize-DduyxBjf.mjs.map +1 -0
  536. package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
  537. package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
  538. package/dist/oauth-clients-DENiDQri.mjs +266 -0
  539. package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
  540. package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
  541. package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
  542. package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
  543. package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
  544. package/dist/object-cache/memory.d.mts +1 -1
  545. package/dist/options-BYa1FgIM.d.mts +81 -0
  546. package/dist/options-BYa1FgIM.d.mts.map +1 -0
  547. package/dist/page/index.d.mts +2 -2
  548. package/dist/page/index.mjs +5 -5
  549. package/dist/parse-CORGGhHf.mjs +81 -0
  550. package/dist/parse-CORGGhHf.mjs.map +1 -0
  551. package/dist/parse-avNM1xWV.d.mts +168 -0
  552. package/dist/parse-avNM1xWV.d.mts.map +1 -0
  553. package/dist/passkey-config-Dih5YeIS.mjs +46 -0
  554. package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
  555. package/dist/paths-d51RFm8M.mjs +77 -0
  556. package/dist/paths-d51RFm8M.mjs.map +1 -0
  557. package/dist/patterns-CoqlXUvk.mjs +145 -0
  558. package/dist/patterns-CoqlXUvk.mjs.map +1 -0
  559. package/dist/placeholder-D2aksPMF.d.mts +306 -0
  560. package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
  561. package/dist/plan-DqeZKuaR.mjs +135 -0
  562. package/dist/plan-DqeZKuaR.mjs.map +1 -0
  563. package/dist/plugin-test-runtime.d.mts +14 -14
  564. package/dist/plugin-test-runtime.mjs +110 -107
  565. package/dist/plugin-types.d.mts +2 -2
  566. package/dist/plugin-utils.d.mts +12 -12
  567. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  568. package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
  569. package/dist/plugins/host.d.mts +5 -5
  570. package/dist/plugins/host.mjs +42 -41
  571. package/dist/plugins-Bb7oqjQA.mjs +277 -0
  572. package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
  573. package/dist/policy-BcEqut3n.mjs +45 -0
  574. package/dist/policy-BcEqut3n.mjs.map +1 -0
  575. package/dist/portable-text-DXE8ymtD.mjs +307 -0
  576. package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
  577. package/dist/preview-DEDWbwA_.mjs +107 -0
  578. package/dist/preview-DEDWbwA_.mjs.map +1 -0
  579. package/dist/protocol-BJbTzvwl.d.mts +61 -0
  580. package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
  581. package/dist/public-submission-D9c9S14m.mjs +250 -0
  582. package/dist/public-submission-D9c9S14m.mjs.map +1 -0
  583. package/dist/public-url-CIRe-2T6.mjs +101 -0
  584. package/dist/public-url-CIRe-2T6.mjs.map +1 -0
  585. package/dist/query-BzifXlPS.mjs +1156 -0
  586. package/dist/query-BzifXlPS.mjs.map +1 -0
  587. package/dist/query-OzMJ6vJP.mjs +41 -0
  588. package/dist/query-OzMJ6vJP.mjs.map +1 -0
  589. package/dist/rate-limit-Csp60Vik.mjs +120 -0
  590. package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
  591. package/dist/receipt-B-aU4hpJ.mjs +43 -0
  592. package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
  593. package/dist/redirect-CDSw1sU3.mjs +17 -0
  594. package/dist/redirect-CDSw1sU3.mjs.map +1 -0
  595. package/dist/redirect-D1ArbO85.mjs +411 -0
  596. package/dist/redirect-D1ArbO85.mjs.map +1 -0
  597. package/dist/redirects-BjTwDTsV.mjs +148 -0
  598. package/dist/redirects-BjTwDTsV.mjs.map +1 -0
  599. package/dist/redirects-Ck50kH3n.mjs +446 -0
  600. package/dist/redirects-Ck50kH3n.mjs.map +1 -0
  601. package/dist/registry/testing.mjs +3 -3
  602. package/dist/registry-CFcNCayZ.mjs +6754 -0
  603. package/dist/registry-CFcNCayZ.mjs.map +1 -0
  604. package/dist/relations-Cfaa1fDl.mjs +776 -0
  605. package/dist/relations-Cfaa1fDl.mjs.map +1 -0
  606. package/dist/request-cache-iHRlHx1d.mjs +104 -0
  607. package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
  608. package/dist/request-context.d.mts +1 -1
  609. package/dist/request-meta-D47mqyev.mjs +141 -0
  610. package/dist/request-meta-D47mqyev.mjs.map +1 -0
  611. package/dist/resolve-BPE8sMvx.mjs +99 -0
  612. package/dist/resolve-BPE8sMvx.mjs.map +1 -0
  613. package/dist/resolve-C0s1E_fH.mjs +199 -0
  614. package/dist/resolve-C0s1E_fH.mjs.map +1 -0
  615. package/dist/revision-j1p4-bOj.mjs +302 -0
  616. package/dist/revision-j1p4-bOj.mjs.map +1 -0
  617. package/dist/route-wire-C9PJV9aL.mjs +197 -0
  618. package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
  619. package/dist/routes-lyYw0mMf.mjs +272 -0
  620. package/dist/routes-lyYw0mMf.mjs.map +1 -0
  621. package/dist/runner-B3eyB9Gb.mjs +6121 -0
  622. package/dist/runner-B3eyB9Gb.mjs.map +1 -0
  623. package/dist/runner-DoYH2Jcu.d.mts +68 -0
  624. package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
  625. package/dist/runtime.d.mts +13 -13
  626. package/dist/runtime.mjs +3 -3
  627. package/dist/schema-BAayK46S.mjs +13 -0
  628. package/dist/schema-BAayK46S.mjs.map +1 -0
  629. package/dist/schema-Gqcl-8G4.mjs +815 -0
  630. package/dist/schema-Gqcl-8G4.mjs.map +1 -0
  631. package/dist/scopes-BqPOKoKf.mjs +34 -0
  632. package/dist/scopes-BqPOKoKf.mjs.map +1 -0
  633. package/dist/search-YJKPIEV6.mjs +448 -0
  634. package/dist/search-YJKPIEV6.mjs.map +1 -0
  635. package/dist/sections-BR_e-wK5.mjs +346 -0
  636. package/dist/sections-BR_e-wK5.mjs.map +1 -0
  637. package/dist/seed/index.d.mts +2 -2
  638. package/dist/seed/index.mjs +37 -31
  639. package/dist/seo/index.d.mts +3 -3
  640. package/dist/seo/index.mjs +22 -21
  641. package/dist/seo/index.mjs.map +1 -1
  642. package/dist/seo-Dsj8hy3j.mjs +114 -0
  643. package/dist/seo-Dsj8hy3j.mjs.map +1 -0
  644. package/dist/seo-XvH4LNNp.mjs +133 -0
  645. package/dist/seo-XvH4LNNp.mjs.map +1 -0
  646. package/dist/service-BsVG05gS.mjs +150 -0
  647. package/dist/service-BsVG05gS.mjs.map +1 -0
  648. package/dist/session-user-DgKbYrlj.mjs +51 -0
  649. package/dist/session-user-DgKbYrlj.mjs.map +1 -0
  650. package/dist/settings-CNPUntkh.mjs +51 -0
  651. package/dist/settings-CNPUntkh.mjs.map +1 -0
  652. package/dist/settings-D5EHi0Tk.mjs +439 -0
  653. package/dist/settings-D5EHi0Tk.mjs.map +1 -0
  654. package/dist/settings-DSfE7wOa.mjs +61 -0
  655. package/dist/settings-DSfE7wOa.mjs.map +1 -0
  656. package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
  657. package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
  658. package/dist/setup-nonce-DnSBP260.mjs +25 -0
  659. package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
  660. package/dist/site-settings-NGzdrt7O.mjs +50 -0
  661. package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
  662. package/dist/site-url-D6JB7tLW.mjs +16 -0
  663. package/dist/site-url-D6JB7tLW.mjs.map +1 -0
  664. package/dist/snapshot-CdcwwWAf.mjs +414 -0
  665. package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
  666. package/dist/ssrf-Dv0_tRpo.mjs +406 -0
  667. package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
  668. package/dist/stage-CUjhED3P.mjs +662 -0
  669. package/dist/stage-CUjhED3P.mjs.map +1 -0
  670. package/dist/staged-C36IWXff.mjs +659 -0
  671. package/dist/staged-C36IWXff.mjs.map +1 -0
  672. package/dist/state-CKouMCSY.mjs +153 -0
  673. package/dist/state-CKouMCSY.mjs.map +1 -0
  674. package/dist/status-lzyj4Uu7.mjs +30 -0
  675. package/dist/status-lzyj4Uu7.mjs.map +1 -0
  676. package/dist/storage/local.d.mts +1 -1
  677. package/dist/storage/local.mjs +1 -1
  678. package/dist/storage/s3.d.mts +1 -1
  679. package/dist/storage/s3.mjs +1 -1
  680. package/dist/storage-query-B-cWcTjJ.d.mts +1594 -0
  681. package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
  682. package/dist/tar-DsTXX6ch.mjs +449 -0
  683. package/dist/tar-DsTXX6ch.mjs.map +1 -0
  684. package/dist/target-DLQCwp_Z.mjs +27 -0
  685. package/dist/target-DLQCwp_Z.mjs.map +1 -0
  686. package/dist/taxonomies-BlAjr4BL.mjs +697 -0
  687. package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
  688. package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
  689. package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
  690. package/dist/taxonomy-CKDwM61Y.mjs +525 -0
  691. package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
  692. package/dist/tokens-BojXlk49.mjs +171 -0
  693. package/dist/tokens-BojXlk49.mjs.map +1 -0
  694. package/dist/transaction-DLPQWik1.mjs +29 -0
  695. package/dist/transaction-DLPQWik1.mjs.map +1 -0
  696. package/dist/transfer-XSTh2BCr.mjs +8706 -0
  697. package/dist/transfer-XSTh2BCr.mjs.map +1 -0
  698. package/dist/transfer-download-DkoCDA9d.mjs +33 -0
  699. package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
  700. package/dist/transfer-iQ26J-RT.mjs +166 -0
  701. package/dist/transfer-iQ26J-RT.mjs.map +1 -0
  702. package/dist/transformations-C7RQabKQ.mjs +196 -0
  703. package/dist/transformations-C7RQabKQ.mjs.map +1 -0
  704. package/dist/transport-D3RulfD6.mjs +136 -0
  705. package/dist/transport-D3RulfD6.mjs.map +1 -0
  706. package/dist/transport-DhlZlf4D.d.mts +42 -0
  707. package/dist/transport-DhlZlf4D.d.mts.map +1 -0
  708. package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
  709. package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
  710. package/dist/turnstile-lqUiY7lP.mjs +53 -0
  711. package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
  712. package/dist/types-4Dn9bZhu.mjs +77 -0
  713. package/dist/types-4Dn9bZhu.mjs.map +1 -0
  714. package/dist/types-5LSo7PPx.d.mts +85 -0
  715. package/dist/types-5LSo7PPx.d.mts.map +1 -0
  716. package/dist/types-BQ3hwYJT.d.mts +896 -0
  717. package/dist/types-BQ3hwYJT.d.mts.map +1 -0
  718. package/dist/types-BYEk7qo3.d.mts +198 -0
  719. package/dist/types-BYEk7qo3.d.mts.map +1 -0
  720. package/dist/types-CJKsWVFR.mjs +199 -0
  721. package/dist/types-CJKsWVFR.mjs.map +1 -0
  722. package/dist/types-Ca_w8mmY.d.mts +363 -0
  723. package/dist/types-Ca_w8mmY.d.mts.map +1 -0
  724. package/dist/types-CkE41ZAG.mjs +18 -0
  725. package/dist/types-CkE41ZAG.mjs.map +1 -0
  726. package/dist/types-D0aJW2uR.d.mts +1641 -0
  727. package/dist/types-D0aJW2uR.d.mts.map +1 -0
  728. package/dist/types-DbpN4Qto.d.mts +372 -0
  729. package/dist/types-DbpN4Qto.d.mts.map +1 -0
  730. package/dist/types-ILDI1sdY.mjs +16 -0
  731. package/dist/types-ILDI1sdY.mjs.map +1 -0
  732. package/dist/types-OC5c-edM.mjs +22 -0
  733. package/dist/types-OC5c-edM.mjs.map +1 -0
  734. package/dist/types-aOOxRSx6.mjs +103 -0
  735. package/dist/types-aOOxRSx6.mjs.map +1 -0
  736. package/dist/types-m1WbUffD.d.mts +198 -0
  737. package/dist/types-m1WbUffD.d.mts.map +1 -0
  738. package/dist/types-uxLoPBio.d.mts +124 -0
  739. package/dist/types-uxLoPBio.d.mts.map +1 -0
  740. package/dist/types-we5uR-tV.d.mts +287 -0
  741. package/dist/types-we5uR-tV.d.mts.map +1 -0
  742. package/dist/upload-attempts-DduMy6B0.mjs +32 -0
  743. package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
  744. package/dist/url-pattern-B3EwxAAk.mjs +33 -0
  745. package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
  746. package/dist/user-ElwQjTQT.mjs +171 -0
  747. package/dist/user-ElwQjTQT.mjs.map +1 -0
  748. package/dist/utils-BlAXmfOG.mjs +439 -0
  749. package/dist/utils-BlAXmfOG.mjs.map +1 -0
  750. package/dist/validate-CH0X5b2c.d.mts +468 -0
  751. package/dist/validate-CH0X5b2c.d.mts.map +1 -0
  752. package/dist/validate-CfgRpcjA.mjs +492 -0
  753. package/dist/validate-CfgRpcjA.mjs.map +1 -0
  754. package/dist/validation-DvYJtv4k.mjs +218 -0
  755. package/dist/validation-DvYJtv4k.mjs.map +1 -0
  756. package/dist/version-DgYjhTud.mjs +9 -0
  757. package/dist/version-DgYjhTud.mjs.map +1 -0
  758. package/dist/version-Dq71scUb.mjs +7 -0
  759. package/dist/version-Dq71scUb.mjs.map +1 -0
  760. package/dist/widgets-ChFIj0be.mjs +126 -0
  761. package/dist/widgets-ChFIj0be.mjs.map +1 -0
  762. package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
  763. package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
  764. package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
  765. package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
  766. package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
  767. package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
  768. package/package.json +7 -6
  769. package/src/api/handlers/content.ts +593 -16
  770. package/src/api/handlers/device-flow.ts +74 -21
  771. package/src/api/handlers/manifest.ts +79 -5
  772. package/src/api/handlers/relations.ts +638 -157
  773. package/src/api/handlers/revision.ts +30 -0
  774. package/src/api/handlers/schema.ts +403 -1
  775. package/src/api/handlers/staged-references.ts +142 -0
  776. package/src/api/handlers/validate-references.ts +146 -0
  777. package/src/api/schemas/content.ts +13 -0
  778. package/src/api/schemas/relations.ts +54 -44
  779. package/src/api/schemas/schema.ts +14 -0
  780. package/src/astro/integration/routes.ts +15 -19
  781. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
  782. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  783. package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
  784. package/src/astro/routes/api/relations/index.ts +4 -4
  785. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
  786. package/src/astro/types.ts +5 -0
  787. package/src/cli/commands/export-seed.ts +510 -89
  788. package/src/components/WidgetArea.astro +3 -2
  789. package/src/database/migrations/086_relations_structural.ts +197 -0
  790. package/src/database/migrations/087_reference_field_relations.ts +407 -0
  791. package/src/database/migrations/runner.ts +4 -0
  792. package/src/database/reference-backfill.ts +141 -0
  793. package/src/database/repositories/content.ts +43 -8
  794. package/src/database/repositories/relation.ts +620 -208
  795. package/src/database/repositories/revision.ts +16 -0
  796. package/src/database/repositories/types.ts +38 -0
  797. package/src/database/transaction.ts +12 -1
  798. package/src/database/types.ts +14 -5
  799. package/src/emdash-runtime.ts +86 -11
  800. package/src/index.ts +10 -0
  801. package/src/loader.ts +169 -22
  802. package/src/query.ts +455 -25
  803. package/src/references/field-map.ts +115 -0
  804. package/src/references/resolve.ts +160 -0
  805. package/src/references/staged.ts +117 -0
  806. package/src/references/types.ts +16 -0
  807. package/src/registry/artifact-fetch.ts +45 -271
  808. package/src/schema/registry.ts +99 -24
  809. package/src/schema/types.ts +58 -0
  810. package/src/schema/zod-generator.ts +67 -1
  811. package/src/seed/apply.ts +519 -62
  812. package/src/seed/types.ts +36 -2
  813. package/src/seed/validate.ts +78 -2
  814. package/src/transfer/analyze/unique-keys.ts +3 -12
  815. package/src/transfer/analyze/validate.ts +65 -39
  816. package/src/transfer/analyze/values.ts +12 -1
  817. package/src/transfer/export/readers.ts +12 -8
  818. package/src/transfer/format/columns.ts +26 -6
  819. package/src/transfer/format/kinds.ts +21 -5
  820. package/src/transfer/import/context.ts +8 -1
  821. package/src/transfer/ops/package-index.ts +1 -1
  822. package/dist/action-token-DYwe4Pk0.mjs +0 -26
  823. package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
  824. package/dist/activation-LOkDM5WT.mjs +0 -382
  825. package/dist/activation-LOkDM5WT.mjs.map +0 -1
  826. package/dist/adapters-B64LbYcB.d.mts +0 -171
  827. package/dist/adapters-B64LbYcB.d.mts.map +0 -1
  828. package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
  829. package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
  830. package/dist/api-CuyNEHZG.mjs +0 -4718
  831. package/dist/api-CuyNEHZG.mjs.map +0 -1
  832. package/dist/api-tokens-s4i4aUp_.mjs +0 -166
  833. package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
  834. package/dist/apply-npY1TAhG.mjs +0 -1366
  835. package/dist/apply-npY1TAhG.mjs.map +0 -1
  836. package/dist/approvals-CqMfNxak.mjs +0 -460
  837. package/dist/approvals-CqMfNxak.mjs.map +0 -1
  838. package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
  839. package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
  840. package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
  841. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
  842. package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
  843. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
  844. package/dist/audit-RfCugiSB.mjs +0 -127
  845. package/dist/audit-RfCugiSB.mjs.map +0 -1
  846. package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
  847. package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
  848. package/dist/authorize-seCifOMJ.mjs +0 -49
  849. package/dist/authorize-seCifOMJ.mjs.map +0 -1
  850. package/dist/backup-BQRj3afm.mjs +0 -246
  851. package/dist/backup-BQRj3afm.mjs.map +0 -1
  852. package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
  853. package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
  854. package/dist/block-types-BmZmLmAD.mjs +0 -132
  855. package/dist/block-types-BmZmLmAD.mjs.map +0 -1
  856. package/dist/block-values-C_VIPr5t.mjs +0 -175
  857. package/dist/block-values-C_VIPr5t.mjs.map +0 -1
  858. package/dist/byline-DYmkXqvo.mjs +0 -909
  859. package/dist/byline-DYmkXqvo.mjs.map +0 -1
  860. package/dist/byline-fields-D28AT-Fh.mjs +0 -123
  861. package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
  862. package/dist/byline-registry-gnKscbQX.mjs +0 -406
  863. package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
  864. package/dist/bylines-BPwJqoYH.mjs +0 -232
  865. package/dist/bylines-BPwJqoYH.mjs.map +0 -1
  866. package/dist/bylines-ukLaYpVZ.mjs +0 -214
  867. package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
  868. package/dist/cache-m7UEkRFV.mjs +0 -108
  869. package/dist/cache-m7UEkRFV.mjs.map +0 -1
  870. package/dist/canonical-YhEQezjg.mjs +0 -174
  871. package/dist/canonical-YhEQezjg.mjs.map +0 -1
  872. package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
  873. package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
  874. package/dist/challenge-store-ppU6Uv13.mjs +0 -51
  875. package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
  876. package/dist/checksum-B2IINIlN.mjs +0 -162
  877. package/dist/checksum-B2IINIlN.mjs.map +0 -1
  878. package/dist/chrome-tags-DApCQSIk.mjs +0 -24
  879. package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
  880. package/dist/chunks-Dms7Uxbt.mjs +0 -25
  881. package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
  882. package/dist/collection-deletion-BIm28mo3.mjs +0 -436
  883. package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
  884. package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
  885. package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
  886. package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
  887. package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
  888. package/dist/comment-CrBl22OF.mjs +0 -313
  889. package/dist/comment-CrBl22OF.mjs.map +0 -1
  890. package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
  891. package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
  892. package/dist/comments-2ah9du9y.mjs +0 -195
  893. package/dist/comments-2ah9du9y.mjs.map +0 -1
  894. package/dist/comments-fHZ8ON9O.mjs +0 -99
  895. package/dist/comments-fHZ8ON9O.mjs.map +0 -1
  896. package/dist/components-CXbq7CSM.mjs +0 -108
  897. package/dist/components-CXbq7CSM.mjs.map +0 -1
  898. package/dist/config-BjEm_3xL.d.mts +0 -6537
  899. package/dist/config-BjEm_3xL.d.mts.map +0 -1
  900. package/dist/config-IhybvkIQ.mjs +0 -242
  901. package/dist/config-IhybvkIQ.mjs.map +0 -1
  902. package/dist/config-Py43JK9r.d.mts +0 -39
  903. package/dist/config-Py43JK9r.d.mts.map +0 -1
  904. package/dist/content-DFaIEDj9.mjs +0 -2281
  905. package/dist/content-DFaIEDj9.mjs.map +0 -1
  906. package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
  907. package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
  908. package/dist/content-policy-DFNw91-d.mjs +0 -46
  909. package/dist/content-policy-DFNw91-d.mjs.map +0 -1
  910. package/dist/content-repair-Q8IUrpLL.mjs +0 -442
  911. package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
  912. package/dist/context-BV_7t-Ua.mjs +0 -1921
  913. package/dist/context-BV_7t-Ua.mjs.map +0 -1
  914. package/dist/cron-7DCJwPXq.mjs +0 -284
  915. package/dist/cron-7DCJwPXq.mjs.map +0 -1
  916. package/dist/dashboard-BP-iJqpd.mjs +0 -151
  917. package/dist/dashboard-BP-iJqpd.mjs.map +0 -1
  918. package/dist/default-DQ6vsviu.mjs +0 -81
  919. package/dist/default-DQ6vsviu.mjs.map +0 -1
  920. package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
  921. package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
  922. package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
  923. package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
  924. package/dist/device-flow-CRd6DXmW.mjs +0 -466
  925. package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
  926. package/dist/digest-BarSh-pN.mjs +0 -194
  927. package/dist/digest-BarSh-pN.mjs.map +0 -1
  928. package/dist/direct-executor-D2lNadwo.mjs +0 -104
  929. package/dist/direct-executor-D2lNadwo.mjs.map +0 -1
  930. package/dist/dist-BNwANFJR.mjs +0 -810
  931. package/dist/dist-BNwANFJR.mjs.map +0 -1
  932. package/dist/email-console-bJn3ctqA.mjs +0 -50
  933. package/dist/email-console-bJn3ctqA.mjs.map +0 -1
  934. package/dist/email-locale-CN6WAMx0.mjs +0 -25
  935. package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
  936. package/dist/emdash-runtime-CtfnZmPi.mjs +0 -4186
  937. package/dist/emdash-runtime-CtfnZmPi.mjs.map +0 -1
  938. package/dist/enrich-Dl3kZ-lP.mjs +0 -194
  939. package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
  940. package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
  941. package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
  942. package/dist/entry-lock-Cf5OoIgN.d.mts +0 -4368
  943. package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
  944. package/dist/entry-lock-DHQOxN7R.mjs +0 -163
  945. package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
  946. package/dist/entry-locks-D0foLdjQ.mjs +0 -167
  947. package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
  948. package/dist/error-CfvOHP0M.mjs +0 -90
  949. package/dist/error-CfvOHP0M.mjs.map +0 -1
  950. package/dist/errors-BF0_LFhW.mjs +0 -460
  951. package/dist/errors-BF0_LFhW.mjs.map +0 -1
  952. package/dist/errors-DgE1zJGG.mjs +0 -120
  953. package/dist/errors-DgE1zJGG.mjs.map +0 -1
  954. package/dist/escape-CuaZhZvL.mjs +0 -9
  955. package/dist/escape-CuaZhZvL.mjs.map +0 -1
  956. package/dist/fence-CMDXJYc_.mjs +0 -162
  957. package/dist/fence-CMDXJYc_.mjs.map +0 -1
  958. package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
  959. package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
  960. package/dist/focal-point-Gr34o-4o.mjs +0 -23
  961. package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
  962. package/dist/fts-manager-S-K0laoS.mjs +0 -443
  963. package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
  964. package/dist/gc-DjKY0Ay1.mjs +0 -75
  965. package/dist/gc-DjKY0Ay1.mjs.map +0 -1
  966. package/dist/hash-SDAW6zC-.mjs +0 -37
  967. package/dist/hash-SDAW6zC-.mjs.map +0 -1
  968. package/dist/hook-result-B5bXDgS2.d.mts +0 -31
  969. package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
  970. package/dist/hreflang-CbVI4paR.mjs +0 -105
  971. package/dist/hreflang-CbVI4paR.mjs.map +0 -1
  972. package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
  973. package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
  974. package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
  975. package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
  976. package/dist/identity-Be5kzutJ.mjs +0 -35
  977. package/dist/identity-Be5kzutJ.mjs.map +0 -1
  978. package/dist/import-YzfKCaco.mjs +0 -2020
  979. package/dist/import-YzfKCaco.mjs.map +0 -1
  980. package/dist/index-D-hdtLe8.d.mts +0 -623
  981. package/dist/index-D-hdtLe8.d.mts.map +0 -1
  982. package/dist/install-finalization-DfM1fj5x.mjs +0 -58
  983. package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
  984. package/dist/keys-yxLm5l35.mjs +0 -61
  985. package/dist/keys-yxLm5l35.mjs.map +0 -1
  986. package/dist/kinds-CRu_T5T5.mjs +0 -961
  987. package/dist/kinds-CRu_T5T5.mjs.map +0 -1
  988. package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
  989. package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
  990. package/dist/load-XgJiE6_3.mjs +0 -28
  991. package/dist/load-XgJiE6_3.mjs.map +0 -1
  992. package/dist/loader-BzqeR1ZN.mjs +0 -1086
  993. package/dist/loader-BzqeR1ZN.mjs.map +0 -1
  994. package/dist/loops-BQSzv5Zn.mjs +0 -203
  995. package/dist/loops-BQSzv5Zn.mjs.map +0 -1
  996. package/dist/manifest-builder-BmSAOOEF.mjs +0 -189
  997. package/dist/manifest-builder-BmSAOOEF.mjs.map +0 -1
  998. package/dist/manifest-schema-CY3zng_M.mjs +0 -492
  999. package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
  1000. package/dist/media-CPXTbb1R.mjs +0 -373
  1001. package/dist/media-CPXTbb1R.mjs.map +0 -1
  1002. package/dist/media-JXRWDhw3.mjs +0 -294
  1003. package/dist/media-JXRWDhw3.mjs.map +0 -1
  1004. package/dist/media-Pu1L6xir.mjs +0 -408
  1005. package/dist/media-Pu1L6xir.mjs.map +0 -1
  1006. package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
  1007. package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
  1008. package/dist/media-folders-BE0oo2eX.mjs +0 -210
  1009. package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
  1010. package/dist/media-url-jArBpzIG.mjs +0 -43
  1011. package/dist/media-url-jArBpzIG.mjs.map +0 -1
  1012. package/dist/media-usage-De-zeR9E.mjs +0 -1629
  1013. package/dist/media-usage-De-zeR9E.mjs.map +0 -1
  1014. package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
  1015. package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
  1016. package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
  1017. package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
  1018. package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
  1019. package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
  1020. package/dist/menus-BM7BPLOb.mjs +0 -139
  1021. package/dist/menus-BM7BPLOb.mjs.map +0 -1
  1022. package/dist/menus-Cm68rsAq.mjs +0 -3608
  1023. package/dist/menus-Cm68rsAq.mjs.map +0 -1
  1024. package/dist/menus-ITeAbcIF.mjs +0 -753
  1025. package/dist/menus-ITeAbcIF.mjs.map +0 -1
  1026. package/dist/mime-ChLqYwDk.mjs +0 -36
  1027. package/dist/mime-ChLqYwDk.mjs.map +0 -1
  1028. package/dist/mode-CCuKXUci.mjs +0 -23
  1029. package/dist/mode-CCuKXUci.mjs.map +0 -1
  1030. package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
  1031. package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
  1032. package/dist/normalize-CO2P8-iE.mjs +0 -191
  1033. package/dist/normalize-CO2P8-iE.mjs.map +0 -1
  1034. package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
  1035. package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
  1036. package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
  1037. package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
  1038. package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
  1039. package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
  1040. package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
  1041. package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
  1042. package/dist/options-SQCHQCPH.d.mts +0 -81
  1043. package/dist/options-SQCHQCPH.d.mts.map +0 -1
  1044. package/dist/parse-CVgO-Qai.d.mts +0 -168
  1045. package/dist/parse-CVgO-Qai.d.mts.map +0 -1
  1046. package/dist/parse-DY6OD1j_.mjs +0 -81
  1047. package/dist/parse-DY6OD1j_.mjs.map +0 -1
  1048. package/dist/passkey-config-X_H8128a.mjs +0 -46
  1049. package/dist/passkey-config-X_H8128a.mjs.map +0 -1
  1050. package/dist/paths-JxokKIbr.mjs +0 -77
  1051. package/dist/paths-JxokKIbr.mjs.map +0 -1
  1052. package/dist/patterns-BhAvqO0S.mjs +0 -145
  1053. package/dist/patterns-BhAvqO0S.mjs.map +0 -1
  1054. package/dist/placeholder-MSEd8gty.d.mts +0 -306
  1055. package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
  1056. package/dist/plan-xjcWrAah.mjs +0 -135
  1057. package/dist/plan-xjcWrAah.mjs.map +0 -1
  1058. package/dist/plugins-DUXUt8B9.mjs +0 -277
  1059. package/dist/plugins-DUXUt8B9.mjs.map +0 -1
  1060. package/dist/policy-CUvwAARc.mjs +0 -45
  1061. package/dist/policy-CUvwAARc.mjs.map +0 -1
  1062. package/dist/portable-text-5O_ZGUjB.mjs +0 -307
  1063. package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
  1064. package/dist/preview-CIUcPYr6.mjs +0 -107
  1065. package/dist/preview-CIUcPYr6.mjs.map +0 -1
  1066. package/dist/protocol-B97DZaFr.d.mts +0 -61
  1067. package/dist/protocol-B97DZaFr.d.mts.map +0 -1
  1068. package/dist/public-submission-BFBUrqst.mjs +0 -250
  1069. package/dist/public-submission-BFBUrqst.mjs.map +0 -1
  1070. package/dist/public-url-Bn7U0D7-.mjs +0 -101
  1071. package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
  1072. package/dist/query-B48peoRT.mjs +0 -890
  1073. package/dist/query-B48peoRT.mjs.map +0 -1
  1074. package/dist/query-C4IH0uhR.mjs +0 -41
  1075. package/dist/query-C4IH0uhR.mjs.map +0 -1
  1076. package/dist/rate-limit-BZ6nybgc.mjs +0 -120
  1077. package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
  1078. package/dist/receipt-B4wJj5Jq.mjs +0 -43
  1079. package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
  1080. package/dist/redirect-B29UjdUn.mjs +0 -411
  1081. package/dist/redirect-B29UjdUn.mjs.map +0 -1
  1082. package/dist/redirect-Cd1E7VUt.mjs +0 -17
  1083. package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
  1084. package/dist/redirects-Ca2MPfEG.mjs +0 -446
  1085. package/dist/redirects-Ca2MPfEG.mjs.map +0 -1
  1086. package/dist/redirects-Cv9apQKj.mjs +0 -148
  1087. package/dist/redirects-Cv9apQKj.mjs.map +0 -1
  1088. package/dist/relation-M4NUCb0b.mjs +0 -334
  1089. package/dist/relation-M4NUCb0b.mjs.map +0 -1
  1090. package/dist/relations-CCif47Oq.mjs +0 -403
  1091. package/dist/relations-CCif47Oq.mjs.map +0 -1
  1092. package/dist/relations-CK9CYUyr.mjs +0 -310
  1093. package/dist/relations-CK9CYUyr.mjs.map +0 -1
  1094. package/dist/request-cache-DzLYKm_x.mjs +0 -104
  1095. package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
  1096. package/dist/request-meta-sZXt3sRo.mjs +0 -141
  1097. package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
  1098. package/dist/resolve-2WbQsCvT.mjs +0 -199
  1099. package/dist/resolve-2WbQsCvT.mjs.map +0 -1
  1100. package/dist/route-wire--1hLuACz.mjs +0 -197
  1101. package/dist/route-wire--1hLuACz.mjs.map +0 -1
  1102. package/dist/routes-vrR95WR6.mjs +0 -272
  1103. package/dist/routes-vrR95WR6.mjs.map +0 -1
  1104. package/dist/runner-1y4J9fJB.mjs +0 -5742
  1105. package/dist/runner-1y4J9fJB.mjs.map +0 -1
  1106. package/dist/runner-D5_LzKXI.d.mts +0 -68
  1107. package/dist/runner-D5_LzKXI.d.mts.map +0 -1
  1108. package/dist/schema-BABiRdsH.mjs +0 -13
  1109. package/dist/schema-BABiRdsH.mjs.map +0 -1
  1110. package/dist/schema-Du3MzCG0.mjs +0 -446
  1111. package/dist/schema-Du3MzCG0.mjs.map +0 -1
  1112. package/dist/scopes-Dbk-ElhT.mjs +0 -34
  1113. package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
  1114. package/dist/search-Bt1PL1jf.mjs +0 -448
  1115. package/dist/search-Bt1PL1jf.mjs.map +0 -1
  1116. package/dist/sections-Ddptx_o9.mjs +0 -346
  1117. package/dist/sections-Ddptx_o9.mjs.map +0 -1
  1118. package/dist/seo-CZT2oLtT.mjs +0 -114
  1119. package/dist/seo-CZT2oLtT.mjs.map +0 -1
  1120. package/dist/seo-D5w3-Azy.mjs +0 -133
  1121. package/dist/seo-D5w3-Azy.mjs.map +0 -1
  1122. package/dist/service-DuykXPyW.mjs +0 -150
  1123. package/dist/service-DuykXPyW.mjs.map +0 -1
  1124. package/dist/session-user-BhaVp8w0.mjs +0 -51
  1125. package/dist/session-user-BhaVp8w0.mjs.map +0 -1
  1126. package/dist/settings-B4vDl1fK.mjs +0 -439
  1127. package/dist/settings-B4vDl1fK.mjs.map +0 -1
  1128. package/dist/settings-DYidIB26.mjs +0 -61
  1129. package/dist/settings-DYidIB26.mjs.map +0 -1
  1130. package/dist/settings-Dyj6v8C4.mjs +0 -51
  1131. package/dist/settings-Dyj6v8C4.mjs.map +0 -1
  1132. package/dist/setup-complete-bOogcHWG.mjs +0 -26
  1133. package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
  1134. package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
  1135. package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
  1136. package/dist/site-settings-DOgRUoFX.mjs +0 -50
  1137. package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
  1138. package/dist/site-url-BU_bbxwj.mjs +0 -16
  1139. package/dist/site-url-BU_bbxwj.mjs.map +0 -1
  1140. package/dist/snapshot-PawoX-WG.mjs +0 -414
  1141. package/dist/snapshot-PawoX-WG.mjs.map +0 -1
  1142. package/dist/ssrf-CJUnJymJ.mjs +0 -406
  1143. package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
  1144. package/dist/stage-DgrBz_du.mjs +0 -662
  1145. package/dist/stage-DgrBz_du.mjs.map +0 -1
  1146. package/dist/state-DDiPySSG.mjs +0 -153
  1147. package/dist/state-DDiPySSG.mjs.map +0 -1
  1148. package/dist/status-DZKIG4a9.mjs +0 -30
  1149. package/dist/status-DZKIG4a9.mjs.map +0 -1
  1150. package/dist/storage-query-FXJH5pI8.d.mts +0 -1581
  1151. package/dist/storage-query-FXJH5pI8.d.mts.map +0 -1
  1152. package/dist/tar-_1AgTYFu.mjs +0 -449
  1153. package/dist/tar-_1AgTYFu.mjs.map +0 -1
  1154. package/dist/target-_7pn2Gbg.mjs +0 -27
  1155. package/dist/target-_7pn2Gbg.mjs.map +0 -1
  1156. package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
  1157. package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
  1158. package/dist/taxonomies-C_XMoRcX.mjs +0 -939
  1159. package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
  1160. package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
  1161. package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
  1162. package/dist/tokens-u78jETkX.mjs +0 -171
  1163. package/dist/tokens-u78jETkX.mjs.map +0 -1
  1164. package/dist/transaction-BcJO4Tmc.mjs +0 -29
  1165. package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
  1166. package/dist/transfer-DIGvR9Af.mjs +0 -166
  1167. package/dist/transfer-DIGvR9Af.mjs.map +0 -1
  1168. package/dist/transfer-DgeCvHnj.mjs +0 -8675
  1169. package/dist/transfer-DgeCvHnj.mjs.map +0 -1
  1170. package/dist/transfer-download-Pml7RMio.mjs +0 -33
  1171. package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
  1172. package/dist/transformations-9gfpwY65.mjs +0 -196
  1173. package/dist/transformations-9gfpwY65.mjs.map +0 -1
  1174. package/dist/transport-BIfH7_hx.d.mts +0 -42
  1175. package/dist/transport-BIfH7_hx.d.mts.map +0 -1
  1176. package/dist/transport-DKWIq53q.mjs +0 -136
  1177. package/dist/transport-DKWIq53q.mjs.map +0 -1
  1178. package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
  1179. package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
  1180. package/dist/turnstile-DpsoyOfg.mjs +0 -53
  1181. package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
  1182. package/dist/types-B4sUC2p1.d.mts +0 -198
  1183. package/dist/types-B4sUC2p1.d.mts.map +0 -1
  1184. package/dist/types-B7Lmsh1E.d.mts +0 -887
  1185. package/dist/types-B7Lmsh1E.d.mts.map +0 -1
  1186. package/dist/types-BZakh7Ym.mjs +0 -22
  1187. package/dist/types-BZakh7Ym.mjs.map +0 -1
  1188. package/dist/types-B_CppEmv.d.mts +0 -264
  1189. package/dist/types-B_CppEmv.d.mts.map +0 -1
  1190. package/dist/types-BcrBrE6-.mjs +0 -159
  1191. package/dist/types-BcrBrE6-.mjs.map +0 -1
  1192. package/dist/types-BkUg2yHx.mjs +0 -92
  1193. package/dist/types-BkUg2yHx.mjs.map +0 -1
  1194. package/dist/types-CAZgq9fO.d.mts +0 -124
  1195. package/dist/types-CAZgq9fO.d.mts.map +0 -1
  1196. package/dist/types-Cd-O03VG.d.mts +0 -363
  1197. package/dist/types-Cd-O03VG.d.mts.map +0 -1
  1198. package/dist/types-Cr-Kg-3D.d.mts +0 -1641
  1199. package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
  1200. package/dist/types-D2fvWd1i.d.mts +0 -359
  1201. package/dist/types-D2fvWd1i.d.mts.map +0 -1
  1202. package/dist/types-D7HUsguf.mjs +0 -77
  1203. package/dist/types-D7HUsguf.mjs.map +0 -1
  1204. package/dist/types-DA1Te3Oy.d.mts +0 -198
  1205. package/dist/types-DA1Te3Oy.d.mts.map +0 -1
  1206. package/dist/types-DhV6Q5bP.mjs +0 -18
  1207. package/dist/types-DhV6Q5bP.mjs.map +0 -1
  1208. package/dist/types-DnnVSl6Y.d.mts +0 -85
  1209. package/dist/types-DnnVSl6Y.d.mts.map +0 -1
  1210. package/dist/types-VT4-BugW.mjs +0 -16
  1211. package/dist/types-VT4-BugW.mjs.map +0 -1
  1212. package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
  1213. package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
  1214. package/dist/url-pattern-CCeZMGOh.mjs +0 -33
  1215. package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
  1216. package/dist/user-DDSL-sGw.mjs +0 -171
  1217. package/dist/user-DDSL-sGw.mjs.map +0 -1
  1218. package/dist/utils-DdhmO9w9.mjs +0 -439
  1219. package/dist/utils-DdhmO9w9.mjs.map +0 -1
  1220. package/dist/validate-CHosPEhs.mjs +0 -453
  1221. package/dist/validate-CHosPEhs.mjs.map +0 -1
  1222. package/dist/validate-CM79QXYE.d.mts +0 -432
  1223. package/dist/validate-CM79QXYE.d.mts.map +0 -1
  1224. package/dist/validation-BFecQczG.mjs +0 -218
  1225. package/dist/validation-BFecQczG.mjs.map +0 -1
  1226. package/dist/version-BRZXVifl.mjs +0 -9
  1227. package/dist/version-BRZXVifl.mjs.map +0 -1
  1228. package/dist/version-DXsxRrob.mjs +0 -7
  1229. package/dist/version-DXsxRrob.mjs.map +0 -1
  1230. package/dist/widgets-WdV72brA.mjs +0 -126
  1231. package/dist/widgets-WdV72brA.mjs.map +0 -1
  1232. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
  1233. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
  1234. package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
  1235. package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
  1236. package/dist/zod-generator-D6uE4WiS.mjs +0 -389
  1237. package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
  1238. package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
  1239. /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
  1240. /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-DZOt8Qof.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-C36IWXff.mjs","names":[],"sources":["../src/database/repositories/relation.ts","../src/references/staged.ts"],"sourcesContent":["import { sql, type Kysely, type Selectable } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { chunks, SQL_BATCH_SIZE } from \"../../utils/chunks.js\";\nimport type { Database, RelationTable, ContentReferenceTable } from \"../types.js\";\nimport {\n\tdecodeCursor,\n\tencodeCursor,\n\tInvalidCursorError,\n\tSTAGED_CURSOR_MARKER,\n\ttype FindManyResult,\n} from \"./types.js\";\n\n// Each reference-edge row binds six values. Derive the row count so every\n// INSERT stays within D1's 100-parameter statement ceiling.\nconst REFERENCE_INSERT_BIND_COLUMNS = 6;\nconst D1_MAX_BOUND_PARAMETERS = 100;\nexport const REFERENCE_INSERT_BATCH_SIZE = Math.floor(\n\tD1_MAX_BOUND_PARAMETERS / REFERENCE_INSERT_BIND_COLUMNS,\n);\n\n// Repositioning binds an edge id twice — once to match the CASE branch, once in\n// the row filter. The new position is a literal and binds nothing.\nconst REFERENCE_REPOSITION_BIND_COLUMNS = 2;\nconst REFERENCE_REPOSITION_BATCH_SIZE = Math.floor(\n\tD1_MAX_BOUND_PARAMETERS / REFERENCE_REPOSITION_BIND_COLUMNS,\n);\n\n/** A reference edge as it is written. */\ninterface EdgeInsert {\n\tid: string;\n\trelation_id: string;\n\tparent_group: string;\n\tchild_group: string;\n\tsort_order: number;\n\tcreated_at: string;\n}\n\n/** Where an existing edge should sit in its parent's list. */\ninterface EdgePosition {\n\tid: string;\n\tsortOrder: number;\n}\n\n/**\n * Narrow a computed position to a non-negative integer before it is written as\n * a SQL literal. Every caller passes an array index; this is what keeps that\n * true at the one place the value stops being a bound parameter.\n */\nfunction asPosition(sortOrder: number): number {\n\tif (!Number.isInteger(sortOrder) || sortOrder < 0) {\n\t\tthrow new TypeError(`Invalid reference sort order: ${sortOrder}`);\n\t}\n\treturn sortOrder;\n}\n\n/**\n * A relation definition. Not localized: a relation joins the same two\n * collections whatever language you read it in, and its role labels are\n * single-valued like a collection's or a field's. That is what lets `slug` be\n * unique outright (migration 086) and resolve without a locale.\n */\nexport interface Relation {\n\tid: string;\n\tslug: string;\n\tparentCollection: string;\n\tchildCollection: string;\n\tparentLabel: string;\n\tchildLabel: string;\n\tparentLabelSingular: string | null;\n\tchildLabelSingular: string | null;\n\t/** How many children one parent may hold. `null` means unlimited. */\n\tmaxChildrenPerParent: number | null;\n\t/** How many parents one child may hold. `null` means unlimited. */\n\tmaxParentsPerChild: number | null;\n}\n\nexport interface CreateRelationInput {\n\tslug: string;\n\tparentCollection: string;\n\tchildCollection: string;\n\tparentLabel: string;\n\tchildLabel: string;\n\tparentLabelSingular?: string | null;\n\tchildLabelSingular?: string | null;\n\tmaxChildrenPerParent?: number | null;\n\tmaxParentsPerChild?: number | null;\n}\n\nexport interface UpdateRelationInput {\n\t/** Structural fields are immutable: a reference field stores the slug, and\n\t * the edges are keyed by the id. */\n\tparentLabel?: string;\n\tchildLabel?: string;\n\tparentLabelSingular?: string | null;\n\tchildLabelSingular?: string | null;\n\tmaxChildrenPerParent?: number | null;\n\tmaxParentsPerChild?: number | null;\n}\n\nexport interface ContentReference {\n\tid: string;\n\trelationId: string;\n\tparentGroup: string;\n\tchildGroup: string;\n\tsortOrder: number;\n}\n\n/**\n * Content-references repository.\n *\n * Owns relation *definitions* (`_emdash_relations`) and the *edge* junction\n * (`_emdash_content_references`, whose endpoints are content\n * `translation_group`s so edges are locale-agnostic, mirroring\n * `content_taxonomies`).\n *\n * A relation is schema, so it is not localized — it sits with\n * `_emdash_collections` and `_emdash_fields`, not with the row-per-locale\n * tables. See migration 086.\n *\n * Like `TaxonomyRepository`, this is not the validation boundary: it trusts its\n * typed inputs. The API slice supplies Zod schemas at the route and enforces\n * collection-agreement / relation-existence invariants in the handler.\n */\nexport class RelationRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Create a relation.\n\t *\n\t * `slug` is unique across all relations, so a duplicate raises the DB's\n\t * unique violation for the handler to translate into a conflict.\n\t */\n\tasync create(input: CreateRelationInput): Promise<Relation> {\n\t\tconst id = ulid();\n\t\tconst now = new Date().toISOString();\n\n\t\tawait this.db\n\t\t\t.insertInto(\"_emdash_relations\")\n\t\t\t.values({\n\t\t\t\tid,\n\t\t\t\tslug: input.slug,\n\t\t\t\tparent_collection: input.parentCollection,\n\t\t\t\tchild_collection: input.childCollection,\n\t\t\t\tparent_label: input.parentLabel,\n\t\t\t\tchild_label: input.childLabel,\n\t\t\t\tparent_label_singular: input.parentLabelSingular ?? null,\n\t\t\t\tchild_label_singular: input.childLabelSingular ?? null,\n\t\t\t\tmax_children_per_parent: input.maxChildrenPerParent ?? null,\n\t\t\t\tmax_parents_per_child: input.maxParentsPerChild ?? null,\n\t\t\t\tcreated_at: now,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.execute();\n\n\t\tconst relation = await this.findById(id);\n\t\tif (!relation) throw new Error(\"Failed to create relation\");\n\t\treturn relation;\n\t}\n\n\tasync findById(id: string): Promise<Relation | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_relations\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? this.rowToRelation(row) : null;\n\t}\n\n\t/**\n\t * Find a relation by its slug. No locale: a slug identifies a relation\n\t * outright (`UNIQUE(slug)`, migration 086), which is what lets an entry in\n\t * any locale address it.\n\t */\n\tasync findBySlug(slug: string): Promise<Relation | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_relations\")\n\t\t\t.selectAll()\n\t\t\t.where(\"slug\", \"=\", slug)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? this.rowToRelation(row) : null;\n\t}\n\n\t/** All relations, ordered by slug. */\n\tasync list(): Promise<Relation[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_relations\")\n\t\t\t.selectAll()\n\t\t\t.orderBy(\"slug\", \"asc\")\n\t\t\t.execute();\n\t\treturn rows.map((row) => this.rowToRelation(row));\n\t}\n\n\t/** Relations where `collection` is the parent OR the child side. */\n\tasync findForCollection(collection: string): Promise<Relation[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_relations\")\n\t\t\t.selectAll()\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([eb(\"parent_collection\", \"=\", collection), eb(\"child_collection\", \"=\", collection)]),\n\t\t\t)\n\t\t\t.orderBy(\"slug\", \"asc\")\n\t\t\t.execute();\n\t\treturn rows.map((row) => this.rowToRelation(row));\n\t}\n\n\t/**\n\t * Update a relation's role labels and cardinality. Structural fields are\n\t * immutable — a reference field stores the slug, and the edges are keyed by\n\t * the id. No-ops when nothing is supplied.\n\t */\n\tasync update(id: string, input: UpdateRelationInput): Promise<Relation | null> {\n\t\tconst existing = await this.findById(id);\n\t\tif (!existing) return null;\n\n\t\tconst updates: Record<string, unknown> = {};\n\t\tif (input.parentLabel !== undefined) updates.parent_label = input.parentLabel;\n\t\tif (input.childLabel !== undefined) updates.child_label = input.childLabel;\n\t\tif (input.parentLabelSingular !== undefined) {\n\t\t\tupdates.parent_label_singular = input.parentLabelSingular;\n\t\t}\n\t\tif (input.childLabelSingular !== undefined) {\n\t\t\tupdates.child_label_singular = input.childLabelSingular;\n\t\t}\n\t\tif (input.maxChildrenPerParent !== undefined) {\n\t\t\tupdates.max_children_per_parent = input.maxChildrenPerParent;\n\t\t}\n\t\tif (input.maxParentsPerChild !== undefined) {\n\t\t\tupdates.max_parents_per_child = input.maxParentsPerChild;\n\t\t}\n\n\t\tif (Object.keys(updates).length > 0) {\n\t\t\tupdates.updated_at = new Date().toISOString();\n\t\t\tawait this.db.updateTable(\"_emdash_relations\").set(updates).where(\"id\", \"=\", id).execute();\n\t\t}\n\n\t\treturn this.findById(id);\n\t}\n\n\t/**\n\t * Delete a relation and its edges (application-layer cascade — the edge\n\t * table has no FK).\n\t */\n\tasync delete(id: string): Promise<boolean> {\n\t\tconst relation = await this.findById(id);\n\t\tif (!relation) return false;\n\n\t\tawait this.db.deleteFrom(\"_emdash_content_references\").where(\"relation_id\", \"=\", id).execute();\n\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"_emdash_relations\")\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\t\treturn (result.numDeletedRows ?? 0n) > 0n;\n\t}\n\n\t/**\n\t * Insert one edge only while the end it lands on is still under its limit,\n\t * deciding and writing in a single statement.\n\t *\n\t * A count read before the insert answers for a moment that has passed by the\n\t * time the row goes in: two requests can both read a free slot and both fill\n\t * it, and the unique edge constraint does not catch it because they are\n\t * different pairs. Folding the count into the insert's `WHERE` makes the\n\t * decision and the write one thing, on D1 as much as anywhere. Returns false\n\t * when the limit refused the row.\n\t */\n\tprivate async insertEdgeWithinLimit(\n\t\trow: EdgeInsert,\n\t\tlimitedSide: \"parent\" | \"child\",\n\t\tlimit: number,\n\t): Promise<boolean> {\n\t\tconst column = limitedSide === \"parent\" ? \"parent_group\" : \"child_group\";\n\t\tconst group = limitedSide === \"parent\" ? row.parent_group : row.child_group;\n\t\tconst result = await sql`\n\t\t\tINSERT INTO ${sql.ref(\"_emdash_content_references\")}\n\t\t\t\t(id, relation_id, parent_group, child_group, sort_order, created_at)\n\t\t\tSELECT ${row.id}, ${row.relation_id}, ${row.parent_group}, ${row.child_group},\n\t\t\t ${row.sort_order}, ${row.created_at}\n\t\t\tWHERE (\n\t\t\t\tSELECT COUNT(*) FROM ${sql.ref(\"_emdash_content_references\")}\n\t\t\t\tWHERE relation_id = ${row.relation_id} AND ${sql.ref(column)} = ${group}\n\t\t\t) < ${limit}\n\t\t`.execute(this.db);\n\t\treturn (result.numAffectedRows ?? 0n) > 0n;\n\t}\n\n\t/**\n\t * Write new edges, taking back the ones already written if the limited end\n\t * refuses a later one.\n\t *\n\t * Returns the refused group in a one-element array, or an empty array when\n\t * every row went in. The rollback is what lets a replacement add before it\n\t * removes: on D1 nothing else can take a partial write back.\n\t *\n\t * An unlimited end cannot refuse anything, so its rows go in as batches; a\n\t * limited one takes a statement per edge, because a limit enforced only by a\n\t * count before the write is one two requests can both walk past.\n\t */\n\tprivate async insertEdges(\n\t\trows: EdgeInsert[],\n\t\tlimitedSide: \"parent\" | \"child\",\n\t\tlimit: number | null,\n\t): Promise<string[]> {\n\t\tif (rows.length === 0) return [];\n\n\t\tif (limit === null) {\n\t\t\tfor (const rowBatch of chunks(rows, REFERENCE_INSERT_BATCH_SIZE)) {\n\t\t\t\t// oxlint-disable-next-line no-await-in-loop -- one statement per D1-safe batch\n\t\t\t\tawait this.db\n\t\t\t\t\t.insertInto(\"_emdash_content_references\")\n\t\t\t\t\t.values(rowBatch)\n\t\t\t\t\t.onConflict((oc) => oc.doNothing())\n\t\t\t\t\t.execute();\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tconst written: string[] = [];\n\t\tfor (const row of rows) {\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- one statement per edge is what makes the limit hold\n\t\t\tconst inserted = await this.insertEdgeWithinLimit(row, limitedSide, limit);\n\t\t\tif (inserted) {\n\t\t\t\twritten.push(row.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait this.deleteEdgesById(written);\n\t\t\treturn [limitedSide === \"parent\" ? row.parent_group : row.child_group];\n\t\t}\n\t\treturn [];\n\t}\n\n\t/** Remove edges by id, in D1-safe batches. */\n\tprivate async deleteEdgesById(ids: string[]): Promise<void> {\n\t\tfor (const idBatch of chunks(ids, SQL_BATCH_SIZE)) {\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- one statement per bind-parameter batch\n\t\t\tawait this.db.deleteFrom(\"_emdash_content_references\").where(\"id\", \"in\", idBatch).execute();\n\t\t}\n\t}\n\n\t/**\n\t * Move kept edges to their new positions, a statement per batch rather than\n\t * one per edge: dragging one entry up a long list moves every entry below it,\n\t * and that is a single editor action.\n\t */\n\tprivate async repositionEdges(moves: EdgePosition[]): Promise<void> {\n\t\tfor (const moveBatch of chunks(moves, REFERENCE_REPOSITION_BATCH_SIZE)) {\n\t\t\t// The position is a literal, not a bind: it is an index this method\n\t\t\t// computed, and every branch of a CASE binding one would leave Postgres\n\t\t\t// inferring the result type from parameters alone.\n\t\t\tconst branches = moveBatch.map(\n\t\t\t\t(move) => sql`WHEN ${move.id} THEN ${sql.lit(asPosition(move.sortOrder))}`,\n\t\t\t);\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- one statement per bind-parameter batch\n\t\t\tawait this.db\n\t\t\t\t.updateTable(\"_emdash_content_references\")\n\t\t\t\t.set({\n\t\t\t\t\tsort_order: sql<number>`CASE ${sql.ref(\"id\")} ${sql.join(branches, sql` `)} END`,\n\t\t\t\t})\n\t\t\t\t.where(\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"in\",\n\t\t\t\t\tmoveBatch.map((move) => move.id),\n\t\t\t\t)\n\t\t\t\t.execute();\n\t\t}\n\t}\n\n\t/** Normalize a relation id OR slug to its id. Returns null for an unknown\n\t * relation (edge methods then no-op, matching\n\t * `TaxonomyRepository.attachToEntry`). */\n\tprivate async resolveRelationId(idOrSlug: string): Promise<string | null> {\n\t\treturn (await this.resolveRelationLimits(idOrSlug))?.id ?? null;\n\t}\n\n\t/** The same lookup, carrying the limits an edge write has to hold to. */\n\tprivate async resolveRelationLimits(idOrSlug: string): Promise<{\n\t\tid: string;\n\t\tmaxChildrenPerParent: number | null;\n\t\tmaxParentsPerChild: number | null;\n\t} | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_relations\")\n\t\t\t.select([\"id\", \"max_children_per_parent\", \"max_parents_per_child\"])\n\t\t\t.where((eb) => eb.or([eb(\"id\", \"=\", idOrSlug), eb(\"slug\", \"=\", idOrSlug)]))\n\t\t\t.executeTakeFirst();\n\t\tif (!row) return null;\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\tmaxChildrenPerParent: row.max_children_per_parent,\n\t\t\tmaxParentsPerChild: row.max_parents_per_child,\n\t\t};\n\t}\n\n\tprivate rowToReference(row: Selectable<ContentReferenceTable>): ContentReference {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\trelationId: row.relation_id,\n\t\t\tparentGroup: row.parent_group,\n\t\t\tchildGroup: row.child_group,\n\t\t\tsortOrder: row.sort_order,\n\t\t};\n\t}\n\n\t/**\n\t * Link `parentGroup → childGroup` under a relation. `relation` is a relation\n\t * id or group. Idempotent (onConflict doNothing against the unique edge).\n\t * `sortOrder` defaults to append: max(sort_order)+1 within (relation, parent).\n\t *\n\t * The default-append MAX→INSERT is not atomic: concurrent appends without an\n\t * explicit `sortOrder` may both read the same max and collide on sort_order,\n\t * and onConflict silently drops the loser. Callers needing strict ordering\n\t * under concurrency should pass `sortOrder` explicitly (or serialize).\n\t */\n\tasync addReference(\n\t\trelation: string,\n\t\tparentGroup: string,\n\t\tchildGroup: string,\n\t\tsortOrder?: number,\n\t): Promise<void> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return;\n\n\t\tlet order = sortOrder;\n\t\tif (order === undefined) {\n\t\t\tconst max = await this.db\n\t\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t\t.select((eb) => eb.fn.max(\"sort_order\").as(\"max\"))\n\t\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t\t.where(\"parent_group\", \"=\", parentGroup)\n\t\t\t\t.executeTakeFirst();\n\t\t\torder = max?.max === null || max?.max === undefined ? 0 : Number(max.max) + 1;\n\t\t}\n\n\t\tawait this.db\n\t\t\t.insertInto(\"_emdash_content_references\")\n\t\t\t.values({\n\t\t\t\tid: ulid(),\n\t\t\t\trelation_id: relationId,\n\t\t\t\tparent_group: parentGroup,\n\t\t\t\tchild_group: childGroup,\n\t\t\t\tsort_order: order,\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t})\n\t\t\t.onConflict((oc) => oc.doNothing())\n\t\t\t.execute();\n\t}\n\n\t/** Remove one `parentGroup → childGroup` edge under a relation. */\n\tasync removeReference(relation: string, parentGroup: string, childGroup: string): Promise<void> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return;\n\n\t\tawait this.db\n\t\t\t.deleteFrom(\"_emdash_content_references\")\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"parent_group\", \"=\", parentGroup)\n\t\t\t.where(\"child_group\", \"=\", childGroup)\n\t\t\t.execute();\n\t}\n\n\t/** Forward traversal: a parent's children for a relation, ordered. */\n\tasync getChildren(relation: string, parentGroup: string): Promise<ContentReference[]> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return [];\n\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.selectAll()\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"parent_group\", \"=\", parentGroup)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.execute();\n\t\treturn rows.map((row) => this.rowToReference(row));\n\t}\n\n\t/**\n\t * Forward traversal, paginated: one page of a parent's children for a\n\t * relation, ordered by `(sort_order, id)`. Use this on request paths — a\n\t * parent's children are capped but still up to 1000, and an unbounded read\n\t * scales poorly. Returns `{ items, nextCursor? }`; the cursor's order value is\n\t * the row's `sort_order`. Default limit 50, max 100.\n\t */\n\tasync getChildrenPage(\n\t\trelation: string,\n\t\tparentGroup: string,\n\t\toptions: { limit?: number; cursor?: string } = {},\n\t): Promise<FindManyResult<ContentReference>> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return { items: [] };\n\t\treturn this.getChildrenPageById(relationId, parentGroup, options);\n\t}\n\n\t/** `getChildrenPage` for a caller that already holds the relation's id. */\n\tasync getChildrenPageById(\n\t\trelationId: string,\n\t\tparentGroup: string,\n\t\toptions: { limit?: number; cursor?: string } = {},\n\t): Promise<FindManyResult<ContentReference>> {\n\t\tconst limit = Math.min(options.limit || 50, 100);\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.selectAll()\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"parent_group\", \"=\", parentGroup);\n\n\t\tif (options.cursor) {\n\t\t\tconst decoded = decodeCursor(options.cursor);\n\t\t\tif (decoded.orderValue === STAGED_CURSOR_MARKER) {\n\t\t\t\t// A cursor issued over a draft's pending selection anchors on a\n\t\t\t\t// translation group rather than a row here, which is what a render\n\t\t\t\t// sees when the draft publishes mid-pagination. Resume after that\n\t\t\t\t// group's edge so the walk continues; if the group is no longer\n\t\t\t\t// selected there is nothing to resume from, so the page restarts.\n\t\t\t\tquery = query.where((eb) => {\n\t\t\t\t\tconst anchor = () =>\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_content_references as anchor\")\n\t\t\t\t\t\t\t.where(\"anchor.relation_id\", \"=\", relationId)\n\t\t\t\t\t\t\t.where(\"anchor.parent_group\", \"=\", parentGroup)\n\t\t\t\t\t\t\t.where(\"anchor.child_group\", \"=\", decoded.id);\n\t\t\t\t\treturn eb.or([\n\t\t\t\t\t\teb.not(eb.exists(anchor().select(\"anchor.id\"))),\n\t\t\t\t\t\teb(\"sort_order\", \">\", anchor().select(\"anchor.sort_order\")),\n\t\t\t\t\t\teb.and([\n\t\t\t\t\t\t\teb(\"sort_order\", \"=\", anchor().select(\"anchor.sort_order\")),\n\t\t\t\t\t\t\teb(\"id\", \">\", anchor().select(\"anchor.id\")),\n\t\t\t\t\t\t]),\n\t\t\t\t\t]);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst sortOrder = Number(decoded.orderValue);\n\t\t\t\t// `decodeCursor` only guarantees `orderValue` is a string; a hand-crafted\n\t\t\t\t// cursor with a non-numeric order value would coerce to NaN and blow up at\n\t\t\t\t// the driver bind as a 500. A bad cursor is a client error — surface it as\n\t\t\t\t// INVALID_CURSOR (400). Server-issued cursors are always numeric here.\n\t\t\t\tif (!Number.isFinite(sortOrder)) throw new InvalidCursorError(options.cursor);\n\t\t\t\tquery = query.where((eb) =>\n\t\t\t\t\teb.or([\n\t\t\t\t\t\teb(\"sort_order\", \">\", sortOrder),\n\t\t\t\t\t\teb.and([eb(\"sort_order\", \"=\", sortOrder), eb(\"id\", \">\", decoded.id)]),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst rows = await query\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.limit(limit + 1)\n\t\t\t.execute();\n\n\t\tconst hasMore = rows.length > limit;\n\t\tconst items = rows.slice(0, limit).map((row) => this.rowToReference(row));\n\t\tconst result: FindManyResult<ContentReference> = { items };\n\t\tconst last = items.at(-1);\n\t\tif (hasMore && last) {\n\t\t\tresult.nextCursor = encodeCursor(String(last.sortOrder), last.id);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/** Backlink traversal: the parents that reference a child for a relation. */\n\tasync getParents(relation: string, childGroup: string): Promise<ContentReference[]> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return [];\n\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.selectAll()\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"child_group\", \"=\", childGroup)\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.execute();\n\t\treturn rows.map((row) => this.rowToReference(row));\n\t}\n\n\t/**\n\t * Replace all children of `parentGroup` under a relation with `childGroups`,\n\t * assigning positional sort_order (index in the deduped array).\n\t * Mirrors the intent of `TaxonomyRepository.setTermsForEntry`.\n\t *\n\t * A parent references a given child at most once (the unique edge), so\n\t * duplicate `childGroups` are collapsed first-occurrence-wins rather than\n\t * relying on the insert's onConflict to silently drop them.\n\t *\n\t * Written as a diff, in the order add → remove → reposition, rather than as a\n\t * delete of the whole end followed by a re-insert. There is no transaction on\n\t * D1: a replacement that removed first would leave the parent holding nothing\n\t * the moment the far side refused one of the additions, and report a failed\n\t * save over an emptied field. Additions already written come back out when a\n\t * later one is refused, so a refused call leaves the selection as it found it.\n\t * The diff also keeps an edge the caller is merely re-stating out of the far\n\t * side's count, which a delete-and-reinsert survives only because its delete\n\t * frees the slot a moment before it asks for it back.\n\t *\n\t * Concurrency: two simultaneous replace-all calls for the same (relation,\n\t * parent) can interleave and merge into the union of both sets (a lost update\n\t * — neither \"replace\" wins). This is non-corrupting — keyset pagination stays\n\t * totally ordered via the `(sort_order, id)` tiebreak even with duplicate\n\t * sort_orders — and a single client editing one parent's children serially\n\t * never hits it. A D1-portable fix isn't available (no multi-statement\n\t * transactions), so concurrent replace-all on one parent is unsupported by\n\t * design rather than guarded here.\n\t *\n\t * Returns the child group `maxParentsPerChild` refused, in a one-element\n\t * array — empty unless the relation limits that end and something else has\n\t * taken the slot since the caller resolved its selection.\n\t */\n\tasync setChildren(\n\t\trelation: string,\n\t\tparentGroup: string,\n\t\tchildGroups: string[],\n\t): Promise<string[]> {\n\t\tconst rel = await this.resolveRelationLimits(relation);\n\t\tif (!rel) return [];\n\n\t\tconst existing = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.select([\"id\", \"child_group\", \"sort_order\"])\n\t\t\t.where(\"relation_id\", \"=\", rel.id)\n\t\t\t.where(\"parent_group\", \"=\", parentGroup)\n\t\t\t.execute();\n\t\tconst existingChildren = new Set(existing.map((row) => row.child_group));\n\n\t\t// Collapse duplicates so positional sort_order has no gaps.\n\t\tconst uniqueChildGroups = [...new Set(childGroups)];\n\t\tconst positions = new Map(uniqueChildGroups.map((childGroup, index) => [childGroup, index]));\n\n\t\tconst now = new Date().toISOString();\n\t\tconst additions = uniqueChildGroups\n\t\t\t.map((childGroup, index) => ({ childGroup, index }))\n\t\t\t.filter(({ childGroup }) => !existingChildren.has(childGroup))\n\t\t\t.map(({ childGroup, index }) => ({\n\t\t\t\tid: ulid(),\n\t\t\t\trelation_id: rel.id,\n\t\t\t\tparent_group: parentGroup,\n\t\t\t\tchild_group: childGroup,\n\t\t\t\tsort_order: index,\n\t\t\t\tcreated_at: now,\n\t\t\t}));\n\n\t\tconst rejected = await this.insertEdges(additions, \"child\", rel.maxParentsPerChild);\n\t\tif (rejected.length > 0) return rejected;\n\n\t\tconst removals: string[] = [];\n\t\tconst repositions: EdgePosition[] = [];\n\t\tfor (const row of existing) {\n\t\t\tconst position = positions.get(row.child_group);\n\t\t\tif (position === undefined) removals.push(row.id);\n\t\t\telse if (position !== row.sort_order) repositions.push({ id: row.id, sortOrder: position });\n\t\t}\n\t\tawait this.deleteEdgesById(removals);\n\t\tawait this.repositionEdges(repositions);\n\t\treturn [];\n\t}\n\n\t/**\n\t * Replace all parents of `childGroup` under a relation with `parentGroups`:\n\t * the mirror of `setChildren`, for a field bound to the child side.\n\t *\n\t * Duplicates collapse first-occurrence-wins, and the same diff ordering and\n\t * non-transactional caveats apply — see `setChildren`, including that two\n\t * concurrent replace-all calls for one (relation, child) can merge.\n\t *\n\t * `sort_order` orders children within a parent and has no counterpart on this\n\t * side, so a *new* edge takes the next position among that parent's existing\n\t * children rather than a position in this child's list. A parent the caller\n\t * re-states keeps the position it already holds: that position is the other\n\t * side's list order, and saving a backlink field must not rewrite it. A\n\t * child-side field therefore has no order of its own; `getParents` reads by\n\t * `id`.\n\t *\n\t * Returns the parent group `maxChildrenPerParent` refused, the mirror of what\n\t * `setChildren` returns.\n\t */\n\tasync setParents(\n\t\trelation: string,\n\t\tchildGroup: string,\n\t\tparentGroups: string[],\n\t): Promise<string[]> {\n\t\tconst rel = await this.resolveRelationLimits(relation);\n\t\tif (!rel) return [];\n\t\tconst relationId = rel.id;\n\n\t\tconst existing = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.select([\"id\", \"parent_group\"])\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"child_group\", \"=\", childGroup)\n\t\t\t.execute();\n\t\tconst existingParents = new Set(existing.map((row) => row.parent_group));\n\n\t\tconst uniqueParentGroups = [...new Set(parentGroups)];\n\t\tconst selected = new Set(uniqueParentGroups);\n\t\tconst newParents = uniqueParentGroups.filter(\n\t\t\t(parentGroup) => !existingParents.has(parentGroup),\n\t\t);\n\n\t\t// One query for every new parent's highest position, so appending stays a\n\t\t// fixed number of round trips rather than one per parent.\n\t\tconst nextSortOrder = new Map<string, number>();\n\t\tfor (const groupBatch of chunks(newParents, REFERENCE_INSERT_BATCH_SIZE)) {\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- one statement per bind-parameter batch\n\t\t\tconst maxima = await this.db\n\t\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t\t.select((eb) => [\"parent_group\", eb.fn.max(\"sort_order\").as(\"max\")])\n\t\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t\t.where(\"parent_group\", \"in\", groupBatch)\n\t\t\t\t.groupBy(\"parent_group\")\n\t\t\t\t.execute();\n\t\t\tfor (const row of maxima) {\n\t\t\t\tnextSortOrder.set(row.parent_group, row.max === null ? 0 : Number(row.max) + 1);\n\t\t\t}\n\t\t}\n\n\t\tconst now = new Date().toISOString();\n\t\tconst additions = newParents.map((parentGroup) => ({\n\t\t\tid: ulid(),\n\t\t\trelation_id: relationId,\n\t\t\tparent_group: parentGroup,\n\t\t\tchild_group: childGroup,\n\t\t\tsort_order: nextSortOrder.get(parentGroup) ?? 0,\n\t\t\tcreated_at: now,\n\t\t}));\n\n\t\tconst rejected = await this.insertEdges(additions, \"parent\", rel.maxChildrenPerParent);\n\t\tif (rejected.length > 0) return rejected;\n\n\t\tawait this.deleteEdgesById(\n\t\t\texisting.filter((row) => !selected.has(row.parent_group)).map((row) => row.id),\n\t\t);\n\t\treturn [];\n\t}\n\n\t/**\n\t * Copy every outgoing edge of `fromParentGroup` onto `toParentGroup`,\n\t * preserving relation, child, and sort order. Used when duplicating a content\n\t * entry so the copy carries the same reference selections (edges are\n\t * storage-less, keyed by translation_group, so they don't ride along in the\n\t * row's `data`). Only the parent side is copied; backlinks pointing at the\n\t * original stay on the original. Idempotent per edge via onConflict.\n\t *\n\t * A copy is still a new edge, so it holds to `maxParentsPerChild` like any\n\t * other: a child already at its limit cannot also belong to the copy. Returns\n\t * the child group that refused, in a one-element array, having taken back\n\t * every edge this call had already written — the caller decides what a\n\t * duplicate that cannot carry its selection should do.\n\t */\n\tasync copyParentEdges(fromParentGroup: string, toParentGroup: string): Promise<string[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.selectAll()\n\t\t\t.where(\"parent_group\", \"=\", fromParentGroup)\n\t\t\t.execute();\n\t\tif (rows.length === 0) return [];\n\n\t\tconst now = new Date().toISOString();\n\t\t// Each relation carries its own limit, so the copies are written a relation\n\t\t// at a time rather than as one undifferentiated batch.\n\t\tconst byRelation = new Map<string, EdgeInsert[]>();\n\t\tfor (const row of rows) {\n\t\t\tconst copies = byRelation.get(row.relation_id) ?? [];\n\t\t\tcopies.push({\n\t\t\t\tid: ulid(),\n\t\t\t\trelation_id: row.relation_id,\n\t\t\t\tparent_group: toParentGroup,\n\t\t\t\tchild_group: row.child_group,\n\t\t\t\tsort_order: row.sort_order,\n\t\t\t\tcreated_at: now,\n\t\t\t});\n\t\t\tbyRelation.set(row.relation_id, copies);\n\t\t}\n\n\t\tconst written: string[] = [];\n\t\tfor (const [relationId, copies] of byRelation) {\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- each relation's limit gates its own copies\n\t\t\tconst rel = await this.resolveRelationLimits(relationId);\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- sequential so a refusal stops the rest\n\t\t\tconst rejected = await this.insertEdges(copies, \"child\", rel?.maxParentsPerChild ?? null);\n\t\t\tif (rejected.length > 0) {\n\t\t\t\t// `insertEdges` took back its own partial write; the relations already\n\t\t\t\t// copied are this call's to undo.\n\t\t\t\tawait this.deleteEdgesById(written);\n\t\t\t\treturn rejected;\n\t\t\t}\n\t\t\twritten.push(...copies.map((copy) => copy.id));\n\t\t}\n\t\treturn [];\n\t}\n\n\t/**\n\t * How many edges each of `groups` already holds at one end of a relation,\n\t * ignoring edges whose opposite end is `excludeOppositeGroup`.\n\t *\n\t * The exclusion is what lets a re-save of an unchanged selection pass: the\n\t * selecting entry's own edges are not counted against the limit it is about\n\t * to re-establish. Groups with no edges are absent from the map.\n\t */\n\tasync countEdgesByGroup(\n\t\trelationId: string,\n\t\tside: \"parent\" | \"child\",\n\t\tgroups: string[],\n\t\texcludeOppositeGroup: string | null,\n\t): Promise<Map<string, number>> {\n\t\tconst column = side === \"parent\" ? \"parent_group\" : \"child_group\";\n\t\tconst opposite = side === \"parent\" ? \"child_group\" : \"parent_group\";\n\n\t\tconst counts = new Map<string, number>();\n\t\tfor (const groupBatch of chunks([...new Set(groups)], SQL_BATCH_SIZE)) {\n\t\t\tlet query = this.db\n\t\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t\t.select((eb) => [column, eb.fn.countAll().as(\"count\")])\n\t\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t\t.where(column, \"in\", groupBatch);\n\t\t\t// An entry with no group of its own yet holds no links to discount, and\n\t\t\t// `!= NULL` is never true — it would silently count nothing at all.\n\t\t\tif (excludeOppositeGroup !== null) {\n\t\t\t\tquery = query.where(opposite, \"!=\", excludeOppositeGroup);\n\t\t\t}\n\t\t\t// oxlint-disable-next-line no-await-in-loop -- one statement per bind-parameter batch\n\t\t\tconst rows = await query.groupBy(column).execute();\n\t\t\tfor (const row of rows) {\n\t\t\t\tcounts.set(row[column], Number(row.count));\n\t\t\t}\n\t\t}\n\t\treturn counts;\n\t}\n\n\t/**\n\t * Backlink traversal, paginated: one page of the parents that reference a\n\t * child for a relation, ordered by `id`. Unlike a parent's children, a\n\t * child's backlinks are *unbounded* — one popular entry can be referenced by\n\t * arbitrarily many parents — so this read must paginate. Returns\n\t * `{ items, nextCursor? }`; the cursor's order value is the row `id`. Default\n\t * limit 50, max 100.\n\t */\n\tasync getParentsPage(\n\t\trelation: string,\n\t\tchildGroup: string,\n\t\toptions: { limit?: number; cursor?: string } = {},\n\t): Promise<FindManyResult<ContentReference>> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return { items: [] };\n\t\treturn this.getParentsPageById(relationId, childGroup, options);\n\t}\n\n\t/** `getParentsPage` for a caller that already holds the relation's id. */\n\tasync getParentsPageById(\n\t\trelationId: string,\n\t\tchildGroup: string,\n\t\toptions: { limit?: number; cursor?: string } = {},\n\t): Promise<FindManyResult<ContentReference>> {\n\t\tconst limit = Math.min(options.limit || 50, 100);\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.selectAll()\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"child_group\", \"=\", childGroup);\n\n\t\tif (options.cursor) {\n\t\t\tconst decoded = decodeCursor(options.cursor);\n\t\t\tif (decoded.orderValue === STAGED_CURSOR_MARKER) {\n\t\t\t\t// The mirror of `getChildrenPageById`: a staged cursor anchors on a\n\t\t\t\t// translation group, which compared against `id` would page from an\n\t\t\t\t// arbitrary point. Resume after that group's edge, or restart when the\n\t\t\t\t// group is no longer selected.\n\t\t\t\tquery = query.where((eb) => {\n\t\t\t\t\tconst anchor = eb\n\t\t\t\t\t\t.selectFrom(\"_emdash_content_references as anchor\")\n\t\t\t\t\t\t.where(\"anchor.relation_id\", \"=\", relationId)\n\t\t\t\t\t\t.where(\"anchor.child_group\", \"=\", childGroup)\n\t\t\t\t\t\t.where(\"anchor.parent_group\", \"=\", decoded.id);\n\t\t\t\t\treturn eb.or([\n\t\t\t\t\t\teb.not(eb.exists(anchor.select(\"anchor.id\"))),\n\t\t\t\t\t\teb(\"id\", \">\", anchor.select(\"anchor.id\")),\n\t\t\t\t\t]);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tquery = query.where(\"id\", \">\", decoded.id);\n\t\t\t}\n\t\t}\n\n\t\tconst rows = await query\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.limit(limit + 1)\n\t\t\t.execute();\n\n\t\tconst hasMore = rows.length > limit;\n\t\tconst items = rows.slice(0, limit).map((row) => this.rowToReference(row));\n\t\tconst result: FindManyResult<ContentReference> = { items };\n\t\tconst last = items.at(-1);\n\t\tif (hasMore && last) {\n\t\t\tresult.nextCursor = encodeCursor(last.id, last.id);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Remove every edge where `group` is the parent OR the child — i.e. ensure no\n\t * orphaned reference edges survive when a content entry is deleted. The\n\t * application-layer cascade that group-linking precludes at the SQL level.\n\t * Callers must be sure the whole group is gone: edges outlive any single\n\t * locale row. Returns the number of edges removed.\n\t */\n\tasync clearReferencesForGroup(group: string): Promise<number> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"_emdash_content_references\")\n\t\t\t.where((eb) => eb.or([eb(\"parent_group\", \"=\", group), eb(\"child_group\", \"=\", group)]))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numDeletedRows ?? 0);\n\t}\n\n\t/** Count a parent's children under a relation. */\n\tasync countChildren(relation: string, parentGroup: string): Promise<number> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return 0;\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.select((eb) => eb.fn.count(\"id\").as(\"count\"))\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"parent_group\", \"=\", parentGroup)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result?.count ?? 0);\n\t}\n\n\t/** Count a child's parents (backlinks) under a relation. */\n\tasync countParents(relation: string, childGroup: string): Promise<number> {\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return 0;\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.select((eb) => eb.fn.count(\"id\").as(\"count\"))\n\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t.where(\"child_group\", \"=\", childGroup)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result?.count ?? 0);\n\t}\n\n\t/**\n\t * Total edges per relation, for every relation at once. Relations with no\n\t * edges are absent from the map.\n\t *\n\t * One grouped scan rather than a count per relation: the delete dialogs name\n\t * how many links go with a relation, and the relations list shows the same\n\t * number on every row.\n\t */\n\tasync countEdgesByRelation(): Promise<Map<string, number>> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t.select([\"relation_id\", (eb) => eb.fn.count(\"id\").as(\"count\")])\n\t\t\t.groupBy(\"relation_id\")\n\t\t\t.execute();\n\t\treturn new Map(rows.map((row) => [row.relation_id, Number(row.count ?? 0)]));\n\t}\n\n\t/**\n\t * Batch child-counts for many parents under a relation. Chunks at\n\t * SQL_BATCH_SIZE for D1's bind-parameter limit. Returns parent_group → count\n\t * (parents with no children are absent from the map). Mirrors\n\t * `TaxonomyRepository.countEntriesForTerms`.\n\t */\n\tasync countChildrenForParents(\n\t\trelation: string,\n\t\tparentGroups: string[],\n\t): Promise<Map<string, number>> {\n\t\tconst counts = new Map<string, number>();\n\t\tif (parentGroups.length === 0) return counts;\n\t\tconst relationId = await this.resolveRelationId(relation);\n\t\tif (!relationId) return counts;\n\n\t\tfor (const chunk of chunks(parentGroups, SQL_BATCH_SIZE)) {\n\t\t\tconst rows = await this.db\n\t\t\t\t.selectFrom(\"_emdash_content_references\")\n\t\t\t\t.select([\"parent_group\", (eb) => eb.fn.count(\"id\").as(\"count\")])\n\t\t\t\t.where(\"relation_id\", \"=\", relationId)\n\t\t\t\t.where(\"parent_group\", \"in\", chunk)\n\t\t\t\t.groupBy(\"parent_group\")\n\t\t\t\t.execute();\n\t\t\tfor (const row of rows) {\n\t\t\t\tcounts.set(row.parent_group, Number(row.count ?? 0));\n\t\t\t}\n\t\t}\n\t\treturn counts;\n\t}\n\n\tprivate rowToRelation(row: Selectable<RelationTable>): Relation {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\tslug: row.slug,\n\t\t\tparentCollection: row.parent_collection,\n\t\t\tchildCollection: row.child_collection,\n\t\t\tparentLabel: row.parent_label,\n\t\t\tchildLabel: row.child_label,\n\t\t\tparentLabelSingular: row.parent_label_singular,\n\t\t\tchildLabelSingular: row.child_label_singular,\n\t\t\tmaxChildrenPerParent: row.max_children_per_parent,\n\t\t\tmaxParentsPerChild: row.max_parents_per_child,\n\t\t};\n\t}\n}\n","/**\n * The shape a pending reference selection takes inside a draft revision, and how\n * to read and page it.\n *\n * Nothing here touches the database, which is what lets both the write side\n * (`api/handlers/staged-references.ts`, which promotes and validates a staged\n * selection) and the read side (the entry read, the edge routes, the public\n * query resolver) share it without importing each other.\n */\n\nimport {\n\tdecodeCursor,\n\tencodeCursor,\n\tSTAGED_CURSOR_MARKER,\n} from \"../database/repositories/types.js\";\n\n/**\n * Where a collection that keeps drafts stages a pending reference selection: in\n * the draft revision's data, beside `_slug`. The leading underscore is what\n * keeps it out of the column writer, the loaded entry's `data`, and the publish\n * promotion loop, all of which already skip `_`-prefixed keys.\n *\n * The link table holds the live selection only.\n */\nexport const STAGED_REFERENCES_KEY = \"_references\";\n\n/**\n * A staged selection, by field slug, holding `translation_group` values rather\n * than entry ids: an edge names a thing, not one locale's row of it, so the\n * group is what the link table stores and what survives an entry being\n * translated or re-slugged between saving and publishing. The save resolves ids\n * to groups so publication has nothing left that can fail to resolve.\n *\n * Order is significant on the parent side, where it becomes `sort_order`.\n */\nexport type StagedReferences = Record<string, string[]>;\n\n/** Default page size for one reference field, matching the list endpoints. */\nexport const REFERENCE_PAGE_LIMIT = 50;\n/** Hard ceiling, matching the list endpoints. */\nexport const REFERENCE_PAGE_MAX_LIMIT = 100;\n\n/** One field's page of translation groups, before the entries are loaded. */\nexport interface PageOfGroups {\n\tgroups: string[];\n\tnextCursor?: string;\n}\n\n/**\n * Page a staged selection, which is a list in memory rather than a table.\n *\n * The cursor anchors on the last group of the previous page rather than on its\n * index: the editor can reorder or drop entries between one page and the next,\n * and an index would then silently skip or repeat. An anchor that is no longer\n * in the selection means the entries it pointed past are gone, so the walk ends.\n */\nexport function pageStagedGroups(\n\tgroups: string[],\n\toptions: { limit?: number; cursor?: string } = {},\n): PageOfGroups {\n\tconst limit = Math.min(\n\t\tMath.max(options.limit ?? REFERENCE_PAGE_LIMIT, 1),\n\t\tREFERENCE_PAGE_MAX_LIMIT,\n\t);\n\n\tlet start = 0;\n\tif (options.cursor) {\n\t\tconst decoded = decodeCursor(options.cursor);\n\t\t// A cursor from the link table anchors on an edge row id, which is not a\n\t\t// group and would match nothing. That happens when a preview session opens\n\t\t// mid-pagination over the published selection, so restart the field rather\n\t\t// than handing back an empty page that reads as \"no more\".\n\t\tif (decoded.orderValue === STAGED_CURSOR_MARKER) {\n\t\t\tconst index = groups.indexOf(decoded.id);\n\t\t\tif (index === -1) return { groups: [] };\n\t\t\tstart = index + 1;\n\t\t}\n\t}\n\n\tconst page = groups.slice(start, start + limit);\n\tconst last = page.at(-1);\n\tconst nextCursor =\n\t\tlast && start + page.length < groups.length\n\t\t\t? encodeCursor(STAGED_CURSOR_MARKER, last)\n\t\t\t: undefined;\n\treturn { groups: page, nextCursor };\n}\n\nfunction isGroupList(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\n/** The staged selection inside a revision's data, if it carries one. */\nexport function readStagedReferences(\n\tdata: Record<string, unknown> | undefined,\n): StagedReferences | undefined {\n\tconst staged = data?.[STAGED_REFERENCES_KEY];\n\tif (typeof staged !== \"object\" || staged === null || Array.isArray(staged)) return undefined;\n\n\tconst result: StagedReferences = {};\n\tfor (const [fieldSlug, groups] of Object.entries(staged)) {\n\t\tif (isGroupList(groups)) result[fieldSlug] = groups;\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Fold a save's selections into whatever the previous draft staged. A save that\n * names one reference field must not drop another field's pending selection, so\n * fields absent from `incoming` keep their staged value.\n */\nexport function mergeStagedReferences(\n\tbase: Record<string, unknown> | undefined,\n\tincoming: StagedReferences,\n): StagedReferences {\n\treturn { ...readStagedReferences(base), ...incoming };\n}\n"],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ //#region src/plugins/state.ts
2
+ const TIMEZONE_SUFFIX = /(?:z|[+-]\d{2}(?::?\d{2})?)$/i;
3
+ const HOUR_OFFSET_SUFFIX = /\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?[+-]\d{2}$/i;
4
+ function parseDatabaseTimestamp(value) {
5
+ let normalized = value.trim().replace(" ", "T");
6
+ if (HOUR_OFFSET_SUFFIX.test(normalized)) normalized += ":00";
7
+ else if (!TIMEZONE_SUFFIX.test(normalized)) normalized += "Z";
8
+ return new Date(normalized);
9
+ }
10
+ function toPluginStatus(value) {
11
+ if (value === "active") return "active";
12
+ return "inactive";
13
+ }
14
+ function toPluginSource(value) {
15
+ if (value === "marketplace") return "marketplace";
16
+ if (value === "registry") return "registry";
17
+ return "config";
18
+ }
19
+ /**
20
+ * Repository for plugin state in the database
21
+ */
22
+ var PluginStateRepository = class {
23
+ constructor(db) {
24
+ this.db = db;
25
+ }
26
+ /**
27
+ * Get state for a specific plugin
28
+ */
29
+ async get(pluginId) {
30
+ const row = await this.db.selectFrom("_plugin_state").selectAll().where("plugin_id", "=", pluginId).executeTakeFirst();
31
+ if (!row) return null;
32
+ return rowToPluginState(row);
33
+ }
34
+ /**
35
+ * Get all plugin states
36
+ */
37
+ async getAll() {
38
+ return (await this.db.selectFrom("_plugin_state").selectAll().execute()).map(rowToPluginState);
39
+ }
40
+ /**
41
+ * Get all marketplace-installed plugin states
42
+ */
43
+ async getMarketplacePlugins() {
44
+ return (await this.db.selectFrom("_plugin_state").selectAll().where("source", "=", "marketplace").execute()).map(rowToPluginState);
45
+ }
46
+ /**
47
+ * Get all registry-installed plugin states.
48
+ *
49
+ * The runtime's registry sync path uses this to discover which
50
+ * registry plugins should be loaded into the sandbox on this worker.
51
+ */
52
+ async getRegistryPlugins() {
53
+ return (await this.db.selectFrom("_plugin_state").selectAll().where("source", "=", "registry").execute()).map(rowToPluginState);
54
+ }
55
+ /**
56
+ * Create or update plugin state
57
+ */
58
+ async upsert(pluginId, version, status, opts) {
59
+ const now = (/* @__PURE__ */ new Date()).toISOString();
60
+ const existing = await this.get(pluginId);
61
+ if (existing) {
62
+ const updates = {
63
+ status,
64
+ version
65
+ };
66
+ if (status === "active" && existing.status !== "active") updates.activated_at = now;
67
+ else if (status === "inactive" && existing.status !== "inactive") updates.deactivated_at = now;
68
+ if (opts?.source) updates.source = opts.source;
69
+ if (opts?.marketplaceVersion !== void 0) updates.marketplace_version = opts.marketplaceVersion;
70
+ if (opts?.displayName !== void 0) updates.display_name = opts.displayName;
71
+ if (opts?.description !== void 0) updates.description = opts.description;
72
+ if (opts?.registryPublisherDid !== void 0) updates.registry_publisher_did = opts.registryPublisherDid;
73
+ if (opts?.registrySlug !== void 0) updates.registry_slug = opts.registrySlug;
74
+ if (opts?.mcpToolsEnabled !== void 0) updates.mcp_tools_enabled = opts.mcpToolsEnabled ? 1 : 0;
75
+ if (opts?.mcpToolsConsent !== void 0) updates.mcp_tools_consent = opts.mcpToolsConsent;
76
+ await this.db.updateTable("_plugin_state").set(updates).where("plugin_id", "=", pluginId).execute();
77
+ } else await this.db.insertInto("_plugin_state").values({
78
+ plugin_id: pluginId,
79
+ status,
80
+ version,
81
+ installed_at: now,
82
+ activated_at: status === "active" ? now : null,
83
+ deactivated_at: null,
84
+ data: null,
85
+ source: opts?.source ?? "config",
86
+ marketplace_version: opts?.marketplaceVersion ?? null,
87
+ display_name: opts?.displayName ?? null,
88
+ description: opts?.description ?? null,
89
+ registry_publisher_did: opts?.registryPublisherDid ?? null,
90
+ registry_slug: opts?.registrySlug ?? null,
91
+ mcp_tools_enabled: opts?.mcpToolsEnabled ? 1 : 0,
92
+ mcp_tools_consent: opts?.mcpToolsConsent ?? null
93
+ }).execute();
94
+ return await this.get(pluginId);
95
+ }
96
+ async restoreIfVersion(expectedVersion, state) {
97
+ return ((await this.db.updateTable("_plugin_state").set({
98
+ version: state.version,
99
+ status: state.status,
100
+ installed_at: state.installedAt.toISOString(),
101
+ activated_at: state.activatedAt?.toISOString() ?? null,
102
+ deactivated_at: state.deactivatedAt?.toISOString() ?? null,
103
+ source: state.source,
104
+ marketplace_version: state.marketplaceVersion,
105
+ display_name: state.displayName,
106
+ description: state.description,
107
+ registry_publisher_did: state.registryPublisherDid,
108
+ registry_slug: state.registrySlug,
109
+ mcp_tools_enabled: state.mcpToolsEnabled ? 1 : 0,
110
+ mcp_tools_consent: state.mcpToolsConsent
111
+ }).where("plugin_id", "=", state.pluginId).where("version", "=", expectedVersion).where("source", "=", state.source).executeTakeFirst()).numUpdatedRows ?? 0n) > 0n;
112
+ }
113
+ /**
114
+ * Enable a plugin
115
+ */
116
+ async enable(pluginId, version) {
117
+ return this.upsert(pluginId, version, "active");
118
+ }
119
+ /**
120
+ * Disable a plugin
121
+ */
122
+ async disable(pluginId, version) {
123
+ return this.upsert(pluginId, version, "inactive");
124
+ }
125
+ /**
126
+ * Delete plugin state
127
+ */
128
+ async delete(pluginId) {
129
+ return ((await this.db.deleteFrom("_plugin_state").where("plugin_id", "=", pluginId).executeTakeFirst()).numDeletedRows ?? 0) > 0;
130
+ }
131
+ };
132
+ function rowToPluginState(row) {
133
+ return {
134
+ pluginId: row.plugin_id,
135
+ status: toPluginStatus(row.status),
136
+ version: row.version,
137
+ installedAt: parseDatabaseTimestamp(row.installed_at),
138
+ activatedAt: row.activated_at ? parseDatabaseTimestamp(row.activated_at) : null,
139
+ deactivatedAt: row.deactivated_at ? parseDatabaseTimestamp(row.deactivated_at) : null,
140
+ source: toPluginSource(row.source),
141
+ marketplaceVersion: row.marketplace_version ?? null,
142
+ displayName: row.display_name ?? null,
143
+ description: row.description ?? null,
144
+ registryPublisherDid: row.registry_publisher_did ?? null,
145
+ registrySlug: row.registry_slug ?? null,
146
+ mcpToolsEnabled: row.mcp_tools_enabled === 1,
147
+ mcpToolsConsent: row.mcp_tools_consent ?? null
148
+ };
149
+ }
150
+
151
+ //#endregion
152
+ export { PluginStateRepository as t };
153
+ //# sourceMappingURL=state-CKouMCSY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-CKouMCSY.mjs","names":[],"sources":["../src/plugins/state.ts"],"sourcesContent":["/**\n * Plugin State Repository\n *\n * Database-backed storage for plugin activation state.\n * Used by the admin API to persist plugin enable/disable across restarts.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../database/types.js\";\n\nexport type PluginStatus = \"active\" | \"inactive\";\nexport type PluginSource = \"config\" | \"marketplace\" | \"registry\";\n\nconst TIMEZONE_SUFFIX = /(?:z|[+-]\\d{2}(?::?\\d{2})?)$/i;\nconst HOUR_OFFSET_SUFFIX = /\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?[+-]\\d{2}$/i;\n\nfunction parseDatabaseTimestamp(value: string): Date {\n\tlet normalized = value.trim().replace(\" \", \"T\");\n\tif (HOUR_OFFSET_SUFFIX.test(normalized)) normalized += \":00\";\n\telse if (!TIMEZONE_SUFFIX.test(normalized)) normalized += \"Z\";\n\treturn new Date(normalized);\n}\n\nfunction toPluginStatus(value: string): PluginStatus {\n\tif (value === \"active\") return \"active\";\n\treturn \"inactive\";\n}\n\nfunction toPluginSource(value: string | undefined | null): PluginSource {\n\tif (value === \"marketplace\") return \"marketplace\";\n\tif (value === \"registry\") return \"registry\";\n\treturn \"config\";\n}\n\nexport interface PluginState {\n\tpluginId: string;\n\tstatus: PluginStatus;\n\tversion: string;\n\tinstalledAt: Date;\n\tactivatedAt: Date | null;\n\tdeactivatedAt: Date | null;\n\tsource: PluginSource;\n\tmarketplaceVersion: string | null;\n\tdisplayName: string | null;\n\tdescription: string | null;\n\t/**\n\t * Publisher DID this plugin was published under. Populated only when\n\t * `source === \"registry\"`; null otherwise.\n\t */\n\tregistryPublisherDid: string | null;\n\t/**\n\t * Slug under which the plugin was published in the publisher's repo\n\t * (the rkey of the `pm.fair.package.profile` record). Populated only\n\t * when `source === \"registry\"`; null otherwise.\n\t *\n\t * The opaque `pluginId` for registry installs is derived from\n\t * `(registryPublisherDid, registrySlug)` -- see\n\t * `packages/core/src/registry/plugin-id.ts`.\n\t */\n\tregistrySlug: string | null;\n\tmcpToolsEnabled: boolean;\n\tmcpToolsConsent: string | null;\n}\n\n/**\n * Repository for plugin state in the database\n */\nexport class PluginStateRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\t/**\n\t * Get state for a specific plugin\n\t */\n\tasync get(pluginId: string): Promise<PluginState | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_plugin_state\")\n\t\t\t.selectAll()\n\t\t\t.where(\"plugin_id\", \"=\", pluginId)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!row) return null;\n\n\t\treturn rowToPluginState(row);\n\t}\n\n\t/**\n\t * Get all plugin states\n\t */\n\tasync getAll(): Promise<PluginState[]> {\n\t\tconst rows = await this.db.selectFrom(\"_plugin_state\").selectAll().execute();\n\t\treturn rows.map(rowToPluginState);\n\t}\n\n\t/**\n\t * Get all marketplace-installed plugin states\n\t */\n\tasync getMarketplacePlugins(): Promise<PluginState[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_plugin_state\")\n\t\t\t.selectAll()\n\t\t\t.where(\"source\", \"=\", \"marketplace\")\n\t\t\t.execute();\n\t\treturn rows.map(rowToPluginState);\n\t}\n\n\t/**\n\t * Get all registry-installed plugin states.\n\t *\n\t * The runtime's registry sync path uses this to discover which\n\t * registry plugins should be loaded into the sandbox on this worker.\n\t */\n\tasync getRegistryPlugins(): Promise<PluginState[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_plugin_state\")\n\t\t\t.selectAll()\n\t\t\t.where(\"source\", \"=\", \"registry\")\n\t\t\t.execute();\n\t\treturn rows.map(rowToPluginState);\n\t}\n\n\t/**\n\t * Create or update plugin state\n\t */\n\tasync upsert(\n\t\tpluginId: string,\n\t\tversion: string,\n\t\tstatus: PluginStatus,\n\t\topts?: {\n\t\t\tsource?: PluginSource;\n\t\t\tmarketplaceVersion?: string;\n\t\t\tdisplayName?: string;\n\t\t\tdescription?: string;\n\t\t\tregistryPublisherDid?: string;\n\t\t\tregistrySlug?: string;\n\t\t\tmcpToolsEnabled?: boolean;\n\t\t\tmcpToolsConsent?: string | null;\n\t\t},\n\t): Promise<PluginState> {\n\t\tconst now = new Date().toISOString();\n\t\tconst existing = await this.get(pluginId);\n\n\t\tif (existing) {\n\t\t\t// Update existing state\n\t\t\tconst updates: Record<string, string | number | null> = {\n\t\t\t\tstatus,\n\t\t\t\tversion,\n\t\t\t};\n\n\t\t\tif (status === \"active\" && existing.status !== \"active\") {\n\t\t\t\tupdates.activated_at = now;\n\t\t\t} else if (status === \"inactive\" && existing.status !== \"inactive\") {\n\t\t\t\tupdates.deactivated_at = now;\n\t\t\t}\n\n\t\t\tif (opts?.source) updates.source = opts.source;\n\t\t\tif (opts?.marketplaceVersion !== undefined) {\n\t\t\t\tupdates.marketplace_version = opts.marketplaceVersion;\n\t\t\t}\n\t\t\tif (opts?.displayName !== undefined) {\n\t\t\t\tupdates.display_name = opts.displayName;\n\t\t\t}\n\t\t\tif (opts?.description !== undefined) {\n\t\t\t\tupdates.description = opts.description;\n\t\t\t}\n\t\t\tif (opts?.registryPublisherDid !== undefined) {\n\t\t\t\tupdates.registry_publisher_did = opts.registryPublisherDid;\n\t\t\t}\n\t\t\tif (opts?.registrySlug !== undefined) {\n\t\t\t\tupdates.registry_slug = opts.registrySlug;\n\t\t\t}\n\t\t\tif (opts?.mcpToolsEnabled !== undefined) {\n\t\t\t\tupdates.mcp_tools_enabled = opts.mcpToolsEnabled ? 1 : 0;\n\t\t\t}\n\t\t\tif (opts?.mcpToolsConsent !== undefined) {\n\t\t\t\tupdates.mcp_tools_consent = opts.mcpToolsConsent;\n\t\t\t}\n\n\t\t\tawait this.db\n\t\t\t\t.updateTable(\"_plugin_state\")\n\t\t\t\t.set(updates)\n\t\t\t\t.where(\"plugin_id\", \"=\", pluginId)\n\t\t\t\t.execute();\n\t\t} else {\n\t\t\t// Create new state\n\t\t\tawait this.db\n\t\t\t\t.insertInto(\"_plugin_state\")\n\t\t\t\t.values({\n\t\t\t\t\tplugin_id: pluginId,\n\t\t\t\t\tstatus,\n\t\t\t\t\tversion,\n\t\t\t\t\tinstalled_at: now,\n\t\t\t\t\tactivated_at: status === \"active\" ? now : null,\n\t\t\t\t\tdeactivated_at: null,\n\t\t\t\t\tdata: null,\n\t\t\t\t\tsource: opts?.source ?? \"config\",\n\t\t\t\t\tmarketplace_version: opts?.marketplaceVersion ?? null,\n\t\t\t\t\tdisplay_name: opts?.displayName ?? null,\n\t\t\t\t\tdescription: opts?.description ?? null,\n\t\t\t\t\tregistry_publisher_did: opts?.registryPublisherDid ?? null,\n\t\t\t\t\tregistry_slug: opts?.registrySlug ?? null,\n\t\t\t\t\tmcp_tools_enabled: opts?.mcpToolsEnabled ? 1 : 0,\n\t\t\t\t\tmcp_tools_consent: opts?.mcpToolsConsent ?? null,\n\t\t\t\t})\n\t\t\t\t.execute();\n\t\t}\n\n\t\treturn (await this.get(pluginId))!;\n\t}\n\n\tasync restoreIfVersion(expectedVersion: string, state: PluginState): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_plugin_state\")\n\t\t\t.set({\n\t\t\t\tversion: state.version,\n\t\t\t\tstatus: state.status,\n\t\t\t\tinstalled_at: state.installedAt.toISOString(),\n\t\t\t\tactivated_at: state.activatedAt?.toISOString() ?? null,\n\t\t\t\tdeactivated_at: state.deactivatedAt?.toISOString() ?? null,\n\t\t\t\tsource: state.source,\n\t\t\t\tmarketplace_version: state.marketplaceVersion,\n\t\t\t\tdisplay_name: state.displayName,\n\t\t\t\tdescription: state.description,\n\t\t\t\tregistry_publisher_did: state.registryPublisherDid,\n\t\t\t\tregistry_slug: state.registrySlug,\n\t\t\t\tmcp_tools_enabled: state.mcpToolsEnabled ? 1 : 0,\n\t\t\t\tmcp_tools_consent: state.mcpToolsConsent,\n\t\t\t})\n\t\t\t.where(\"plugin_id\", \"=\", state.pluginId)\n\t\t\t.where(\"version\", \"=\", expectedVersion)\n\t\t\t.where(\"source\", \"=\", state.source)\n\t\t\t.executeTakeFirst();\n\n\t\treturn (result.numUpdatedRows ?? 0n) > 0n;\n\t}\n\n\t/**\n\t * Enable a plugin\n\t */\n\tasync enable(pluginId: string, version: string): Promise<PluginState> {\n\t\treturn this.upsert(pluginId, version, \"active\");\n\t}\n\n\t/**\n\t * Disable a plugin\n\t */\n\tasync disable(pluginId: string, version: string): Promise<PluginState> {\n\t\treturn this.upsert(pluginId, version, \"inactive\");\n\t}\n\n\t/**\n\t * Delete plugin state\n\t */\n\tasync delete(pluginId: string): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"_plugin_state\")\n\t\t\t.where(\"plugin_id\", \"=\", pluginId)\n\t\t\t.executeTakeFirst();\n\n\t\treturn (result.numDeletedRows ?? 0) > 0;\n\t}\n}\n\n/**\n * Internal: map a `_plugin_state` row to the public `PluginState` shape.\n *\n * Kept at module scope so the three select paths (`get`, `getAll`,\n * `getMarketplacePlugins`, `getRegistryPlugins`) stay byte-identical in\n * their handling of nullable columns -- adding a new column to the table\n * means changing this function and nothing else.\n */\ninterface PluginStateRow {\n\tplugin_id: string;\n\tstatus: string;\n\tversion: string;\n\tinstalled_at: string;\n\tactivated_at: string | null;\n\tdeactivated_at: string | null;\n\tsource: string;\n\tmarketplace_version: string | null;\n\tdisplay_name: string | null;\n\tdescription: string | null;\n\tregistry_publisher_did: string | null;\n\tregistry_slug: string | null;\n\tmcp_tools_enabled: number;\n\tmcp_tools_consent: string | null;\n}\n\nfunction rowToPluginState(row: PluginStateRow): PluginState {\n\treturn {\n\t\tpluginId: row.plugin_id,\n\t\tstatus: toPluginStatus(row.status),\n\t\tversion: row.version,\n\t\tinstalledAt: parseDatabaseTimestamp(row.installed_at),\n\t\tactivatedAt: row.activated_at ? parseDatabaseTimestamp(row.activated_at) : null,\n\t\tdeactivatedAt: row.deactivated_at ? parseDatabaseTimestamp(row.deactivated_at) : null,\n\t\tsource: toPluginSource(row.source),\n\t\tmarketplaceVersion: row.marketplace_version ?? null,\n\t\tdisplayName: row.display_name ?? null,\n\t\tdescription: row.description ?? null,\n\t\tregistryPublisherDid: row.registry_publisher_did ?? null,\n\t\tregistrySlug: row.registry_slug ?? null,\n\t\tmcpToolsEnabled: row.mcp_tools_enabled === 1,\n\t\tmcpToolsConsent: row.mcp_tools_consent ?? null,\n\t};\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ //#region src/redirects/status.ts
2
+ /**
3
+ * Redirect rule status codes.
4
+ *
5
+ * A redirect rule's `type` is either a *redirect* status (issues a `Location`
6
+ * header) or a *terminal* status (serves the status with no target). Terminal
7
+ * statuses let editors mark a URL as intentionally gone:
8
+ * - `410 Gone` — permanently and intentionally deleted (Google deindexes it
9
+ * faster than a 404).
10
+ * - `451 Unavailable For Legal Reasons`.
11
+ */
12
+ /** Statuses that issue an HTTP redirect (require a destination). */
13
+ const REDIRECT_STATUSES = [
14
+ 301,
15
+ 302,
16
+ 307,
17
+ 308
18
+ ];
19
+ /** Terminal statuses that serve a status with no `Location` / no destination. */
20
+ const TERMINAL_STATUSES = [410, 451];
21
+ /** All values accepted as a redirect rule `type`. */
22
+ const REDIRECT_RULE_STATUSES = [...REDIRECT_STATUSES, ...TERMINAL_STATUSES];
23
+ /** True for terminal statuses (410/451) — served directly, with no target. */
24
+ function isTerminalStatus(type) {
25
+ return TERMINAL_STATUSES.includes(type);
26
+ }
27
+
28
+ //#endregion
29
+ export { isTerminalStatus as n, REDIRECT_RULE_STATUSES as t };
30
+ //# sourceMappingURL=status-lzyj4Uu7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-lzyj4Uu7.mjs","names":[],"sources":["../src/redirects/status.ts"],"sourcesContent":["/**\n * Redirect rule status codes.\n *\n * A redirect rule's `type` is either a *redirect* status (issues a `Location`\n * header) or a *terminal* status (serves the status with no target). Terminal\n * statuses let editors mark a URL as intentionally gone:\n * - `410 Gone` — permanently and intentionally deleted (Google deindexes it\n * faster than a 404).\n * - `451 Unavailable For Legal Reasons`.\n */\n\n/** Statuses that issue an HTTP redirect (require a destination). */\nexport const REDIRECT_STATUSES = [301, 302, 307, 308] as const;\n\n/** Terminal statuses that serve a status with no `Location` / no destination. */\nexport const TERMINAL_STATUSES = [410, 451] as const;\n\n/** All values accepted as a redirect rule `type`. */\nexport const REDIRECT_RULE_STATUSES: readonly number[] = [\n\t...REDIRECT_STATUSES,\n\t...TERMINAL_STATUSES,\n];\n\n/** True for terminal statuses (410/451) — served directly, with no target. */\nexport function isTerminalStatus(type: number): boolean {\n\treturn (TERMINAL_STATUSES as readonly number[]).includes(type);\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,oBAAoB;CAAC;CAAK;CAAK;CAAK;CAAI;;AAGrD,MAAa,oBAAoB,CAAC,KAAK,IAAI;;AAG3C,MAAa,yBAA4C,CACxD,GAAG,mBACH,GAAG,kBACH;;AAGD,SAAgB,iBAAiB,MAAuB;AACvD,QAAQ,kBAAwC,SAAS,KAAK"}
@@ -1,4 +1,4 @@
1
- import { a as ListOptions, d as Storage, l as SignedUploadOptions, n as DownloadResult, o as ListResult, p as UploadResult, s as LocalStorageConfig, u as SignedUploadUrl } from "../types-DA1Te3Oy.mjs";
1
+ import { a as ListOptions, d as Storage, l as SignedUploadOptions, n as DownloadResult, o as ListResult, p as UploadResult, s as LocalStorageConfig, u as SignedUploadUrl } from "../types-BYEk7qo3.mjs";
2
2
 
3
3
  //#region src/storage/local.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { t as EmDashStorageError } from "../types-VT4-BugW.mjs";
1
+ import { t as EmDashStorageError } from "../types-ILDI1sdY.mjs";
2
2
  import mime from "mime/lite";
3
3
  import * as fs from "node:fs/promises";
4
4
  import * as path from "node:path";
@@ -1,4 +1,4 @@
1
- import { a as ListOptions, c as S3StorageConfig, d as Storage, l as SignedUploadOptions, n as DownloadResult, o as ListResult, p as UploadResult, u as SignedUploadUrl } from "../types-DA1Te3Oy.mjs";
1
+ import { a as ListOptions, c as S3StorageConfig, d as Storage, l as SignedUploadOptions, n as DownloadResult, o as ListResult, p as UploadResult, u as SignedUploadUrl } from "../types-BYEk7qo3.mjs";
2
2
 
3
3
  //#region src/storage/s3.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { t as EmDashStorageError } from "../types-VT4-BugW.mjs";
1
+ import { t as EmDashStorageError } from "../types-ILDI1sdY.mjs";
2
2
  import { z } from "zod";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { getSignedUrl } from "@aws-sdk/s3-request-presigner";