@cosmicdrift/kumiko-bundled-features 0.369.0 → 0.370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/dist/account-security/constants.d.ts +4 -0
  2. package/dist/account-security/constants.js +5 -0
  3. package/dist/account-security/feature.d.ts +14 -0
  4. package/dist/account-security/feature.js +62 -0
  5. package/dist/account-security/i18n.d.ts +6 -0
  6. package/dist/account-security/i18n.js +6 -0
  7. package/dist/account-security/index.d.ts +3 -0
  8. package/dist/account-security/index.js +3 -0
  9. package/dist/admin-shell/feature.d.ts +1 -1
  10. package/dist/admin-shell/index.d.ts +4 -4
  11. package/dist/admin-shell/overview-panels.d.ts +1 -1
  12. package/dist/admin-shell/web/index.d.ts +1 -1
  13. package/dist/agent-tools/agent-manifest.d.ts +1 -1
  14. package/dist/agent-tools/index.d.ts +8 -8
  15. package/dist/agent-tools/manifest-deny-qns.d.ts +1 -1
  16. package/dist/agent-tools/tool-catalog.d.ts +1 -1
  17. package/dist/agent-tools/tool-dispatch.d.ts +1 -1
  18. package/dist/audit/handlers/resolve-audit-tenant.d.ts +1 -1
  19. package/dist/audit/index.d.ts +3 -3
  20. package/dist/audit/web/index.d.ts +1 -1
  21. package/dist/auth-email-password/bootstrap.d.ts +1 -1
  22. package/dist/auth-email-password/feature.d.ts +7 -6
  23. package/dist/auth-email-password/feature.js +3 -1
  24. package/dist/auth-email-password/handlers/confirm-token-flow.d.ts +1 -1
  25. package/dist/auth-email-password/handlers/invite-accept-with-login.write.d.ts +1 -1
  26. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -2
  27. package/dist/auth-email-password/handlers/invite-signup-complete.write.d.ts +1 -1
  28. package/dist/auth-email-password/handlers/login.write.d.ts +1 -1
  29. package/dist/auth-email-password/handlers/request-account-unlock.write.d.ts +1 -1
  30. package/dist/auth-email-password/handlers/request-email-verification.write.d.ts +1 -1
  31. package/dist/auth-email-password/handlers/request-password-reset.write.d.ts +1 -1
  32. package/dist/auth-email-password/handlers/signup-confirm.write.d.ts +1 -1
  33. package/dist/auth-email-password/handlers/signup-request.write.d.ts +1 -1
  34. package/dist/auth-email-password/handlers/switch-tenant-mfa-gate.write.d.ts +1 -1
  35. package/dist/auth-email-password/handlers/token-request-handler.d.ts +2 -2
  36. package/dist/auth-email-password/index.d.ts +13 -13
  37. package/dist/auth-email-password/lockout-store.d.ts +1 -1
  38. package/dist/auth-email-password/magic-link-mail.d.ts +1 -1
  39. package/dist/auth-email-password/seeding.d.ts +3 -3
  40. package/dist/auth-email-password/signed-token.d.ts +1 -1
  41. package/dist/auth-email-password/signup-token-store.d.ts +1 -1
  42. package/dist/auth-email-password/testing.d.ts +1 -1
  43. package/dist/auth-email-password/web/auth-gate.d.ts +1 -1
  44. package/dist/auth-email-password/web/client-plugin.d.ts +2 -2
  45. package/dist/auth-email-password/web/index.d.ts +42 -42
  46. package/dist/auth-email-password/web/session-bootstrap-error.d.ts +1 -1
  47. package/dist/auth-email-password/web/session.d.ts +1 -1
  48. package/dist/auth-email-password/web/signup-complete-screen.d.ts +1 -1
  49. package/dist/auth-foundation/feature.d.ts +2 -6
  50. package/dist/auth-foundation/feature.js +0 -2
  51. package/dist/auth-foundation/index.d.ts +3 -3
  52. package/dist/auth-foundation/index.js +1 -1
  53. package/dist/auth-foundation/resolve-anonymous-access.d.ts +1 -1
  54. package/dist/auth-mfa/env.d.ts +13 -0
  55. package/dist/auth-mfa/env.js +24 -0
  56. package/dist/auth-mfa/errors.d.ts +1 -1
  57. package/dist/auth-mfa/feature-exports.d.ts +12 -0
  58. package/dist/auth-mfa/feature-exports.js +72 -0
  59. package/dist/auth-mfa/feature.d.ts +6 -12
  60. package/dist/auth-mfa/feature.js +53 -70
  61. package/dist/auth-mfa/handlers/reencrypt.job.d.ts +1 -1
  62. package/dist/auth-mfa/index.d.ts +12 -9
  63. package/dist/auth-mfa/index.js +4 -2
  64. package/dist/auth-mfa/mfa-challenge-token.d.ts +1 -1
  65. package/dist/auth-mfa/mfa-preauth-setup-token.d.ts +1 -1
  66. package/dist/auth-mfa/mfa-status-checker.d.ts +1 -1
  67. package/dist/auth-mfa/mfa-verify-attempts.d.ts +1 -1
  68. package/dist/auth-mfa/testing.d.ts +1 -1
  69. package/dist/auth-mfa/token-secrets.d.ts +7 -0
  70. package/dist/auth-mfa/token-secrets.js +13 -0
  71. package/dist/auth-mfa/verify-factor.d.ts +1 -1
  72. package/dist/auth-mfa/web/index.d.ts +15 -15
  73. package/dist/auth-mfa/web/mfa-client.d.ts +1 -1
  74. package/dist/auth-mfa-user-data/index.d.ts +0 -4
  75. package/dist/auth-mfa-user-data/index.js +0 -2
  76. package/dist/billing-foundation/checkout-core.d.ts +2 -2
  77. package/dist/billing-foundation/consumer-protection/confirmation-mail.d.ts +2 -2
  78. package/dist/billing-foundation/consumer-protection/consent-gate.d.ts +1 -1
  79. package/dist/billing-foundation/consumer-protection/consent-text.d.ts +2 -2
  80. package/dist/billing-foundation/consumer-protection/issue-confirmation.d.ts +1 -1
  81. package/dist/billing-foundation/consumer-protection/register-consent.d.ts +1 -1
  82. package/dist/billing-foundation/consumer-protection/register-termination.d.ts +1 -1
  83. package/dist/billing-foundation/consumer-protection/termination-mail.d.ts +3 -3
  84. package/dist/billing-foundation/consumer-protection/termination-notify.d.ts +5 -5
  85. package/dist/billing-foundation/consumer-protection/termination-pages.d.ts +2 -2
  86. package/dist/billing-foundation/consumer-protection/termination-record.d.ts +3 -3
  87. package/dist/billing-foundation/consumer-protection/termination-request.d.ts +2 -2
  88. package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +2 -2
  89. package/dist/billing-foundation/feature.d.ts +1 -3
  90. package/dist/billing-foundation/feature.js +0 -2
  91. package/dist/billing-foundation/handlers/billing-plans.query.d.ts +1 -1
  92. package/dist/billing-foundation/handlers/create-checkout-session.write.d.ts +1 -1
  93. package/dist/billing-foundation/handlers/create-portal-session.write.d.ts +1 -1
  94. package/dist/billing-foundation/handlers/start-plan-checkout.write.d.ts +1 -1
  95. package/dist/billing-foundation/handlers/switch-plan.write.d.ts +1 -1
  96. package/dist/billing-foundation/index.d.ts +16 -16
  97. package/dist/billing-foundation/index.js +1 -1
  98. package/dist/billing-foundation/plan-catalog.d.ts +1 -1
  99. package/dist/billing-foundation/subscription-tier-sync.d.ts +3 -1
  100. package/dist/billing-foundation/subscription-tier-sync.js +3 -2
  101. package/dist/billing-foundation/types.d.ts +3 -3
  102. package/dist/billing-foundation/validate-options.d.ts +1 -1
  103. package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +1 -1
  104. package/dist/billing-foundation/web/index.d.ts +6 -6
  105. package/dist/cap-counter/calendar-cap-usage-reservation.d.ts +4 -4
  106. package/dist/cap-counter/cap-reservation.d.ts +1 -1
  107. package/dist/cap-counter/enforce-cap.d.ts +1 -1
  108. package/dist/cap-counter/feature.d.ts +0 -4
  109. package/dist/cap-counter/feature.js +0 -2
  110. package/dist/cap-counter/index.d.ts +13 -13
  111. package/dist/cap-counter/index.js +1 -1
  112. package/dist/cap-counter/value-cap-guard.d.ts +1 -1
  113. package/dist/cap-counter/with-cap-enforcement.d.ts +1 -1
  114. package/dist/cap-overview/feature.d.ts +1 -1
  115. package/dist/cap-overview/handlers/caps-usage.query.d.ts +1 -1
  116. package/dist/cap-overview/handlers/tenant-caps-list.query.d.ts +1 -1
  117. package/dist/cap-overview/index.d.ts +6 -6
  118. package/dist/cap-overview/screens.d.ts +1 -1
  119. package/dist/cap-overview/types.d.ts +1 -1
  120. package/dist/cap-overview/usage-math.d.ts +1 -1
  121. package/dist/cap-overview/web/cap-usage-bar.d.ts +1 -1
  122. package/dist/cap-overview/web/index.d.ts +4 -4
  123. package/dist/channel-discord/discord-channel.d.ts +1 -1
  124. package/dist/channel-discord/feature.d.ts +1 -1
  125. package/dist/channel-discord/index.d.ts +2 -2
  126. package/dist/channel-email/email-channel.d.ts +2 -2
  127. package/dist/channel-email/env.d.ts +14 -0
  128. package/dist/channel-email/env.js +27 -0
  129. package/dist/channel-email/feature.d.ts +14 -3
  130. package/dist/channel-email/feature.js +5 -1
  131. package/dist/channel-email/index.d.ts +6 -5
  132. package/dist/channel-email/index.js +1 -0
  133. package/dist/channel-email/pii-guard.d.ts +1 -1
  134. package/dist/channel-email/smtp-transport.d.ts +1 -1
  135. package/dist/channel-email/types.d.ts +1 -1
  136. package/dist/channel-in-app/in-app-channel.d.ts +1 -1
  137. package/dist/channel-in-app/index.d.ts +4 -4
  138. package/dist/channel-push/feature.d.ts +1 -1
  139. package/dist/channel-push/index.d.ts +3 -3
  140. package/dist/channel-push/push-channel.d.ts +2 -2
  141. package/dist/channel-slack/feature.d.ts +1 -1
  142. package/dist/channel-slack/index.d.ts +2 -2
  143. package/dist/channel-slack/slack-channel.d.ts +1 -1
  144. package/dist/channel-teams/feature.d.ts +1 -1
  145. package/dist/channel-teams/index.d.ts +2 -2
  146. package/dist/channel-teams/teams-channel.d.ts +1 -1
  147. package/dist/channel-telegram/feature.d.ts +1 -1
  148. package/dist/channel-telegram/index.d.ts +2 -2
  149. package/dist/channel-telegram/telegram-channel.d.ts +1 -1
  150. package/dist/compliance-profiles/feature.d.ts +1 -1
  151. package/dist/compliance-profiles/index.d.ts +3 -3
  152. package/dist/compliance-profiles/web/index.d.ts +2 -2
  153. package/dist/compliance-profiles-ops/index.d.ts +0 -8
  154. package/dist/compliance-profiles-ops/index.js +0 -2
  155. package/dist/config/feature.d.ts +1 -1
  156. package/dist/config/handlers/reencrypt.job.d.ts +1 -1
  157. package/dist/config/index.d.ts +8 -8
  158. package/dist/config/web/client-plugin.d.ts +1 -1
  159. package/dist/config/web/index.d.ts +2 -2
  160. package/dist/crypto-shredding/env/index.d.ts +21 -0
  161. package/dist/crypto-shredding/env/index.js +78 -0
  162. package/dist/crypto-shredding/feature.d.ts +17 -2
  163. package/dist/crypto-shredding/feature.js +5 -1
  164. package/dist/crypto-shredding/index.d.ts +4 -3
  165. package/dist/crypto-shredding/index.js +1 -0
  166. package/dist/custom-fields/feature.d.ts +0 -17
  167. package/dist/custom-fields/feature.js +0 -2
  168. package/dist/custom-fields/index.d.ts +10 -10
  169. package/dist/custom-fields/index.js +1 -1
  170. package/dist/custom-fields/lib/define-or-resurrect.d.ts +2 -2
  171. package/dist/custom-fields/lib/field-access.d.ts +1 -1
  172. package/dist/custom-fields/lib/field-definition-row.d.ts +1 -1
  173. package/dist/custom-fields/lib/quota.d.ts +1 -1
  174. package/dist/custom-fields/web/index.d.ts +3 -3
  175. package/dist/data-retention/_internal/parse-override.d.ts +1 -1
  176. package/dist/data-retention/feature.d.ts +7 -7
  177. package/dist/data-retention/handlers/policy-for.query.d.ts +1 -1
  178. package/dist/data-retention/index.d.ts +3 -3
  179. package/dist/data-retention/resolve-for-tenant.d.ts +2 -2
  180. package/dist/data-retention/resolve-tenant-preset.d.ts +1 -1
  181. package/dist/data-retention/resolver.d.ts +1 -1
  182. package/dist/data-retention/run-retention-cleanup.d.ts +2 -2
  183. package/dist/delivery/attachment-ref.d.ts +1 -1
  184. package/dist/delivery/attempt-log.d.ts +1 -1
  185. package/dist/delivery/channel-context.d.ts +2 -2
  186. package/dist/delivery/chat-webhook-channel.d.ts +2 -2
  187. package/dist/delivery/constants.d.ts +1 -1
  188. package/dist/delivery/delivery-service.d.ts +2 -2
  189. package/dist/delivery/feature.js +2 -0
  190. package/dist/delivery/handlers/log.query.d.ts +1 -1
  191. package/dist/delivery/handlers/unsubscribe-page-chrome.query.d.ts +5 -0
  192. package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +44 -0
  193. package/dist/delivery/index.d.ts +20 -20
  194. package/dist/delivery/notify-factory.d.ts +1 -1
  195. package/dist/delivery/public-names.d.ts +1 -0
  196. package/dist/delivery/public-names.js +1 -0
  197. package/dist/delivery/testing.d.ts +3 -3
  198. package/dist/delivery/types.d.ts +3 -3
  199. package/dist/delivery/unsubscribe-link.d.ts +1 -1
  200. package/dist/delivery/unsubscribe-page-strings.d.ts +4 -0
  201. package/dist/delivery/unsubscribe-page-strings.js +4 -0
  202. package/dist/delivery/unsubscribe-page.d.ts +27 -0
  203. package/dist/delivery/unsubscribe-page.js +192 -0
  204. package/dist/delivery/unsubscribe.d.ts +11 -3
  205. package/dist/delivery/unsubscribe.js +146 -64
  206. package/dist/delivery/web/index.d.ts +2 -2
  207. package/dist/derivatives-sharp/feature.d.ts +0 -4
  208. package/dist/derivatives-sharp/feature.js +0 -2
  209. package/dist/derivatives-sharp/index.d.ts +2 -2
  210. package/dist/derivatives-sharp/index.js +1 -1
  211. package/dist/document-ingest-foundation/feature.d.ts +0 -7
  212. package/dist/document-ingest-foundation/feature.js +0 -2
  213. package/dist/document-ingest-foundation/index.d.ts +7 -7
  214. package/dist/document-ingest-foundation/index.js +1 -1
  215. package/dist/document-ingest-foundation/pages.d.ts +1 -1
  216. package/dist/document-ingest-foundation/providers.d.ts +1 -1
  217. package/dist/document-ingest-foundation/write-document-extract.d.ts +1 -1
  218. package/dist/feature-toggles/compose-tier-resolver.d.ts +1 -1
  219. package/dist/feature-toggles/feature.d.ts +5 -5
  220. package/dist/feature-toggles/handlers/set.write.d.ts +1 -1
  221. package/dist/feature-toggles/index.d.ts +3 -3
  222. package/dist/feature-toggles/toggle-sync-signal.d.ts +1 -1
  223. package/dist/feature-toggles/web/index.d.ts +1 -1
  224. package/dist/file-derivatives/feature.d.ts +0 -2
  225. package/dist/file-derivatives/feature.js +0 -2
  226. package/dist/file-derivatives/index.d.ts +4 -4
  227. package/dist/file-derivatives/index.js +1 -1
  228. package/dist/file-foundation/feature.d.ts +0 -6
  229. package/dist/file-foundation/feature.js +0 -2
  230. package/dist/file-foundation/index.d.ts +2 -2
  231. package/dist/file-foundation/index.js +1 -1
  232. package/dist/file-provider-inmemory/feature.d.ts +0 -4
  233. package/dist/file-provider-inmemory/feature.js +0 -2
  234. package/dist/file-provider-inmemory/index.d.ts +1 -1
  235. package/dist/file-provider-inmemory/index.js +1 -1
  236. package/dist/file-provider-s3/env-feature.d.ts +12 -2
  237. package/dist/file-provider-s3/env-feature.js +9 -6
  238. package/dist/file-provider-s3/env-schema.d.ts +38 -0
  239. package/dist/file-provider-s3/env-schema.js +51 -0
  240. package/dist/file-provider-s3/feature.d.ts +1 -14
  241. package/dist/file-provider-s3/feature.js +0 -2
  242. package/dist/file-provider-s3/index.d.ts +2 -1
  243. package/dist/file-provider-s3/index.js +2 -1
  244. package/dist/file-provider-s3/lib/env-helper.d.ts +1 -1
  245. package/dist/file-provider-s3/lib/index.d.ts +3 -3
  246. package/dist/files/index.d.ts +1 -1
  247. package/dist/files-tenant-data/index.d.ts +2 -2
  248. package/dist/folders/feature.d.ts +0 -4
  249. package/dist/folders/feature.js +0 -2
  250. package/dist/folders/index.d.ts +7 -7
  251. package/dist/folders/index.js +1 -1
  252. package/dist/folders/web/folder-manager.d.ts +1 -1
  253. package/dist/folders/web/index.d.ts +5 -5
  254. package/dist/folders-user-data/index.d.ts +0 -4
  255. package/dist/folders-user-data/index.js +0 -2
  256. package/dist/form-draft/db/queries/cleanup.d.ts +1 -1
  257. package/dist/form-draft/feature.d.ts +0 -4
  258. package/dist/form-draft/feature.js +0 -2
  259. package/dist/form-draft/handlers/cleanup.job.d.ts +1 -1
  260. package/dist/form-draft/handlers/get.query.d.ts +1 -1
  261. package/dist/form-draft/index.d.ts +10 -10
  262. package/dist/form-draft/index.js +1 -1
  263. package/dist/form-draft/lookup.d.ts +1 -1
  264. package/dist/form-draft/release-file-refs.d.ts +1 -1
  265. package/dist/form-draft-user-data/index.d.ts +0 -4
  266. package/dist/form-draft-user-data/index.js +0 -2
  267. package/dist/foundation-shared/build-info-env.d.ts +7 -0
  268. package/dist/foundation-shared/build-info-env.js +15 -0
  269. package/dist/foundation-shared/demo-admin-env.d.ts +12 -0
  270. package/dist/foundation-shared/demo-admin-env.js +21 -0
  271. package/dist/foundation-shared/index.d.ts +5 -3
  272. package/dist/foundation-shared/index.js +2 -0
  273. package/dist/host-routing/constants.d.ts +8 -0
  274. package/dist/host-routing/constants.js +19 -0
  275. package/dist/host-routing/dispatch.d.ts +24 -0
  276. package/dist/host-routing/dispatch.js +102 -0
  277. package/dist/host-routing/feature.d.ts +3 -0
  278. package/dist/host-routing/feature.js +102 -0
  279. package/dist/host-routing/host.d.ts +14 -0
  280. package/dist/host-routing/host.js +37 -0
  281. package/dist/host-routing/index.d.ts +5 -0
  282. package/dist/host-routing/index.js +4 -0
  283. package/dist/host-routing/options.d.ts +27 -0
  284. package/dist/host-routing/options.js +1 -0
  285. package/dist/host-routing/validate-options.d.ts +2 -0
  286. package/dist/host-routing/validate-options.js +29 -0
  287. package/dist/inbound-mail-foundation/connect-routes.d.ts +2 -2
  288. package/dist/inbound-mail-foundation/feature.d.ts +0 -4
  289. package/dist/inbound-mail-foundation/feature.js +0 -2
  290. package/dist/inbound-mail-foundation/handlers/account-state.d.ts +1 -1
  291. package/dist/inbound-mail-foundation/index.d.ts +12 -12
  292. package/dist/inbound-mail-foundation/index.js +1 -1
  293. package/dist/inbound-mail-foundation/oauth-access-token.d.ts +1 -1
  294. package/dist/inbound-mail-foundation/provider-factory.d.ts +1 -1
  295. package/dist/inbound-mail-foundation/types.d.ts +1 -1
  296. package/dist/inbound-mail-foundation/watch-supervisor.d.ts +2 -2
  297. package/dist/inbound-provider-imap/feature.d.ts +1 -5
  298. package/dist/inbound-provider-imap/feature.js +0 -2
  299. package/dist/inbound-provider-imap/imap-client.d.ts +1 -1
  300. package/dist/inbound-provider-imap/index.d.ts +3 -3
  301. package/dist/inbound-provider-imap/index.js +1 -1
  302. package/dist/inbound-provider-inmemory/feature.d.ts +0 -4
  303. package/dist/inbound-provider-inmemory/feature.js +0 -2
  304. package/dist/inbound-provider-inmemory/index.d.ts +1 -1
  305. package/dist/inbound-provider-inmemory/index.js +1 -1
  306. package/dist/jobs/handlers/tenant-runs.query.d.ts +1 -1
  307. package/dist/jobs/index.d.ts +9 -9
  308. package/dist/jobs/web/index.d.ts +1 -1
  309. package/dist/ledger/feature.d.ts +0 -4
  310. package/dist/ledger/feature.js +0 -2
  311. package/dist/ledger/index.d.ts +10 -10
  312. package/dist/ledger/index.js +1 -1
  313. package/dist/ledger/recurring.d.ts +2 -2
  314. package/dist/ledger/reports.d.ts +2 -2
  315. package/dist/ledger/web/index.d.ts +3 -3
  316. package/dist/legal-pages/constants.d.ts +12 -0
  317. package/dist/legal-pages/constants.js +16 -0
  318. package/dist/legal-pages/feature.d.ts +6 -3
  319. package/dist/legal-pages/feature.js +5 -2
  320. package/dist/legal-pages/index.d.ts +5 -3
  321. package/dist/legal-pages/index.js +3 -1
  322. package/dist/legal-pages/layout.d.ts +10 -0
  323. package/dist/legal-pages/layout.js +32 -0
  324. package/dist/legal-pages/lib/boot-check.d.ts +1 -1
  325. package/dist/legal-pages/lib/validate-routes.d.ts +1 -1
  326. package/dist/legal-pages/markdown.d.ts +2 -2
  327. package/dist/legal-pages/seed.d.ts +12 -0
  328. package/dist/legal-pages/seed.js +38 -0
  329. package/dist/legal-pages/web/index.d.ts +1 -1
  330. package/dist/mail-foundation/feature.d.ts +0 -7
  331. package/dist/mail-foundation/feature.js +0 -2
  332. package/dist/mail-foundation/index.d.ts +1 -1
  333. package/dist/mail-foundation/index.js +1 -1
  334. package/dist/mail-transport-inmemory/feature.d.ts +0 -4
  335. package/dist/mail-transport-inmemory/feature.js +0 -2
  336. package/dist/mail-transport-inmemory/index.d.ts +1 -1
  337. package/dist/mail-transport-inmemory/index.js +1 -1
  338. package/dist/mail-transport-smtp/feature.d.ts +0 -16
  339. package/dist/mail-transport-smtp/feature.js +0 -2
  340. package/dist/mail-transport-smtp/index.d.ts +1 -1
  341. package/dist/mail-transport-smtp/index.js +1 -1
  342. package/dist/managed-pages/branding.d.ts +1 -1
  343. package/dist/managed-pages/feature.d.ts +1 -1
  344. package/dist/managed-pages/handlers/branding.query.d.ts +1 -1
  345. package/dist/managed-pages/index.d.ts +5 -5
  346. package/dist/managed-pages/web/index.d.ts +2 -2
  347. package/dist/metrics/compute.d.ts +2 -2
  348. package/dist/metrics/default-metrics.d.ts +9 -9
  349. package/dist/metrics/feature.d.ts +1 -1
  350. package/dist/metrics/filters.d.ts +1 -1
  351. package/dist/metrics/index.d.ts +5 -5
  352. package/dist/metrics/types.d.ts +1 -1
  353. package/dist/metrics/validate.d.ts +1 -1
  354. package/dist/metrics/window.d.ts +2 -2
  355. package/dist/notes-history/feature.d.ts +0 -4
  356. package/dist/notes-history/feature.js +0 -2
  357. package/dist/notes-history/handlers/add-note.write.d.ts +1 -1
  358. package/dist/notes-history/index.d.ts +6 -6
  359. package/dist/notes-history/index.js +1 -1
  360. package/dist/notes-history/web/index.d.ts +3 -3
  361. package/dist/notes-history-user-data/index.d.ts +1 -5
  362. package/dist/notes-history-user-data/index.js +0 -2
  363. package/dist/page-render/index.d.ts +7 -7
  364. package/dist/page-render/layout.d.ts +1 -1
  365. package/dist/page-render/web.d.ts +5 -5
  366. package/dist/personal-access-tokens/feature.d.ts +3 -3
  367. package/dist/personal-access-tokens/handlers/available-scopes.query.d.ts +1 -1
  368. package/dist/personal-access-tokens/i18n.d.ts +1 -1
  369. package/dist/personal-access-tokens/index.d.ts +13 -13
  370. package/dist/personal-access-tokens/resolver.d.ts +1 -1
  371. package/dist/personal-access-tokens/screens.d.ts +1 -1
  372. package/dist/presets/dsgvo-self-service.d.ts +3 -1
  373. package/dist/presets/dsgvo-self-service.js +2 -0
  374. package/dist/presets/index.d.ts +2 -2
  375. package/dist/presets/security-baseline.d.ts +2 -0
  376. package/dist/presets/security-baseline.js +2 -0
  377. package/dist/rate-limiting/index.d.ts +2 -2
  378. package/dist/readiness/feature.d.ts +0 -8
  379. package/dist/readiness/feature.js +0 -2
  380. package/dist/readiness/index.d.ts +3 -3
  381. package/dist/readiness/index.js +1 -1
  382. package/dist/renderer-foundation/api.d.ts +2 -2
  383. package/dist/renderer-foundation/constants.d.ts +2 -2
  384. package/dist/renderer-foundation/feature.d.ts +1 -1
  385. package/dist/renderer-foundation/index.d.ts +5 -5
  386. package/dist/renderer-foundation/types.d.ts +24 -2
  387. package/dist/renderer-pdf/feature.d.ts +1 -1
  388. package/dist/renderer-pdf/index.d.ts +2 -2
  389. package/dist/renderer-pdf/render-table-pdf.d.ts +1 -1
  390. package/dist/secrets/constants.d.ts +7 -0
  391. package/dist/secrets/constants.js +7 -0
  392. package/dist/secrets/db/queries/read.d.ts +1 -1
  393. package/dist/secrets/feature.d.ts +4 -3
  394. package/dist/secrets/feature.js +4 -2
  395. package/dist/secrets/handlers/delete.write.js +2 -2
  396. package/dist/secrets/handlers/rotate.job.d.ts +1 -1
  397. package/dist/secrets/handlers/set.write.js +2 -2
  398. package/dist/secrets/index.d.ts +7 -7
  399. package/dist/secrets/index.js +1 -1
  400. package/dist/secrets/secrets-context.d.ts +1 -1
  401. package/dist/seo/feature.d.ts +3 -3
  402. package/dist/seo/index.d.ts +6 -6
  403. package/dist/sessions/feature.d.ts +1 -1
  404. package/dist/sessions/index.d.ts +8 -8
  405. package/dist/sessions/session-callbacks.d.ts +1 -1
  406. package/dist/sessions/testing.d.ts +1 -1
  407. package/dist/shared/index.d.ts +31 -31
  408. package/dist/step-dispatcher/dispatch-payload.d.ts +2 -2
  409. package/dist/step-dispatcher/index.d.ts +3 -3
  410. package/dist/subscription-mollie/feature.d.ts +2 -2
  411. package/dist/subscription-mollie/index.d.ts +3 -3
  412. package/dist/subscription-mollie/verify-webhook.d.ts +1 -1
  413. package/dist/subscription-stripe/feature.d.ts +17 -1
  414. package/dist/subscription-stripe/feature.js +19 -1
  415. package/dist/subscription-stripe/index.d.ts +2 -2
  416. package/dist/subscription-stripe/index.js +1 -1
  417. package/dist/subscription-stripe/plugin-methods.d.ts +1 -1
  418. package/dist/subscription-stripe/verify-webhook.d.ts +1 -1
  419. package/dist/tags/feature.d.ts +0 -4
  420. package/dist/tags/feature.js +0 -2
  421. package/dist/tags/handlers/assign-tag.write.d.ts +1 -1
  422. package/dist/tags/handlers/remove-tag.write.d.ts +1 -1
  423. package/dist/tags/index.d.ts +11 -11
  424. package/dist/tags/index.js +1 -1
  425. package/dist/tags/web/index.d.ts +9 -9
  426. package/dist/template-resolver/api.d.ts +4 -4
  427. package/dist/template-resolver/constants.d.ts +1 -1
  428. package/dist/template-resolver/document-sanitizer.d.ts +1 -1
  429. package/dist/template-resolver/handlers/bundle-import.d.ts +3 -3
  430. package/dist/template-resolver/handlers/collection-shared.d.ts +2 -2
  431. package/dist/template-resolver/handlers/copy-locale.write.d.ts +1 -1
  432. package/dist/template-resolver/handlers/diff-to-system.query.d.ts +1 -1
  433. package/dist/template-resolver/handlers/find-by-id.query.d.ts +1 -1
  434. package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +1 -1
  435. package/dist/template-resolver/handlers/import-bundle.write.d.ts +1 -1
  436. package/dist/template-resolver/handlers/layout-source.query.d.ts +3 -3
  437. package/dist/template-resolver/handlers/override-diff.d.ts +2 -2
  438. package/dist/template-resolver/handlers/overview.query.d.ts +3 -3
  439. package/dist/template-resolver/handlers/preview.query.d.ts +1 -1
  440. package/dist/template-resolver/handlers/resource-link-pdf.write.d.ts +1 -1
  441. package/dist/template-resolver/handlers/resource-upload.write.d.ts +1 -1
  442. package/dist/template-resolver/handlers/send-test.write.d.ts +1 -1
  443. package/dist/template-resolver/handlers/shared.d.ts +1 -1
  444. package/dist/template-resolver/handlers/template-gates.d.ts +4 -4
  445. package/dist/template-resolver/handlers/template-write.d.ts +4 -4
  446. package/dist/template-resolver/handlers/tenant-overrides.query.d.ts +1 -1
  447. package/dist/template-resolver/handlers/toggle-status.write.d.ts +1 -1
  448. package/dist/template-resolver/handlers/upsert-system.write.d.ts +1 -1
  449. package/dist/template-resolver/handlers/upsert-tenant.write.d.ts +1 -1
  450. package/dist/template-resolver/handlers/usage.query.d.ts +1 -1
  451. package/dist/template-resolver/handlers/validate.query.d.ts +3 -3
  452. package/dist/template-resolver/index.d.ts +25 -25
  453. package/dist/template-resolver/layout-appearance.d.ts +1 -1
  454. package/dist/template-resolver/layout-regions.d.ts +2 -2
  455. package/dist/template-resolver/linked-resources.d.ts +1 -1
  456. package/dist/template-resolver/preview-display-html.d.ts +1 -1
  457. package/dist/template-resolver/resource-image.d.ts +1 -1
  458. package/dist/template-resolver/seeding.d.ts +2 -2
  459. package/dist/template-resolver/store-template-resource.d.ts +1 -1
  460. package/dist/template-resolver/template-draft.d.ts +2 -2
  461. package/dist/template-resolver/template-meta.d.ts +2 -2
  462. package/dist/template-resolver/template-preview.d.ts +7 -6
  463. package/dist/template-resolver/template-preview.js +19 -12
  464. package/dist/template-resolver/template-resources.d.ts +1 -1
  465. package/dist/template-resolver/template-usage.d.ts +3 -1
  466. package/dist/template-resolver/template-usage.js +1 -0
  467. package/dist/template-resolver/template-validation.d.ts +1 -1
  468. package/dist/template-resolver/testing.d.ts +1 -1
  469. package/dist/template-resolver/user-content-table.d.ts +1 -1
  470. package/dist/template-resolver/web/document-editor-extensions.d.ts +1 -1
  471. package/dist/template-resolver/web/document-editor-extensions.js +6 -2
  472. package/dist/template-resolver/web/document-editor.d.ts +1 -1
  473. package/dist/template-resolver/web/document-tiptap-editor.d.ts +1 -1
  474. package/dist/template-resolver/web/document-tiptap-editor.js +13 -10
  475. package/dist/template-resolver/web/editor-handle.d.ts +1 -1
  476. package/dist/template-resolver/web/index.d.ts +7 -7
  477. package/dist/template-resolver/web/placeholder-line-editor-lazy.d.ts +2 -2
  478. package/dist/template-resolver/web/placeholder-line-editor.d.ts +1 -1
  479. package/dist/template-resolver-user-data/index.d.ts +0 -4
  480. package/dist/template-resolver-user-data/index.js +0 -2
  481. package/dist/tenant/feature.d.ts +1 -1
  482. package/dist/tenant/index.d.ts +10 -10
  483. package/dist/tenant/is-tenant-serving-public-content.d.ts +1 -1
  484. package/dist/tenant/testing.d.ts +1 -1
  485. package/dist/tenant/web/index.d.ts +3 -3
  486. package/dist/tenant-handover/feature.d.ts +1 -1
  487. package/dist/tenant-handover/index.d.ts +3 -3
  488. package/dist/tenant-handover/signup-handover-provider.d.ts +1 -1
  489. package/dist/tenant-lifecycle/feature.d.ts +2 -2
  490. package/dist/tenant-lifecycle/index.d.ts +3 -3
  491. package/dist/tenant-lifecycle/run-tenant-destroy.d.ts +1 -1
  492. package/dist/tenant-lifecycle/stages.d.ts +1 -1
  493. package/dist/tenant-lifecycle/testing.d.ts +1 -1
  494. package/dist/tenant-settings/feature.d.ts +1 -3
  495. package/dist/tenant-settings/feature.js +0 -2
  496. package/dist/tenant-settings/index.d.ts +4 -4
  497. package/dist/tenant-settings/index.js +1 -1
  498. package/dist/tier-engine/entity.d.ts +1 -1
  499. package/dist/tier-engine/feature.d.ts +2 -4
  500. package/dist/tier-engine/feature.js +0 -2
  501. package/dist/tier-engine/handlers/get-tenant-tier.query.d.ts +1 -1
  502. package/dist/tier-engine/i18n.d.ts +0 -2
  503. package/dist/tier-engine/i18n.js +4 -4
  504. package/dist/tier-engine/index.d.ts +8 -8
  505. package/dist/tier-engine/index.js +1 -1
  506. package/dist/tier-engine/tier-option-gate.d.ts +1 -1
  507. package/dist/tier-engine/tier-resolver.d.ts +1 -1
  508. package/dist/tier-engine/web/client-plugin.js +3 -2
  509. package/dist/tier-engine/web/index.d.ts +1 -1
  510. package/dist/user/index.d.ts +8 -8
  511. package/dist/user/invited-global-roles.d.ts +1 -1
  512. package/dist/user/principal-status.d.ts +1 -1
  513. package/dist/user/seeding.d.ts +1 -1
  514. package/dist/user/testing.d.ts +1 -1
  515. package/dist/user-data-rights/deletion-token.d.ts +1 -1
  516. package/dist/user-data-rights/feature.d.ts +5 -5
  517. package/dist/user-data-rights/handlers/request-deletion.write.d.ts +1 -1
  518. package/dist/user-data-rights/handlers/run-forget-cleanup.write.d.ts +3 -3
  519. package/dist/user-data-rights/index.d.ts +13 -13
  520. package/dist/user-data-rights/lib/default-mailers.d.ts +4 -4
  521. package/dist/user-data-rights/web/client-plugin.d.ts +1 -1
  522. package/dist/user-data-rights/web/index.d.ts +8 -8
  523. package/dist/user-data-rights-defaults/index.d.ts +11 -11
  524. package/dist/user-profile/index.d.ts +2 -2
  525. package/dist/user-profile/web/index.d.ts +2 -2
  526. package/dist/waitlist/constants.d.ts +9 -0
  527. package/dist/waitlist/constants.js +11 -0
  528. package/dist/waitlist/entity.d.ts +38 -6
  529. package/dist/waitlist/entity.js +4 -2
  530. package/dist/waitlist/entries-admin.d.ts +4 -0
  531. package/dist/waitlist/entries-admin.js +42 -0
  532. package/dist/waitlist/feature.d.ts +1 -1
  533. package/dist/waitlist/feature.js +16 -1
  534. package/dist/waitlist/handlers/export-purge.write.d.ts +12 -0
  535. package/dist/waitlist/handlers/export-purge.write.js +61 -0
  536. package/dist/waitlist/handlers/invite.write.d.ts +1 -1
  537. package/dist/waitlist/handlers/submit.write.d.ts +1 -1
  538. package/dist/waitlist/i18n.js +4 -0
  539. package/dist/waitlist/import.d.ts +24 -0
  540. package/dist/waitlist/import.js +51 -0
  541. package/dist/waitlist/index.d.ts +7 -5
  542. package/dist/waitlist/index.js +2 -0
  543. package/dist/waitlist/legacy-migrate.d.ts +27 -0
  544. package/dist/waitlist/legacy-migrate.js +173 -0
  545. package/dist/waitlist/lib.d.ts +2 -2
  546. package/dist/waitlist/link-on-signup.d.ts +3 -0
  547. package/dist/waitlist/link-on-signup.js +83 -0
  548. package/dist/waitlist/options.d.ts +11 -3
  549. package/dist/waitlist/payloads.d.ts +3 -0
  550. package/dist/waitlist/payloads.js +1 -0
  551. package/dist/workflow-runner/feature.d.ts +0 -4
  552. package/dist/workflow-runner/feature.js +0 -2
  553. package/dist/workflow-runner/index.d.ts +4 -4
  554. package/dist/workflow-runner/index.js +1 -1
  555. package/package.json +43 -27
  556. package/src/account-security/changes.json +8 -0
  557. package/src/auth-email-password/changes.json +6 -0
  558. package/src/auth-foundation/changes.json +8 -0
  559. package/src/auth-mfa/changes.json +6 -0
  560. package/src/auth-mfa-user-data/changes.json +10 -1
  561. package/src/billing-foundation/changes.json +8 -0
  562. package/src/cap-counter/changes.json +8 -0
  563. package/src/channel-email/changes.json +6 -0
  564. package/src/compliance-profiles-ops/changes.json +10 -0
  565. package/src/crypto-shredding/changes.json +6 -0
  566. package/src/custom-fields/changes.json +8 -0
  567. package/src/delivery/changes.json +6 -0
  568. package/src/derivatives-sharp/changes.json +8 -0
  569. package/src/document-ingest-foundation/changes.json +8 -0
  570. package/src/file-derivatives/changes.json +8 -0
  571. package/src/file-foundation/changes.json +8 -0
  572. package/src/file-provider-inmemory/changes.json +10 -1
  573. package/src/file-provider-s3/changes.json +22 -0
  574. package/src/folders/changes.json +8 -0
  575. package/src/folders-user-data/changes.json +10 -1
  576. package/src/form-draft/changes.json +8 -0
  577. package/src/form-draft-user-data/changes.json +10 -1
  578. package/src/foundation-shared/changes.json +8 -1
  579. package/src/host-routing/changes.json +8 -0
  580. package/src/inbound-mail-foundation/changes.json +8 -0
  581. package/src/inbound-provider-imap/changes.json +8 -0
  582. package/src/inbound-provider-inmemory/changes.json +10 -1
  583. package/src/ledger/changes.json +8 -0
  584. package/src/legal-pages/changes.json +6 -0
  585. package/src/mail-foundation/changes.json +10 -1
  586. package/src/mail-transport-inmemory/changes.json +10 -1
  587. package/src/mail-transport-smtp/changes.json +8 -0
  588. package/src/notes-history/changes.json +8 -0
  589. package/src/notes-history-user-data/changes.json +8 -0
  590. package/src/presets/changes.json +6 -0
  591. package/src/readiness/changes.json +10 -1
  592. package/src/secrets/changes.json +12 -0
  593. package/src/subscription-stripe/changes.json +6 -0
  594. package/src/tags/changes.json +8 -0
  595. package/src/template-resolver/changes.json +6 -0
  596. package/src/template-resolver-user-data/changes.json +10 -0
  597. package/src/tenant-settings/changes.json +10 -1
  598. package/src/tier-engine/changes.json +8 -0
  599. package/src/waitlist/changes.json +7 -0
  600. package/src/workflow-runner/changes.json +8 -0
  601. package/dist/file-provider-s3-env/index.d.ts +0 -8
  602. package/dist/file-provider-s3-env/index.js +0 -7
  603. package/dist/files-provider-s3/index.d.ts +0 -5
  604. package/dist/files-provider-s3/index.js +0 -5
  605. package/src/file-provider-s3-env/changes.json +0 -1
  606. package/src/files-provider-s3/changes.json +0 -1
@@ -0,0 +1,38 @@
1
+ import * as z from "zod";
2
+ /** S3-compatible endpoint URL: https, or http on a loopback host. */
3
+ export declare const s3EndpointSchema: z.ZodURL;
4
+ /** Builds the env block `createS3ProviderFromEnv(prefix)` reads, e.g.
5
+ * `createS3EnvSchema({ prefix: "RELEASES_S3_" })` for a second bucket.
6
+ * Every field is optional: an app that mounts the env provider next to
7
+ * another one picks the provider at runtime, and the provider reports
8
+ * missing credentials on its first file operation. */
9
+ export declare function createS3EnvSchema<const TPrefix extends string>(options: {
10
+ readonly prefix: TPrefix;
11
+ }): z.ZodObject<S3EnvShape<TPrefix> extends infer T ? { -readonly [P in keyof T]: T[P]; } : never, z.core.$strip>;
12
+ type OptionalString = z.ZodOptional<z.ZodString>;
13
+ type S3EnvShape<TPrefix extends string> = {
14
+ [Key in `${TPrefix}${"BUCKET" | "REGION" | "ACCESS_KEY" | "SECRET_KEY"}`]: OptionalString;
15
+ } & {
16
+ [Key in `${TPrefix}ENDPOINT`]: z.ZodOptional<z.ZodUnion<[
17
+ z.ZodPipe<z.ZodLiteral<"">, z.ZodTransform<undefined, "">>,
18
+ typeof s3EndpointSchema
19
+ ]>>;
20
+ } & {
21
+ [Key in `${TPrefix}FORCE_PATH_STYLE`]: z.ZodOptional<z.ZodEnum<{
22
+ true: "true";
23
+ false: "false";
24
+ }>>;
25
+ };
26
+ /** The `S3_*` block of the `"s3-env"` provider. */
27
+ export declare const s3EnvSchema: z.ZodObject<{
28
+ S3_ACCESS_KEY: OptionalString;
29
+ S3_BUCKET: OptionalString;
30
+ S3_ENDPOINT: z.ZodOptional<z.ZodUnion<[z.ZodPipe<z.ZodLiteral<"">, z.ZodTransform<undefined, "">>, z.ZodURL]>>;
31
+ S3_FORCE_PATH_STYLE: z.ZodOptional<z.ZodEnum<{
32
+ true: "true";
33
+ false: "false";
34
+ }>>;
35
+ S3_REGION: OptionalString;
36
+ S3_SECRET_KEY: OptionalString;
37
+ }, z.core.$strip>;
38
+ export {};
@@ -0,0 +1,51 @@
1
+ import * as z from "zod";
2
+ const LOOPBACK_HOSTNAMES = new Set(["localhost", "127.0.0.1", "[::1]"]);
3
+ // The bucket holds tenant files, so a remote endpoint must be https; plain
4
+ // http stays allowed for a loopback MinIO in dev and CI.
5
+ function isHttpsOrLoopbackHttp(value) {
6
+ if (!URL.canParse(value))
7
+ return false;
8
+ const url = new URL(value);
9
+ return url.protocol === "https:" || LOOPBACK_HOSTNAMES.has(url.hostname);
10
+ }
11
+ /** S3-compatible endpoint URL: https, or http on a loopback host. */
12
+ export const s3EndpointSchema = z
13
+ .url({ protocol: /^https?$/ })
14
+ .refine(isHttpsOrLoopbackHttp, "must use https unless the host is loopback");
15
+ /** Builds the env block `createS3ProviderFromEnv(prefix)` reads, e.g.
16
+ * `createS3EnvSchema({ prefix: "RELEASES_S3_" })` for a second bucket.
17
+ * Every field is optional: an app that mounts the env provider next to
18
+ * another one picks the provider at runtime, and the provider reports
19
+ * missing credentials on its first file operation. */
20
+ export function createS3EnvSchema(options) {
21
+ const { prefix } = options;
22
+ // @cast-boundary schema-walk — computed template keys widen to an index signature; the literal keys below are exactly the ones S3EnvShape names.
23
+ const shape = {
24
+ [`${prefix}BUCKET`]: z.string().min(1).optional().describe("S3 bucket."),
25
+ [`${prefix}REGION`]: z.string().min(1).optional().describe("S3 region."),
26
+ [`${prefix}ACCESS_KEY`]: z
27
+ .string()
28
+ .min(1)
29
+ .optional()
30
+ .describe("S3 access key id.")
31
+ .meta({ kumiko: { pulumi: { secret: true } } }),
32
+ [`${prefix}SECRET_KEY`]: z
33
+ .string()
34
+ .min(1)
35
+ .optional()
36
+ .describe("S3 secret access key.")
37
+ .meta({ kumiko: { pulumi: { secret: true } } }),
38
+ // An empty value (blank .env line) means "unset", same as the reader.
39
+ [`${prefix}ENDPOINT`]: z
40
+ .union([z.literal("").transform(() => undefined), s3EndpointSchema])
41
+ .optional()
42
+ .describe("S3-compatible endpoint (Hetzner, R2, MinIO). Default: AWS."),
43
+ [`${prefix}FORCE_PATH_STYLE`]: z
44
+ .enum(["true", "false"])
45
+ .optional()
46
+ .describe('Path-style bucket addressing ("true"), needed by MinIO and some S3 clones.'),
47
+ };
48
+ return z.object(shape);
49
+ }
50
+ /** The `S3_*` block of the `"s3-env"` provider. */
51
+ export const s3EnvSchema = createS3EnvSchema({ prefix: "S3_" });
@@ -1,4 +1,4 @@
1
- import { createFileProviderS3EnvFeature } from "./env-feature.js";
1
+ import { createFileProviderS3EnvFeature } from "./env-feature.ts";
2
2
  declare function createTenantConfigFileProviderS3Feature(): import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
3
3
  readonly exports: {
4
4
  configKeys: {
@@ -22,19 +22,6 @@ export declare function createFileProviderS3Feature(options?: {
22
22
  readonly fromEnv?: false;
23
23
  }): ReturnType<typeof createTenantConfigFileProviderS3Feature>;
24
24
  export declare function createFileProviderS3Feature(options: FileProviderS3FeatureOptions): ReturnType<typeof createFileProviderS3EnvFeature> | ReturnType<typeof createTenantConfigFileProviderS3Feature>;
25
- /** @deprecated Use createFileProviderS3Feature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
26
- export declare const fileProviderS3Feature: import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
27
- readonly exports: {
28
- configKeys: {
29
- readonly bucket: import("@cosmicdrift/kumiko-types/config").ConfigKeyHandle<"text">;
30
- readonly region: import("@cosmicdrift/kumiko-types/config").ConfigKeyHandle<"text">;
31
- readonly endpoint: import("@cosmicdrift/kumiko-types/config").ConfigKeyHandle<"text">;
32
- readonly forcePathStyle: import("@cosmicdrift/kumiko-types/config").ConfigKeyHandle<"boolean">;
33
- readonly accessKeyId: import("@cosmicdrift/kumiko-types/config").ConfigKeyHandle<"text">;
34
- };
35
- secretAccessKey: import("@cosmicdrift/kumiko-types/feature").SecretKeyHandle;
36
- };
37
- };
38
25
  /** Typed handle for the S3 secret-access-key. */
39
26
  export declare const S3_SECRET_ACCESS_KEY: import("@cosmicdrift/kumiko-types/feature").SecretKeyHandle;
40
27
  export {};
@@ -97,8 +97,6 @@ export function createFileProviderS3Feature(options = {}) {
97
97
  ? createFileProviderS3EnvFeature()
98
98
  : createTenantConfigFileProviderS3Feature();
99
99
  }
100
- /** @deprecated Use createFileProviderS3Feature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
101
- export const fileProviderS3Feature = createFileProviderS3Feature();
102
100
  // Typed config/secret handles are identical across instances, so one module-level instance serves them.
103
101
  const tenantConfigFeature = createTenantConfigFileProviderS3Feature();
104
102
  /** Typed handle for the S3 secret-access-key. */
@@ -1 +1,2 @@
1
- export { createFileProviderS3Feature, type FileProviderS3FeatureOptions, fileProviderS3Feature, S3_SECRET_ACCESS_KEY, } from "./feature.js";
1
+ export { createS3EnvSchema, s3EndpointSchema, s3EnvSchema } from "./env-schema.ts";
2
+ export { createFileProviderS3Feature, type FileProviderS3FeatureOptions, S3_SECRET_ACCESS_KEY, } from "./feature.ts";
@@ -1,2 +1,3 @@
1
1
  // Public API of the file-provider-s3 bundled-feature.
2
- export { createFileProviderS3Feature, fileProviderS3Feature, S3_SECRET_ACCESS_KEY, } from "./feature.js";
2
+ export { createS3EnvSchema, s3EndpointSchema, s3EnvSchema } from "./env-schema.js";
3
+ export { createFileProviderS3Feature, S3_SECRET_ACCESS_KEY, } from "./feature.js";
@@ -1,4 +1,4 @@
1
1
  import type { FileStorageProvider } from "@cosmicdrift/kumiko-framework/files";
2
- import { type S3ProviderConfig } from "./s3-provider.js";
2
+ import { type S3ProviderConfig } from "./s3-provider.ts";
3
3
  export declare function createS3ProviderFromEnv(prefix?: string): FileStorageProvider;
4
4
  export declare function parseS3EnvConfig(prefix: string): S3ProviderConfig;
@@ -1,3 +1,3 @@
1
- export { createS3ProviderFromEnv, parseS3EnvConfig } from "./env-helper.js";
2
- export type { S3ProviderConfig } from "./s3-provider.js";
3
- export { createS3Provider, resolveForcePathStyle } from "./s3-provider.js";
1
+ export { createS3ProviderFromEnv, parseS3EnvConfig } from "./env-helper.ts";
2
+ export type { S3ProviderConfig } from "./s3-provider.ts";
3
+ export { createS3Provider, resolveForcePathStyle } from "./s3-provider.ts";
@@ -1 +1 @@
1
- export { createFilesFeature, fileRefEntity } from "./feature.js";
1
+ export { createFilesFeature, fileRefEntity } from "./feature.ts";
@@ -1,5 +1,5 @@
1
1
  import { type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
2
  export declare const FILES_TENANT_DATA_FEATURE: "files-tenant-data";
3
3
  export declare function createFilesTenantDataFeature(): FeatureDefinition;
4
- export { sweepOrphanedDerivativesJob, sweepOrphanedDerivativesPayloadSchema, } from "./handlers/sweep-orphaned-derivatives.job.js";
5
- export { fileRefStorageDestroyHook, fileRefTenantDestroyHook } from "./hooks.js";
4
+ export { sweepOrphanedDerivativesJob, sweepOrphanedDerivativesPayloadSchema, } from "./handlers/sweep-orphaned-derivatives.job.ts";
5
+ export { fileRefStorageDestroyHook, fileRefTenantDestroyHook } from "./hooks.ts";
@@ -42,8 +42,4 @@ export type FoldersFeatureOptions = {
42
42
  readonly parents?: readonly string[];
43
43
  };
44
44
  export declare function createFoldersFeature(opts?: FoldersFeatureOptions): typeof defaultFoldersFeature;
45
- /** @deprecated Use createFoldersFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
46
- export declare const foldersFeature: import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
47
- readonly exports: void;
48
- };
49
45
  export {};
@@ -90,5 +90,3 @@ export function createFoldersFeature(opts = {}) {
90
90
  const access = resolveAccess(opts);
91
91
  return defineFeature(FOLDERS_FEATURE_NAME, (r) => registerFolders(r, access, opts.toggleable, opts.ownership, opts.parents));
92
92
  }
93
- /** @deprecated Use createFoldersFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
94
- export const foldersFeature = createFoldersFeature();
@@ -1,7 +1,7 @@
1
- export { folderAssignmentAggregateId } from "./aggregate-id.js";
2
- export { DEFAULT_FOLDER_ACCESS, DEFAULT_FOLDER_ROLES, FOLDER_SECTION_EXTENSION_NAME, FOLDERS_FEATURE_NAME, FoldersHandlers, FoldersQueries, } from "./constants.js";
3
- export { folderAssignmentEntity, folderEntity } from "./entity.js";
4
- export { createFoldersFeature, type FoldersFeatureOptions, foldersFeature, } from "./feature.js";
5
- export { clearFolderHandler, createClearFolderHandler } from "./handlers/clear-folder.write.js";
6
- export { createSetFolderHandler, setFolderHandler } from "./handlers/set-folder.write.js";
7
- export { type ClearFolderPayload, clearFolderPayloadSchema, type SetFolderPayload, setFolderPayloadSchema, } from "./schemas.js";
1
+ export { folderAssignmentAggregateId } from "./aggregate-id.ts";
2
+ export { DEFAULT_FOLDER_ACCESS, DEFAULT_FOLDER_ROLES, FOLDER_SECTION_EXTENSION_NAME, FOLDERS_FEATURE_NAME, FoldersHandlers, FoldersQueries, } from "./constants.ts";
3
+ export { folderAssignmentEntity, folderEntity } from "./entity.ts";
4
+ export { createFoldersFeature, type FoldersFeatureOptions, } from "./feature.ts";
5
+ export { clearFolderHandler, createClearFolderHandler } from "./handlers/clear-folder.write.ts";
6
+ export { createSetFolderHandler, setFolderHandler } from "./handlers/set-folder.write.ts";
7
+ export { type ClearFolderPayload, clearFolderPayloadSchema, type SetFolderPayload, setFolderPayloadSchema, } from "./schemas.ts";
@@ -1,7 +1,7 @@
1
1
  export { folderAssignmentAggregateId } from "./aggregate-id.js";
2
2
  export { DEFAULT_FOLDER_ACCESS, DEFAULT_FOLDER_ROLES, FOLDER_SECTION_EXTENSION_NAME, FOLDERS_FEATURE_NAME, FoldersHandlers, FoldersQueries, } from "./constants.js";
3
3
  export { folderAssignmentEntity, folderEntity } from "./entity.js";
4
- export { createFoldersFeature, foldersFeature, } from "./feature.js";
4
+ export { createFoldersFeature, } from "./feature.js";
5
5
  export { clearFolderHandler, createClearFolderHandler } from "./handlers/clear-folder.write.js";
6
6
  export { createSetFolderHandler, setFolderHandler } from "./handlers/set-folder.write.js";
7
7
  export { clearFolderPayloadSchema, setFolderPayloadSchema, } from "./schemas.js";
@@ -1,6 +1,6 @@
1
1
  import { type LucideIcon } from "lucide-react";
2
2
  import { type ReactNode } from "react";
3
- import { type FolderRow } from "./tree.js";
3
+ import { type FolderRow } from "./tree.ts";
4
4
  export type FolderLeaf = {
5
5
  readonly id: string;
6
6
  readonly label: string;
@@ -1,5 +1,5 @@
1
- export { FOLDER_SECTION_EXTENSION_NAME, FoldersHandlers, FoldersQueries } from "../constants.js";
2
- export { foldersClient } from "./client-plugin.js";
3
- export { type FolderFiling, type FolderLeaf, FolderManager } from "./folder-manager.js";
4
- export { FolderSection } from "./folder-section.js";
5
- export { buildFolderTree, type FolderNode, type FolderRow, folderPath } from "./tree.js";
1
+ export { FOLDER_SECTION_EXTENSION_NAME, FoldersHandlers, FoldersQueries } from "../constants.ts";
2
+ export { foldersClient } from "./client-plugin.tsx";
3
+ export { type FolderFiling, type FolderLeaf, FolderManager } from "./folder-manager.tsx";
4
+ export { FolderSection } from "./folder-section.tsx";
5
+ export { buildFolderTree, type FolderNode, type FolderRow, folderPath } from "./tree.ts";
@@ -1,7 +1,3 @@
1
1
  export declare function createFoldersUserDataFeature(): import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
2
2
  readonly exports: void;
3
3
  };
4
- /** @deprecated Use createFoldersUserDataFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
5
- export declare const foldersUserDataFeature: import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
6
- readonly exports: void;
7
- };
@@ -24,5 +24,3 @@ export function createFoldersUserDataFeature() {
24
24
  });
25
25
  }, { dedupeOptions: {} });
26
26
  }
27
- /** @deprecated Use createFoldersUserDataFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
28
- export const foldersUserDataFeature = createFoldersUserDataFeature();
@@ -1,7 +1,7 @@
1
1
  import type { DbConnection } from "@cosmicdrift/kumiko-framework/db";
2
2
  import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
4
- import type { FormDraftBlob } from "../../schemas.js";
4
+ import type { FormDraftBlob } from "../../schemas.ts";
5
5
  export type StaleDraftRow = {
6
6
  readonly id: string;
7
7
  readonly tenantId: TenantId;
@@ -1,7 +1,3 @@
1
1
  export declare function createFormDraftFeature(): import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
2
2
  readonly exports: void;
3
3
  };
4
- /** @deprecated Use createFormDraftFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
5
- export declare const formDraftFeature: import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
6
- readonly exports: void;
7
- };
@@ -44,5 +44,3 @@ function registerFormDraft(r) {
44
44
  export function createFormDraftFeature() {
45
45
  return defineFeature(FORM_DRAFT_FEATURE_NAME, registerFormDraft, { dedupeOptions: {} });
46
46
  }
47
- /** @deprecated Use createFormDraftFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
48
- export const formDraftFeature = createFormDraftFeature();
@@ -1,6 +1,6 @@
1
1
  import { type DbConnection } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { type AppContext, type ConfigKeyDefinition, type JobContext, type TenantId } from "@cosmicdrift/kumiko-framework/engine";
3
- import { type StaleDraftRow } from "../db/queries/cleanup.js";
3
+ import { type StaleDraftRow } from "../db/queries/cleanup.ts";
4
4
  export declare const FORM_DRAFT_RETENTION_DAYS_CONFIG_KEY = "form-draft:config:retention-days";
5
5
  export declare const FORM_DRAFT_DEFAULT_RETENTION_DAYS = 30;
6
6
  export declare const formDraftRetentionDaysConfig: ConfigKeyDefinition<"number">;
@@ -1,4 +1,4 @@
1
- import type { FormDraftBlob } from "../schemas.js";
1
+ import type { FormDraftBlob } from "../schemas.ts";
2
2
  export type GetDraftResult = {
3
3
  readonly draft: FormDraftBlob | null;
4
4
  };
@@ -1,10 +1,10 @@
1
- export { FORM_DRAFT_ACCESS, FORM_DRAFT_FEATURE_NAME, FORM_DRAFT_KEY_MAX_LENGTH, FORM_DRAFT_UNIQUE_KEY_CONSTRAINT, FormDraftHandlers, FormDraftQueries, } from "./constants.js";
2
- export { formDraftEntity } from "./entity.js";
3
- export { formDraftExecutor, formDraftTable } from "./executor.js";
4
- export { createFormDraftFeature, formDraftFeature } from "./feature.js";
5
- export { discardDraftWrite } from "./handlers/discard.write.js";
6
- export { type GetDraftResult, getDraftQuery } from "./handlers/get.query.js";
7
- export { type ListDraftsResult, listDraftsQuery } from "./handlers/list.query.js";
8
- export { saveDraftWrite } from "./handlers/save.write.js";
9
- export { type FormDraftRow, lookupDraft } from "./lookup.js";
10
- export { type DiscardDraftPayload, discardDraftPayloadSchema, type FormDraftBlob, formDraftBlobSchema, type GetDraftPayload, getDraftPayloadSchema, type ListDraftsPayload, listDraftsPayloadSchema, type SaveDraftPayload, saveDraftPayloadSchema, } from "./schemas.js";
1
+ export { FORM_DRAFT_ACCESS, FORM_DRAFT_FEATURE_NAME, FORM_DRAFT_KEY_MAX_LENGTH, FORM_DRAFT_UNIQUE_KEY_CONSTRAINT, FormDraftHandlers, FormDraftQueries, } from "./constants.ts";
2
+ export { formDraftEntity } from "./entity.ts";
3
+ export { formDraftExecutor, formDraftTable } from "./executor.ts";
4
+ export { createFormDraftFeature } from "./feature.ts";
5
+ export { discardDraftWrite } from "./handlers/discard.write.ts";
6
+ export { type GetDraftResult, getDraftQuery } from "./handlers/get.query.ts";
7
+ export { type ListDraftsResult, listDraftsQuery } from "./handlers/list.query.ts";
8
+ export { saveDraftWrite } from "./handlers/save.write.ts";
9
+ export { type FormDraftRow, lookupDraft } from "./lookup.ts";
10
+ export { type DiscardDraftPayload, discardDraftPayloadSchema, type FormDraftBlob, formDraftBlobSchema, type GetDraftPayload, getDraftPayloadSchema, type ListDraftsPayload, listDraftsPayloadSchema, type SaveDraftPayload, saveDraftPayloadSchema, } from "./schemas.ts";
@@ -1,7 +1,7 @@
1
1
  export { FORM_DRAFT_ACCESS, FORM_DRAFT_FEATURE_NAME, FORM_DRAFT_KEY_MAX_LENGTH, FORM_DRAFT_UNIQUE_KEY_CONSTRAINT, FormDraftHandlers, FormDraftQueries, } from "./constants.js";
2
2
  export { formDraftEntity } from "./entity.js";
3
3
  export { formDraftExecutor, formDraftTable } from "./executor.js";
4
- export { createFormDraftFeature, formDraftFeature } from "./feature.js";
4
+ export { createFormDraftFeature } from "./feature.js";
5
5
  export { discardDraftWrite } from "./handlers/discard.write.js";
6
6
  export { getDraftQuery } from "./handlers/get.query.js";
7
7
  export { listDraftsQuery } from "./handlers/list.query.js";
@@ -1,7 +1,7 @@
1
1
  import type { TenantDb } from "@cosmicdrift/kumiko-framework/db";
2
2
  import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import type { Temporal } from "@cosmicdrift/kumiko-types/temporal";
4
- import type { FormDraftBlob } from "./schemas.js";
4
+ import type { FormDraftBlob } from "./schemas.ts";
5
5
  export type FormDraftRow = {
6
6
  readonly id: string;
7
7
  readonly version: number;
@@ -1,4 +1,4 @@
1
- import type { FormDraftBlob } from "./schemas.js";
1
+ import type { FormDraftBlob } from "./schemas.ts";
2
2
  export declare function collectDraftFileRefKeys(draft: FormDraftBlob | null | undefined): readonly string[];
3
3
  export declare function releaseDraftFileRefs(keys: readonly string[], deleteBinary: (storageKey: string) => Promise<void>, log?: {
4
4
  warn(msg: string, data?: Record<string, unknown>): void;
@@ -1,7 +1,3 @@
1
1
  export declare function createFormDraftUserDataFeature(): import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
2
2
  readonly exports: void;
3
3
  };
4
- /** @deprecated Use createFormDraftUserDataFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
5
- export declare const formDraftUserDataFeature: import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
6
- readonly exports: void;
7
- };
@@ -17,5 +17,3 @@ export function createFormDraftUserDataFeature() {
17
17
  });
18
18
  }, { dedupeOptions: {} });
19
19
  }
20
- /** @deprecated Use createFormDraftUserDataFeature(). Run `bun kumiko-upgrade --apply`. Removed in the first release after 2026-10-29. */
21
- export const formDraftUserDataFeature = createFormDraftUserDataFeature();
@@ -0,0 +1,7 @@
1
+ import * as z from "zod";
2
+ /** `BUILD_VERSION`/`BUILD_TIME`, passed from the Dockerfile build args and
3
+ * served by the health and version routes ("dev"/"unknown" when unset). */
4
+ export declare const buildInfoEnvSchema: z.ZodObject<{
5
+ BUILD_VERSION: z.ZodOptional<z.ZodString>;
6
+ BUILD_TIME: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
@@ -0,0 +1,15 @@
1
+ import * as z from "zod";
2
+ /** `BUILD_VERSION`/`BUILD_TIME`, passed from the Dockerfile build args and
3
+ * served by the health and version routes ("dev"/"unknown" when unset). */
4
+ export const buildInfoEnvSchema = z.object({
5
+ BUILD_VERSION: z
6
+ .string()
7
+ .min(1)
8
+ .optional()
9
+ .describe("Release version baked into the image (git tag or sha). Default: dev."),
10
+ BUILD_TIME: z
11
+ .string()
12
+ .min(1)
13
+ .optional()
14
+ .describe("Image build timestamp (ISO 8601). Default: unknown."),
15
+ });
@@ -0,0 +1,12 @@
1
+ import * as z from "zod";
2
+ /** Logins seeded on first boot: the demo tenant admin and the SystemAdmin.
3
+ * The emails are required so a deploy never seeds an account nobody can
4
+ * reach; a missing password skips that seed. An app with other rules
5
+ * overrides single keys by spreading `.shape` before its own fields. */
6
+ export declare const demoAdminEnvSchema: z.ZodObject<{
7
+ DEMO_ADMIN_EMAIL: z.ZodEmail;
8
+ DEMO_ADMIN_PASSWORD: z.ZodOptional<z.ZodString>;
9
+ DEMO_SYSADMIN_EMAIL: z.ZodEmail;
10
+ DEMO_SYSADMIN_PASSWORD: z.ZodOptional<z.ZodString>;
11
+ DEMO_TENANT_ID: z.ZodOptional<z.ZodUUID>;
12
+ }, z.core.$strip>;
@@ -0,0 +1,21 @@
1
+ import * as z from "zod";
2
+ const SEED_PASSWORD_MIN_LENGTH = 16;
3
+ function seedPassword(description) {
4
+ return z
5
+ .string()
6
+ .min(SEED_PASSWORD_MIN_LENGTH)
7
+ .optional()
8
+ .describe(`${description} Generate with: openssl rand -hex 24`)
9
+ .meta({ kumiko: { pulumi: { generator: "openssl rand -hex 24", secret: true } } });
10
+ }
11
+ /** Logins seeded on first boot: the demo tenant admin and the SystemAdmin.
12
+ * The emails are required so a deploy never seeds an account nobody can
13
+ * reach; a missing password skips that seed. An app with other rules
14
+ * overrides single keys by spreading `.shape` before its own fields. */
15
+ export const demoAdminEnvSchema = z.object({
16
+ DEMO_ADMIN_EMAIL: z.email().describe("Login of the demo tenant admin seeded on first boot."),
17
+ DEMO_ADMIN_PASSWORD: seedPassword("Password of the seeded demo tenant admin."),
18
+ DEMO_SYSADMIN_EMAIL: z.email().describe("Login of the SystemAdmin seeded on first boot."),
19
+ DEMO_SYSADMIN_PASSWORD: seedPassword("Password of the seeded SystemAdmin."),
20
+ DEMO_TENANT_ID: z.uuid().optional().describe("Id of the seeded demo tenant. Default: generated."),
21
+ });
@@ -1,3 +1,5 @@
1
- export { requireDefined, requireNonEmpty, requireSecretSet } from "./config-helpers.js";
2
- export { isHostAllowlisted, readHostAllowlistFromEnv } from "./host-allowlist.js";
3
- export { BlockedHostError, HostResolutionError, MAIL_ALLOWED_PRIVATE_HOSTS_ENV_VAR, type MailConnectTarget, type MailHostGuardOptions, mailAllowedPrivateHostsEnvSchema, readAllowedPrivateMailHostsFromEnv, resolveMailConnectTarget, } from "./mail-host-policy.js";
1
+ export { buildInfoEnvSchema } from "./build-info-env.ts";
2
+ export { requireDefined, requireNonEmpty, requireSecretSet } from "./config-helpers.ts";
3
+ export { demoAdminEnvSchema } from "./demo-admin-env.ts";
4
+ export { isHostAllowlisted, readHostAllowlistFromEnv } from "./host-allowlist.ts";
5
+ export { BlockedHostError, HostResolutionError, MAIL_ALLOWED_PRIVATE_HOSTS_ENV_VAR, type MailConnectTarget, type MailHostGuardOptions, mailAllowedPrivateHostsEnvSchema, readAllowedPrivateMailHostsFromEnv, resolveMailConnectTarget, } from "./mail-host-policy.ts";
@@ -1,5 +1,7 @@
1
1
  // Public API of foundation-shared — utilities consumed by the per-tenant
2
2
  // Foundation packages (ai-foundation, mail-foundation, file-foundation).
3
+ export { buildInfoEnvSchema } from "./build-info-env.js";
3
4
  export { requireDefined, requireNonEmpty, requireSecretSet } from "./config-helpers.js";
5
+ export { demoAdminEnvSchema } from "./demo-admin-env.js";
4
6
  export { isHostAllowlisted, readHostAllowlistFromEnv } from "./host-allowlist.js";
5
7
  export { BlockedHostError, HostResolutionError, MAIL_ALLOWED_PRIVATE_HOSTS_ENV_VAR, mailAllowedPrivateHostsEnvSchema, readAllowedPrivateMailHostsFromEnv, resolveMailConnectTarget, } from "./mail-host-policy.js";
@@ -0,0 +1,8 @@
1
+ export declare const HOST_ROUTING_FEATURE = "host-routing";
2
+ export declare const HostRoutingQueries: {
3
+ readonly tenantKeyExists: "host-routing:query:tenant-key-exists";
4
+ };
5
+ export declare const TENANT_KEY_MAX_LENGTH = 50;
6
+ export declare const TENANT_KEY_PATTERN: RegExp;
7
+ export declare function isTenantKeyCandidate(value: string): boolean;
8
+ export declare function isPathTenantKeyCandidate(value: string): boolean;
@@ -0,0 +1,19 @@
1
+ export const HOST_ROUTING_FEATURE = "host-routing";
2
+ export const HostRoutingQueries = {
3
+ tenantKeyExists: `${HOST_ROUTING_FEATURE}:query:tenant-key-exists`,
4
+ };
5
+ // Matches tenant:write:create's key limit; keeps lookups for absurd keys out
6
+ // of the database.
7
+ export const TENANT_KEY_MAX_LENGTH = 50;
8
+ // A subdomain is one lowercase DNS label, so tenant keys outside this shape
9
+ // are only reachable in path mode.
10
+ export const TENANT_KEY_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,48}[a-z0-9])?$/;
11
+ export function isTenantKeyCandidate(value) {
12
+ return value.length <= TENANT_KEY_MAX_LENGTH && TENANT_KEY_PATTERN.test(value);
13
+ }
14
+ // Path mode takes any key made of unreserved URL characters, since the tenant
15
+ // feature itself only limits the length.
16
+ const PATH_TENANT_KEY_PATTERN = /^[A-Za-z0-9._~-]+$/;
17
+ export function isPathTenantKeyCandidate(value) {
18
+ return value.length <= TENANT_KEY_MAX_LENGTH && PATH_TENANT_KEY_PATTERN.test(value);
19
+ }
@@ -0,0 +1,24 @@
1
+ import type { PageHeadSystemQuery } from "@cosmicdrift/kumiko-headless/apex";
2
+ import type { HostRoutingOptions } from "./options.ts";
3
+ export type HostRoutingDispatchResult = {
4
+ readonly kind: "html";
5
+ readonly file: string;
6
+ readonly csp?: string;
7
+ } | {
8
+ readonly kind: "redirect";
9
+ readonly to: string;
10
+ readonly status?: 301 | 302;
11
+ } | {
12
+ readonly kind: "not-found";
13
+ readonly file?: string;
14
+ readonly csp?: string;
15
+ };
16
+ export type HostRoutingRequest = {
17
+ readonly host: string;
18
+ readonly path: string;
19
+ readonly search: string;
20
+ };
21
+ export type HostRoutingDispatchFn = (req: HostRoutingRequest, deps: {
22
+ readonly systemQuery: PageHeadSystemQuery;
23
+ }) => Promise<HostRoutingDispatchResult>;
24
+ export declare function createHostDispatch(options: HostRoutingOptions): HostRoutingDispatchFn;
@@ -0,0 +1,102 @@
1
+ import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
2
+ import { RateLimitError, ValidationError } from "@cosmicdrift/kumiko-framework/errors";
3
+ import * as z from "zod";
4
+ import { HostRoutingQueries, isPathTenantKeyCandidate, isTenantKeyCandidate } from "./constants.js";
5
+ import { classifyHost } from "./host.js";
6
+ import { validateHostRoutingOptions } from "./validate-options.js";
7
+ const tenantKeyExistsResultSchema = z.object({ exists: z.boolean() });
8
+ async function isTenantKeyKnown(systemQuery, key) {
9
+ let result;
10
+ try {
11
+ result = await systemQuery(HostRoutingQueries.tenantKeyExists, { key }, SYSTEM_TENANT_ID);
12
+ }
13
+ catch (error) {
14
+ if (error instanceof ValidationError)
15
+ return false;
16
+ // Over the rate limit every key looks the same: serve the tenant shell,
17
+ // which leaks nothing; the API behind it still resolves the tenant itself.
18
+ if (error instanceof RateLimitError)
19
+ return true;
20
+ throw error;
21
+ }
22
+ return tenantKeyExistsResultSchema.parse(result).exists;
23
+ }
24
+ function serve(surface, file = surface.file) {
25
+ return surface.csp === undefined
26
+ ? { kind: "html", file }
27
+ : { kind: "html", file, csp: surface.csp };
28
+ }
29
+ function notFound(surface) {
30
+ if (surface === undefined)
31
+ return { kind: "not-found" };
32
+ return surface.csp === undefined
33
+ ? { kind: "not-found", file: surface.file }
34
+ : { kind: "not-found", file: surface.file, csp: surface.csp };
35
+ }
36
+ // Redirect targets are always same-origin paths. Collapsing leading slashes
37
+ // and backslashes keeps "/de//evil.example" from turning into the
38
+ // protocol-relative "//evil.example".
39
+ function sameOriginPath(path) {
40
+ return `/${path.replace(/^[/\\]+/, "")}`;
41
+ }
42
+ function splitFirstSegment(path) {
43
+ const withoutLeading = path.replace(/^\/+/, "");
44
+ const slash = withoutLeading.indexOf("/");
45
+ if (slash === -1)
46
+ return { segment: withoutLeading, rest: "/" };
47
+ return { segment: withoutLeading.slice(0, slash), rest: withoutLeading.slice(slash) };
48
+ }
49
+ function apexPage(options, req) {
50
+ const { apex, locales } = options;
51
+ if (locales === undefined)
52
+ return serve(apex);
53
+ const { segment, rest } = splitFirstSegment(req.path);
54
+ if (segment === locales.default) {
55
+ return { kind: "redirect", to: `${sameOriginPath(rest)}${req.search}`, status: 301 };
56
+ }
57
+ const locale = locales.prefixed.includes(segment) ? segment : locales.default;
58
+ return serve(apex, apex.localeFiles?.[locale] ?? apex.file);
59
+ }
60
+ async function tenantPage(options, key, systemQuery) {
61
+ // No key (bare tenant prefix): the shell handles login and tenant choice.
62
+ if (key === null)
63
+ return serve(options.tenant);
64
+ const isCandidate = options.tenantBy === "path" ? isPathTenantKeyCandidate : isTenantKeyCandidate;
65
+ if (!isCandidate(key))
66
+ return notFound(options.unknownTenant);
67
+ return (await isTenantKeyKnown(systemQuery, key))
68
+ ? serve(options.tenant)
69
+ : notFound(options.unknownTenant);
70
+ }
71
+ function tenantKeyFromPath(prefix, path) {
72
+ if (path !== prefix && !path.startsWith(`${prefix}/`))
73
+ return undefined;
74
+ const { segment } = splitFirstSegment(path.slice(prefix.length));
75
+ return segment === "" ? null : segment;
76
+ }
77
+ // The routing decision for runProdApp's `hostDispatch` (and, via
78
+ // toDevHostDispatch, the dev server). Unknown hosts fail closed with 404.
79
+ export function createHostDispatch(options) {
80
+ validateHostRoutingOptions(options);
81
+ return async (req, { systemQuery }) => {
82
+ const host = classifyHost(req.host, options);
83
+ switch (host.kind) {
84
+ case "fixed":
85
+ return serve(host.surface);
86
+ case "unknown":
87
+ return notFound(undefined);
88
+ case "subdomain":
89
+ if (options.tenantBy !== "host")
90
+ return notFound(undefined);
91
+ return tenantPage(options, host.key, systemQuery);
92
+ case "apex": {
93
+ if (options.tenantBy === "path") {
94
+ const key = tenantKeyFromPath(options.tenantPathPrefix, req.path);
95
+ if (key !== undefined)
96
+ return tenantPage(options, key, systemQuery);
97
+ }
98
+ return apexPage(options, req);
99
+ }
100
+ }
101
+ };
102
+ }
@@ -0,0 +1,3 @@
1
+ import { type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
+ import type { HostRoutingOptions } from "./options.ts";
3
+ export declare function createHostRoutingFeature(options: HostRoutingOptions): FeatureDefinition;