dineway 0.1.49 → 0.2.1

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 (434) hide show
  1. package/dist/activity-DUaz_w7p.mjs +79 -0
  2. package/dist/{activity-events-CwM7yxPW.mjs → activity-events-CJDvE2uc.mjs} +5 -113
  3. package/dist/actor-0QJ1Gbtf.mjs +37 -0
  4. package/dist/after-BfniwgIf.mjs +9 -0
  5. package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins--OwHHiY8.mjs} +1 -1
  6. package/dist/api/route-utils.d.mts +9 -10
  7. package/dist/api/route-utils.mjs +16 -13
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +5 -4
  10. package/dist/{api-BMIxRIEN.mjs → api-B4PHIF4V.mjs} +93 -41
  11. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-tbK_sORH.mjs} +6 -2
  12. package/dist/{apply-D_RlTYtC.mjs → apply-DjTqq6Ae.mjs} +117 -77
  13. package/dist/astro/image-endpoint.d.mts +7 -0
  14. package/dist/astro/image-endpoint.mjs +54 -0
  15. package/dist/astro/index.d.mts +34 -11
  16. package/dist/astro/index.mjs +163 -24
  17. package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  18. package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
  19. package/dist/astro/middleware/auth.d.mts +8 -18
  20. package/dist/astro/middleware/auth.mjs +42 -24
  21. package/dist/astro/middleware/redirect.mjs +13 -4
  22. package/dist/astro/middleware/request-context.mjs +8 -5
  23. package/dist/astro/middleware/seed.d.mts +1 -1
  24. package/dist/astro/middleware/seed.mjs +2 -2
  25. package/dist/astro/middleware/setup.mjs +1 -1
  26. package/dist/astro/middleware.mjs +389 -206
  27. package/dist/astro/routes/admin.astro +6 -1
  28. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
  29. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
  30. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  31. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  32. package/dist/astro/routes/api/admin/briefing.mjs +21 -17
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
  35. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
  36. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
  37. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
  39. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
  40. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
  41. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
  42. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
  43. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
  44. package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
  45. package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -24
  46. package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -24
  47. package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -28
  48. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -28
  49. package/dist/astro/routes/api/admin/context/diff.mjs +31 -27
  50. package/dist/astro/routes/api/admin/context/index.mjs +32 -28
  51. package/dist/astro/routes/api/admin/context/stale.mjs +31 -27
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -24
  53. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -27
  54. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -27
  55. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -25
  56. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  57. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  58. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  59. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -51
  60. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -51
  61. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
  62. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -49
  63. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -48
  64. package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
  67. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -48
  68. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
  69. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -63
  72. package/dist/astro/routes/api/admin/review-requests/index.d.mts +2 -1
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +58 -10
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
  75. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  76. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -6
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  90. package/dist/astro/routes/api/auth/me.mjs +9 -8
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
  103. package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
  107. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
  108. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  109. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +6 -5
  110. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  111. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -5
  112. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
  113. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +49 -20
  114. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -5
  115. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  116. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +67 -32
  117. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
  118. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  119. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -5
  120. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  121. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  122. package/dist/astro/routes/api/content/_collection_/index.mjs +11 -9
  123. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  124. package/dist/astro/routes/api/dashboard.mjs +9 -8
  125. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  126. package/dist/astro/routes/api/health.mjs +1 -1
  127. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  128. package/dist/astro/routes/api/import/probe.mjs +22 -10
  129. package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
  130. package/dist/astro/routes/api/import/wordpress/execute.d.mts +18 -1
  131. package/dist/astro/routes/api/import/wordpress/execute.mjs +85 -37
  132. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -1
  133. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
  134. package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -32
  135. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +17 -1
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +121 -100
  137. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  138. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
  139. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +55 -2
  140. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -55
  141. package/dist/astro/routes/api/manifest.mjs +14 -5
  142. package/dist/astro/routes/api/mcp.mjs +753 -170
  143. package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
  144. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  145. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  146. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  147. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  148. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  149. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  150. package/dist/astro/routes/api/media.mjs +28 -35
  151. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -28
  152. package/dist/astro/routes/api/menus/_name_/items.mjs +32 -28
  153. package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -28
  154. package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -28
  155. package/dist/astro/routes/api/menus/_name_.mjs +32 -28
  156. package/dist/astro/routes/api/menus/index.mjs +32 -28
  157. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  158. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  159. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  160. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  161. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  162. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  163. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  164. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  165. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  166. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +46 -31
  167. package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
  168. package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
  169. package/dist/astro/routes/api/redirects/_id_.mjs +33 -29
  170. package/dist/astro/routes/api/redirects/index.mjs +33 -29
  171. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  172. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +48 -43
  174. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -43
  175. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -43
  176. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -43
  177. package/dist/astro/routes/api/schema/collections/index.mjs +48 -43
  178. package/dist/astro/routes/api/schema/index.mjs +14 -15
  179. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
  180. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
  181. package/dist/astro/routes/api/search/enable.mjs +11 -10
  182. package/dist/astro/routes/api/search/index.mjs +10 -9
  183. package/dist/astro/routes/api/search/rebuild.mjs +11 -10
  184. package/dist/astro/routes/api/search/stats.mjs +6 -6
  185. package/dist/astro/routes/api/search/suggest.mjs +10 -9
  186. package/dist/astro/routes/api/sections/_slug_.mjs +32 -28
  187. package/dist/astro/routes/api/sections/index.mjs +32 -28
  188. package/dist/astro/routes/api/settings/email.mjs +4 -4
  189. package/dist/astro/routes/api/settings.mjs +32 -28
  190. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  191. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  192. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
  193. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  194. package/dist/astro/routes/api/setup/index.mjs +29 -25
  195. package/dist/astro/routes/api/setup/status.mjs +3 -3
  196. package/dist/astro/routes/api/snapshot.mjs +8 -7
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -31
  198. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -31
  199. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -31
  200. package/dist/astro/routes/api/taxonomies/index.mjs +35 -31
  201. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  202. package/dist/astro/routes/api/typegen.mjs +4 -4
  203. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  204. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  205. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  206. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +31 -27
  207. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -28
  208. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -28
  209. package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -26
  210. package/dist/astro/routes/api/widget-areas/index.mjs +32 -28
  211. package/dist/astro/routes/api/widget-components.mjs +2 -2
  212. package/dist/astro/routes/robots.txt.mjs +8 -7
  213. package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
  214. package/dist/astro/routes/sitemap.xml.mjs +9 -8
  215. package/dist/astro/session-driver.d.mts +1 -1
  216. package/dist/astro/session-driver.mjs +2 -2
  217. package/dist/astro/types.d.mts +22 -13
  218. package/dist/{audit-BeNsSyfU.mjs → audit-B2pRxZ20.mjs} +1 -1
  219. package/dist/auth/providers/github.d.mts +1 -1
  220. package/dist/auth/providers/google.d.mts +1 -1
  221. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-D71jourk.mjs} +1 -1
  222. package/dist/{authorize-BLO0m7fW.mjs → authorize-ZXPGPwKn.mjs} +1 -1
  223. package/dist/{briefing-CkTee1ex.mjs → briefing-0rf-su3-.mjs} +90 -28
  224. package/dist/{briefing-DJX6irto.mjs → briefing-kRhegBoF.mjs} +2 -1
  225. package/dist/bundle-CEcdUa1s.mjs +602 -0
  226. package/dist/{byline-BVC1lV6G.mjs → byline-7xR185Ly.mjs} +30 -62
  227. package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-BKzA0fJU.mjs} +1 -1
  228. package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-Ckeqd1OY.d.mts} +88 -35
  229. package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-WN7RQT4q.mjs} +10 -4
  230. package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-Ba54M74c.mjs} +2 -2
  231. package/dist/{bylines-LN9XISRo.mjs → bylines-C-EL6dh3.mjs} +9 -3
  232. package/dist/{bylines-DwokOFj6.mjs → bylines-CmZFCMr0.mjs} +5 -5
  233. package/dist/{cache-Bac05gBd.mjs → cache-DkVCKGio.mjs} +2 -2
  234. package/dist/{chunks-CuUt7K50.mjs → chunks-ChGNDY8r.mjs} +1 -1
  235. package/dist/cli/index.d.mts +29 -1
  236. package/dist/cli/index.mjs +1466 -1763
  237. package/dist/cli/plugin-kit.d.mts +75 -0
  238. package/dist/cli/plugin-kit.mjs +4 -0
  239. package/dist/client/external-auth-headers.d.mts +1 -1
  240. package/dist/client/index.d.mts +27 -52
  241. package/dist/client/index.mjs +34 -6
  242. package/dist/client-factory-BDD9azPJ.mjs +233 -0
  243. package/dist/{comment-Beue8-15.mjs → comment-DFALgsJD.mjs} +13 -3
  244. package/dist/comment-reaction-C37bf99u.mjs +58 -0
  245. package/dist/{comments-DcjFIfqX.mjs → comments-B3NwDBxl.mjs} +1 -1
  246. package/dist/{content-CBxYGWfL.mjs → content-DJcAYFhz.mjs} +51 -34
  247. package/dist/content-refresh-B4ZCmxgd.mjs +1576 -0
  248. package/dist/{context-Df1xVYyr.mjs → context-DnpXcp6Y.mjs} +2 -2
  249. package/dist/{context-CQVNZaR8.mjs → context-fSCYLL3c.mjs} +125 -53
  250. package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-CI8XzcsK.mjs} +2 -1
  251. package/dist/{cron-DxCAU_Sn.mjs → cron-B1SL_lsb.mjs} +7 -3
  252. package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-D0nj5oWg.mjs} +4 -4
  253. package/dist/db/index.d.mts +3 -3
  254. package/dist/db/index.mjs +1 -1
  255. package/dist/db/libsql.d.mts +1 -1
  256. package/dist/db/postgres.d.mts +1 -1
  257. package/dist/db/sqlite.d.mts +1 -1
  258. package/dist/{device-flow-BZVGftqi.mjs → device-flow-BJe6VEhP.mjs} +5 -5
  259. package/dist/{placeholder-d54Qr_7n.mjs → enrich-Ck9tfMqe.mjs} +36 -9
  260. package/dist/{error-DCSuUAZW.mjs → error-CSVaQNZy.mjs} +5 -0
  261. package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-GVhUgzEs.mjs} +1 -1
  262. package/dist/field-defs-cache-DL-T2XVS.mjs +49 -0
  263. package/dist/forgeway-seo-client-G5ddhVHd.mjs +456 -0
  264. package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-ewTGohf4.mjs} +1 -1
  265. package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-DEFj8e6u.mjs} +2 -2
  266. package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-C23JHaWz.mjs} +5 -4
  267. package/dist/import-CXXL5pip.mjs +1354 -0
  268. package/dist/index-DcnOCD1e.d.mts +375 -0
  269. package/dist/index.d.mts +15 -16
  270. package/dist/index.mjs +85 -70
  271. package/dist/{jsonld-DZ67souc.d.mts → jsonld-DzKbhRZ4.d.mts} +8 -4
  272. package/dist/{load-D9OiGr2m.mjs → load-CFtJRT3c.mjs} +1 -1
  273. package/dist/{loader--GOYux8M.mjs → loader-aWkkc1_o.mjs} +117 -31
  274. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-uA6pRFXi.mjs} +38 -1
  275. package/dist/mcp-reviewed-executor-Dn52L_yY.mjs +558 -0
  276. package/dist/media/image-endpoint.d.mts +32 -0
  277. package/dist/media/image-endpoint.mjs +111 -0
  278. package/dist/media/index.d.mts +27 -2
  279. package/dist/media/index.mjs +5 -3
  280. package/dist/media/local-runtime.d.mts +15 -11
  281. package/dist/media/local-runtime.mjs +9 -7
  282. package/dist/{media-CbKyYukG.mjs → media-CVMOoywq.mjs} +3 -1
  283. package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-zDNJmXCo.mjs} +1 -1
  284. package/dist/media-url-BdoLPvg8.mjs +20 -0
  285. package/dist/{menus-C7F0sCrC.mjs → menus-CCG2z5um.mjs} +80 -15
  286. package/dist/{menus-BZbXf-ej.mjs → menus-CmyIkRG5.mjs} +19 -5
  287. package/dist/{normalize-ByemhhfW.mjs → normalize-Cyt7JdF7.mjs} +8 -1
  288. package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-B9H7X85L.mjs} +5 -5
  289. package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dwl32-Uj.mjs} +2 -2
  290. package/dist/object-cache/memory.d.mts +14 -0
  291. package/dist/object-cache/memory.mjs +55 -0
  292. package/dist/object-cache-D51qOseS.mjs +419 -0
  293. package/dist/output-DhBe5_Pi.mjs +68 -0
  294. package/dist/page/index.d.mts +10 -3
  295. package/dist/page/index.mjs +2 -2
  296. package/dist/{parse-CneSgl7-.mjs → parse-i15EFSAE.mjs} +1 -1
  297. package/dist/{parser-DxfsARXL.mjs → parser-06LLLL4E.mjs} +151 -9
  298. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-DkWkXfDI.d.mts} +12 -4
  299. package/dist/plugin-utils.d.mts +8 -9
  300. package/dist/plugins/adapt-sandbox-entry.d.mts +8 -9
  301. package/dist/plugins/adapt-sandbox-entry.mjs +13 -2
  302. package/dist/{plugins-DzfqRREq.mjs → plugins-CPA2PtfY.mjs} +919 -66
  303. package/dist/{transport-LSdZVXHF.mjs → portable-text-BASHceim.mjs} +1 -134
  304. package/dist/portable-text-E79LyjGo.d.mts +45 -0
  305. package/dist/{preview-C-3YTX2U.mjs → preview-BjedZm8G.mjs} +4 -3
  306. package/dist/process-cache-CCDgti7j.mjs +106 -0
  307. package/dist/project-env-DKibmuP8.mjs +95 -0
  308. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-DC2JdWeO.d.mts} +1 -1
  309. package/dist/{public-url-B4xV4rGa.d.mts → public-url-DQJCnYi9.d.mts} +1 -1
  310. package/dist/publication-authorization-RKiHXKtq.mjs +985 -0
  311. package/dist/{query-CZ3TH_Uu.mjs → query-C2U5u5_p.mjs} +11 -6
  312. package/dist/{query-Ds0EnMFX.mjs → query-DEv5x6yB.mjs} +281 -76
  313. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-DglsAJSw.mjs} +2 -2
  314. package/dist/{redirect-CEACczxo.mjs → redirect-ubhEqQCQ.mjs} +2 -2
  315. package/dist/{redirects-ocRJmQHP.mjs → redirects-Bhpm8bRe.mjs} +35 -19
  316. package/dist/{redirects-DYj1yPxs.mjs → redirects-xs2yahLq.mjs} +47 -24
  317. package/dist/{registry-D7HACema.mjs → registry-BYYyb2tF.mjs} +148 -81
  318. package/dist/request-context.d.mts +2 -0
  319. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CFe1tW2M.mjs} +1 -1
  320. package/dist/review-payload-BysRWpxS.mjs +111 -0
  321. package/dist/{review-requests-BW2NxY-l.mjs → review-requests-CTWGnWUt.mjs} +1 -1
  322. package/dist/review-requests-D42VEP1l.mjs +142 -0
  323. package/dist/review-route-helpers-C31vO6SI.mjs +41 -0
  324. package/dist/runner-BgmttQmD.mjs +7444 -0
  325. package/dist/{runner-09sTqtv0.d.mts → runner-D6hzs8L9.d.mts} +1 -1
  326. package/dist/runtime.d.mts +9 -10
  327. package/dist/runtime.mjs +3 -3
  328. package/dist/schema-DUtnZxjZ.mjs +8 -0
  329. package/dist/{search-Gdrqj582.mjs → search-DUKgZUlm.mjs} +5 -3
  330. package/dist/{secrets-CeGpBFV2.mjs → secrets-ZV5rd8yV.mjs} +14 -11
  331. package/dist/{sections-BOjU13Y-.mjs → sections-DvFgsnda.mjs} +2 -2
  332. package/dist/seed/index.d.mts +2 -2
  333. package/dist/seed/index.mjs +21 -18
  334. package/dist/seo/index.d.mts +1 -1
  335. package/dist/seo/index.mjs +3 -12
  336. package/dist/{seo-5lJOtB5J.mjs → seo-BLszyJxd.mjs} +22 -4
  337. package/dist/{seo-CLj8lS7Q.mjs → seo-BU8MLCS9.mjs} +5 -2
  338. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-GnCuL1ML.mjs} +11 -3
  339. package/dist/{service-jGlhrICs.mjs → service-FL3fB0Rx.mjs} +2 -2
  340. package/dist/session-user-Ct6GBLvn.mjs +22 -0
  341. package/dist/{settings-CUXOxzsT.mjs → settings-BECcAIRH.mjs} +28 -55
  342. package/dist/{settings-DlBsT2VS.mjs → settings-EzADu-dd.mjs} +2 -2
  343. package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-Da0axZEE.mjs} +1 -1
  344. package/dist/{site-activity-DONFrMBJ.mjs → site-activity-h8smOlYI.mjs} +1 -1
  345. package/dist/{site-context-C8Az_P_I.mjs → site-context-B8T1kpUP.mjs} +337 -530
  346. package/dist/{site-url-DIMD68go.mjs → site-url-DJEid0ml.mjs} +1 -1
  347. package/dist/stable-hash-DshcXvRE.mjs +19 -0
  348. package/dist/status-NqWOSFAD.mjs +21 -0
  349. package/dist/storage/local.d.mts +1 -1
  350. package/dist/storage/local.mjs +1 -1
  351. package/dist/storage/s3.d.mts +1 -1
  352. package/dist/storage/s3.mjs +1 -1
  353. package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-BiM9NtgW.mjs} +36 -29
  354. package/dist/taxonomies-DSnY5nOa.mjs +443 -0
  355. package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-0k_vRVsD.mjs} +44 -9
  356. package/dist/transport-C46KHLMP.mjs +134 -0
  357. package/dist/types-A8fPOJnl.mjs +69 -0
  358. package/dist/types-BLQCz46p.d.mts +118 -0
  359. package/dist/{types-CwawBUTa.d.mts → types-B_FlxIIl.d.mts} +4 -1
  360. package/dist/{types-CSgR9nQB.mjs → types-ChxYDRvx.mjs} +1 -1
  361. package/dist/{types-GaCtZ1k9.d.mts → types-Cw0PeCT_.d.mts} +18 -0
  362. package/dist/types-DuQn1G7-.d.mts +2973 -0
  363. package/dist/{runtime-C4-2lSFg.d.mts → types-DwoUifGE.d.mts} +5668 -3000
  364. package/dist/{types-DRIKLmJI.d.mts → types-opjX_kz6.d.mts} +17 -2
  365. package/dist/ui/server-runtime.d.mts +13 -15
  366. package/dist/ui/server-runtime.mjs +24 -20
  367. package/dist/url-guoXQQcV.mjs +33 -0
  368. package/dist/{user-DTLoZs16.mjs → user-BH-n01y3.mjs} +2 -2
  369. package/dist/{utils-B8hBJ9Oz.mjs → utils-D1SrKGtP.mjs} +129 -7
  370. package/dist/{validate-DzjCdy6v.d.mts → validate-CbVFoJgc.d.mts} +65 -8
  371. package/dist/{validate-DWmPO6oj.mjs → validate-D1HL-oLR.mjs} +11 -6
  372. package/dist/version-C3iVRuaF.mjs +6 -0
  373. package/dist/{widgets-BpJ8EpPd.mjs → widgets-BZrLrNgS.mjs} +46 -43
  374. package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-C3PWcowq.mjs} +1 -1
  375. package/dist/{zod-generator-K91-g665.mjs → zod-generator-C7AsLpSB.mjs} +42 -14
  376. package/package.json +38 -8
  377. package/src/components/Block.astro +50 -0
  378. package/src/components/Comments.astro +143 -1
  379. package/src/components/DinewayHead.astro +19 -2
  380. package/src/components/DinewayImage.astro +66 -33
  381. package/src/components/DinewayMedia.astro +1 -2
  382. package/src/components/Image.astro +85 -40
  383. package/src/components/InlinePortableTextEditor.tsx +12 -2
  384. package/src/components/JsonLdScript.astro +9 -0
  385. package/src/components/LiveSearch.astro +40 -4
  386. package/src/components/index.ts +4 -0
  387. package/src/components/live-search-routing.ts +30 -0
  388. package/src/components/portable-text-text-align.ts +15 -0
  389. package/src/ui.ts +2 -0
  390. package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
  391. package/dist/import-4YBXbDkI.mjs +0 -684
  392. package/dist/index-CZiWCQDp.d.mts +0 -227
  393. package/dist/review-requests-Qum4713s.mjs +0 -79
  394. package/dist/runner-DzIpHGND.mjs +0 -2836
  395. package/dist/schema-Bsi-VpYv.mjs +0 -8
  396. package/dist/taxonomies-CZ-_DitR.mjs +0 -327
  397. package/dist/types-CuJOqHfM.d.mts +0 -758
  398. package/dist/types-DSPGWjxO.d.mts +0 -1247
  399. package/dist/types-nP9vGUFq.d.mts +0 -56
  400. package/dist/version-C4gfn0PJ.mjs +0 -6
  401. /package/dist/{adapters-OQCImOL7.d.mts → adapters-BiRymx02.d.mts} +0 -0
  402. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-Ypaly90d.mjs} +0 -0
  403. /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-D5pSY2S1.mjs} +0 -0
  404. /package/dist/{components--pg6zBvu.mjs → components-DImzlLhb.mjs} +0 -0
  405. /package/dist/{context-types-r8oFvyOq.mjs → context-types-eBuMDAg-.mjs} +0 -0
  406. /package/dist/{default-B6iaLvP7.mjs → default-D4Vygcy_.mjs} +0 -0
  407. /package/dist/{email-console-BOVqIYpB.mjs → email-console-Bp0r68iF.mjs} +0 -0
  408. /package/dist/{escape-BDgouFFY.mjs → escape-DN4Qmjsl.mjs} +0 -0
  409. /package/dist/{hash-BPmX6P8I.mjs → hash-mxxx2oPW.mjs} +0 -0
  410. /package/dist/{mime-CbKsKDCB.mjs → mime-C0vOHFm7.mjs} +0 -0
  411. /package/dist/{mode-CZqCF9dZ.mjs → mode-C8yZnIlR.mjs} +0 -0
  412. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CndT35iw.mjs} +0 -0
  413. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-CMehAaKs.mjs} +0 -0
  414. /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
  415. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-NYukYGed.mjs} +0 -0
  416. /package/dist/{patterns-DKAX6oqN.mjs → patterns-CoqlXUvk.mjs} +0 -0
  417. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-BtfrrzfD.mjs} +0 -0
  418. /package/dist/{public-url-B_m9IwdV.mjs → public-url-Cp6hyjVR.mjs} +0 -0
  419. /package/dist/{redirect-BjIBtDWY.mjs → redirect-DrbEmU9a.mjs} +0 -0
  420. /package/dist/{request-cache-ho99schz.mjs → request-cache-CBFjCwSt.mjs} +0 -0
  421. /package/dist/{resolve-DTuDyYKs.mjs → resolve-DE71WcL9.mjs} +0 -0
  422. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-BtkKnvxQ.mjs} +0 -0
  423. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-Ctzfyyp-.mjs} +0 -0
  424. /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
  425. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-FJqwQzj4.mjs} +0 -0
  426. /package/dist/{tokens-SLmgowfd.mjs → tokens-BDQU29Vd.mjs} +0 -0
  427. /package/dist/{transaction-CFLhEOuH.mjs → transaction-0LEAAy8R.mjs} +0 -0
  428. /package/dist/{transport-BnsNxh2l.d.mts → transport-D9pKAzFP.d.mts} +0 -0
  429. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-Dm7Mxvt6.mjs} +0 -0
  430. /package/dist/{types-CJ8DkL0q.mjs → types-B7TDDFMG.mjs} +0 -0
  431. /package/dist/{types-Dryvv7LH.d.mts → types-g0zMtraY.d.mts} +0 -0
  432. /package/dist/{types-Cg276-3z.mjs → types-mVVgRPaU.mjs} +0 -0
  433. /package/dist/{types-DZpT-PnG.d.mts → types-wFu80FrO.d.mts} +0 -0
  434. /package/dist/{url-w7Mp5qAD.mjs → url-EMAguGVk.mjs} +0 -0
@@ -0,0 +1,558 @@
1
+ import { o as HitlRequestRepository } from "./publication-authorization-RKiHXKtq.mjs";
2
+ import { b as HitlRequestService } from "./site-context-B8T1kpUP.mjs";
3
+ import { n as stableStringify } from "./stable-hash-DshcXvRE.mjs";
4
+ import { n as buildStableActionHash } from "./review-payload-BysRWpxS.mjs";
5
+ import { i as hasScope } from "./api-tokens-Ypaly90d.mjs";
6
+ import { m as logSiteActivityStrict, p as logSiteActivitySafely } from "./activity-events-CJDvE2uc.mjs";
7
+ import { ulid } from "ulidx";
8
+ import { hasPermission } from "@dineway-ai/auth";
9
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
11
+
12
+ //#region src/plugins/mcp.ts
13
+ function createPluginMcpRegistry(plugins) {
14
+ const tools = [];
15
+ const resources = [];
16
+ const toolOwners = /* @__PURE__ */ new Map();
17
+ const resourceOwners = /* @__PURE__ */ new Map();
18
+ const resourceUriOwners = /* @__PURE__ */ new Map();
19
+ for (const plugin of plugins) {
20
+ for (const tool of plugin.mcp.tools) {
21
+ assertUniqueContribution("tool", tool.name, plugin.id, toolOwners);
22
+ tools.push({
23
+ pluginId: plugin.id,
24
+ pluginVersion: plugin.version,
25
+ tool,
26
+ authorizeTarget: plugin.mcp.authorizeTarget
27
+ });
28
+ }
29
+ for (const resource of plugin.mcp.resources) {
30
+ assertUniqueContribution("resource", resource.name, plugin.id, resourceOwners);
31
+ assertUniqueContribution("resource URI", resource.uri, plugin.id, resourceUriOwners);
32
+ resources.push({
33
+ pluginId: plugin.id,
34
+ pluginVersion: plugin.version,
35
+ resource,
36
+ authorizeTarget: plugin.mcp.authorizeTarget
37
+ });
38
+ }
39
+ }
40
+ return {
41
+ tools,
42
+ resources
43
+ };
44
+ }
45
+ function createActivePluginMcpRegistry(configuredPlugins, enabledPluginIds) {
46
+ return createPluginMcpRegistry(configuredPlugins.filter((plugin) => enabledPluginIds.has(plugin.id)));
47
+ }
48
+ function registerPluginMcpRegistry(server, registry, options) {
49
+ for (const contribution of registry.tools) {
50
+ const { tool } = contribution;
51
+ server.registerTool(tool.name, {
52
+ title: tool.title,
53
+ description: tool.description,
54
+ inputSchema: tool.inputSchema,
55
+ outputSchema: tool.kind === "query" ? tool.outputSchema : void 0,
56
+ annotations: {
57
+ readOnlyHint: tool.kind === "query",
58
+ destructiveHint: tool.kind === "command" && tool.reversibility === "irreversible",
59
+ idempotentHint: tool.kind === "query" || tool.kind === "command"
60
+ }
61
+ }, async (input, requestExtra) => {
62
+ if (!isRecord$1(input)) throw new McpError(ErrorCode.InvalidParams, "Plugin MCP tool input must be an object");
63
+ const context = options.resolveContext({
64
+ id: contribution.pluginId,
65
+ version: contribution.pluginVersion
66
+ }, requestExtra);
67
+ const target = tool.resolveTarget ? await tool.resolveTarget(input, context) : void 0;
68
+ await authorizeContribution(tool.authorization, target, context, contribution.authorizeTarget, options);
69
+ if (tool.pii.output === "sensitive") await authorizeSensitiveOutput({
70
+ contributionType: "tool",
71
+ name: tool.name,
72
+ target,
73
+ context
74
+ }, options);
75
+ const output = tool.kind === "query" ? await tool.handler(input, context) : await executeCommand(contribution, input, context, target, requestExtra, options);
76
+ const content = [{
77
+ type: "text",
78
+ text: JSON.stringify(output, null, 2)
79
+ }];
80
+ return tool.kind === "query" && tool.outputSchema ? {
81
+ content,
82
+ structuredContent: output
83
+ } : { content };
84
+ });
85
+ }
86
+ for (const contribution of registry.resources) {
87
+ const { resource } = contribution;
88
+ server.registerResource(resource.name, resource.uri, {
89
+ title: resource.title,
90
+ description: resource.description,
91
+ mimeType: resource.mimeType
92
+ }, async (uri, requestExtra) => {
93
+ const context = options.resolveContext({
94
+ id: contribution.pluginId,
95
+ version: contribution.pluginVersion
96
+ }, requestExtra);
97
+ await authorizeContribution(resource.authorization, resource.target, context, contribution.authorizeTarget, options);
98
+ if (resource.pii.output === "sensitive") await authorizeSensitiveOutput({
99
+ contributionType: "resource",
100
+ name: resource.name,
101
+ target: resource.target,
102
+ context
103
+ }, options);
104
+ const result = await resource.handler(uri, context);
105
+ return { contents: [{
106
+ uri: uri.href,
107
+ mimeType: result.mimeType ?? resource.mimeType,
108
+ text: result.text
109
+ }] };
110
+ });
111
+ }
112
+ }
113
+ function isRecord$1(value) {
114
+ return typeof value === "object" && value !== null && !Array.isArray(value);
115
+ }
116
+ function assertUniqueContribution(kind, name, pluginId, owners) {
117
+ const existingOwner = owners.get(name);
118
+ if (existingOwner) throw new Error(`Duplicate plugin MCP ${kind} "${name}" contributed by "${existingOwner}" and "${pluginId}".`);
119
+ owners.set(name, pluginId);
120
+ }
121
+ async function authorizeContribution(authorization, target, context, pluginAuthorizer, options) {
122
+ if (!hasPermission({ role: context.actor.role }, authorization.permission)) throw new McpError(ErrorCode.InvalidRequest, "Insufficient permissions for this operation");
123
+ const tokenScopes = context.actor.tokenScopes;
124
+ if (tokenScopes && !authorization.anyOfTokenScopes.some((scope) => hasScope([...tokenScopes], scope))) throw new McpError(ErrorCode.InvalidRequest, `Insufficient scope: requires one of ${authorization.anyOfTokenScopes.join(", ")}`);
125
+ if (authorization.restaurantPermission) {
126
+ if (!target || !pluginAuthorizer && !options.authorizeTarget) throw new McpError(ErrorCode.InvalidRequest, "Restaurant target authorization is not configured for this MCP contribution");
127
+ const request = {
128
+ restaurantPermission: authorization.restaurantPermission,
129
+ target,
130
+ context
131
+ };
132
+ try {
133
+ await pluginAuthorizer?.(request);
134
+ await options.authorizeTarget?.(request);
135
+ } catch {
136
+ throw new McpError(ErrorCode.InvalidRequest, "Restaurant target authorization denied for this operation");
137
+ }
138
+ }
139
+ }
140
+ async function authorizeSensitiveOutput(request, options) {
141
+ if (!options.authorizeSensitiveOutput) throw new McpError(ErrorCode.InvalidRequest, "Sensitive plugin MCP output requires an explicit core authorization policy");
142
+ await options.authorizeSensitiveOutput(request);
143
+ }
144
+ async function executeCommand(contribution, input, context, target, requestExtra, options) {
145
+ if (contribution.tool.kind !== "command") throw new Error(`MCP contribution "${contribution.tool.name}" is not a command.`);
146
+ if (!options.executeCommand) throw new McpError(ErrorCode.InvalidRequest, "Plugin MCP command execution requires the core reviewed execution boundary");
147
+ return options.executeCommand({
148
+ ...contribution,
149
+ tool: contribution.tool
150
+ }, input, context, {
151
+ target,
152
+ review: parseReviewMetadata(requestExtra)
153
+ });
154
+ }
155
+ function parseReviewMetadata(requestExtra) {
156
+ if (!isRecord$1(requestExtra) || !isRecord$1(requestExtra._meta)) return {};
157
+ const value = requestExtra._meta["dineway/review"];
158
+ if (value === void 0) return {};
159
+ if (!isRecord$1(value)) throw new McpError(ErrorCode.InvalidParams, "MCP metadata \"dineway/review\" must be an object");
160
+ return {
161
+ hitlRequestId: optionalNonEmptyString(value.hitl_request_id, "hitl_request_id"),
162
+ quickActionHash: optionalNonEmptyString(value.quick_action_hash, "quick_action_hash")
163
+ };
164
+ }
165
+ function optionalNonEmptyString(value, name) {
166
+ if (value === void 0) return void 0;
167
+ if (typeof value !== "string" || value.trim().length === 0) throw new McpError(ErrorCode.InvalidParams, `MCP review metadata ${name} must be a string`);
168
+ return value;
169
+ }
170
+
171
+ //#endregion
172
+ //#region src/database/repositories/hitl-executions.ts
173
+ var HitlExecutionRepository = class {
174
+ constructor(db) {
175
+ this.db = db;
176
+ }
177
+ async claim(input) {
178
+ const id = ulid();
179
+ const now = input.createdAt ?? (/* @__PURE__ */ new Date()).toISOString();
180
+ await this.db.insertInto("_dineway_hitl_executions").values(toInsertableExecution(id, input, now)).onConflict((conflict) => conflict.doNothing()).execute();
181
+ const inserted = await this.findById(id);
182
+ if (inserted) return {
183
+ claimed: true,
184
+ execution: inserted
185
+ };
186
+ const conflicts = await this.findConflicts(input);
187
+ const existing = conflicts[0];
188
+ if (conflicts.length !== 1 || !existing || !matchesClaim(existing, input)) throw new Error("HITL execution claim conflicts with a different reviewed action.");
189
+ return {
190
+ claimed: false,
191
+ execution: existing
192
+ };
193
+ }
194
+ async findById(id) {
195
+ const row = await this.db.selectFrom("_dineway_hitl_executions").selectAll().where("id", "=", id).executeTakeFirst();
196
+ return row ? rowToExecution(row) : null;
197
+ }
198
+ async markSucceeded(id, result, completedAt = (/* @__PURE__ */ new Date()).toISOString()) {
199
+ return this.complete(id, "succeeded", result, null, completedAt);
200
+ }
201
+ async markFailed(id, errorCode, completedAt = (/* @__PURE__ */ new Date()).toISOString()) {
202
+ return this.complete(id, "failed", null, errorCode, completedAt);
203
+ }
204
+ async markIndeterminate(id, errorCode, completedAt = (/* @__PURE__ */ new Date()).toISOString()) {
205
+ return this.complete(id, "indeterminate", null, errorCode, completedAt);
206
+ }
207
+ async complete(id, status, result, errorCode, completedAt) {
208
+ const update = await this.db.updateTable("_dineway_hitl_executions").set({
209
+ status,
210
+ result_json: result ? JSON.stringify(result) : null,
211
+ error_code: errorCode,
212
+ updated_at: completedAt,
213
+ completed_at: completedAt
214
+ }).where("id", "=", id).where("status", "=", "claimed").executeTakeFirst();
215
+ if (Number(update.numUpdatedRows ?? 0) === 0) return null;
216
+ return this.findById(id);
217
+ }
218
+ async findConflicts(input) {
219
+ return (await this.db.selectFrom("_dineway_hitl_executions").selectAll().where((eb) => eb.or([
220
+ eb("action_hash", "=", input.actionHash),
221
+ eb("idempotency_key", "=", input.idempotencyKey),
222
+ ...input.hitlRequestId ? [eb("hitl_request_id", "=", input.hitlRequestId)] : []
223
+ ])).execute()).map(rowToExecution);
224
+ }
225
+ };
226
+ function toInsertableExecution(id, input, now) {
227
+ return {
228
+ id,
229
+ hitl_request_id: input.hitlRequestId ?? null,
230
+ plugin_id: input.pluginId,
231
+ tool_name: input.toolName,
232
+ review_mode: input.reviewMode,
233
+ action_hash: input.actionHash,
234
+ idempotency_key: input.idempotencyKey,
235
+ status: "claimed",
236
+ actor_type: input.actorType,
237
+ actor_id: input.actorId,
238
+ scope: input.scope,
239
+ target_ref_type: input.targetRefType,
240
+ target_ref_id: input.targetRefId,
241
+ result_json: null,
242
+ error_code: null,
243
+ created_at: now,
244
+ updated_at: now,
245
+ completed_at: null
246
+ };
247
+ }
248
+ function matchesClaim(execution, input) {
249
+ return execution.hitlRequestId === (input.hitlRequestId ?? null) && execution.pluginId === input.pluginId && execution.toolName === input.toolName && execution.reviewMode === input.reviewMode && execution.actionHash === input.actionHash && execution.idempotencyKey === input.idempotencyKey && execution.actorType === input.actorType && execution.actorId === input.actorId && execution.scope === input.scope && execution.targetRefType === input.targetRefType && execution.targetRefId === input.targetRefId;
250
+ }
251
+ function rowToExecution(row) {
252
+ return {
253
+ id: row.id,
254
+ hitlRequestId: row.hitl_request_id,
255
+ pluginId: row.plugin_id,
256
+ toolName: row.tool_name,
257
+ reviewMode: row.review_mode,
258
+ actionHash: row.action_hash,
259
+ idempotencyKey: row.idempotency_key,
260
+ status: row.status,
261
+ actorType: row.actor_type,
262
+ actorId: row.actor_id,
263
+ scope: row.scope,
264
+ targetRefType: row.target_ref_type,
265
+ targetRefId: row.target_ref_id,
266
+ result: parseNullableRecord(row.result_json),
267
+ errorCode: row.error_code,
268
+ createdAt: row.created_at,
269
+ updatedAt: row.updated_at,
270
+ completedAt: row.completed_at
271
+ };
272
+ }
273
+ function parseNullableRecord(value) {
274
+ if (!value) return null;
275
+ try {
276
+ const parsed = JSON.parse(value);
277
+ return isRecord(parsed) ? parsed : null;
278
+ } catch {
279
+ return null;
280
+ }
281
+ }
282
+ function isRecord(value) {
283
+ return typeof value === "object" && value !== null && !Array.isArray(value);
284
+ }
285
+
286
+ //#endregion
287
+ //#region src/plugins/mcp-reviewed-executor.ts
288
+ const REVIEW_METADATA_KEY = "dineway/review";
289
+ var PluginMcpIndeterminateError = class extends Error {
290
+ constructor(message, code = "PLUGIN_COMMAND_OUTCOME_INDETERMINATE") {
291
+ super(message);
292
+ this.code = code;
293
+ this.name = "PluginMcpIndeterminateError";
294
+ }
295
+ };
296
+ function createReviewedPluginMcpCommandExecutor() {
297
+ return async (command, input, context, request) => executeReviewedPluginMcpCommand(command, input, context, request);
298
+ }
299
+ async function executeReviewedPluginMcpCommand(command, input, context, request) {
300
+ const preview = await command.tool.preview(input, context);
301
+ validatePreview(preview, "Command preview");
302
+ if (request.target && stableStringify(request.target) !== stableStringify(preview.target)) throw invalidReview("Command preview target does not match the authorized target.");
303
+ const redactedPreview = command.tool.redactPreview ? await command.tool.redactPreview(preview, context) : preview;
304
+ validatePreview(redactedPreview, "Redacted command preview");
305
+ if (stableStringify(redactedPreview.target) !== stableStringify(preview.target)) throw invalidReview("Command preview redaction must not change the target.");
306
+ const fingerprint = await command.tool.actionFingerprint(input, preview, context);
307
+ const actionHash = await buildStableActionHash({
308
+ plugin: {
309
+ id: command.pluginId,
310
+ version: command.pluginVersion
311
+ },
312
+ tool: command.tool.name,
313
+ actor: {
314
+ type: context.actor.type,
315
+ id: context.actor.id
316
+ },
317
+ input,
318
+ target: preview.target,
319
+ preview,
320
+ fingerprint
321
+ });
322
+ const idempotencyKey = `${command.tool.idempotency.namespace ?? `${command.pluginId}:${command.tool.name}`}:${actionHash}`;
323
+ const reviewMode = command.tool.risk.level === "strong_confirmation" ? "strong" : "quick";
324
+ const scope = preview.target.scope;
325
+ let hitlRequestId = null;
326
+ if (reviewMode === "strong") {
327
+ const review = await resolveStrongReview({
328
+ command,
329
+ context,
330
+ request,
331
+ redactedPreview,
332
+ actionHash,
333
+ idempotencyKey,
334
+ scope
335
+ });
336
+ if (review.response) return review.response;
337
+ hitlRequestId = review.hitlRequestId;
338
+ } else if (request.review.quickActionHash !== actionHash) return {
339
+ status: "confirmation_required",
340
+ review_mode: "quick",
341
+ action_hash: actionHash,
342
+ preview: redactedPreview,
343
+ message: `Retry this tool with _meta["${REVIEW_METADATA_KEY}"].quick_action_hash set to the exact action_hash.`
344
+ };
345
+ const executions = new HitlExecutionRepository(context.db);
346
+ const claim = await executions.claim({
347
+ hitlRequestId,
348
+ pluginId: command.pluginId,
349
+ toolName: command.tool.name,
350
+ reviewMode,
351
+ actionHash,
352
+ idempotencyKey,
353
+ actorType: context.actor.type,
354
+ actorId: context.actor.id,
355
+ scope,
356
+ targetRefType: preview.target.type,
357
+ targetRefId: preview.target.id
358
+ });
359
+ if (!claim.claimed) return existingExecutionResponse(claim.execution);
360
+ const activityInput = {
361
+ actionType: `plugin.mcp.${command.tool.name}`,
362
+ subjectType: preview.target.type,
363
+ subjectId: preview.target.id,
364
+ relatedSubjectType: "plugin",
365
+ relatedSubjectId: command.pluginId,
366
+ sourceType: "mcp_tool",
367
+ sourceName: command.tool.name,
368
+ scope,
369
+ summary: redactedPreview.summary,
370
+ detail: {
371
+ executionId: claim.execution.id,
372
+ hitlRequestId,
373
+ actionHash,
374
+ reviewMode,
375
+ reversibility: command.tool.reversibility,
376
+ target: redactedPreview.target
377
+ }
378
+ };
379
+ const actorLocals = toActorLocals(context);
380
+ try {
381
+ if (command.tool.audit === "strict") await logSiteActivityStrict(context.db, actorLocals, {
382
+ ...activityInput,
383
+ resultStatus: "pending"
384
+ });
385
+ else await logSiteActivitySafely(context.db, actorLocals, {
386
+ ...activityInput,
387
+ resultStatus: "pending"
388
+ });
389
+ } catch {
390
+ await executions.markFailed(claim.execution.id, "STRICT_AUDIT_WRITE_FAILED");
391
+ throw invalidReview("The command was not executed because its required audit record failed.");
392
+ }
393
+ try {
394
+ const output = await command.tool.handler(input, {
395
+ ...context,
396
+ reviewedExecution: {
397
+ id: claim.execution.id,
398
+ hitlRequestId,
399
+ actionHash,
400
+ idempotencyKey
401
+ }
402
+ });
403
+ const storedResult = command.tool.pii.output === "sensitive" ? {
404
+ status: "succeeded",
405
+ result_omitted: true
406
+ } : output;
407
+ if (!await executions.markSucceeded(claim.execution.id, storedResult)) throw new PluginMcpIndeterminateError("The command completed but its execution result could not be persisted.", "EXECUTION_RESULT_PERSIST_FAILED");
408
+ await logSiteActivitySafely(context.db, actorLocals, {
409
+ ...activityInput,
410
+ resultStatus: "succeeded"
411
+ });
412
+ return output;
413
+ } catch (error) {
414
+ if (error instanceof PluginMcpIndeterminateError) {
415
+ await executions.markIndeterminate(claim.execution.id, error.code);
416
+ await logSiteActivitySafely(context.db, actorLocals, {
417
+ ...activityInput,
418
+ resultStatus: "blocked",
419
+ detail: {
420
+ ...activityInput.detail,
421
+ outcome: "indeterminate"
422
+ }
423
+ });
424
+ throw new McpError(ErrorCode.InternalError, "Command outcome is indeterminate; manual reconciliation is required.");
425
+ }
426
+ await executions.markFailed(claim.execution.id, "PLUGIN_COMMAND_FAILED");
427
+ await logSiteActivitySafely(context.db, actorLocals, {
428
+ ...activityInput,
429
+ resultStatus: "failed"
430
+ });
431
+ throw error;
432
+ }
433
+ }
434
+ async function resolveStrongReview(input) {
435
+ const repository = new HitlRequestRepository(input.context.db);
436
+ let request;
437
+ if (input.request.review.hitlRequestId) {
438
+ request = await repository.findById(input.request.review.hitlRequestId);
439
+ if (!request) throw invalidReview("The supplied HITL request does not exist.");
440
+ validateStrongReviewRequest(request, input);
441
+ } else {
442
+ request = await findMatchingReviewRequest(repository, input);
443
+ if (!request) request = await createReviewRequest(input);
444
+ return { response: approvalResponse(request, input.redactedPreview, input.actionHash) };
445
+ }
446
+ if (request.status === "pending") return { response: approvalResponse(request, input.redactedPreview, input.actionHash) };
447
+ if (request.status === "rejected") return { response: {
448
+ status: "approval_rejected",
449
+ review_mode: "strong",
450
+ hitl_request_id: request.id,
451
+ action_hash: input.actionHash
452
+ } };
453
+ if (request.resolvedByActorType !== "user" || !request.resolvedByActorId) throw invalidReview("Strong confirmation must be approved by an authenticated user.");
454
+ return { hitlRequestId: request.id };
455
+ }
456
+ async function findMatchingReviewRequest(repository, input) {
457
+ return (await repository.list({
458
+ scope: input.scope,
459
+ actionType: `plugin.mcp.${input.command.tool.name}`,
460
+ targetRefType: input.redactedPreview.target.type,
461
+ targetRefId: input.redactedPreview.target.id,
462
+ requestedByActorType: input.context.actor.type,
463
+ requestedByActorId: input.context.actor.id,
464
+ limit: 100
465
+ })).items.find((request) => request.metadata.actionHash === input.actionHash && request.metadata.idempotencyKey === input.idempotencyKey) ?? null;
466
+ }
467
+ async function createReviewRequest(input) {
468
+ return new HitlRequestService(input.context.db).create({
469
+ actorType: input.context.actor.type,
470
+ actorId: input.context.actor.id,
471
+ userRole: input.context.actor.role,
472
+ authMetadata: actorAuthMetadata(input.context)
473
+ }, {
474
+ scope: input.scope,
475
+ actionType: `plugin.mcp.${input.command.tool.name}`,
476
+ title: input.command.tool.title,
477
+ summary: input.redactedPreview.summary,
478
+ riskReason: input.command.tool.risk.reason,
479
+ reviewPayload: {
480
+ actionHash: input.actionHash,
481
+ idempotencyKey: input.idempotencyKey,
482
+ preview: input.redactedPreview
483
+ },
484
+ targetRefType: input.redactedPreview.target.type,
485
+ targetRefId: input.redactedPreview.target.id,
486
+ metadata: {
487
+ pluginId: input.command.pluginId,
488
+ toolName: input.command.tool.name,
489
+ actionHash: input.actionHash,
490
+ idempotencyKey: input.idempotencyKey,
491
+ reviewMode: "strong",
492
+ reversibility: input.command.tool.reversibility
493
+ },
494
+ priority: input.command.tool.reversibility === "irreversible" ? "high" : "normal"
495
+ });
496
+ }
497
+ function validateStrongReviewRequest(request, input) {
498
+ if (request.scope !== input.scope || request.actionType !== `plugin.mcp.${input.command.tool.name}` || request.targetRefType !== input.redactedPreview.target.type || request.targetRefId !== input.redactedPreview.target.id || request.requestedByActorType !== input.context.actor.type || request.requestedByActorId !== input.context.actor.id || request.metadata.pluginId !== input.command.pluginId || request.metadata.toolName !== input.command.tool.name || request.metadata.actionHash !== input.actionHash || request.metadata.idempotencyKey !== input.idempotencyKey || request.reviewPayload.actionHash !== input.actionHash || request.reviewPayload.idempotencyKey !== input.idempotencyKey) throw invalidReview("The supplied HITL approval is stale or belongs to another action.");
499
+ }
500
+ function approvalResponse(request, preview, actionHash) {
501
+ return {
502
+ status: "approval_required",
503
+ review_mode: "strong",
504
+ hitl_request_id: request.id,
505
+ hitl_status: request.status,
506
+ action_hash: actionHash,
507
+ preview,
508
+ message: `After human approval, retry this tool with _meta["${REVIEW_METADATA_KEY}"].hitl_request_id set to the HITL request id.`
509
+ };
510
+ }
511
+ function existingExecutionResponse(execution) {
512
+ if (execution.status === "succeeded") return execution.result ?? {
513
+ status: "succeeded",
514
+ result_omitted: true,
515
+ execution_id: execution.id
516
+ };
517
+ return {
518
+ status: execution.status === "claimed" ? "execution_in_progress" : execution.status === "indeterminate" ? "outcome_indeterminate" : "execution_failed",
519
+ execution_id: execution.id,
520
+ action_hash: execution.actionHash,
521
+ retry_allowed: false
522
+ };
523
+ }
524
+ function validatePreview(preview, label) {
525
+ if (!preview || typeof preview.summary !== "string" || preview.summary.trim().length === 0) throw invalidReview(`${label} requires a non-empty summary.`);
526
+ validateTarget(preview.target, label);
527
+ }
528
+ function validateTarget(target, label) {
529
+ if (!target || ![
530
+ "plugin",
531
+ "location",
532
+ "entity"
533
+ ].includes(target.type) || typeof target.id !== "string" || target.id.trim().length === 0 || typeof target.scope !== "string" || target.scope.trim().length === 0 || target.locationId !== void 0 && (typeof target.locationId !== "string" || target.locationId.trim().length === 0)) throw invalidReview(`${label} contains an invalid target.`);
534
+ }
535
+ function actorAuthMetadata(context) {
536
+ return {
537
+ auth_method: context.actor.authMethod,
538
+ user_id: context.actor.userId,
539
+ token_scopes: context.actor.tokenScopes ?? []
540
+ };
541
+ }
542
+ function toActorLocals(context) {
543
+ const authToken = context.actor.authMethod === "api_token" || context.actor.authMethod === "oauth_token" ? {
544
+ type: context.actor.authMethod,
545
+ id: context.actor.authMethod === "api_token" ? context.actor.id : null
546
+ } : void 0;
547
+ return {
548
+ user: context.actor.userId ? { id: context.actor.userId } : null,
549
+ tokenScopes: context.actor.tokenScopes ? [...context.actor.tokenScopes] : void 0,
550
+ authToken
551
+ };
552
+ }
553
+ function invalidReview(message) {
554
+ return new McpError(ErrorCode.InvalidRequest, message);
555
+ }
556
+
557
+ //#endregion
558
+ export { createActivePluginMcpRegistry as n, registerPluginMcpRegistry as r, createReviewedPluginMcpCommandExecutor as t };
@@ -0,0 +1,32 @@
1
+ //#region src/media/image-endpoint.d.ts
2
+ /**
3
+ * Portable helpers shared by image-endpoint modules.
4
+ *
5
+ * Dineway wraps Astro's image endpoint so source bytes for Dineway media can be
6
+ * read directly from the storage adapter instead of fetched over HTTP.
7
+ */
8
+ declare const ALLOWED_TRANSFORM_FORMATS: readonly ["webp", "avif", "jpeg", "png"];
9
+ declare const DEFAULT_TRANSFORM_FORMAT: ImageTransformFormat;
10
+ declare const MAX_TRANSFORM_DIMENSION = 4000;
11
+ declare const IMMUTABLE_IMAGE_CACHE = "public, max-age=31536000, immutable";
12
+ type ImageTransformFormat = (typeof ALLOWED_TRANSFORM_FORMATS)[number];
13
+ interface ImageTransformOptions {
14
+ width?: number;
15
+ height?: number;
16
+ format: ImageTransformFormat;
17
+ quality?: number;
18
+ }
19
+ declare function originalMediaHeaders(contentType: string): Record<string, string>;
20
+ declare function isSafeTransformKey(key: string): boolean;
21
+ declare function matchInternalMediaKey(href: string | null | undefined): string | null;
22
+ declare function isTransformFormat(value: string): value is ImageTransformFormat;
23
+ type ParsedTransformParams = {
24
+ ok: true;
25
+ options: ImageTransformOptions;
26
+ } | {
27
+ ok: false;
28
+ message: string;
29
+ };
30
+ declare function parseTransformParams(params: URLSearchParams): ParsedTransformParams;
31
+ //#endregion
32
+ export { ALLOWED_TRANSFORM_FORMATS, DEFAULT_TRANSFORM_FORMAT, IMMUTABLE_IMAGE_CACHE, ImageTransformFormat, ImageTransformOptions, MAX_TRANSFORM_DIMENSION, ParsedTransformParams, isSafeTransformKey, isTransformFormat, matchInternalMediaKey, originalMediaHeaders, parseTransformParams };