emdash 0.40.0 → 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 (1258) 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 +26 -30
  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.d.mts.map +1 -1
  35. package/dist/astro/middleware.mjs +110 -106
  36. package/dist/astro/middleware.mjs.map +1 -1
  37. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
  38. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
  39. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  40. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  41. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  42. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
  43. package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
  44. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
  45. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
  46. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
  47. package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
  48. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
  49. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  50. package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
  51. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  52. package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
  53. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  54. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  55. package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
  56. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
  57. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
  58. package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
  59. package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
  60. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
  61. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
  62. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  63. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  64. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  65. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  66. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
  67. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  68. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  69. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
  70. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
  72. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
  74. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
  76. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
  78. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
  79. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +81 -77
  81. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
  83. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
  85. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +83 -79
  87. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
  89. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
  90. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  92. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
  93. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
  95. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  97. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
  98. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +5 -5
  100. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
  101. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  103. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
  104. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
  105. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
  106. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
  107. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
  108. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
  109. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
  110. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
  111. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
  112. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
  113. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
  114. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
  115. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
  116. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
  117. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
  118. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
  119. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
  120. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
  121. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
  122. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
  123. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
  124. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  125. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  126. package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
  127. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  128. package/dist/astro/routes/api/admin/users/index.mjs +14 -14
  129. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  130. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  131. package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
  132. package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
  133. package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
  134. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  135. package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
  136. package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
  137. package/dist/astro/routes/api/auth/me.mjs +15 -15
  138. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  139. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  140. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  141. package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
  142. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  143. package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
  144. package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
  145. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
  146. package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
  147. package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
  148. package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
  149. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  150. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
  151. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
  152. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  153. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
  154. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  155. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
  156. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  157. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
  158. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
  159. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
  160. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
  161. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  162. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
  163. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  164. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -29
  165. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  166. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  167. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  168. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
  169. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
  170. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  171. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  172. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
  173. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  174. package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
  175. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  176. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  177. package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
  178. package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
  179. package/dist/astro/routes/api/dashboard.mjs +10 -9
  180. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  181. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  182. package/dist/astro/routes/api/health.mjs +6 -6
  183. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  184. package/dist/astro/routes/api/import/probe.mjs +23 -23
  185. package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
  186. package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
  187. package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
  188. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  189. package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
  190. package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
  191. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  192. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
  193. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  194. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
  195. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  196. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
  197. package/dist/astro/routes/api/manifest.mjs +6 -6
  198. package/dist/astro/routes/api/mcp.mjs +98 -118
  199. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  200. package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
  201. package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
  202. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  203. package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
  204. package/dist/astro/routes/api/media/_id_.mjs +31 -31
  205. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  206. package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
  207. package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
  208. package/dist/astro/routes/api/media/folders/index.mjs +16 -16
  209. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  210. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  211. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  212. package/dist/astro/routes/api/media/upload-url.mjs +18 -18
  213. package/dist/astro/routes/api/media.mjs +35 -35
  214. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
  215. package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
  216. package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
  217. package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
  218. package/dist/astro/routes/api/menus/_name_.mjs +17 -17
  219. package/dist/astro/routes/api/menus/index.mjs +17 -17
  220. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  221. package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
  222. package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
  223. package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
  224. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
  225. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  226. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  227. package/dist/astro/routes/api/oauth/register.mjs +5 -5
  228. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  229. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  230. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  231. package/dist/astro/routes/api/openapi.json.mjs +20 -20
  232. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
  233. package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
  234. package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
  235. package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
  236. package/dist/astro/routes/api/redirects/index.mjs +19 -19
  237. package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
  238. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  239. package/dist/astro/routes/api/relations/index.mjs +36 -31
  240. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  241. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  242. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
  243. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
  244. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  245. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
  246. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  247. package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
  248. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  249. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
  250. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  251. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -67
  252. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  253. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -67
  254. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  255. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
  256. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  257. package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
  258. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  259. package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
  260. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  261. package/dist/astro/routes/api/schema/index.mjs +16 -16
  262. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
  263. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  264. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
  265. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  266. package/dist/astro/routes/api/search/enable.mjs +19 -19
  267. package/dist/astro/routes/api/search/index.mjs +18 -18
  268. package/dist/astro/routes/api/search/rebuild.mjs +19 -19
  269. package/dist/astro/routes/api/search/stats.mjs +9 -9
  270. package/dist/astro/routes/api/search/suggest.mjs +18 -18
  271. package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
  272. package/dist/astro/routes/api/sections/index.mjs +18 -18
  273. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  274. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  275. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  276. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  277. package/dist/astro/routes/api/settings/email.mjs +6 -6
  278. package/dist/astro/routes/api/settings.mjs +21 -21
  279. package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
  280. package/dist/astro/routes/api/setup/admin.mjs +18 -18
  281. package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
  282. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  283. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  284. package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
  285. package/dist/astro/routes/api/setup/index.mjs +80 -49
  286. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  287. package/dist/astro/routes/api/setup/status.mjs +6 -6
  288. package/dist/astro/routes/api/snapshot.mjs +9 -9
  289. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  290. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
  291. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
  292. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
  293. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
  294. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
  295. package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
  296. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
  297. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  298. package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
  299. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  300. package/dist/astro/routes/api/typegen.mjs +8 -8
  301. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  302. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
  303. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  304. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  305. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  306. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  307. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +16 -16
  308. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
  309. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
  310. package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
  311. package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
  312. package/dist/astro/routes/api/widget-components.mjs +5 -5
  313. package/dist/astro/routes/robots.txt.mjs +6 -6
  314. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  315. package/dist/astro/routes/sitemap.xml.mjs +7 -7
  316. package/dist/astro/types.d.mts +28 -18
  317. package/dist/astro/types.d.mts.map +1 -1
  318. package/dist/audit-CrgmE9LE.mjs +127 -0
  319. package/dist/audit-CrgmE9LE.mjs.map +1 -0
  320. package/dist/auth/providers/github.d.mts +1 -1
  321. package/dist/auth/providers/google.d.mts +1 -1
  322. package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
  323. package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
  324. package/dist/authorize-WgdKF8QY.mjs +49 -0
  325. package/dist/authorize-WgdKF8QY.mjs.map +1 -0
  326. package/dist/backup-Ck8_lMO3.mjs +246 -0
  327. package/dist/backup-Ck8_lMO3.mjs.map +1 -0
  328. package/dist/block-types-BQ90asVI.mjs +132 -0
  329. package/dist/block-types-BQ90asVI.mjs.map +1 -0
  330. package/dist/block-values-ACFqgB1D.mjs +175 -0
  331. package/dist/block-values-ACFqgB1D.mjs.map +1 -0
  332. package/dist/bundle-Db1iNMv_.mjs +667 -0
  333. package/dist/bundle-Db1iNMv_.mjs.map +1 -0
  334. package/dist/byline-BayaYGoj.mjs +909 -0
  335. package/dist/byline-BayaYGoj.mjs.map +1 -0
  336. package/dist/byline-fields-B8HH-35f.mjs +254 -0
  337. package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
  338. package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
  339. package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
  340. package/dist/byline-registry-B_EK_TQf.mjs +406 -0
  341. package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
  342. package/dist/bylines-DFAaFXWi.mjs +214 -0
  343. package/dist/bylines-DFAaFXWi.mjs.map +1 -0
  344. package/dist/bylines-DkIxUxmr.mjs +232 -0
  345. package/dist/bylines-DkIxUxmr.mjs.map +1 -0
  346. package/dist/cache-DkvhQ8XE.mjs +108 -0
  347. package/dist/cache-DkvhQ8XE.mjs.map +1 -0
  348. package/dist/canonical-CcSuuTlH.mjs +174 -0
  349. package/dist/canonical-CcSuuTlH.mjs.map +1 -0
  350. package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
  351. package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
  352. package/dist/challenge-store-CvBl81AQ.mjs +51 -0
  353. package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
  354. package/dist/checksum-CClweQzI.mjs +162 -0
  355. package/dist/checksum-CClweQzI.mjs.map +1 -0
  356. package/dist/chrome-tags-D5caJwwp.mjs +24 -0
  357. package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
  358. package/dist/chunks-DwBaj8aT.mjs +25 -0
  359. package/dist/chunks-DwBaj8aT.mjs.map +1 -0
  360. package/dist/cli/index.mjs +374 -761
  361. package/dist/cli/index.mjs.map +1 -1
  362. package/dist/client/cf-access.d.mts +1 -1
  363. package/dist/client/index.d.mts +18 -18
  364. package/dist/client/index.mjs +2 -2
  365. package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
  366. package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
  367. package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
  368. package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
  369. package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
  370. package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
  371. package/dist/comment-D2uvL63j.mjs +313 -0
  372. package/dist/comment-D2uvL63j.mjs.map +1 -0
  373. package/dist/comment-reaction-DevUuzg4.mjs +85 -0
  374. package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
  375. package/dist/comments-Cq0s7_hO.mjs +195 -0
  376. package/dist/comments-Cq0s7_hO.mjs.map +1 -0
  377. package/dist/comments-M4EDYAHw.mjs +99 -0
  378. package/dist/comments-M4EDYAHw.mjs.map +1 -0
  379. package/dist/components-CuIGwXMs.mjs +108 -0
  380. package/dist/components-CuIGwXMs.mjs.map +1 -0
  381. package/dist/config-52Ea5IWt.d.mts +39 -0
  382. package/dist/config-52Ea5IWt.d.mts.map +1 -0
  383. package/dist/config-CCz3xOLc.mjs +242 -0
  384. package/dist/config-CCz3xOLc.mjs.map +1 -0
  385. package/dist/config-D3d5Qudq.d.mts +6669 -0
  386. package/dist/config-D3d5Qudq.d.mts.map +1 -0
  387. package/dist/content-CbnufDsM.mjs +2018 -0
  388. package/dist/content-CbnufDsM.mjs.map +1 -0
  389. package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
  390. package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
  391. package/dist/content-policy-CYu6K1KB.mjs +46 -0
  392. package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
  393. package/dist/content-repair-DlDUgFGp.mjs +442 -0
  394. package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
  395. package/dist/context-CGQLA1-a.mjs +1922 -0
  396. package/dist/context-CGQLA1-a.mjs.map +1 -0
  397. package/dist/cron-c4D5C5Fx.mjs +284 -0
  398. package/dist/cron-c4D5C5Fx.mjs.map +1 -0
  399. package/dist/dashboard-CBq9kmOn.mjs +151 -0
  400. package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
  401. package/dist/db/index.d.mts +3 -3
  402. package/dist/db/index.mjs +1 -1
  403. package/dist/db/libsql-migrations.d.mts +1 -1
  404. package/dist/db/libsql-migrations.mjs +4 -4
  405. package/dist/db/libsql.d.mts +1 -1
  406. package/dist/db/postgres-migrations.d.mts +1 -1
  407. package/dist/db/postgres-migrations.mjs +4 -4
  408. package/dist/db/postgres.d.mts +1 -1
  409. package/dist/db/sqlite-migrations.d.mts +1 -1
  410. package/dist/db/sqlite-migrations.mjs +4 -4
  411. package/dist/db/sqlite.d.mts +1 -1
  412. package/dist/db/sqlite.mjs +1 -1
  413. package/dist/default-DPsys51U.mjs +81 -0
  414. package/dist/default-DPsys51U.mjs.map +1 -0
  415. package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
  416. package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
  417. package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
  418. package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
  419. package/dist/device-flow-OcSqE9uY.mjs +521 -0
  420. package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
  421. package/dist/digest-DVZ--cE9.mjs +194 -0
  422. package/dist/digest-DVZ--cE9.mjs.map +1 -0
  423. package/dist/direct-executor-DyjAqkpT.mjs +104 -0
  424. package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
  425. package/dist/dist-FPR93_xf.mjs +810 -0
  426. package/dist/dist-FPR93_xf.mjs.map +1 -0
  427. package/dist/email-console-DyQIgEnz.mjs +50 -0
  428. package/dist/email-console-DyQIgEnz.mjs.map +1 -0
  429. package/dist/email-locale-BYb16rVd.mjs +25 -0
  430. package/dist/email-locale-BYb16rVd.mjs.map +1 -0
  431. package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
  432. package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
  433. package/dist/enrich-DBtCncE2.mjs +194 -0
  434. package/dist/enrich-DBtCncE2.mjs.map +1 -0
  435. package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
  436. package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
  437. package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
  438. package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
  439. package/dist/entry-lock-C6NcnZPV.mjs +163 -0
  440. package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
  441. package/dist/entry-locks-BTyQLdbC.mjs +167 -0
  442. package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
  443. package/dist/error-BfsNNrIE.mjs +90 -0
  444. package/dist/error-BfsNNrIE.mjs.map +1 -0
  445. package/dist/errors-BN1QAnEY.mjs +460 -0
  446. package/dist/errors-BN1QAnEY.mjs.map +1 -0
  447. package/dist/errors-Bt3goF8I.mjs +120 -0
  448. package/dist/errors-Bt3goF8I.mjs.map +1 -0
  449. package/dist/escape-BveidMa2.mjs +9 -0
  450. package/dist/escape-BveidMa2.mjs.map +1 -0
  451. package/dist/fence-Bb_IbCxI.mjs +162 -0
  452. package/dist/fence-Bb_IbCxI.mjs.map +1 -0
  453. package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
  454. package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
  455. package/dist/field-map-6m9rF49t.mjs +83 -0
  456. package/dist/field-map-6m9rF49t.mjs.map +1 -0
  457. package/dist/focal-point-CZ3d1wK5.mjs +23 -0
  458. package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
  459. package/dist/fts-manager-CCaZTp8y.mjs +443 -0
  460. package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
  461. package/dist/gc-xowRjczI.mjs +75 -0
  462. package/dist/gc-xowRjczI.mjs.map +1 -0
  463. package/dist/hash-COVK27Pc.mjs +37 -0
  464. package/dist/hash-COVK27Pc.mjs.map +1 -0
  465. package/dist/hook-result-CYSk0XFe.d.mts +31 -0
  466. package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
  467. package/dist/hreflang-CChPV7jx.mjs +105 -0
  468. package/dist/hreflang-CChPV7jx.mjs.map +1 -0
  469. package/dist/hreflang-DRslq3QI.d.mts +50 -0
  470. package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
  471. package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
  472. package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
  473. package/dist/identity-NVTOOQyq.mjs +35 -0
  474. package/dist/identity-NVTOOQyq.mjs.map +1 -0
  475. package/dist/import-wpSO2N0x.mjs +2020 -0
  476. package/dist/import-wpSO2N0x.mjs.map +1 -0
  477. package/dist/index-CDs2wq4X.d.mts +623 -0
  478. package/dist/index-CDs2wq4X.d.mts.map +1 -0
  479. package/dist/index.d.mts +24 -24
  480. package/dist/index.mjs +103 -101
  481. package/dist/install-finalization-D9R9R-W8.mjs +58 -0
  482. package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
  483. package/dist/keys-Bck6LBfF.mjs +61 -0
  484. package/dist/keys-Bck6LBfF.mjs.map +1 -0
  485. package/dist/kinds-CYmRESWj.mjs +974 -0
  486. package/dist/kinds-CYmRESWj.mjs.map +1 -0
  487. package/dist/lifecycle-C815ZQfV.mjs +25 -0
  488. package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
  489. package/dist/load-D99axixL.mjs +28 -0
  490. package/dist/load-D99axixL.mjs.map +1 -0
  491. package/dist/loader-CrRPfkHS.mjs +1197 -0
  492. package/dist/loader-CrRPfkHS.mjs.map +1 -0
  493. package/dist/loops-DMKlygqX.mjs +203 -0
  494. package/dist/loops-DMKlygqX.mjs.map +1 -0
  495. package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
  496. package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
  497. package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
  498. package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
  499. package/dist/media/image-endpoint.mjs +1 -1
  500. package/dist/media/index.d.mts +1 -1
  501. package/dist/media/index.mjs +4 -4
  502. package/dist/media/local-runtime.d.mts +14 -14
  503. package/dist/media/local-runtime.mjs +6 -6
  504. package/dist/media-BUQePMxP.mjs +373 -0
  505. package/dist/media-BUQePMxP.mjs.map +1 -0
  506. package/dist/media-DH8ibNlY.mjs +294 -0
  507. package/dist/media-DH8ibNlY.mjs.map +1 -0
  508. package/dist/media-OEIQ3bVc.mjs +408 -0
  509. package/dist/media-OEIQ3bVc.mjs.map +1 -0
  510. package/dist/media-allowlist-pYtaBA95.mjs +44 -0
  511. package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
  512. package/dist/media-folders-Bf8_s4de.mjs +210 -0
  513. package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
  514. package/dist/media-url-C6klEuNd.mjs +43 -0
  515. package/dist/media-url-C6klEuNd.mjs.map +1 -0
  516. package/dist/media-usage-D7Y64m6v.mjs +1629 -0
  517. package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
  518. package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
  519. package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
  520. package/dist/media-usage-work-DommYhYA.mjs +152 -0
  521. package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
  522. package/dist/media-usage-work-HU63hNDu.mjs +586 -0
  523. package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
  524. package/dist/menus-BQfusWEC.mjs +3608 -0
  525. package/dist/menus-BQfusWEC.mjs.map +1 -0
  526. package/dist/menus-BtwjQt5s.mjs +753 -0
  527. package/dist/menus-BtwjQt5s.mjs.map +1 -0
  528. package/dist/menus-p_M1V7J_.mjs +139 -0
  529. package/dist/menus-p_M1V7J_.mjs.map +1 -0
  530. package/dist/migrations/index.d.mts +1 -1
  531. package/dist/migrations/index.mjs +3 -3
  532. package/dist/mime-C94qBG-P.mjs +36 -0
  533. package/dist/mime-C94qBG-P.mjs.map +1 -0
  534. package/dist/mode-DpYW3w6U.mjs +23 -0
  535. package/dist/mode-DpYW3w6U.mjs.map +1 -0
  536. package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
  537. package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
  538. package/dist/normalize-DduyxBjf.mjs +191 -0
  539. package/dist/normalize-DduyxBjf.mjs.map +1 -0
  540. package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
  541. package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
  542. package/dist/oauth-clients-DENiDQri.mjs +266 -0
  543. package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
  544. package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
  545. package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
  546. package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
  547. package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
  548. package/dist/object-cache/memory.d.mts +1 -1
  549. package/dist/options-BYa1FgIM.d.mts +81 -0
  550. package/dist/options-BYa1FgIM.d.mts.map +1 -0
  551. package/dist/page/index.d.mts +2 -2
  552. package/dist/page/index.mjs +5 -5
  553. package/dist/parse-CORGGhHf.mjs +81 -0
  554. package/dist/parse-CORGGhHf.mjs.map +1 -0
  555. package/dist/parse-avNM1xWV.d.mts +168 -0
  556. package/dist/parse-avNM1xWV.d.mts.map +1 -0
  557. package/dist/passkey-config-Dih5YeIS.mjs +46 -0
  558. package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
  559. package/dist/paths-d51RFm8M.mjs +77 -0
  560. package/dist/paths-d51RFm8M.mjs.map +1 -0
  561. package/dist/patterns-CoqlXUvk.mjs +145 -0
  562. package/dist/patterns-CoqlXUvk.mjs.map +1 -0
  563. package/dist/placeholder-D2aksPMF.d.mts +306 -0
  564. package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
  565. package/dist/plan-DqeZKuaR.mjs +135 -0
  566. package/dist/plan-DqeZKuaR.mjs.map +1 -0
  567. package/dist/plugin-test-runtime.d.mts +14 -14
  568. package/dist/plugin-test-runtime.mjs +110 -107
  569. package/dist/plugin-types.d.mts +2 -2
  570. package/dist/plugin-utils.d.mts +12 -12
  571. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  572. package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
  573. package/dist/plugins/host.d.mts +5 -5
  574. package/dist/plugins/host.mjs +42 -41
  575. package/dist/plugins-Bb7oqjQA.mjs +277 -0
  576. package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
  577. package/dist/policy-BcEqut3n.mjs +45 -0
  578. package/dist/policy-BcEqut3n.mjs.map +1 -0
  579. package/dist/portable-text-DXE8ymtD.mjs +307 -0
  580. package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
  581. package/dist/preview-DEDWbwA_.mjs +107 -0
  582. package/dist/preview-DEDWbwA_.mjs.map +1 -0
  583. package/dist/protocol-BJbTzvwl.d.mts +61 -0
  584. package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
  585. package/dist/public-submission-D9c9S14m.mjs +250 -0
  586. package/dist/public-submission-D9c9S14m.mjs.map +1 -0
  587. package/dist/public-url-CIRe-2T6.mjs +101 -0
  588. package/dist/public-url-CIRe-2T6.mjs.map +1 -0
  589. package/dist/query-BzifXlPS.mjs +1156 -0
  590. package/dist/query-BzifXlPS.mjs.map +1 -0
  591. package/dist/query-OzMJ6vJP.mjs +41 -0
  592. package/dist/query-OzMJ6vJP.mjs.map +1 -0
  593. package/dist/rate-limit-Csp60Vik.mjs +120 -0
  594. package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
  595. package/dist/receipt-B-aU4hpJ.mjs +43 -0
  596. package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
  597. package/dist/redirect-CDSw1sU3.mjs +17 -0
  598. package/dist/redirect-CDSw1sU3.mjs.map +1 -0
  599. package/dist/redirect-D1ArbO85.mjs +411 -0
  600. package/dist/redirect-D1ArbO85.mjs.map +1 -0
  601. package/dist/redirects-BjTwDTsV.mjs +148 -0
  602. package/dist/redirects-BjTwDTsV.mjs.map +1 -0
  603. package/dist/redirects-Ck50kH3n.mjs +446 -0
  604. package/dist/redirects-Ck50kH3n.mjs.map +1 -0
  605. package/dist/registry/testing.mjs +3 -3
  606. package/dist/registry-CFcNCayZ.mjs +6754 -0
  607. package/dist/registry-CFcNCayZ.mjs.map +1 -0
  608. package/dist/relations-Cfaa1fDl.mjs +776 -0
  609. package/dist/relations-Cfaa1fDl.mjs.map +1 -0
  610. package/dist/request-cache-iHRlHx1d.mjs +104 -0
  611. package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
  612. package/dist/request-context.d.mts +1 -1
  613. package/dist/request-meta-D47mqyev.mjs +141 -0
  614. package/dist/request-meta-D47mqyev.mjs.map +1 -0
  615. package/dist/resolve-BPE8sMvx.mjs +99 -0
  616. package/dist/resolve-BPE8sMvx.mjs.map +1 -0
  617. package/dist/resolve-C0s1E_fH.mjs +199 -0
  618. package/dist/resolve-C0s1E_fH.mjs.map +1 -0
  619. package/dist/revision-j1p4-bOj.mjs +302 -0
  620. package/dist/revision-j1p4-bOj.mjs.map +1 -0
  621. package/dist/route-wire-C9PJV9aL.mjs +197 -0
  622. package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
  623. package/dist/routes-lyYw0mMf.mjs +272 -0
  624. package/dist/routes-lyYw0mMf.mjs.map +1 -0
  625. package/dist/runner-B3eyB9Gb.mjs +6121 -0
  626. package/dist/runner-B3eyB9Gb.mjs.map +1 -0
  627. package/dist/runner-DoYH2Jcu.d.mts +68 -0
  628. package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
  629. package/dist/runtime.d.mts +13 -13
  630. package/dist/runtime.mjs +3 -3
  631. package/dist/schema-BAayK46S.mjs +13 -0
  632. package/dist/schema-BAayK46S.mjs.map +1 -0
  633. package/dist/schema-Gqcl-8G4.mjs +815 -0
  634. package/dist/schema-Gqcl-8G4.mjs.map +1 -0
  635. package/dist/scopes-BqPOKoKf.mjs +34 -0
  636. package/dist/scopes-BqPOKoKf.mjs.map +1 -0
  637. package/dist/search-YJKPIEV6.mjs +448 -0
  638. package/dist/search-YJKPIEV6.mjs.map +1 -0
  639. package/dist/sections-BR_e-wK5.mjs +346 -0
  640. package/dist/sections-BR_e-wK5.mjs.map +1 -0
  641. package/dist/seed/index.d.mts +2 -2
  642. package/dist/seed/index.mjs +37 -31
  643. package/dist/seo/index.d.mts +3 -3
  644. package/dist/seo/index.mjs +22 -21
  645. package/dist/seo/index.mjs.map +1 -1
  646. package/dist/seo-Dsj8hy3j.mjs +114 -0
  647. package/dist/seo-Dsj8hy3j.mjs.map +1 -0
  648. package/dist/seo-XvH4LNNp.mjs +133 -0
  649. package/dist/seo-XvH4LNNp.mjs.map +1 -0
  650. package/dist/service-BsVG05gS.mjs +150 -0
  651. package/dist/service-BsVG05gS.mjs.map +1 -0
  652. package/dist/session-user-DgKbYrlj.mjs +51 -0
  653. package/dist/session-user-DgKbYrlj.mjs.map +1 -0
  654. package/dist/settings-CNPUntkh.mjs +51 -0
  655. package/dist/settings-CNPUntkh.mjs.map +1 -0
  656. package/dist/settings-D5EHi0Tk.mjs +439 -0
  657. package/dist/settings-D5EHi0Tk.mjs.map +1 -0
  658. package/dist/settings-DSfE7wOa.mjs +61 -0
  659. package/dist/settings-DSfE7wOa.mjs.map +1 -0
  660. package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
  661. package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
  662. package/dist/setup-nonce-DnSBP260.mjs +25 -0
  663. package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
  664. package/dist/site-settings-NGzdrt7O.mjs +50 -0
  665. package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
  666. package/dist/site-url-D6JB7tLW.mjs +16 -0
  667. package/dist/site-url-D6JB7tLW.mjs.map +1 -0
  668. package/dist/snapshot-CdcwwWAf.mjs +414 -0
  669. package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
  670. package/dist/ssrf-Dv0_tRpo.mjs +406 -0
  671. package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
  672. package/dist/stage-CUjhED3P.mjs +662 -0
  673. package/dist/stage-CUjhED3P.mjs.map +1 -0
  674. package/dist/staged-C36IWXff.mjs +659 -0
  675. package/dist/staged-C36IWXff.mjs.map +1 -0
  676. package/dist/state-CKouMCSY.mjs +153 -0
  677. package/dist/state-CKouMCSY.mjs.map +1 -0
  678. package/dist/status-lzyj4Uu7.mjs +30 -0
  679. package/dist/status-lzyj4Uu7.mjs.map +1 -0
  680. package/dist/storage/local.d.mts +1 -1
  681. package/dist/storage/local.mjs +1 -1
  682. package/dist/storage/s3.d.mts +1 -1
  683. package/dist/storage/s3.mjs +1 -1
  684. package/dist/storage-query-B-cWcTjJ.d.mts +1594 -0
  685. package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
  686. package/dist/tar-DsTXX6ch.mjs +449 -0
  687. package/dist/tar-DsTXX6ch.mjs.map +1 -0
  688. package/dist/target-DLQCwp_Z.mjs +27 -0
  689. package/dist/target-DLQCwp_Z.mjs.map +1 -0
  690. package/dist/taxonomies-BlAjr4BL.mjs +697 -0
  691. package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
  692. package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
  693. package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
  694. package/dist/taxonomy-CKDwM61Y.mjs +525 -0
  695. package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
  696. package/dist/tokens-BojXlk49.mjs +171 -0
  697. package/dist/tokens-BojXlk49.mjs.map +1 -0
  698. package/dist/transaction-DLPQWik1.mjs +29 -0
  699. package/dist/transaction-DLPQWik1.mjs.map +1 -0
  700. package/dist/transfer-XSTh2BCr.mjs +8706 -0
  701. package/dist/transfer-XSTh2BCr.mjs.map +1 -0
  702. package/dist/transfer-download-DkoCDA9d.mjs +33 -0
  703. package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
  704. package/dist/transfer-iQ26J-RT.mjs +166 -0
  705. package/dist/transfer-iQ26J-RT.mjs.map +1 -0
  706. package/dist/transformations-C7RQabKQ.mjs +196 -0
  707. package/dist/transformations-C7RQabKQ.mjs.map +1 -0
  708. package/dist/transport-D3RulfD6.mjs +136 -0
  709. package/dist/transport-D3RulfD6.mjs.map +1 -0
  710. package/dist/transport-DhlZlf4D.d.mts +42 -0
  711. package/dist/transport-DhlZlf4D.d.mts.map +1 -0
  712. package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
  713. package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
  714. package/dist/turnstile-lqUiY7lP.mjs +53 -0
  715. package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
  716. package/dist/types-4Dn9bZhu.mjs +77 -0
  717. package/dist/types-4Dn9bZhu.mjs.map +1 -0
  718. package/dist/types-5LSo7PPx.d.mts +85 -0
  719. package/dist/types-5LSo7PPx.d.mts.map +1 -0
  720. package/dist/types-BQ3hwYJT.d.mts +896 -0
  721. package/dist/types-BQ3hwYJT.d.mts.map +1 -0
  722. package/dist/types-BYEk7qo3.d.mts +198 -0
  723. package/dist/types-BYEk7qo3.d.mts.map +1 -0
  724. package/dist/types-CJKsWVFR.mjs +199 -0
  725. package/dist/types-CJKsWVFR.mjs.map +1 -0
  726. package/dist/types-Ca_w8mmY.d.mts +363 -0
  727. package/dist/types-Ca_w8mmY.d.mts.map +1 -0
  728. package/dist/types-CkE41ZAG.mjs +18 -0
  729. package/dist/types-CkE41ZAG.mjs.map +1 -0
  730. package/dist/types-D0aJW2uR.d.mts +1641 -0
  731. package/dist/types-D0aJW2uR.d.mts.map +1 -0
  732. package/dist/types-DbpN4Qto.d.mts +372 -0
  733. package/dist/types-DbpN4Qto.d.mts.map +1 -0
  734. package/dist/types-ILDI1sdY.mjs +16 -0
  735. package/dist/types-ILDI1sdY.mjs.map +1 -0
  736. package/dist/types-OC5c-edM.mjs +22 -0
  737. package/dist/types-OC5c-edM.mjs.map +1 -0
  738. package/dist/types-aOOxRSx6.mjs +103 -0
  739. package/dist/types-aOOxRSx6.mjs.map +1 -0
  740. package/dist/types-m1WbUffD.d.mts +198 -0
  741. package/dist/types-m1WbUffD.d.mts.map +1 -0
  742. package/dist/types-uxLoPBio.d.mts +124 -0
  743. package/dist/types-uxLoPBio.d.mts.map +1 -0
  744. package/dist/types-we5uR-tV.d.mts +287 -0
  745. package/dist/types-we5uR-tV.d.mts.map +1 -0
  746. package/dist/upload-attempts-DduMy6B0.mjs +32 -0
  747. package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
  748. package/dist/url-pattern-B3EwxAAk.mjs +33 -0
  749. package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
  750. package/dist/user-ElwQjTQT.mjs +171 -0
  751. package/dist/user-ElwQjTQT.mjs.map +1 -0
  752. package/dist/utils-BlAXmfOG.mjs +439 -0
  753. package/dist/utils-BlAXmfOG.mjs.map +1 -0
  754. package/dist/validate-CH0X5b2c.d.mts +468 -0
  755. package/dist/validate-CH0X5b2c.d.mts.map +1 -0
  756. package/dist/validate-CfgRpcjA.mjs +492 -0
  757. package/dist/validate-CfgRpcjA.mjs.map +1 -0
  758. package/dist/validation-DvYJtv4k.mjs +218 -0
  759. package/dist/validation-DvYJtv4k.mjs.map +1 -0
  760. package/dist/version-DgYjhTud.mjs +9 -0
  761. package/dist/version-DgYjhTud.mjs.map +1 -0
  762. package/dist/version-Dq71scUb.mjs +7 -0
  763. package/dist/version-Dq71scUb.mjs.map +1 -0
  764. package/dist/widgets-ChFIj0be.mjs +126 -0
  765. package/dist/widgets-ChFIj0be.mjs.map +1 -0
  766. package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
  767. package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
  768. package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
  769. package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
  770. package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
  771. package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
  772. package/package.json +7 -6
  773. package/src/api/handlers/content.ts +593 -16
  774. package/src/api/handlers/device-flow.ts +74 -21
  775. package/src/api/handlers/index.ts +1 -0
  776. package/src/api/handlers/manifest.ts +79 -5
  777. package/src/api/handlers/media-upload.ts +17 -71
  778. package/src/api/handlers/media.ts +97 -3
  779. package/src/api/handlers/relations.ts +638 -157
  780. package/src/api/handlers/revision.ts +30 -0
  781. package/src/api/handlers/schema.ts +403 -1
  782. package/src/api/handlers/snapshot.ts +257 -3
  783. package/src/api/handlers/staged-references.ts +142 -0
  784. package/src/api/handlers/validate-references.ts +146 -0
  785. package/src/api/schemas/content.ts +13 -0
  786. package/src/api/schemas/relations.ts +54 -44
  787. package/src/api/schemas/schema.ts +14 -0
  788. package/src/astro/integration/routes.ts +15 -19
  789. package/src/astro/integration/vite-config.ts +10 -4
  790. package/src/astro/middleware.ts +1 -0
  791. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
  792. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  793. package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
  794. package/src/astro/routes/api/relations/index.ts +4 -4
  795. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
  796. package/src/astro/routes/api/setup/index.ts +66 -23
  797. package/src/astro/routes/api/snapshot.ts +2 -1
  798. package/src/astro/types.ts +10 -0
  799. package/src/cleanup.ts +10 -0
  800. package/src/cli/commands/export-seed.ts +510 -89
  801. package/src/components/Columns.astro +3 -1
  802. package/src/components/Cover.astro +3 -1
  803. package/src/components/WidgetArea.astro +3 -2
  804. package/src/database/migrations/086_relations_structural.ts +197 -0
  805. package/src/database/migrations/087_reference_field_relations.ts +407 -0
  806. package/src/database/migrations/runner.ts +4 -0
  807. package/src/database/reference-backfill.ts +141 -0
  808. package/src/database/repositories/content.ts +43 -8
  809. package/src/database/repositories/media.ts +40 -1
  810. package/src/database/repositories/redirect.ts +17 -34
  811. package/src/database/repositories/relation.ts +620 -208
  812. package/src/database/repositories/revision.ts +16 -0
  813. package/src/database/repositories/types.ts +38 -0
  814. package/src/database/transaction.ts +12 -1
  815. package/src/database/types.ts +14 -5
  816. package/src/emdash-runtime.ts +114 -11
  817. package/src/index.ts +11 -0
  818. package/src/loader.ts +169 -22
  819. package/src/mcp/server.ts +13 -48
  820. package/src/query.ts +455 -25
  821. package/src/references/field-map.ts +115 -0
  822. package/src/references/resolve.ts +160 -0
  823. package/src/references/staged.ts +117 -0
  824. package/src/references/types.ts +16 -0
  825. package/src/registry/artifact-fetch.ts +45 -271
  826. package/src/schema/registry.ts +99 -24
  827. package/src/schema/types.ts +58 -0
  828. package/src/schema/zod-generator.ts +67 -1
  829. package/src/seed/apply.ts +841 -103
  830. package/src/seed/types.ts +36 -2
  831. package/src/seed/validate.ts +78 -2
  832. package/src/transfer/analyze/unique-keys.ts +3 -12
  833. package/src/transfer/analyze/validate.ts +65 -39
  834. package/src/transfer/analyze/values.ts +12 -1
  835. package/src/transfer/export/readers.ts +12 -8
  836. package/src/transfer/format/columns.ts +26 -6
  837. package/src/transfer/format/kinds.ts +21 -5
  838. package/src/transfer/import/context.ts +8 -1
  839. package/src/transfer/ops/package-index.ts +1 -1
  840. package/dist/action-token-DYwe4Pk0.mjs +0 -26
  841. package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
  842. package/dist/activation-LOkDM5WT.mjs +0 -382
  843. package/dist/activation-LOkDM5WT.mjs.map +0 -1
  844. package/dist/adapters-B64LbYcB.d.mts +0 -171
  845. package/dist/adapters-B64LbYcB.d.mts.map +0 -1
  846. package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
  847. package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
  848. package/dist/api-cFFZpyS0.mjs +0 -4718
  849. package/dist/api-cFFZpyS0.mjs.map +0 -1
  850. package/dist/api-tokens-s4i4aUp_.mjs +0 -166
  851. package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
  852. package/dist/apply-CoT603H3.mjs +0 -1163
  853. package/dist/apply-CoT603H3.mjs.map +0 -1
  854. package/dist/approvals-CqMfNxak.mjs +0 -460
  855. package/dist/approvals-CqMfNxak.mjs.map +0 -1
  856. package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
  857. package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
  858. package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
  859. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
  860. package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
  861. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
  862. package/dist/audit-RfCugiSB.mjs +0 -127
  863. package/dist/audit-RfCugiSB.mjs.map +0 -1
  864. package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
  865. package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
  866. package/dist/authorize-seCifOMJ.mjs +0 -49
  867. package/dist/authorize-seCifOMJ.mjs.map +0 -1
  868. package/dist/backup-CBu0LrXf.mjs +0 -246
  869. package/dist/backup-CBu0LrXf.mjs.map +0 -1
  870. package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
  871. package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
  872. package/dist/block-types-BmZmLmAD.mjs +0 -132
  873. package/dist/block-types-BmZmLmAD.mjs.map +0 -1
  874. package/dist/block-values-C_VIPr5t.mjs +0 -175
  875. package/dist/block-values-C_VIPr5t.mjs.map +0 -1
  876. package/dist/byline-DYmkXqvo.mjs +0 -909
  877. package/dist/byline-DYmkXqvo.mjs.map +0 -1
  878. package/dist/byline-fields-D28AT-Fh.mjs +0 -123
  879. package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
  880. package/dist/byline-registry-gnKscbQX.mjs +0 -406
  881. package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
  882. package/dist/bylines-BPwJqoYH.mjs +0 -232
  883. package/dist/bylines-BPwJqoYH.mjs.map +0 -1
  884. package/dist/bylines-ukLaYpVZ.mjs +0 -214
  885. package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
  886. package/dist/cache-m7UEkRFV.mjs +0 -108
  887. package/dist/cache-m7UEkRFV.mjs.map +0 -1
  888. package/dist/canonical-YhEQezjg.mjs +0 -174
  889. package/dist/canonical-YhEQezjg.mjs.map +0 -1
  890. package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
  891. package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
  892. package/dist/challenge-store-ppU6Uv13.mjs +0 -51
  893. package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
  894. package/dist/checksum-B2IINIlN.mjs +0 -162
  895. package/dist/checksum-B2IINIlN.mjs.map +0 -1
  896. package/dist/chrome-tags-DApCQSIk.mjs +0 -24
  897. package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
  898. package/dist/chunks-Dms7Uxbt.mjs +0 -25
  899. package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
  900. package/dist/collection-deletion-BIm28mo3.mjs +0 -436
  901. package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
  902. package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
  903. package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
  904. package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
  905. package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
  906. package/dist/comment-CrBl22OF.mjs +0 -313
  907. package/dist/comment-CrBl22OF.mjs.map +0 -1
  908. package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
  909. package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
  910. package/dist/comments-2ah9du9y.mjs +0 -195
  911. package/dist/comments-2ah9du9y.mjs.map +0 -1
  912. package/dist/comments-fHZ8ON9O.mjs +0 -99
  913. package/dist/comments-fHZ8ON9O.mjs.map +0 -1
  914. package/dist/components-CXbq7CSM.mjs +0 -108
  915. package/dist/components-CXbq7CSM.mjs.map +0 -1
  916. package/dist/config-5ii2haYu.d.mts +0 -6528
  917. package/dist/config-5ii2haYu.d.mts.map +0 -1
  918. package/dist/config-IhybvkIQ.mjs +0 -242
  919. package/dist/config-IhybvkIQ.mjs.map +0 -1
  920. package/dist/config-Py43JK9r.d.mts +0 -39
  921. package/dist/config-Py43JK9r.d.mts.map +0 -1
  922. package/dist/content-DFaIEDj9.mjs +0 -2281
  923. package/dist/content-DFaIEDj9.mjs.map +0 -1
  924. package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
  925. package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
  926. package/dist/content-policy-DFNw91-d.mjs +0 -46
  927. package/dist/content-policy-DFNw91-d.mjs.map +0 -1
  928. package/dist/content-repair-Q8IUrpLL.mjs +0 -442
  929. package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
  930. package/dist/context-BeGccdUX.mjs +0 -1921
  931. package/dist/context-BeGccdUX.mjs.map +0 -1
  932. package/dist/cron-7DCJwPXq.mjs +0 -284
  933. package/dist/cron-7DCJwPXq.mjs.map +0 -1
  934. package/dist/dashboard-DjrB-xxZ.mjs +0 -151
  935. package/dist/dashboard-DjrB-xxZ.mjs.map +0 -1
  936. package/dist/default-DQ6vsviu.mjs +0 -81
  937. package/dist/default-DQ6vsviu.mjs.map +0 -1
  938. package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
  939. package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
  940. package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
  941. package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
  942. package/dist/device-flow-CRd6DXmW.mjs +0 -466
  943. package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
  944. package/dist/digest-BarSh-pN.mjs +0 -194
  945. package/dist/digest-BarSh-pN.mjs.map +0 -1
  946. package/dist/direct-executor-BmuFJJZV.mjs +0 -104
  947. package/dist/direct-executor-BmuFJJZV.mjs.map +0 -1
  948. package/dist/dist-BNwANFJR.mjs +0 -810
  949. package/dist/dist-BNwANFJR.mjs.map +0 -1
  950. package/dist/email-console-bJn3ctqA.mjs +0 -50
  951. package/dist/email-console-bJn3ctqA.mjs.map +0 -1
  952. package/dist/email-locale-CN6WAMx0.mjs +0 -25
  953. package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
  954. package/dist/emdash-runtime-DAjghyEG.mjs +0 -4186
  955. package/dist/emdash-runtime-DAjghyEG.mjs.map +0 -1
  956. package/dist/enrich-Dl3kZ-lP.mjs +0 -194
  957. package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
  958. package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
  959. package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
  960. package/dist/entry-lock-DHQOxN7R.mjs +0 -163
  961. package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
  962. package/dist/entry-lock-DVhCt49A.d.mts +0 -4368
  963. package/dist/entry-lock-DVhCt49A.d.mts.map +0 -1
  964. package/dist/entry-locks-D0foLdjQ.mjs +0 -167
  965. package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
  966. package/dist/error-CfvOHP0M.mjs +0 -90
  967. package/dist/error-CfvOHP0M.mjs.map +0 -1
  968. package/dist/errors-BF0_LFhW.mjs +0 -460
  969. package/dist/errors-BF0_LFhW.mjs.map +0 -1
  970. package/dist/errors-DgE1zJGG.mjs +0 -120
  971. package/dist/errors-DgE1zJGG.mjs.map +0 -1
  972. package/dist/escape-CuaZhZvL.mjs +0 -9
  973. package/dist/escape-CuaZhZvL.mjs.map +0 -1
  974. package/dist/fence-CMDXJYc_.mjs +0 -162
  975. package/dist/fence-CMDXJYc_.mjs.map +0 -1
  976. package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
  977. package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
  978. package/dist/focal-point-Gr34o-4o.mjs +0 -23
  979. package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
  980. package/dist/fts-manager-S-K0laoS.mjs +0 -443
  981. package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
  982. package/dist/gc-DjKY0Ay1.mjs +0 -75
  983. package/dist/gc-DjKY0Ay1.mjs.map +0 -1
  984. package/dist/hash-SDAW6zC-.mjs +0 -37
  985. package/dist/hash-SDAW6zC-.mjs.map +0 -1
  986. package/dist/hook-result-B5bXDgS2.d.mts +0 -31
  987. package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
  988. package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
  989. package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
  990. package/dist/hreflang-DMFBL2eb.mjs +0 -105
  991. package/dist/hreflang-DMFBL2eb.mjs.map +0 -1
  992. package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
  993. package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
  994. package/dist/identity-IyNWwXr6.mjs +0 -35
  995. package/dist/identity-IyNWwXr6.mjs.map +0 -1
  996. package/dist/import-C3JZplWq.mjs +0 -2020
  997. package/dist/import-C3JZplWq.mjs.map +0 -1
  998. package/dist/index-D-hdtLe8.d.mts +0 -623
  999. package/dist/index-D-hdtLe8.d.mts.map +0 -1
  1000. package/dist/install-finalization-DfM1fj5x.mjs +0 -58
  1001. package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
  1002. package/dist/keys-yxLm5l35.mjs +0 -61
  1003. package/dist/keys-yxLm5l35.mjs.map +0 -1
  1004. package/dist/kinds-CRu_T5T5.mjs +0 -961
  1005. package/dist/kinds-CRu_T5T5.mjs.map +0 -1
  1006. package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
  1007. package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
  1008. package/dist/load-XgJiE6_3.mjs +0 -28
  1009. package/dist/load-XgJiE6_3.mjs.map +0 -1
  1010. package/dist/loader-BzqeR1ZN.mjs +0 -1086
  1011. package/dist/loader-BzqeR1ZN.mjs.map +0 -1
  1012. package/dist/loops-BQSzv5Zn.mjs +0 -203
  1013. package/dist/loops-BQSzv5Zn.mjs.map +0 -1
  1014. package/dist/manifest-builder-B8zR-73J.mjs +0 -189
  1015. package/dist/manifest-builder-B8zR-73J.mjs.map +0 -1
  1016. package/dist/manifest-schema-CY3zng_M.mjs +0 -492
  1017. package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
  1018. package/dist/media-Pu1L6xir.mjs +0 -408
  1019. package/dist/media-Pu1L6xir.mjs.map +0 -1
  1020. package/dist/media-Qp5S3eH3.mjs +0 -355
  1021. package/dist/media-Qp5S3eH3.mjs.map +0 -1
  1022. package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
  1023. package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
  1024. package/dist/media-folders-BE0oo2eX.mjs +0 -210
  1025. package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
  1026. package/dist/media-h7tOiDLj.mjs +0 -221
  1027. package/dist/media-h7tOiDLj.mjs.map +0 -1
  1028. package/dist/media-url-jArBpzIG.mjs +0 -43
  1029. package/dist/media-url-jArBpzIG.mjs.map +0 -1
  1030. package/dist/media-usage-My-Vi-ex.mjs +0 -1629
  1031. package/dist/media-usage-My-Vi-ex.mjs.map +0 -1
  1032. package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
  1033. package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
  1034. package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
  1035. package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
  1036. package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
  1037. package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
  1038. package/dist/menus-BM7BPLOb.mjs +0 -139
  1039. package/dist/menus-BM7BPLOb.mjs.map +0 -1
  1040. package/dist/menus-ITeAbcIF.mjs +0 -753
  1041. package/dist/menus-ITeAbcIF.mjs.map +0 -1
  1042. package/dist/menus-TsSGmSR4.mjs +0 -3608
  1043. package/dist/menus-TsSGmSR4.mjs.map +0 -1
  1044. package/dist/mime-ChLqYwDk.mjs +0 -36
  1045. package/dist/mime-ChLqYwDk.mjs.map +0 -1
  1046. package/dist/mode-CCuKXUci.mjs +0 -23
  1047. package/dist/mode-CCuKXUci.mjs.map +0 -1
  1048. package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
  1049. package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
  1050. package/dist/normalize-CO2P8-iE.mjs +0 -191
  1051. package/dist/normalize-CO2P8-iE.mjs.map +0 -1
  1052. package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
  1053. package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
  1054. package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
  1055. package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
  1056. package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
  1057. package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
  1058. package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
  1059. package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
  1060. package/dist/options-SQCHQCPH.d.mts +0 -81
  1061. package/dist/options-SQCHQCPH.d.mts.map +0 -1
  1062. package/dist/parse-CVgO-Qai.d.mts +0 -168
  1063. package/dist/parse-CVgO-Qai.d.mts.map +0 -1
  1064. package/dist/parse-DY6OD1j_.mjs +0 -81
  1065. package/dist/parse-DY6OD1j_.mjs.map +0 -1
  1066. package/dist/passkey-config-X_H8128a.mjs +0 -46
  1067. package/dist/passkey-config-X_H8128a.mjs.map +0 -1
  1068. package/dist/paths-JxokKIbr.mjs +0 -77
  1069. package/dist/paths-JxokKIbr.mjs.map +0 -1
  1070. package/dist/patterns-BhAvqO0S.mjs +0 -145
  1071. package/dist/patterns-BhAvqO0S.mjs.map +0 -1
  1072. package/dist/placeholder-MSEd8gty.d.mts +0 -306
  1073. package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
  1074. package/dist/plan-xjcWrAah.mjs +0 -135
  1075. package/dist/plan-xjcWrAah.mjs.map +0 -1
  1076. package/dist/plugins-DUXUt8B9.mjs +0 -277
  1077. package/dist/plugins-DUXUt8B9.mjs.map +0 -1
  1078. package/dist/policy-CUvwAARc.mjs +0 -45
  1079. package/dist/policy-CUvwAARc.mjs.map +0 -1
  1080. package/dist/portable-text-5O_ZGUjB.mjs +0 -307
  1081. package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
  1082. package/dist/preview-CIUcPYr6.mjs +0 -107
  1083. package/dist/preview-CIUcPYr6.mjs.map +0 -1
  1084. package/dist/protocol-B97DZaFr.d.mts +0 -61
  1085. package/dist/protocol-B97DZaFr.d.mts.map +0 -1
  1086. package/dist/public-submission-BFBUrqst.mjs +0 -250
  1087. package/dist/public-submission-BFBUrqst.mjs.map +0 -1
  1088. package/dist/public-url-Bn7U0D7-.mjs +0 -101
  1089. package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
  1090. package/dist/query-B48peoRT.mjs +0 -890
  1091. package/dist/query-B48peoRT.mjs.map +0 -1
  1092. package/dist/query-C4IH0uhR.mjs +0 -41
  1093. package/dist/query-C4IH0uhR.mjs.map +0 -1
  1094. package/dist/rate-limit-BZ6nybgc.mjs +0 -120
  1095. package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
  1096. package/dist/receipt-B4wJj5Jq.mjs +0 -43
  1097. package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
  1098. package/dist/redirect-Cd1E7VUt.mjs +0 -17
  1099. package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
  1100. package/dist/redirect-iJf5fltD.mjs +0 -415
  1101. package/dist/redirect-iJf5fltD.mjs.map +0 -1
  1102. package/dist/redirects-CYu1u1aK.mjs +0 -446
  1103. package/dist/redirects-CYu1u1aK.mjs.map +0 -1
  1104. package/dist/redirects-Cv9apQKj.mjs +0 -148
  1105. package/dist/redirects-Cv9apQKj.mjs.map +0 -1
  1106. package/dist/relation-M4NUCb0b.mjs +0 -334
  1107. package/dist/relation-M4NUCb0b.mjs.map +0 -1
  1108. package/dist/relations-CCif47Oq.mjs +0 -403
  1109. package/dist/relations-CCif47Oq.mjs.map +0 -1
  1110. package/dist/relations-CK9CYUyr.mjs +0 -310
  1111. package/dist/relations-CK9CYUyr.mjs.map +0 -1
  1112. package/dist/request-cache-DzLYKm_x.mjs +0 -104
  1113. package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
  1114. package/dist/request-meta-sZXt3sRo.mjs +0 -141
  1115. package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
  1116. package/dist/resolve-2WbQsCvT.mjs +0 -199
  1117. package/dist/resolve-2WbQsCvT.mjs.map +0 -1
  1118. package/dist/route-wire--1hLuACz.mjs +0 -197
  1119. package/dist/route-wire--1hLuACz.mjs.map +0 -1
  1120. package/dist/routes-CUsM40Cc.mjs +0 -272
  1121. package/dist/routes-CUsM40Cc.mjs.map +0 -1
  1122. package/dist/runner-1y4J9fJB.mjs +0 -5742
  1123. package/dist/runner-1y4J9fJB.mjs.map +0 -1
  1124. package/dist/runner-D5_LzKXI.d.mts +0 -68
  1125. package/dist/runner-D5_LzKXI.d.mts.map +0 -1
  1126. package/dist/schema-BABiRdsH.mjs +0 -13
  1127. package/dist/schema-BABiRdsH.mjs.map +0 -1
  1128. package/dist/schema-Du3MzCG0.mjs +0 -446
  1129. package/dist/schema-Du3MzCG0.mjs.map +0 -1
  1130. package/dist/scopes-Dbk-ElhT.mjs +0 -34
  1131. package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
  1132. package/dist/search-Bt1PL1jf.mjs +0 -448
  1133. package/dist/search-Bt1PL1jf.mjs.map +0 -1
  1134. package/dist/sections-Ddptx_o9.mjs +0 -346
  1135. package/dist/sections-Ddptx_o9.mjs.map +0 -1
  1136. package/dist/seo-CZT2oLtT.mjs +0 -114
  1137. package/dist/seo-CZT2oLtT.mjs.map +0 -1
  1138. package/dist/seo-D5w3-Azy.mjs +0 -133
  1139. package/dist/seo-D5w3-Azy.mjs.map +0 -1
  1140. package/dist/service-DuykXPyW.mjs +0 -150
  1141. package/dist/service-DuykXPyW.mjs.map +0 -1
  1142. package/dist/session-user-BhaVp8w0.mjs +0 -51
  1143. package/dist/session-user-BhaVp8w0.mjs.map +0 -1
  1144. package/dist/settings-2xNYr90o.mjs +0 -51
  1145. package/dist/settings-2xNYr90o.mjs.map +0 -1
  1146. package/dist/settings-CgjRWGW9.mjs +0 -439
  1147. package/dist/settings-CgjRWGW9.mjs.map +0 -1
  1148. package/dist/settings-DYidIB26.mjs +0 -61
  1149. package/dist/settings-DYidIB26.mjs.map +0 -1
  1150. package/dist/setup-complete-bOogcHWG.mjs +0 -26
  1151. package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
  1152. package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
  1153. package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
  1154. package/dist/site-settings-DOgRUoFX.mjs +0 -50
  1155. package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
  1156. package/dist/site-url-BU_bbxwj.mjs +0 -16
  1157. package/dist/site-url-BU_bbxwj.mjs.map +0 -1
  1158. package/dist/snapshot-CugwUqKQ.mjs +0 -237
  1159. package/dist/snapshot-CugwUqKQ.mjs.map +0 -1
  1160. package/dist/ssrf-CJUnJymJ.mjs +0 -406
  1161. package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
  1162. package/dist/stage-DgrBz_du.mjs +0 -662
  1163. package/dist/stage-DgrBz_du.mjs.map +0 -1
  1164. package/dist/state-DDiPySSG.mjs +0 -153
  1165. package/dist/state-DDiPySSG.mjs.map +0 -1
  1166. package/dist/status-DZKIG4a9.mjs +0 -30
  1167. package/dist/status-DZKIG4a9.mjs.map +0 -1
  1168. package/dist/storage-query-Bdv7A62k.d.mts +0 -1576
  1169. package/dist/storage-query-Bdv7A62k.d.mts.map +0 -1
  1170. package/dist/tar-_1AgTYFu.mjs +0 -449
  1171. package/dist/tar-_1AgTYFu.mjs.map +0 -1
  1172. package/dist/target-_7pn2Gbg.mjs +0 -27
  1173. package/dist/target-_7pn2Gbg.mjs.map +0 -1
  1174. package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
  1175. package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
  1176. package/dist/taxonomies-C_XMoRcX.mjs +0 -939
  1177. package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
  1178. package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
  1179. package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
  1180. package/dist/tokens-u78jETkX.mjs +0 -171
  1181. package/dist/tokens-u78jETkX.mjs.map +0 -1
  1182. package/dist/transaction-BcJO4Tmc.mjs +0 -29
  1183. package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
  1184. package/dist/transfer-BhUCrgDc.mjs +0 -8675
  1185. package/dist/transfer-BhUCrgDc.mjs.map +0 -1
  1186. package/dist/transfer-DIGvR9Af.mjs +0 -166
  1187. package/dist/transfer-DIGvR9Af.mjs.map +0 -1
  1188. package/dist/transfer-download-Pml7RMio.mjs +0 -33
  1189. package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
  1190. package/dist/transformations-9gfpwY65.mjs +0 -196
  1191. package/dist/transformations-9gfpwY65.mjs.map +0 -1
  1192. package/dist/transport-BIfH7_hx.d.mts +0 -42
  1193. package/dist/transport-BIfH7_hx.d.mts.map +0 -1
  1194. package/dist/transport-DKWIq53q.mjs +0 -136
  1195. package/dist/transport-DKWIq53q.mjs.map +0 -1
  1196. package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
  1197. package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
  1198. package/dist/turnstile-DpsoyOfg.mjs +0 -53
  1199. package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
  1200. package/dist/types-B4sUC2p1.d.mts +0 -198
  1201. package/dist/types-B4sUC2p1.d.mts.map +0 -1
  1202. package/dist/types-B7Lmsh1E.d.mts +0 -887
  1203. package/dist/types-B7Lmsh1E.d.mts.map +0 -1
  1204. package/dist/types-BZakh7Ym.mjs +0 -22
  1205. package/dist/types-BZakh7Ym.mjs.map +0 -1
  1206. package/dist/types-B_CppEmv.d.mts +0 -264
  1207. package/dist/types-B_CppEmv.d.mts.map +0 -1
  1208. package/dist/types-BcrBrE6-.mjs +0 -159
  1209. package/dist/types-BcrBrE6-.mjs.map +0 -1
  1210. package/dist/types-BkUg2yHx.mjs +0 -92
  1211. package/dist/types-BkUg2yHx.mjs.map +0 -1
  1212. package/dist/types-CAZgq9fO.d.mts +0 -124
  1213. package/dist/types-CAZgq9fO.d.mts.map +0 -1
  1214. package/dist/types-Cd-O03VG.d.mts +0 -363
  1215. package/dist/types-Cd-O03VG.d.mts.map +0 -1
  1216. package/dist/types-Cr-Kg-3D.d.mts +0 -1641
  1217. package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
  1218. package/dist/types-D2fvWd1i.d.mts +0 -359
  1219. package/dist/types-D2fvWd1i.d.mts.map +0 -1
  1220. package/dist/types-D7HUsguf.mjs +0 -77
  1221. package/dist/types-D7HUsguf.mjs.map +0 -1
  1222. package/dist/types-DA1Te3Oy.d.mts +0 -198
  1223. package/dist/types-DA1Te3Oy.d.mts.map +0 -1
  1224. package/dist/types-DhV6Q5bP.mjs +0 -18
  1225. package/dist/types-DhV6Q5bP.mjs.map +0 -1
  1226. package/dist/types-DnnVSl6Y.d.mts +0 -85
  1227. package/dist/types-DnnVSl6Y.d.mts.map +0 -1
  1228. package/dist/types-VT4-BugW.mjs +0 -16
  1229. package/dist/types-VT4-BugW.mjs.map +0 -1
  1230. package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
  1231. package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
  1232. package/dist/url-pattern-CCeZMGOh.mjs +0 -33
  1233. package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
  1234. package/dist/user-DDSL-sGw.mjs +0 -171
  1235. package/dist/user-DDSL-sGw.mjs.map +0 -1
  1236. package/dist/utils-DdhmO9w9.mjs +0 -439
  1237. package/dist/utils-DdhmO9w9.mjs.map +0 -1
  1238. package/dist/validate-CHosPEhs.mjs +0 -453
  1239. package/dist/validate-CHosPEhs.mjs.map +0 -1
  1240. package/dist/validate-CM79QXYE.d.mts +0 -432
  1241. package/dist/validate-CM79QXYE.d.mts.map +0 -1
  1242. package/dist/validation-BFecQczG.mjs +0 -218
  1243. package/dist/validation-BFecQczG.mjs.map +0 -1
  1244. package/dist/version-BRZXVifl.mjs +0 -9
  1245. package/dist/version-BRZXVifl.mjs.map +0 -1
  1246. package/dist/version-DUQDHgrf.mjs +0 -7
  1247. package/dist/version-DUQDHgrf.mjs.map +0 -1
  1248. package/dist/widgets-WdV72brA.mjs +0 -126
  1249. package/dist/widgets-WdV72brA.mjs.map +0 -1
  1250. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
  1251. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
  1252. package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
  1253. package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
  1254. package/dist/zod-generator-D6uE4WiS.mjs +0 -389
  1255. package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
  1256. package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
  1257. /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
  1258. /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";