qarpeo 0.0.0-alpha.10

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 (599) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/dist/chunks/auth-schema.mjs +219 -0
  4. package/dist/chunks/wrangler.mjs +783 -0
  5. package/dist/cli/index.mjs +1085 -0
  6. package/dist/dev/env.d.ts +12 -0
  7. package/dist/dev/wrangler.d.ts +18 -0
  8. package/dist/module.d.ts +16 -0
  9. package/dist/module.mjs +4436 -0
  10. package/dist/runtime/ai.d.ts +25 -0
  11. package/dist/runtime/ai.mjs +106 -0
  12. package/dist/runtime/analytics.d.ts +24 -0
  13. package/dist/runtime/analytics.mjs +38 -0
  14. package/dist/runtime/app/components/BlobImage.vue +100 -0
  15. package/dist/runtime/app/components/CMSBlocks.vue +93 -0
  16. package/dist/runtime/app/components/CMSContent.vue +23 -0
  17. package/dist/runtime/app/components/CMSImage.vue +49 -0
  18. package/dist/runtime/app/components/CMSLocaleSwitcher.vue +110 -0
  19. package/dist/runtime/app/components/CMSPreviewBanner.vue +79 -0
  20. package/dist/runtime/app/components/CMSVersionBanner.vue +49 -0
  21. package/dist/runtime/app/components/CMSVersionSwitcher.vue +126 -0
  22. package/dist/runtime/app/components/ContentRenderer.vue +80 -0
  23. package/dist/runtime/app/components/FileUpload.vue +196 -0
  24. package/dist/runtime/app/components/ImpersonationBanner.vue +57 -0
  25. package/dist/runtime/app/components/SignedIn.vue +13 -0
  26. package/dist/runtime/app/components/SignedOut.vue +13 -0
  27. package/dist/runtime/app/components/shiki.css +34 -0
  28. package/dist/runtime/app/composables/analytics.d.ts +125 -0
  29. package/dist/runtime/app/composables/analytics.mjs +81 -0
  30. package/dist/runtime/app/composables/api-tokens.d.ts +49 -0
  31. package/dist/runtime/app/composables/api-tokens.mjs +61 -0
  32. package/dist/runtime/app/composables/auth.d.ts +50 -0
  33. package/dist/runtime/app/composables/auth.mjs +101 -0
  34. package/dist/runtime/app/composables/chat.d.ts +69 -0
  35. package/dist/runtime/app/composables/chat.mjs +159 -0
  36. package/dist/runtime/app/composables/cms-preview.d.ts +33 -0
  37. package/dist/runtime/app/composables/cms-preview.mjs +83 -0
  38. package/dist/runtime/app/composables/cms.d.ts +307 -0
  39. package/dist/runtime/app/composables/cms.mjs +355 -0
  40. package/dist/runtime/app/composables/docs-version.d.ts +35 -0
  41. package/dist/runtime/app/composables/docs-version.mjs +70 -0
  42. package/dist/runtime/app/composables/impersonation.d.ts +14 -0
  43. package/dist/runtime/app/composables/impersonation.mjs +44 -0
  44. package/dist/runtime/app/composables/notifications.d.ts +35 -0
  45. package/dist/runtime/app/composables/notifications.mjs +139 -0
  46. package/dist/runtime/app/composables/organization.d.ts +127 -0
  47. package/dist/runtime/app/composables/organization.mjs +138 -0
  48. package/dist/runtime/app/composables/passkey.d.ts +6 -0
  49. package/dist/runtime/app/composables/passkey.mjs +105 -0
  50. package/dist/runtime/app/composables/passwordless.d.ts +7 -0
  51. package/dist/runtime/app/composables/passwordless.mjs +67 -0
  52. package/dist/runtime/app/composables/payments.d.ts +43 -0
  53. package/dist/runtime/app/composables/payments.mjs +74 -0
  54. package/dist/runtime/app/composables/realtime.d.ts +96 -0
  55. package/dist/runtime/app/composables/realtime.mjs +432 -0
  56. package/dist/runtime/app/composables/site.d.ts +35 -0
  57. package/dist/runtime/app/composables/site.mjs +36 -0
  58. package/dist/runtime/app/composables/storage.d.ts +60 -0
  59. package/dist/runtime/app/composables/storage.mjs +294 -0
  60. package/dist/runtime/app/composables/tenant.d.ts +82 -0
  61. package/dist/runtime/app/composables/tenant.mjs +120 -0
  62. package/dist/runtime/app/composables/turnstile.d.ts +3 -0
  63. package/dist/runtime/app/composables/turnstile.mjs +10 -0
  64. package/dist/runtime/app/composables/two-factor.d.ts +12 -0
  65. package/dist/runtime/app/composables/two-factor.mjs +65 -0
  66. package/dist/runtime/app/middleware/auth.global.d.ts +2 -0
  67. package/dist/runtime/app/middleware/auth.global.mjs +44 -0
  68. package/dist/runtime/app/pages/cms.vue +2249 -0
  69. package/dist/runtime/app/pages/devtools/agents.vue +717 -0
  70. package/dist/runtime/app/pages/devtools/analytics.vue +618 -0
  71. package/dist/runtime/app/pages/devtools/auth.vue +351 -0
  72. package/dist/runtime/app/pages/devtools/blob.vue +745 -0
  73. package/dist/runtime/app/pages/devtools/db.vue +546 -0
  74. package/dist/runtime/app/pages/devtools/domains.vue +772 -0
  75. package/dist/runtime/app/pages/devtools/kv.vue +829 -0
  76. package/dist/runtime/app/pages/devtools/logs.vue +655 -0
  77. package/dist/runtime/app/pages/devtools/mail.vue +389 -0
  78. package/dist/runtime/app/pages/devtools/overview.vue +390 -0
  79. package/dist/runtime/app/pages/devtools/settings.vue +560 -0
  80. package/dist/runtime/app/pages/devtools.vue +165 -0
  81. package/dist/runtime/app/plugins/seo.d.ts +2 -0
  82. package/dist/runtime/app/plugins/seo.mjs +105 -0
  83. package/dist/runtime/app/plugins/shortcuts.client.d.ts +6 -0
  84. package/dist/runtime/app/plugins/shortcuts.client.mjs +19 -0
  85. package/dist/runtime/app/public/sw-notifications.mjs +52 -0
  86. package/dist/runtime/auth.d.ts +25 -0
  87. package/dist/runtime/auth.mjs +11 -0
  88. package/dist/runtime/bindings.d.ts +27 -0
  89. package/dist/runtime/bindings.mjs +38 -0
  90. package/dist/runtime/blob.d.ts +26 -0
  91. package/dist/runtime/blob.mjs +334 -0
  92. package/dist/runtime/bots.d.ts +1 -0
  93. package/dist/runtime/bots.mjs +1 -0
  94. package/dist/runtime/browser.d.ts +21 -0
  95. package/dist/runtime/browser.mjs +64 -0
  96. package/dist/runtime/cache.d.ts +19 -0
  97. package/dist/runtime/cache.mjs +12 -0
  98. package/dist/runtime/cms.d.ts +2 -0
  99. package/dist/runtime/cms.mjs +0 -0
  100. package/dist/runtime/db.d.ts +21 -0
  101. package/dist/runtime/db.mjs +36 -0
  102. package/dist/runtime/drizzle.d.ts +11 -0
  103. package/dist/runtime/drizzle.mjs +18 -0
  104. package/dist/runtime/email.d.ts +51 -0
  105. package/dist/runtime/email.mjs +245 -0
  106. package/dist/runtime/hyperdrive.d.ts +21 -0
  107. package/dist/runtime/hyperdrive.mjs +49 -0
  108. package/dist/runtime/index.d.ts +23 -0
  109. package/dist/runtime/index.mjs +23 -0
  110. package/dist/runtime/kv.d.ts +16 -0
  111. package/dist/runtime/kv.mjs +126 -0
  112. package/dist/runtime/payments.d.ts +2 -0
  113. package/dist/runtime/payments.mjs +0 -0
  114. package/dist/runtime/queue.d.ts +21 -0
  115. package/dist/runtime/queue.mjs +41 -0
  116. package/dist/runtime/rag.d.ts +1 -0
  117. package/dist/runtime/rag.mjs +1 -0
  118. package/dist/runtime/ratelimit.d.ts +21 -0
  119. package/dist/runtime/ratelimit.mjs +38 -0
  120. package/dist/runtime/realtime.d.ts +6 -0
  121. package/dist/runtime/realtime.mjs +13 -0
  122. package/dist/runtime/server/db/cms-schema.d.ts +651 -0
  123. package/dist/runtime/server/db/cms-schema.mjs +74 -0
  124. package/dist/runtime/server/durable-objects/agent.d.ts +14 -0
  125. package/dist/runtime/server/durable-objects/agent.mjs +571 -0
  126. package/dist/runtime/server/durable-objects/room.d.ts +34 -0
  127. package/dist/runtime/server/durable-objects/room.mjs +514 -0
  128. package/dist/runtime/server/middleware/auth.d.ts +2 -0
  129. package/dist/runtime/server/middleware/auth.mjs +108 -0
  130. package/dist/runtime/server/middleware/devtools.d.ts +2 -0
  131. package/dist/runtime/server/middleware/devtools.mjs +61 -0
  132. package/dist/runtime/server/middleware/ratelimit.d.ts +2 -0
  133. package/dist/runtime/server/middleware/ratelimit.mjs +49 -0
  134. package/dist/runtime/server/middleware/tenancy.d.ts +6 -0
  135. package/dist/runtime/server/middleware/tenancy.mjs +15 -0
  136. package/dist/runtime/server/middleware/tracker.d.ts +7 -0
  137. package/dist/runtime/server/middleware/tracker.mjs +9 -0
  138. package/dist/runtime/server/plugins/agents.d.ts +7 -0
  139. package/dist/runtime/server/plugins/agents.mjs +3 -0
  140. package/dist/runtime/server/plugins/cms.d.ts +7 -0
  141. package/dist/runtime/server/plugins/cms.mjs +16 -0
  142. package/dist/runtime/server/plugins/dev-logs.d.ts +1 -0
  143. package/dist/runtime/server/plugins/dev-logs.mjs +58 -0
  144. package/dist/runtime/server/plugins/dev-proxy.d.ts +3 -0
  145. package/dist/runtime/server/plugins/dev-proxy.mjs +21 -0
  146. package/dist/runtime/server/plugins/env.d.ts +6 -0
  147. package/dist/runtime/server/plugins/env.mjs +17 -0
  148. package/dist/runtime/server/plugins/queue.d.ts +6 -0
  149. package/dist/runtime/server/plugins/queue.mjs +8 -0
  150. package/dist/runtime/server/routes/__qarpeo/agents/chat.post.d.ts +20 -0
  151. package/dist/runtime/server/routes/__qarpeo/agents/chat.post.mjs +110 -0
  152. package/dist/runtime/server/routes/__qarpeo/agents/clear.post.d.ts +7 -0
  153. package/dist/runtime/server/routes/__qarpeo/agents/clear.post.mjs +15 -0
  154. package/dist/runtime/server/routes/__qarpeo/agents/create.post.d.ts +17 -0
  155. package/dist/runtime/server/routes/__qarpeo/agents/create.post.mjs +47 -0
  156. package/dist/runtime/server/routes/__qarpeo/agents/history.get.d.ts +15 -0
  157. package/dist/runtime/server/routes/__qarpeo/agents/history.get.mjs +24 -0
  158. package/dist/runtime/server/routes/__qarpeo/agents/list.get.d.ts +5 -0
  159. package/dist/runtime/server/routes/__qarpeo/agents/list.get.mjs +63 -0
  160. package/dist/runtime/server/routes/__qarpeo/analytics/events.get.d.ts +64 -0
  161. package/dist/runtime/server/routes/__qarpeo/analytics/events.get.mjs +55 -0
  162. package/dist/runtime/server/routes/__qarpeo/analytics/summary.get.d.ts +30 -0
  163. package/dist/runtime/server/routes/__qarpeo/analytics/summary.get.mjs +73 -0
  164. package/dist/runtime/server/routes/__qarpeo/auth/revoke-session.post.d.ts +6 -0
  165. package/dist/runtime/server/routes/__qarpeo/auth/revoke-session.post.mjs +26 -0
  166. package/dist/runtime/server/routes/__qarpeo/auth/sessions.get.d.ts +6 -0
  167. package/dist/runtime/server/routes/__qarpeo/auth/sessions.get.mjs +46 -0
  168. package/dist/runtime/server/routes/__qarpeo/auth/users.get.d.ts +7 -0
  169. package/dist/runtime/server/routes/__qarpeo/auth/users.get.mjs +65 -0
  170. package/dist/runtime/server/routes/__qarpeo/blob/files.get.d.ts +22 -0
  171. package/dist/runtime/server/routes/__qarpeo/blob/files.get.mjs +36 -0
  172. package/dist/runtime/server/routes/__qarpeo/db/query.post.d.ts +23 -0
  173. package/dist/runtime/server/routes/__qarpeo/db/query.post.mjs +34 -0
  174. package/dist/runtime/server/routes/__qarpeo/db/tables.get.d.ts +31 -0
  175. package/dist/runtime/server/routes/__qarpeo/db/tables.get.mjs +81 -0
  176. package/dist/runtime/server/routes/__qarpeo/kv/delete.post.d.ts +11 -0
  177. package/dist/runtime/server/routes/__qarpeo/kv/delete.post.mjs +18 -0
  178. package/dist/runtime/server/routes/__qarpeo/kv/get.get.d.ts +11 -0
  179. package/dist/runtime/server/routes/__qarpeo/kv/get.get.mjs +20 -0
  180. package/dist/runtime/server/routes/__qarpeo/kv/keys.get.d.ts +8 -0
  181. package/dist/runtime/server/routes/__qarpeo/kv/keys.get.mjs +27 -0
  182. package/dist/runtime/server/routes/__qarpeo/kv/set.post.d.ts +14 -0
  183. package/dist/runtime/server/routes/__qarpeo/kv/set.post.mjs +24 -0
  184. package/dist/runtime/server/routes/__qarpeo/logs.delete.d.ts +5 -0
  185. package/dist/runtime/server/routes/__qarpeo/logs.delete.mjs +6 -0
  186. package/dist/runtime/server/routes/__qarpeo/logs.get.d.ts +5 -0
  187. package/dist/runtime/server/routes/__qarpeo/logs.get.mjs +26 -0
  188. package/dist/runtime/server/routes/__qarpeo/logs.post.d.ts +6 -0
  189. package/dist/runtime/server/routes/__qarpeo/logs.post.mjs +17 -0
  190. package/dist/runtime/server/routes/__qarpeo/mail/bounce.post.d.ts +5 -0
  191. package/dist/runtime/server/routes/__qarpeo/mail/bounce.post.mjs +37 -0
  192. package/dist/runtime/server/routes/__qarpeo/mail/clear.post.d.ts +4 -0
  193. package/dist/runtime/server/routes/__qarpeo/mail/clear.post.mjs +6 -0
  194. package/dist/runtime/server/routes/__qarpeo/mail/inbox.get.d.ts +5 -0
  195. package/dist/runtime/server/routes/__qarpeo/mail/inbox.get.mjs +7 -0
  196. package/dist/runtime/server/routes/__qarpeo/mail/send-test.post.d.ts +4 -0
  197. package/dist/runtime/server/routes/__qarpeo/mail/send-test.post.mjs +29 -0
  198. package/dist/runtime/server/routes/__qarpeo/mail/track/click/[id].get.d.ts +2 -0
  199. package/dist/runtime/server/routes/__qarpeo/mail/track/click/[id].get.mjs +23 -0
  200. package/dist/runtime/server/routes/__qarpeo/mail/track/open/[id].get.d.ts +2 -0
  201. package/dist/runtime/server/routes/__qarpeo/mail/track/open/[id].get.mjs +31 -0
  202. package/dist/runtime/server/routes/__qarpeo/overview/health.get.d.ts +8 -0
  203. package/dist/runtime/server/routes/__qarpeo/overview/health.get.mjs +46 -0
  204. package/dist/runtime/server/routes/__qarpeo/overview.get.d.ts +32 -0
  205. package/dist/runtime/server/routes/__qarpeo/overview.get.mjs +38 -0
  206. package/dist/runtime/server/routes/__qarpeo/settings/reset-dev-data.post.d.ts +11 -0
  207. package/dist/runtime/server/routes/__qarpeo/settings/reset-dev-data.post.mjs +84 -0
  208. package/dist/runtime/server/routes/__qarpeo/settings.get.d.ts +124 -0
  209. package/dist/runtime/server/routes/__qarpeo/settings.get.mjs +145 -0
  210. package/dist/runtime/server/routes/__qarpeo/tenants/create.post.d.ts +7 -0
  211. package/dist/runtime/server/routes/__qarpeo/tenants/create.post.mjs +26 -0
  212. package/dist/runtime/server/routes/__qarpeo/tenants/domain-add.post.d.ts +6 -0
  213. package/dist/runtime/server/routes/__qarpeo/tenants/domain-add.post.mjs +29 -0
  214. package/dist/runtime/server/routes/__qarpeo/tenants/domain-delete.post.d.ts +7 -0
  215. package/dist/runtime/server/routes/__qarpeo/tenants/domain-delete.post.mjs +21 -0
  216. package/dist/runtime/server/routes/__qarpeo/tenants/domain-verify.post.d.ts +9 -0
  217. package/dist/runtime/server/routes/__qarpeo/tenants/domain-verify.post.mjs +21 -0
  218. package/dist/runtime/server/routes/__qarpeo/tenants/list.get.d.ts +15 -0
  219. package/dist/runtime/server/routes/__qarpeo/tenants/list.get.mjs +22 -0
  220. package/dist/runtime/server/routes/agents/[agent]/chat.post.d.ts +2 -0
  221. package/dist/runtime/server/routes/agents/[agent]/chat.post.mjs +35 -0
  222. package/dist/runtime/server/routes/agents/[agent]/clear.post.d.ts +4 -0
  223. package/dist/runtime/server/routes/agents/[agent]/clear.post.mjs +27 -0
  224. package/dist/runtime/server/routes/agents/[agent]/history.get.d.ts +4 -0
  225. package/dist/runtime/server/routes/agents/[agent]/history.get.mjs +27 -0
  226. package/dist/runtime/server/routes/analytics/events.get.d.ts +3 -0
  227. package/dist/runtime/server/routes/analytics/events.get.mjs +17 -0
  228. package/dist/runtime/server/routes/analytics/pageviews.get.d.ts +3 -0
  229. package/dist/runtime/server/routes/analytics/pageviews.get.mjs +15 -0
  230. package/dist/runtime/server/routes/analytics/summary.get.d.ts +6 -0
  231. package/dist/runtime/server/routes/analytics/summary.get.mjs +15 -0
  232. package/dist/runtime/server/routes/atom.xml.get.d.ts +2 -0
  233. package/dist/runtime/server/routes/atom.xml.get.mjs +76 -0
  234. package/dist/runtime/server/routes/auth/2fa/disable.post.d.ts +4 -0
  235. package/dist/runtime/server/routes/auth/2fa/disable.post.mjs +44 -0
  236. package/dist/runtime/server/routes/auth/2fa/setup.post.d.ts +6 -0
  237. package/dist/runtime/server/routes/auth/2fa/setup.post.mjs +32 -0
  238. package/dist/runtime/server/routes/auth/2fa/verify.post.d.ts +6 -0
  239. package/dist/runtime/server/routes/auth/2fa/verify.post.mjs +92 -0
  240. package/dist/runtime/server/routes/auth/[provider]/callback.d.ts +1 -0
  241. package/dist/runtime/server/routes/auth/[provider]/callback.mjs +1 -0
  242. package/dist/runtime/server/routes/auth/[provider].d.ts +3 -0
  243. package/dist/runtime/server/routes/auth/[provider].mjs +95 -0
  244. package/dist/runtime/server/routes/auth/account.delete.d.ts +5 -0
  245. package/dist/runtime/server/routes/auth/account.delete.mjs +52 -0
  246. package/dist/runtime/server/routes/auth/impersonate/start.post.d.ts +5 -0
  247. package/dist/runtime/server/routes/auth/impersonate/start.post.mjs +14 -0
  248. package/dist/runtime/server/routes/auth/impersonate/stop.post.d.ts +5 -0
  249. package/dist/runtime/server/routes/auth/impersonate/stop.post.mjs +5 -0
  250. package/dist/runtime/server/routes/auth/logout-all.post.d.ts +4 -0
  251. package/dist/runtime/server/routes/auth/logout-all.post.mjs +16 -0
  252. package/dist/runtime/server/routes/auth/logout-others.post.d.ts +4 -0
  253. package/dist/runtime/server/routes/auth/logout-others.post.mjs +11 -0
  254. package/dist/runtime/server/routes/auth/logout.post.d.ts +4 -0
  255. package/dist/runtime/server/routes/auth/logout.post.mjs +17 -0
  256. package/dist/runtime/server/routes/auth/magic-link/send.post.d.ts +10 -0
  257. package/dist/runtime/server/routes/auth/magic-link/send.post.mjs +29 -0
  258. package/dist/runtime/server/routes/auth/magic-link/verify.get.d.ts +2 -0
  259. package/dist/runtime/server/routes/auth/magic-link/verify.get.mjs +81 -0
  260. package/dist/runtime/server/routes/auth/organization/create.post.d.ts +5 -0
  261. package/dist/runtime/server/routes/auth/organization/create.post.mjs +10 -0
  262. package/dist/runtime/server/routes/auth/organization/invite.post.d.ts +9 -0
  263. package/dist/runtime/server/routes/auth/organization/invite.post.mjs +27 -0
  264. package/dist/runtime/server/routes/auth/organization/join.post.d.ts +6 -0
  265. package/dist/runtime/server/routes/auth/organization/join.post.mjs +15 -0
  266. package/dist/runtime/server/routes/auth/organization/list.get.d.ts +5 -0
  267. package/dist/runtime/server/routes/auth/organization/list.get.mjs +7 -0
  268. package/dist/runtime/server/routes/auth/organization/members/[id].delete.d.ts +4 -0
  269. package/dist/runtime/server/routes/auth/organization/members/[id].delete.mjs +33 -0
  270. package/dist/runtime/server/routes/auth/organization/members/index.get.d.ts +6 -0
  271. package/dist/runtime/server/routes/auth/organization/members/index.get.mjs +18 -0
  272. package/dist/runtime/server/routes/auth/organization/mfa.post.d.ts +6 -0
  273. package/dist/runtime/server/routes/auth/organization/mfa.post.mjs +33 -0
  274. package/dist/runtime/server/routes/auth/organization/sso/[id].delete.d.ts +4 -0
  275. package/dist/runtime/server/routes/auth/organization/sso/[id].delete.mjs +28 -0
  276. package/dist/runtime/server/routes/auth/organization/sso/index.get.d.ts +2 -0
  277. package/dist/runtime/server/routes/auth/organization/sso/index.get.mjs +23 -0
  278. package/dist/runtime/server/routes/auth/organization/sso/index.post.d.ts +5 -0
  279. package/dist/runtime/server/routes/auth/organization/sso/index.post.mjs +84 -0
  280. package/dist/runtime/server/routes/auth/organization/switch.post.d.ts +6 -0
  281. package/dist/runtime/server/routes/auth/organization/switch.post.mjs +14 -0
  282. package/dist/runtime/server/routes/auth/otp/send.post.d.ts +10 -0
  283. package/dist/runtime/server/routes/auth/otp/send.post.mjs +29 -0
  284. package/dist/runtime/server/routes/auth/otp/verify.post.d.ts +6 -0
  285. package/dist/runtime/server/routes/auth/otp/verify.post.mjs +95 -0
  286. package/dist/runtime/server/routes/auth/sessions/[id].delete.d.ts +5 -0
  287. package/dist/runtime/server/routes/auth/sessions/[id].delete.mjs +24 -0
  288. package/dist/runtime/server/routes/auth/sessions.get.d.ts +2 -0
  289. package/dist/runtime/server/routes/auth/sessions.get.mjs +11 -0
  290. package/dist/runtime/server/routes/auth/sso/login.get.d.ts +2 -0
  291. package/dist/runtime/server/routes/auth/sso/login.get.mjs +94 -0
  292. package/dist/runtime/server/routes/auth/sso/oidc/callback.get.d.ts +2 -0
  293. package/dist/runtime/server/routes/auth/sso/oidc/callback.get.mjs +113 -0
  294. package/dist/runtime/server/routes/auth/sso/saml/acs.post.d.ts +2 -0
  295. package/dist/runtime/server/routes/auth/sso/saml/acs.post.mjs +95 -0
  296. package/dist/runtime/server/routes/auth/tokens/[id].delete.d.ts +4 -0
  297. package/dist/runtime/server/routes/auth/tokens/[id].delete.mjs +13 -0
  298. package/dist/runtime/server/routes/auth/tokens/create.post.d.ts +9 -0
  299. package/dist/runtime/server/routes/auth/tokens/create.post.mjs +17 -0
  300. package/dist/runtime/server/routes/auth/tokens/index.get.d.ts +9 -0
  301. package/dist/runtime/server/routes/auth/tokens/index.get.mjs +5 -0
  302. package/dist/runtime/server/routes/auth/turnstile/verify.post.d.ts +2 -0
  303. package/dist/runtime/server/routes/auth/turnstile/verify.post.mjs +15 -0
  304. package/dist/runtime/server/routes/auth/user.get.d.ts +2 -0
  305. package/dist/runtime/server/routes/auth/user.get.mjs +6 -0
  306. package/dist/runtime/server/routes/auth/webauthn/login/options.post.d.ts +2 -0
  307. package/dist/runtime/server/routes/auth/webauthn/login/options.post.mjs +17 -0
  308. package/dist/runtime/server/routes/auth/webauthn/login/verify.post.d.ts +6 -0
  309. package/dist/runtime/server/routes/auth/webauthn/login/verify.post.mjs +127 -0
  310. package/dist/runtime/server/routes/auth/webauthn/register/options.post.d.ts +2 -0
  311. package/dist/runtime/server/routes/auth/webauthn/register/options.post.mjs +47 -0
  312. package/dist/runtime/server/routes/auth/webauthn/register/verify.post.d.ts +5 -0
  313. package/dist/runtime/server/routes/auth/webauthn/register/verify.post.mjs +88 -0
  314. package/dist/runtime/server/routes/cms/[collection]/[id]/preview-token.post.d.ts +8 -0
  315. package/dist/runtime/server/routes/cms/[collection]/[id]/preview-token.post.mjs +27 -0
  316. package/dist/runtime/server/routes/cms/[collection]/[id]/publish.post.d.ts +6 -0
  317. package/dist/runtime/server/routes/cms/[collection]/[id]/publish.post.mjs +19 -0
  318. package/dist/runtime/server/routes/cms/[collection]/[id]/review.post.d.ts +6 -0
  319. package/dist/runtime/server/routes/cms/[collection]/[id]/review.post.mjs +33 -0
  320. package/dist/runtime/server/routes/cms/[collection]/[id].delete.d.ts +4 -0
  321. package/dist/runtime/server/routes/cms/[collection]/[id].delete.mjs +17 -0
  322. package/dist/runtime/server/routes/cms/[collection]/[id].put.d.ts +4 -0
  323. package/dist/runtime/server/routes/cms/[collection]/[id].put.mjs +18 -0
  324. package/dist/runtime/server/routes/cms/[collection]/[slug].get.d.ts +4 -0
  325. package/dist/runtime/server/routes/cms/[collection]/[slug].get.mjs +19 -0
  326. package/dist/runtime/server/routes/cms/[collection]/atom.xml.get.d.ts +2 -0
  327. package/dist/runtime/server/routes/cms/[collection]/atom.xml.get.mjs +69 -0
  328. package/dist/runtime/server/routes/cms/[collection]/by-path.get.d.ts +8 -0
  329. package/dist/runtime/server/routes/cms/[collection]/by-path.get.mjs +23 -0
  330. package/dist/runtime/server/routes/cms/[collection]/feed.xml.get.d.ts +2 -0
  331. package/dist/runtime/server/routes/cms/[collection]/feed.xml.get.mjs +65 -0
  332. package/dist/runtime/server/routes/cms/[collection]/index.get.d.ts +7 -0
  333. package/dist/runtime/server/routes/cms/[collection]/index.get.mjs +15 -0
  334. package/dist/runtime/server/routes/cms/[collection]/index.post.d.ts +4 -0
  335. package/dist/runtime/server/routes/cms/[collection]/index.post.mjs +23 -0
  336. package/dist/runtime/server/routes/cms/[collection]/references.get.d.ts +19 -0
  337. package/dist/runtime/server/routes/cms/[collection]/references.get.mjs +47 -0
  338. package/dist/runtime/server/routes/cms/[collection]/surroundings.get.d.ts +10 -0
  339. package/dist/runtime/server/routes/cms/[collection]/surroundings.get.mjs +12 -0
  340. package/dist/runtime/server/routes/cms/collections/[id].delete.d.ts +4 -0
  341. package/dist/runtime/server/routes/cms/collections/[id].delete.mjs +10 -0
  342. package/dist/runtime/server/routes/cms/collections/[id].put.d.ts +4 -0
  343. package/dist/runtime/server/routes/cms/collections/[id].put.mjs +11 -0
  344. package/dist/runtime/server/routes/cms/collections/index.get.d.ts +4 -0
  345. package/dist/runtime/server/routes/cms/collections/index.get.mjs +6 -0
  346. package/dist/runtime/server/routes/cms/collections/index.post.d.ts +4 -0
  347. package/dist/runtime/server/routes/cms/collections/index.post.mjs +19 -0
  348. package/dist/runtime/server/routes/cms/components/index.get.d.ts +17 -0
  349. package/dist/runtime/server/routes/cms/components/index.get.mjs +16 -0
  350. package/dist/runtime/server/routes/cms/deploy.post.d.ts +4 -0
  351. package/dist/runtime/server/routes/cms/deploy.post.mjs +46 -0
  352. package/dist/runtime/server/routes/cms/export.post.d.ts +10 -0
  353. package/dist/runtime/server/routes/cms/export.post.mjs +55 -0
  354. package/dist/runtime/server/routes/cms/navigation.get.d.ts +8 -0
  355. package/dist/runtime/server/routes/cms/navigation.get.mjs +36 -0
  356. package/dist/runtime/server/routes/cms/preview/disable.get.d.ts +9 -0
  357. package/dist/runtime/server/routes/cms/preview/disable.get.mjs +9 -0
  358. package/dist/runtime/server/routes/cms/preview/enable.get.d.ts +14 -0
  359. package/dist/runtime/server/routes/cms/preview/enable.get.mjs +42 -0
  360. package/dist/runtime/server/routes/cms/publish-scheduled.post.d.ts +11 -0
  361. package/dist/runtime/server/routes/cms/publish-scheduled.post.mjs +35 -0
  362. package/dist/runtime/server/routes/cms/search.get.d.ts +13 -0
  363. package/dist/runtime/server/routes/cms/search.get.mjs +137 -0
  364. package/dist/runtime/server/routes/cms/sync.post.d.ts +7 -0
  365. package/dist/runtime/server/routes/cms/sync.post.mjs +18 -0
  366. package/dist/runtime/server/routes/cms/webhooks/[provider].post.d.ts +150 -0
  367. package/dist/runtime/server/routes/cms/webhooks/[provider].post.mjs +213 -0
  368. package/dist/runtime/server/routes/docs/search.get.d.ts +15 -0
  369. package/dist/runtime/server/routes/docs/search.get.mjs +20 -0
  370. package/dist/runtime/server/routes/feed.xml.get.d.ts +2 -0
  371. package/dist/runtime/server/routes/feed.xml.get.mjs +73 -0
  372. package/dist/runtime/server/routes/mail/bounce.post.d.ts +14 -0
  373. package/dist/runtime/server/routes/mail/bounce.post.mjs +56 -0
  374. package/dist/runtime/server/routes/mail/inbox/[id].get.d.ts +2 -0
  375. package/dist/runtime/server/routes/mail/inbox/[id].get.mjs +9 -0
  376. package/dist/runtime/server/routes/mail/inbox.get.d.ts +4 -0
  377. package/dist/runtime/server/routes/mail/inbox.get.mjs +7 -0
  378. package/dist/runtime/server/routes/mail/suppressions/[email].delete.d.ts +11 -0
  379. package/dist/runtime/server/routes/mail/suppressions/[email].delete.mjs +18 -0
  380. package/dist/runtime/server/routes/mail/suppressions/index.get.d.ts +12 -0
  381. package/dist/runtime/server/routes/mail/suppressions/index.get.mjs +23 -0
  382. package/dist/runtime/server/routes/mail/suppressions/index.post.d.ts +10 -0
  383. package/dist/runtime/server/routes/mail/suppressions/index.post.mjs +23 -0
  384. package/dist/runtime/server/routes/mail/unsubscribe.d.ts +13 -0
  385. package/dist/runtime/server/routes/mail/unsubscribe.mjs +91 -0
  386. package/dist/runtime/server/routes/mail/webhooks.post.d.ts +12 -0
  387. package/dist/runtime/server/routes/mail/webhooks.post.mjs +71 -0
  388. package/dist/runtime/server/routes/notifications/[id]/read.post.d.ts +4 -0
  389. package/dist/runtime/server/routes/notifications/[id]/read.post.mjs +13 -0
  390. package/dist/runtime/server/routes/notifications/[id].delete.d.ts +4 -0
  391. package/dist/runtime/server/routes/notifications/[id].delete.mjs +13 -0
  392. package/dist/runtime/server/routes/notifications/[id].get.d.ts +2 -0
  393. package/dist/runtime/server/routes/notifications/[id].get.mjs +15 -0
  394. package/dist/runtime/server/routes/notifications/index.get.d.ts +6 -0
  395. package/dist/runtime/server/routes/notifications/index.get.mjs +18 -0
  396. package/dist/runtime/server/routes/notifications/push/subscribe.post.d.ts +4 -0
  397. package/dist/runtime/server/routes/notifications/push/subscribe.post.mjs +20 -0
  398. package/dist/runtime/server/routes/notifications/push/unsubscribe.post.d.ts +4 -0
  399. package/dist/runtime/server/routes/notifications/push/unsubscribe.post.mjs +15 -0
  400. package/dist/runtime/server/routes/notifications/read-all.post.d.ts +4 -0
  401. package/dist/runtime/server/routes/notifications/read-all.post.mjs +11 -0
  402. package/dist/runtime/server/routes/payments/cancel.post.d.ts +7 -0
  403. package/dist/runtime/server/routes/payments/cancel.post.mjs +9 -0
  404. package/dist/runtime/server/routes/payments/change-plan.post.d.ts +7 -0
  405. package/dist/runtime/server/routes/payments/change-plan.post.mjs +12 -0
  406. package/dist/runtime/server/routes/payments/checkout.post.d.ts +9 -0
  407. package/dist/runtime/server/routes/payments/checkout.post.mjs +16 -0
  408. package/dist/runtime/server/routes/payments/pause.post.d.ts +7 -0
  409. package/dist/runtime/server/routes/payments/pause.post.mjs +9 -0
  410. package/dist/runtime/server/routes/payments/portal.post.d.ts +5 -0
  411. package/dist/runtime/server/routes/payments/portal.post.mjs +9 -0
  412. package/dist/runtime/server/routes/payments/subscription.get.d.ts +6 -0
  413. package/dist/runtime/server/routes/payments/subscription.get.mjs +9 -0
  414. package/dist/runtime/server/routes/payments/usage.get.d.ts +12 -0
  415. package/dist/runtime/server/routes/payments/usage.get.mjs +18 -0
  416. package/dist/runtime/server/routes/payments/usage.post.d.ts +6 -0
  417. package/dist/runtime/server/routes/payments/usage.post.mjs +24 -0
  418. package/dist/runtime/server/routes/payments/webhook.post.d.ts +14 -0
  419. package/dist/runtime/server/routes/payments/webhook.post.mjs +21 -0
  420. package/dist/runtime/server/routes/realtime/broadcast.post.d.ts +4 -0
  421. package/dist/runtime/server/routes/realtime/broadcast.post.mjs +26 -0
  422. package/dist/runtime/server/routes/realtime/history.delete.d.ts +13 -0
  423. package/dist/runtime/server/routes/realtime/history.delete.mjs +12 -0
  424. package/dist/runtime/server/routes/realtime/history.get.d.ts +16 -0
  425. package/dist/runtime/server/routes/realtime/history.get.mjs +15 -0
  426. package/dist/runtime/server/routes/realtime/presence.get.d.ts +6 -0
  427. package/dist/runtime/server/routes/realtime/presence.get.mjs +27 -0
  428. package/dist/runtime/server/routes/realtime/state.get.d.ts +5 -0
  429. package/dist/runtime/server/routes/realtime/state.get.mjs +26 -0
  430. package/dist/runtime/server/routes/realtime/state.post.d.ts +6 -0
  431. package/dist/runtime/server/routes/realtime/state.post.mjs +37 -0
  432. package/dist/runtime/server/routes/realtime/ws.get.d.ts +2 -0
  433. package/dist/runtime/server/routes/realtime/ws.get.mjs +73 -0
  434. package/dist/runtime/server/routes/robots.txt.get.d.ts +2 -0
  435. package/dist/runtime/server/routes/robots.txt.get.mjs +41 -0
  436. package/dist/runtime/server/routes/rss.xml.get.d.ts +2 -0
  437. package/dist/runtime/server/routes/rss.xml.get.mjs +2 -0
  438. package/dist/runtime/server/routes/sitemap.xml.get.d.ts +2 -0
  439. package/dist/runtime/server/routes/sitemap.xml.get.mjs +84 -0
  440. package/dist/runtime/server/routes/storage/file/[...key].delete.d.ts +4 -0
  441. package/dist/runtime/server/routes/storage/file/[...key].delete.mjs +23 -0
  442. package/dist/runtime/server/routes/storage/file/[...key].get.d.ts +2 -0
  443. package/dist/runtime/server/routes/storage/file/[...key].get.mjs +23 -0
  444. package/dist/runtime/server/routes/storage/files.get.d.ts +14 -0
  445. package/dist/runtime/server/routes/storage/files.get.mjs +11 -0
  446. package/dist/runtime/server/routes/storage/presigned.post.d.ts +8 -0
  447. package/dist/runtime/server/routes/storage/presigned.post.mjs +39 -0
  448. package/dist/runtime/server/routes/storage/sign.post.d.ts +6 -0
  449. package/dist/runtime/server/routes/storage/sign.post.mjs +24 -0
  450. package/dist/runtime/server/routes/storage/upload.post.d.ts +22 -0
  451. package/dist/runtime/server/routes/storage/upload.post.mjs +96 -0
  452. package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/index.delete.d.ts +8 -0
  453. package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/index.delete.mjs +39 -0
  454. package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/verify.post.d.ts +8 -0
  455. package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/verify.post.mjs +39 -0
  456. package/dist/runtime/server/routes/tenants/[tenant]/domains/index.get.d.ts +8 -0
  457. package/dist/runtime/server/routes/tenants/[tenant]/domains/index.get.mjs +20 -0
  458. package/dist/runtime/server/routes/tenants/[tenant]/domains/index.post.d.ts +8 -0
  459. package/dist/runtime/server/routes/tenants/[tenant]/domains/index.post.mjs +44 -0
  460. package/dist/runtime/server/routes/tenants/current.get.d.ts +8 -0
  461. package/dist/runtime/server/routes/tenants/current.get.mjs +6 -0
  462. package/dist/runtime/server/tasks/cms/publish.d.ts +4 -0
  463. package/dist/runtime/server/tasks/cms/publish.mjs +18 -0
  464. package/dist/runtime/server/utils/agent-store.d.ts +24 -0
  465. package/dist/runtime/server/utils/agent-store.mjs +53 -0
  466. package/dist/runtime/server/utils/agents-registry-fallback.d.ts +1 -0
  467. package/dist/runtime/server/utils/agents-registry-fallback.mjs +1 -0
  468. package/dist/runtime/server/utils/ai.d.ts +119 -0
  469. package/dist/runtime/server/utils/ai.mjs +607 -0
  470. package/dist/runtime/server/utils/analytics-query.d.ts +109 -0
  471. package/dist/runtime/server/utils/analytics-query.mjs +234 -0
  472. package/dist/runtime/server/utils/auth.d.ts +60 -0
  473. package/dist/runtime/server/utils/auth.mjs +361 -0
  474. package/dist/runtime/server/utils/blob-store.d.ts +13 -0
  475. package/dist/runtime/server/utils/blob-store.mjs +60 -0
  476. package/dist/runtime/server/utils/bots.d.ts +21 -0
  477. package/dist/runtime/server/utils/bots.mjs +491 -0
  478. package/dist/runtime/server/utils/cache.d.ts +33 -0
  479. package/dist/runtime/server/utils/cache.mjs +128 -0
  480. package/dist/runtime/server/utils/cms-events.d.ts +17 -0
  481. package/dist/runtime/server/utils/cms-events.mjs +80 -0
  482. package/dist/runtime/server/utils/cms-filter.d.ts +3 -0
  483. package/dist/runtime/server/utils/cms-filter.mjs +34 -0
  484. package/dist/runtime/server/utils/cms.d.ts +278 -0
  485. package/dist/runtime/server/utils/cms.mjs +3268 -0
  486. package/dist/runtime/server/utils/config.d.ts +27 -0
  487. package/dist/runtime/server/utils/config.mjs +38 -0
  488. package/dist/runtime/server/utils/context.d.ts +13 -0
  489. package/dist/runtime/server/utils/context.mjs +98 -0
  490. package/dist/runtime/server/utils/crypto.d.ts +16 -0
  491. package/dist/runtime/server/utils/crypto.mjs +56 -0
  492. package/dist/runtime/server/utils/dev-logs.d.ts +21 -0
  493. package/dist/runtime/server/utils/dev-logs.mjs +41 -0
  494. package/dist/runtime/server/utils/dev-proxy.d.ts +1 -0
  495. package/dist/runtime/server/utils/dev-proxy.mjs +69 -0
  496. package/dist/runtime/server/utils/domains.d.ts +46 -0
  497. package/dist/runtime/server/utils/domains.mjs +318 -0
  498. package/dist/runtime/server/utils/drizzle.d.ts +10 -0
  499. package/dist/runtime/server/utils/drizzle.mjs +36 -0
  500. package/dist/runtime/server/utils/email-templates.d.ts +44 -0
  501. package/dist/runtime/server/utils/email-templates.mjs +373 -0
  502. package/dist/runtime/server/utils/feed.d.ts +42 -0
  503. package/dist/runtime/server/utils/feed.mjs +161 -0
  504. package/dist/runtime/server/utils/impersonation.d.ts +67 -0
  505. package/dist/runtime/server/utils/impersonation.mjs +298 -0
  506. package/dist/runtime/server/utils/jobs.d.ts +70 -0
  507. package/dist/runtime/server/utils/jobs.mjs +125 -0
  508. package/dist/runtime/server/utils/kv-store.d.ts +9 -0
  509. package/dist/runtime/server/utils/kv-store.mjs +32 -0
  510. package/dist/runtime/server/utils/mail-suppression.d.ts +62 -0
  511. package/dist/runtime/server/utils/mail-suppression.mjs +328 -0
  512. package/dist/runtime/server/utils/mail.d.ts +90 -0
  513. package/dist/runtime/server/utils/mail.mjs +366 -0
  514. package/dist/runtime/server/utils/notifications.d.ts +51 -0
  515. package/dist/runtime/server/utils/notifications.mjs +215 -0
  516. package/dist/runtime/server/utils/organization.d.ts +54 -0
  517. package/dist/runtime/server/utils/organization.mjs +354 -0
  518. package/dist/runtime/server/utils/passwordless.d.ts +48 -0
  519. package/dist/runtime/server/utils/passwordless.mjs +179 -0
  520. package/dist/runtime/server/utils/payments.d.ts +121 -0
  521. package/dist/runtime/server/utils/payments.mjs +1067 -0
  522. package/dist/runtime/server/utils/queue-fallback.d.ts +2 -0
  523. package/dist/runtime/server/utils/queue-fallback.mjs +2 -0
  524. package/dist/runtime/server/utils/queue.d.ts +4 -0
  525. package/dist/runtime/server/utils/queue.mjs +3 -0
  526. package/dist/runtime/server/utils/rag.d.ts +25 -0
  527. package/dist/runtime/server/utils/rag.mjs +333 -0
  528. package/dist/runtime/server/utils/ratelimit.d.ts +45 -0
  529. package/dist/runtime/server/utils/ratelimit.mjs +182 -0
  530. package/dist/runtime/server/utils/realtime.d.ts +110 -0
  531. package/dist/runtime/server/utils/realtime.mjs +197 -0
  532. package/dist/runtime/server/utils/schema-fallback.d.ts +3 -0
  533. package/dist/runtime/server/utils/schema-fallback.mjs +2 -0
  534. package/dist/runtime/server/utils/session.d.ts +72 -0
  535. package/dist/runtime/server/utils/session.mjs +287 -0
  536. package/dist/runtime/server/utils/sso.d.ts +49 -0
  537. package/dist/runtime/server/utils/sso.mjs +131 -0
  538. package/dist/runtime/server/utils/storage.d.ts +111 -0
  539. package/dist/runtime/server/utils/storage.mjs +654 -0
  540. package/dist/runtime/server/utils/tenant.d.ts +44 -0
  541. package/dist/runtime/server/utils/tenant.mjs +285 -0
  542. package/dist/runtime/server/utils/totp.d.ts +33 -0
  543. package/dist/runtime/server/utils/totp.mjs +112 -0
  544. package/dist/runtime/server/utils/tracker.d.ts +72 -0
  545. package/dist/runtime/server/utils/tracker.mjs +139 -0
  546. package/dist/runtime/server/utils/turnstile.d.ts +17 -0
  547. package/dist/runtime/server/utils/turnstile.mjs +68 -0
  548. package/dist/runtime/server/utils/vapid.d.ts +35 -0
  549. package/dist/runtime/server/utils/vapid.mjs +211 -0
  550. package/dist/runtime/storage.d.ts +1 -0
  551. package/dist/runtime/storage.mjs +0 -0
  552. package/dist/runtime/types/ai.d.ts +68 -0
  553. package/dist/runtime/types/ai.mjs +0 -0
  554. package/dist/runtime/types/analytics.d.ts +30 -0
  555. package/dist/runtime/types/analytics.mjs +0 -0
  556. package/dist/runtime/types/auth-globals.d.ts +14 -0
  557. package/dist/runtime/types/auth.d.ts +153 -0
  558. package/dist/runtime/types/auth.mjs +0 -0
  559. package/dist/runtime/types/browser.d.ts +29 -0
  560. package/dist/runtime/types/browser.mjs +0 -0
  561. package/dist/runtime/types/d1.d.ts +44 -0
  562. package/dist/runtime/types/d1.mjs +0 -0
  563. package/dist/runtime/types/drizzle.d.ts +13 -0
  564. package/dist/runtime/types/drizzle.mjs +0 -0
  565. package/dist/runtime/types/durable-object.d.ts +51 -0
  566. package/dist/runtime/types/durable-object.mjs +0 -0
  567. package/dist/runtime/types/email.d.ts +66 -0
  568. package/dist/runtime/types/email.mjs +0 -0
  569. package/dist/runtime/types/hyperdrive.d.ts +18 -0
  570. package/dist/runtime/types/hyperdrive.mjs +0 -0
  571. package/dist/runtime/types/imports.d.ts +58 -0
  572. package/dist/runtime/types/index.d.ts +156 -0
  573. package/dist/runtime/types/index.mjs +13 -0
  574. package/dist/runtime/types/queue.d.ts +67 -0
  575. package/dist/runtime/types/queue.mjs +0 -0
  576. package/dist/runtime/types/r2.d.ts +108 -0
  577. package/dist/runtime/types/r2.mjs +0 -0
  578. package/dist/runtime/types/ratelimit.d.ts +21 -0
  579. package/dist/runtime/types/ratelimit.mjs +0 -0
  580. package/dist/runtime/types/vectorize.d.ts +74 -0
  581. package/dist/runtime/types/vectorize.mjs +0 -0
  582. package/dist/runtime/vectorize.d.ts +21 -0
  583. package/dist/runtime/vectorize.mjs +53 -0
  584. package/dist/types.d.ts +2750 -0
  585. package/dist/types.mjs +1 -0
  586. package/dist/utils/agents.d.ts +8 -0
  587. package/dist/utils/auth-schema.d.ts +11 -0
  588. package/dist/utils/bindings.d.ts +16 -0
  589. package/dist/utils/cms-schema.d.ts +1 -0
  590. package/dist/utils/cms-sources.d.ts +62 -0
  591. package/dist/utils/drizzle.d.ts +42 -0
  592. package/dist/utils/jobs.d.ts +8 -0
  593. package/dist/utils/local-db.d.ts +28 -0
  594. package/dist/utils/notifications-schema.d.ts +15 -0
  595. package/dist/utils/payments-schema.d.ts +11 -0
  596. package/dist/utils/pkg.d.ts +15 -0
  597. package/dist/utils/queue.d.ts +8 -0
  598. package/dist/utils/tenants-schema.d.ts +11 -0
  599. package/package.json +104 -0
@@ -0,0 +1,654 @@
1
+ import { createError, getRequestURL, getRequestHeader, getQuery } from "nuxt/server";
2
+ import { getR2Binding, parseByteSize } from "../../blob.mjs";
3
+ import { getDevMockBlobStore } from "./blob-store.mjs";
4
+ import { getQarpeoConfig, getSessionSecret } from "./config.mjs";
5
+ import { getAuthContext } from "./context.mjs";
6
+ export function getStorageConfig(event) {
7
+ const cfg = getQarpeoConfig(event);
8
+ return {
9
+ prefix: "/api/storage",
10
+ maxSize: "20MB",
11
+ allowedTypes: ["*"],
12
+ scope: "public",
13
+ defaultAccess: "public",
14
+ ...cfg.storage,
15
+ ...cfg.blob
16
+ };
17
+ }
18
+ export function parseDurationSeconds(duration) {
19
+ if (typeof duration === "number") return duration;
20
+ const match = duration.trim().match(/^(\d+(?:\.\d+)?)\s*(s|m|h|d|w)?$/i);
21
+ if (!match) return Number(duration) || 3600;
22
+ const num = parseFloat(match[1]);
23
+ const unit = (match[2] || "s").toLowerCase();
24
+ const multipliers = {
25
+ s: 1,
26
+ m: 60,
27
+ h: 3600,
28
+ d: 86400,
29
+ w: 604800
30
+ };
31
+ return Math.round(num * (multipliers[unit] || 1));
32
+ }
33
+ export async function resolveStorageScopePrefix(event, config) {
34
+ const scope = config.scope || "public";
35
+ if (scope === "org") {
36
+ const authCtx = await getAuthContext(event);
37
+ const orgId = authCtx?.organization?.id || authCtx?.session?.currentOrganizationId;
38
+ if (!orgId) {
39
+ throw createError({
40
+ statusCode: 403,
41
+ statusMessage: "Forbidden",
42
+ message: "Active organization required for organization-scoped storage"
43
+ });
44
+ }
45
+ return `org_${orgId}`;
46
+ }
47
+ if (scope === "user") {
48
+ const authCtx = await getAuthContext(event);
49
+ const userId = authCtx?.user?.id;
50
+ if (!userId) {
51
+ throw createError({
52
+ statusCode: 401,
53
+ statusMessage: "Unauthorized",
54
+ message: "Authentication required for user-scoped storage"
55
+ });
56
+ }
57
+ return `user_${userId}`;
58
+ }
59
+ return "public";
60
+ }
61
+ export function sanitizeFilename(filename) {
62
+ return filename.toLowerCase().replace(/[^\w.-]/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
63
+ }
64
+ export function validateStorageFile(file, config) {
65
+ const maxBytes = parseByteSize(config.maxSize || "20MB");
66
+ const fileSize = file.size ?? file.data.byteLength;
67
+ if (maxBytes > 0 && fileSize > maxBytes) {
68
+ throw createError({
69
+ statusCode: 413,
70
+ statusMessage: "Payload Too Large",
71
+ message: `File size (${fileSize} bytes) exceeds maximum allowed size of ${config.maxSize}`
72
+ });
73
+ }
74
+ const allowedTypes = config.allowedTypes || ["*"];
75
+ if (!allowedTypes.includes("*")) {
76
+ const fileType = (file.type || "application/octet-stream").toLowerCase();
77
+ const isAllowed = allowedTypes.some((pattern) => {
78
+ const lowerPattern = pattern.toLowerCase();
79
+ if (lowerPattern.endsWith("/*")) {
80
+ const prefix = lowerPattern.slice(0, -1);
81
+ return fileType.startsWith(prefix);
82
+ }
83
+ return fileType === lowerPattern;
84
+ });
85
+ if (!isAllowed) {
86
+ throw createError({
87
+ statusCode: 415,
88
+ statusMessage: "Unsupported Media Type",
89
+ message: `File type "${fileType}" is not allowed. Permitted types: ${allowedTypes.join(", ")}`
90
+ });
91
+ }
92
+ }
93
+ }
94
+ export async function uploadStorageFile(event, file, options = {}) {
95
+ const config = getStorageConfig(event);
96
+ validateStorageFile(file, config);
97
+ let key = options.key;
98
+ if (!key) {
99
+ const scopePrefix = await resolveStorageScopePrefix(event, config);
100
+ const rawName = file.filename || `file-${Date.now()}`;
101
+ const cleanName = sanitizeFilename(rawName);
102
+ const uniqueId = `${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;
103
+ key = `${scopePrefix}/${uniqueId}-${cleanName}`;
104
+ }
105
+ key = key.replace(/^\/+/, "");
106
+ const contentType = file.type || "application/octet-stream";
107
+ const access = options.access || config.defaultAccess || "public";
108
+ const metadata = {
109
+ ...options.customMetadata,
110
+ access
111
+ };
112
+ try {
113
+ const r2 = getR2Binding("BLOB", event);
114
+ const r2Object = await r2.put(key, file.data, {
115
+ httpMetadata: {
116
+ contentType
117
+ },
118
+ customMetadata: metadata
119
+ });
120
+ const url = buildStorageUrl(event, key);
121
+ return {
122
+ key,
123
+ pathname: key,
124
+ url,
125
+ size: r2Object.size,
126
+ type: contentType,
127
+ etag: r2Object.etag,
128
+ access,
129
+ customMetadata: metadata
130
+ };
131
+ } catch (err) {
132
+ console.error("[qarpeo:storage] R2 upload failed:", err?.message || err);
133
+ const procEnv = globalThis.process?.env || {};
134
+ const isDev = Boolean(import.meta.dev || procEnv.NODE_ENV !== "production");
135
+ if (!isDev) {
136
+ throw createError({
137
+ statusCode: 500,
138
+ statusMessage: "Internal Server Error",
139
+ message: `Failed to upload file to R2: ${err?.message || "Storage error"}`
140
+ });
141
+ }
142
+ const store = getDevMockBlobStore();
143
+ const rawData = file.data instanceof Uint8Array ? file.data : new Uint8Array(file.data);
144
+ const size = file.size ?? rawData.byteLength;
145
+ const uploaded = (/* @__PURE__ */ new Date()).toISOString();
146
+ const etag = `mock-${Date.now()}`;
147
+ store.set(key, {
148
+ key,
149
+ size,
150
+ contentType,
151
+ uploaded,
152
+ data: rawData,
153
+ access
154
+ });
155
+ const url = buildStorageUrl(event, key);
156
+ return {
157
+ key,
158
+ pathname: key,
159
+ url,
160
+ size,
161
+ type: contentType,
162
+ etag,
163
+ access,
164
+ customMetadata: metadata
165
+ };
166
+ }
167
+ }
168
+ export function buildStorageUrl(event, key, transform) {
169
+ const config = getStorageConfig(event);
170
+ const cleanKey = key.replace(/^\/+/, "");
171
+ let baseUrl = "";
172
+ if (config.cdnUrl) {
173
+ baseUrl = `${config.cdnUrl.replace(/\/$/, "")}/${cleanKey}`;
174
+ } else if (event) {
175
+ const reqUrl = getRequestURL(event);
176
+ const prefix = config.prefix || "/api/storage";
177
+ baseUrl = `${reqUrl.protocol}//${reqUrl.host}${prefix}/file/${cleanKey}`;
178
+ } else {
179
+ const prefix = config.prefix || "/api/storage";
180
+ baseUrl = `${prefix}/file/${cleanKey}`;
181
+ }
182
+ if (!transform) {
183
+ return baseUrl;
184
+ }
185
+ let appliedTransform = { ...transform };
186
+ if (transform.preset && config.images?.presets?.[transform.preset]) {
187
+ appliedTransform = {
188
+ ...config.images.presets[transform.preset],
189
+ ...transform
190
+ };
191
+ }
192
+ const cfOpts = [];
193
+ if (appliedTransform.width) cfOpts.push(`width=${appliedTransform.width}`);
194
+ if (appliedTransform.height) cfOpts.push(`height=${appliedTransform.height}`);
195
+ if (appliedTransform.quality) cfOpts.push(`quality=${appliedTransform.quality}`);
196
+ if (appliedTransform.format) cfOpts.push(`format=${appliedTransform.format}`);
197
+ if (appliedTransform.fit) cfOpts.push(`fit=${appliedTransform.fit}`);
198
+ if (cfOpts.length === 0) return baseUrl;
199
+ const useCfResizing = config.images?.resizing !== false;
200
+ if (useCfResizing) {
201
+ const cfParamStr = cfOpts.join(",");
202
+ try {
203
+ const parsed = new URL(baseUrl);
204
+ return `${parsed.origin}/cdn-cgi/image/${cfParamStr}${parsed.pathname}${parsed.search}`;
205
+ } catch {
206
+ const cleanPath = baseUrl.startsWith("/") ? baseUrl : `/${baseUrl}`;
207
+ return `/cdn-cgi/image/${cfParamStr}${cleanPath}`;
208
+ }
209
+ }
210
+ const params = new URLSearchParams();
211
+ if (appliedTransform.width) params.set("w", String(appliedTransform.width));
212
+ if (appliedTransform.height) params.set("h", String(appliedTransform.height));
213
+ if (appliedTransform.quality) params.set("q", String(appliedTransform.quality));
214
+ if (appliedTransform.format) params.set("f", appliedTransform.format);
215
+ if (appliedTransform.fit) params.set("fit", appliedTransform.fit);
216
+ const queryString = params.toString();
217
+ return queryString ? `${baseUrl}?${queryString}` : baseUrl;
218
+ }
219
+ export async function createPresignedUploadTicket(event, input) {
220
+ const config = getStorageConfig(event);
221
+ const scopePrefix = await resolveStorageScopePrefix(event, config);
222
+ const cleanName = sanitizeFilename(input.filename || "file");
223
+ const key = `${scopePrefix}/${Date.now()}-${crypto.randomUUID().slice(0, 8)}-${cleanName}`;
224
+ const access = input.access || config.defaultAccess || "public";
225
+ const durationSec = parseDurationSeconds(input.expiresIn || 900);
226
+ const expiresAt = Date.now() + durationSec * 1e3;
227
+ const secretKey = getSessionSecret(event);
228
+ const encoder = new TextEncoder();
229
+ const cryptoKey = await crypto.subtle.importKey(
230
+ "raw",
231
+ encoder.encode(secretKey),
232
+ { name: "HMAC", hash: "SHA-256" },
233
+ false,
234
+ ["sign"]
235
+ );
236
+ const payload = `${key}:${input.type}:${expiresAt}:${access}`;
237
+ const signatureBuffer = await crypto.subtle.sign("HMAC", cryptoKey, encoder.encode(payload));
238
+ const signatureHex = Array.from(new Uint8Array(signatureBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
239
+ const ticket = `${expiresAt}.${signatureHex}`;
240
+ const prefix = config.prefix || "/api/storage";
241
+ const uploadUrl = `${prefix}/upload?key=${encodeURIComponent(key)}&type=${encodeURIComponent(input.type)}&access=${access}&ticket=${ticket}`;
242
+ return {
243
+ key,
244
+ uploadUrl,
245
+ ticket,
246
+ expiresAt,
247
+ access
248
+ };
249
+ }
250
+ export async function verifyPresignedUploadTicket(event, key, type, ticket, access = "public") {
251
+ const [expiresAtStr, signatureHex] = ticket.split(".");
252
+ const expiresAt = Number(expiresAtStr);
253
+ if (!expiresAt || !signatureHex || Date.now() > expiresAt) {
254
+ throw createError({
255
+ statusCode: 403,
256
+ statusMessage: "Forbidden",
257
+ message: "Presigned upload ticket has expired or is invalid"
258
+ });
259
+ }
260
+ const secretKey = getSessionSecret(event);
261
+ const encoder = new TextEncoder();
262
+ const cryptoKey = await crypto.subtle.importKey(
263
+ "raw",
264
+ encoder.encode(secretKey),
265
+ { name: "HMAC", hash: "SHA-256" },
266
+ false,
267
+ ["verify"]
268
+ );
269
+ const payloadWithAccess = `${key}:${type}:${expiresAt}:${access}`;
270
+ const sigBytes = new Uint8Array(
271
+ signatureHex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || []
272
+ );
273
+ let isValid = await crypto.subtle.verify(
274
+ "HMAC",
275
+ cryptoKey,
276
+ sigBytes,
277
+ encoder.encode(payloadWithAccess)
278
+ );
279
+ if (!isValid) {
280
+ const legacyPayload = `${key}:${type}:${expiresAt}`;
281
+ isValid = await crypto.subtle.verify(
282
+ "HMAC",
283
+ cryptoKey,
284
+ sigBytes,
285
+ encoder.encode(legacyPayload)
286
+ );
287
+ }
288
+ if (!isValid) {
289
+ throw createError({
290
+ statusCode: 403,
291
+ statusMessage: "Forbidden",
292
+ message: "Invalid ticket signature"
293
+ });
294
+ }
295
+ return true;
296
+ }
297
+ export async function createSignedBlobToken(event, key, options) {
298
+ const cleanKey = key.replace(/^\/+/, "");
299
+ const durationSec = parseDurationSeconds(options?.expiresIn || 3600);
300
+ const expiresAt = Date.now() + durationSec * 1e3;
301
+ const isDownload = options?.download ? 1 : 0;
302
+ const secretKey = getSessionSecret(event);
303
+ const encoder = new TextEncoder();
304
+ const cryptoKey = await crypto.subtle.importKey(
305
+ "raw",
306
+ encoder.encode(secretKey),
307
+ { name: "HMAC", hash: "SHA-256" },
308
+ false,
309
+ ["sign"]
310
+ );
311
+ const payload = `${cleanKey}:${expiresAt}:${isDownload}`;
312
+ const signatureBuffer = await crypto.subtle.sign("HMAC", cryptoKey, encoder.encode(payload));
313
+ const signatureHex = Array.from(new Uint8Array(signatureBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
314
+ const token = `${expiresAt}.${isDownload}.${signatureHex}`;
315
+ const config = getStorageConfig(event);
316
+ const prefix = config.prefix || "/api/storage";
317
+ const downloadParam = isDownload ? "&download=1" : "";
318
+ const url = `${prefix}/file/${cleanKey}?token=${token}${downloadParam}`;
319
+ return { token, expiresAt, url };
320
+ }
321
+ export async function verifySignedBlobToken(event, key, token) {
322
+ const cleanKey = key.replace(/^\/+/, "");
323
+ const parts = token.split(".");
324
+ if (parts.length !== 3) {
325
+ throw createError({
326
+ statusCode: 403,
327
+ statusMessage: "Forbidden",
328
+ message: "Malformed signed file token"
329
+ });
330
+ }
331
+ const [expiresAtStr, downloadStr, signatureHex] = parts;
332
+ const expiresAt = Number(expiresAtStr);
333
+ const isDownload = downloadStr === "1";
334
+ if (!expiresAt || !signatureHex || Date.now() > expiresAt) {
335
+ throw createError({
336
+ statusCode: 403,
337
+ statusMessage: "Forbidden",
338
+ message: "Signed file URL has expired"
339
+ });
340
+ }
341
+ const secretKey = getSessionSecret(event);
342
+ const encoder = new TextEncoder();
343
+ const cryptoKey = await crypto.subtle.importKey(
344
+ "raw",
345
+ encoder.encode(secretKey),
346
+ { name: "HMAC", hash: "SHA-256" },
347
+ false,
348
+ ["verify"]
349
+ );
350
+ const payload = `${cleanKey}:${expiresAt}:${isDownload ? 1 : 0}`;
351
+ const sigBytes = new Uint8Array(
352
+ signatureHex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || []
353
+ );
354
+ const isValid = await crypto.subtle.verify(
355
+ "HMAC",
356
+ cryptoKey,
357
+ sigBytes,
358
+ encoder.encode(payload)
359
+ );
360
+ if (!isValid) {
361
+ throw createError({
362
+ statusCode: 403,
363
+ statusMessage: "Forbidden",
364
+ message: "Invalid signed file token signature"
365
+ });
366
+ }
367
+ return { valid: true, download: isDownload };
368
+ }
369
+ export async function getDownloadUrl(event, key, options) {
370
+ const res = await createSignedBlobToken(event, key, {
371
+ expiresIn: options?.expiresIn,
372
+ download: options?.download ?? true
373
+ });
374
+ if (options?.filename) {
375
+ return `${res.url}&filename=${encodeURIComponent(options.filename)}`;
376
+ }
377
+ return res.url;
378
+ }
379
+ export async function deleteStorageFile(event, key) {
380
+ const cleanKey = key.replace(/^\/+/, "");
381
+ try {
382
+ const r2 = getR2Binding("BLOB", event);
383
+ await r2.delete(cleanKey);
384
+ } catch (err) {
385
+ console.error("[qarpeo:storage] R2 delete failed:", err?.message || err);
386
+ const procEnv = globalThis.process?.env || {};
387
+ const isDev = Boolean(import.meta.dev || procEnv.NODE_ENV !== "production");
388
+ if (!isDev) {
389
+ throw createError({
390
+ statusCode: 500,
391
+ statusMessage: "Internal Server Error",
392
+ message: `Failed to delete file from R2: ${err?.message || "Storage error"}`
393
+ });
394
+ }
395
+ const store = getDevMockBlobStore();
396
+ store.delete(cleanKey);
397
+ }
398
+ return { success: true };
399
+ }
400
+ export async function listStorageFiles(event, options) {
401
+ const config = getStorageConfig(event);
402
+ try {
403
+ const r2 = getR2Binding("BLOB", event);
404
+ const result = await r2.list({
405
+ prefix: options?.prefix,
406
+ limit: options?.limit || 60,
407
+ cursor: options?.cursor
408
+ });
409
+ const prefix = config.prefix || "/api/storage";
410
+ let files = (result.objects || []).map((obj) => {
411
+ const url = `${prefix}/file/${obj.key}`;
412
+ const access = obj.customMetadata?.access || "public";
413
+ return {
414
+ key: obj.key,
415
+ size: obj.size,
416
+ uploaded: obj.uploaded ? new Date(obj.uploaded).toISOString() : (/* @__PURE__ */ new Date()).toISOString(),
417
+ url,
418
+ pathname: obj.key,
419
+ access
420
+ };
421
+ });
422
+ if (options?.access) {
423
+ files = files.filter((f) => f.access === options.access);
424
+ }
425
+ return {
426
+ files,
427
+ cursor: result.truncated ? result.cursor : void 0,
428
+ truncated: Boolean(result.truncated)
429
+ };
430
+ } catch (err) {
431
+ console.error("[qarpeo:storage] R2 list failed:", err?.message || err);
432
+ const procEnv = globalThis.process?.env || {};
433
+ const isDev = Boolean(import.meta.dev || procEnv.NODE_ENV !== "production");
434
+ if (!isDev) {
435
+ throw createError({
436
+ statusCode: 500,
437
+ statusMessage: "Internal Server Error",
438
+ message: `Failed to list files from R2: ${err?.message || "Storage error"}`
439
+ });
440
+ }
441
+ const store = getDevMockBlobStore();
442
+ const prefix = config.prefix || "/api/storage";
443
+ let files = Array.from(store.values()).filter((f) => !options?.prefix || f.key.startsWith(options.prefix)).map((item) => ({
444
+ key: item.key,
445
+ size: item.size,
446
+ uploaded: item.uploaded,
447
+ url: `${prefix}/file/${item.key}`,
448
+ pathname: item.key,
449
+ access: item.access || "public"
450
+ }));
451
+ if (options?.access) {
452
+ files = files.filter((f) => f.access === options.access);
453
+ }
454
+ const limit = options?.limit || 60;
455
+ return {
456
+ files: files.slice(0, limit),
457
+ truncated: false
458
+ };
459
+ }
460
+ }
461
+ export async function serveStorageFile(event, key) {
462
+ const cleanKey = key.replace(/^\/+/, "");
463
+ const query = getQuery(event);
464
+ const hasTransform = ["w", "h", "f", "fit", "q"].some(
465
+ (p) => query[p] !== void 0 && query[p] !== ""
466
+ );
467
+ if (hasTransform) {
468
+ const storageConfig = getStorageConfig(event);
469
+ if (storageConfig.cdnUrl && !query.token) {
470
+ const transform = {};
471
+ if (query.w) transform.width = Number(query.w);
472
+ if (query.h) transform.height = Number(query.h);
473
+ if (query.q) transform.quality = Number(query.q);
474
+ if (query.f) transform.format = String(query.f);
475
+ if (query.fit) transform.fit = String(query.fit);
476
+ const redirectUrl = buildStorageUrl(event, cleanKey, transform);
477
+ return new Response(null, {
478
+ status: 302,
479
+ headers: { Location: redirectUrl }
480
+ });
481
+ }
482
+ }
483
+ let object = null;
484
+ const rangeHeader = getRequestHeader(event, "range");
485
+ let r2Range = void 0;
486
+ let isRange = false;
487
+ if (rangeHeader && rangeHeader.startsWith("bytes=")) {
488
+ const rangeVal = rangeHeader.slice(6).trim();
489
+ const [startStr, endStr] = rangeVal.split("-");
490
+ const start = startStr ? parseInt(startStr, 10) : void 0;
491
+ const end = endStr ? parseInt(endStr, 10) : void 0;
492
+ if (start !== void 0 && end !== void 0 && !isNaN(start) && !isNaN(end) && end >= start) {
493
+ r2Range = { offset: start, length: end - start + 1 };
494
+ isRange = true;
495
+ } else if (start !== void 0 && !isNaN(start)) {
496
+ r2Range = { offset: start };
497
+ isRange = true;
498
+ } else if (end !== void 0 && !isNaN(end)) {
499
+ r2Range = { suffix: end };
500
+ isRange = true;
501
+ }
502
+ }
503
+ try {
504
+ const cfg = getQarpeoConfig(event);
505
+ const bindingName = cfg.blob?.binding || "BLOB";
506
+ const r2 = getR2Binding(bindingName, event);
507
+ object = await r2.get(cleanKey, r2Range ? { range: r2Range } : void 0).catch(() => null);
508
+ } catch (err) {
509
+ console.error("[qarpeo:storage] R2 retrieve failed:", err?.message || err);
510
+ const procEnv = globalThis.process?.env || {};
511
+ const isDev = Boolean(import.meta.dev || procEnv.NODE_ENV !== "production");
512
+ if (!isDev) {
513
+ throw createError({
514
+ statusCode: 500,
515
+ statusMessage: "Internal Server Error",
516
+ message: `Failed to retrieve file from R2: ${err?.message || "Storage error"}`
517
+ });
518
+ }
519
+ object = null;
520
+ }
521
+ if (!object) {
522
+ const procEnv = globalThis.process?.env || {};
523
+ const isDev = Boolean(import.meta.dev || procEnv.NODE_ENV !== "production");
524
+ if (isDev) {
525
+ const store = getDevMockBlobStore();
526
+ const devItem = store.get(cleanKey);
527
+ if (devItem && devItem.data) {
528
+ const query2 = getQuery(event);
529
+ const forceDownload2 = query2.download === "1" || query2.download === "true";
530
+ const rawFilename = query2.filename || cleanKey.split("/").pop() || "download";
531
+ const headers2 = {
532
+ "Content-Type": devItem.contentType || "application/octet-stream",
533
+ "Content-Length": String(devItem.data.byteLength),
534
+ "Accept-Ranges": "bytes",
535
+ "Cache-Control": "no-cache"
536
+ };
537
+ if (forceDownload2) {
538
+ headers2["Content-Disposition"] = `attachment; filename="${sanitizeFilename(rawFilename)}"`;
539
+ }
540
+ return new Response(devItem.data, { headers: headers2 });
541
+ }
542
+ if (cleanKey.endsWith(".png") || cleanKey.endsWith(".webp") || cleanKey.endsWith(".jpg") || cleanKey.endsWith(".jpeg") || cleanKey.endsWith(".svg")) {
543
+ const filename = cleanKey.split("/").pop() || cleanKey;
544
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="600" height="400" viewBox="0 0 600 400" fill="none">
545
+ <rect width="600" height="400" fill="#0f172a"/>
546
+ <rect x="20" y="20" width="560" height="360" rx="12" fill="#1e293b" stroke="#334155" stroke-dasharray="8 8" stroke-width="2"/>
547
+ <circle cx="300" cy="180" r="48" fill="#0284c7" fill-opacity="0.2" stroke="#0284c7" stroke-width="3"/>
548
+ <path d="M284 196L296 172L308 188L316 178L328 196H284Z" fill="#38bdf8"/>
549
+ <circle cx="316" cy="164" r="6" fill="#38bdf8"/>
550
+ <text x="300" y="260" font-family="-apple-system, system-ui, sans-serif" font-size="16" font-weight="600" fill="#f8fafc" text-anchor="middle">${filename}</text>
551
+ <text x="300" y="285" font-family="-apple-system, system-ui, sans-serif" font-size="12" fill="#94a3b8" text-anchor="middle">Cloudflare R2 Dev Preview</text>
552
+ </svg>`;
553
+ return new Response(svg, {
554
+ headers: {
555
+ "Content-Type": "image/svg+xml",
556
+ "Accept-Ranges": "bytes",
557
+ "Cache-Control": "no-cache"
558
+ }
559
+ });
560
+ }
561
+ }
562
+ throw createError({
563
+ statusCode: 404,
564
+ statusMessage: "Not Found",
565
+ message: `Storage file "${cleanKey}" not found`
566
+ });
567
+ }
568
+ const token = query.token;
569
+ const access = object.customMetadata?.access || "public";
570
+ let tokenVerified = null;
571
+ if (token) {
572
+ tokenVerified = await verifySignedBlobToken(event, cleanKey, token);
573
+ }
574
+ if (access === "private") {
575
+ if (!tokenVerified?.valid) {
576
+ const authCtx = await getAuthContext(event);
577
+ if (!authCtx?.user) {
578
+ throw createError({
579
+ statusCode: 401,
580
+ statusMessage: "Unauthorized",
581
+ message: `Authentication required to access private file "${cleanKey}"`
582
+ });
583
+ }
584
+ if (cleanKey.startsWith("user_")) {
585
+ const requiredUserId = cleanKey.split("/")[0].slice(5);
586
+ if (authCtx.user.id !== requiredUserId) {
587
+ throw createError({
588
+ statusCode: 403,
589
+ statusMessage: "Forbidden",
590
+ message: "You do not have permission to access this private file"
591
+ });
592
+ }
593
+ } else if (cleanKey.startsWith("org_")) {
594
+ const requiredOrgId = cleanKey.split("/")[0].slice(4);
595
+ const userOrgId = authCtx.organization?.id || authCtx.session?.currentOrganizationId;
596
+ if (userOrgId !== requiredOrgId) {
597
+ throw createError({
598
+ statusCode: 403,
599
+ statusMessage: "Forbidden",
600
+ message: "You do not have permission to access this organization file"
601
+ });
602
+ }
603
+ }
604
+ }
605
+ }
606
+ if (access === "unlisted") {
607
+ if (!tokenVerified?.valid) {
608
+ throw createError({
609
+ statusCode: 403,
610
+ statusMessage: "Forbidden",
611
+ message: `Signed token is required to access unlisted file "${cleanKey}"`
612
+ });
613
+ }
614
+ }
615
+ const ifNoneMatch = getRequestHeader(event, "if-none-match");
616
+ if (ifNoneMatch && (ifNoneMatch === object.etag || ifNoneMatch === `W/"${object.etag}"`)) {
617
+ event.node?.res ? event.node.res.statusCode = 304 : event.status = 304;
618
+ return null;
619
+ }
620
+ const headers = {
621
+ ETag: object.etag,
622
+ "Content-Type": object.httpMetadata?.contentType || "application/octet-stream",
623
+ "Accept-Ranges": "bytes",
624
+ "Cache-Control": access === "public" ? object.httpMetadata?.cacheControl || "public, max-age=31536000, immutable" : "private, no-cache, no-store, must-revalidate"
625
+ };
626
+ if (isRange && !object.range) {
627
+ return new Response(null, {
628
+ status: 416,
629
+ headers: {
630
+ "Content-Range": `bytes */${object.size}`,
631
+ "Accept-Ranges": "bytes"
632
+ }
633
+ });
634
+ }
635
+ if (isRange && object.range) {
636
+ const offset = object.range.offset ?? 0;
637
+ const length = object.range.length ?? object.size;
638
+ const end = offset + length - 1;
639
+ headers["Content-Range"] = `bytes ${offset}-${end}/${object.size}`;
640
+ headers["Content-Length"] = String(length);
641
+ if (event.node?.res) event.node.res.statusCode = 206;
642
+ return new Response(object.body, { status: 206, headers });
643
+ }
644
+ headers["Content-Length"] = String(object.size);
645
+ const forceDownload = query.download === "1" || query.download === "true" || Boolean(tokenVerified?.download);
646
+ if (forceDownload) {
647
+ const rawFilename = query.filename || cleanKey.split("/").pop() || "download";
648
+ const safeFilename = sanitizeFilename(rawFilename);
649
+ headers["Content-Disposition"] = `attachment; filename="${safeFilename}"`;
650
+ } else if (object.httpMetadata?.contentDisposition) {
651
+ headers["Content-Disposition"] = object.httpMetadata.contentDisposition;
652
+ }
653
+ return new Response(object.body, { headers });
654
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @file Tenant.ts Tier 2 Multi-Tenancy — Edge Tenant resolution and context management. Provides:
3
+ *
4
+ * - resolveTenant(event) — resolution cascade (header → subdomain → custom domain cache → D1)
5
+ * - getTenant(event) — returns current tenant or null
6
+ * - useTenant(event) — returns current tenant or throws 404
7
+ * - setTenant(event, tenant) — assigns tenant to H3 context
8
+ * - getTenantBySlug(slug, event?)
9
+ * - getTenantById(id, event?)
10
+ */
11
+ import type { RequestEvent } from "nuxt/server";
12
+ import type { TenantRecord } from "../../../types";
13
+ /** Extract clean hostname without port. */
14
+ export declare function extractHostname(event: RequestEvent): string;
15
+ /** Check if host is a subdomain of rootDomains and return the subdomain slug. */
16
+ export declare function extractSubdomain(host: string, rootDomains: string[]): string | null;
17
+ /** Retrieve a tenant record by slug. */
18
+ export declare function getTenantBySlug(slug: string, event?: RequestEvent): Promise<TenantRecord | null>;
19
+ /** Retrieve a tenant record by ID. */
20
+ export declare function getTenantById(id: string, event?: RequestEvent): Promise<TenantRecord | null>;
21
+ /** Retrieve a tenant record linked to a given auth organization id. */
22
+ export declare function getTenantByOrganization(orgId: string, event?: RequestEvent): Promise<TenantRecord | null>;
23
+ /** Register or update a tenant in memory/DB. */
24
+ export declare function saveTenant(tenant: TenantRecord, event?: RequestEvent): Promise<TenantRecord>;
25
+ /** List all registered tenants (DB with memory fallback). */
26
+ export declare function listTenants(event?: RequestEvent): Promise<TenantRecord[]>;
27
+ /**
28
+ * Resolves the active tenant for an incoming HTTP request. Cascade order:
29
+ *
30
+ * 1. Explicit header override (e.g. `x-tenant-id`)
31
+ * 2. Subdomain check against configured `rootDomains`
32
+ * 3. Custom domain edge cache (Cloudflare KV lookup: `domain:<host>`)
33
+ * 4. Direct database lookup (fallback)
34
+ */
35
+ export declare function resolveTenant(event: RequestEvent): Promise<TenantRecord | null>;
36
+ /** Assign tenant to request context. */
37
+ export declare function setTenant(event: RequestEvent, tenant: TenantRecord): void;
38
+ /**
39
+ * Retrieve the resolved tenant for the current request context. Returns `null` if no tenant was
40
+ * matched.
41
+ */
42
+ export declare function getTenant(event: RequestEvent): TenantRecord | null;
43
+ /** Retrieve the active tenant or throw a 404 HTTP error. */
44
+ export declare function useTenant(event: RequestEvent): TenantRecord;