@cosmicdrift/kumiko-bundled-features 0.377.0 → 0.379.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 (669) hide show
  1. package/dist/account-security/feature.js +2 -2
  2. package/dist/account-security/index.d.ts +2 -2
  3. package/dist/account-security/index.js +2 -2
  4. package/dist/account-security/{constants.js → web/constants.js} +0 -1
  5. package/dist/account-security/{i18n.js → web/i18n.js} +0 -1
  6. package/dist/admin-shell/feature.js +4 -3
  7. package/dist/admin-shell/index.d.ts +2 -2
  8. package/dist/admin-shell/index.js +2 -2
  9. package/dist/admin-shell/web/client-plugin.js +2 -3
  10. package/dist/admin-shell/{constants.js → web/constants.js} +0 -1
  11. package/dist/admin-shell/web/default-translations.d.ts +2 -0
  12. package/dist/admin-shell/web/default-translations.js +4 -0
  13. package/dist/admin-shell/web/i18n.d.ts +5 -2
  14. package/dist/admin-shell/web/i18n.js +50 -5
  15. package/dist/admin-shell/web/index.js +0 -1
  16. package/dist/audit/feature.js +58 -59
  17. package/dist/audit/handlers/audit-events.d.ts +102 -0
  18. package/dist/audit/handlers/audit-events.js +112 -0
  19. package/dist/audit/handlers/audit-system-db.d.ts +1 -0
  20. package/dist/audit/handlers/audit-system-db.js +9 -0
  21. package/dist/audit/handlers/details-all-tenants.query.d.ts +15 -0
  22. package/dist/audit/handlers/details-all-tenants.query.js +20 -0
  23. package/dist/audit/handlers/details.query.d.ts +2 -1
  24. package/dist/audit/handlers/details.query.js +8 -24
  25. package/dist/audit/handlers/list-all-tenants.query.d.ts +41 -0
  26. package/dist/audit/handlers/list-all-tenants.query.js +32 -0
  27. package/dist/audit/handlers/list.query.d.ts +2 -1
  28. package/dist/audit/handlers/list.query.js +9 -99
  29. package/dist/audit/handlers/resolve-audit-tenant.d.ts +3 -1
  30. package/dist/audit/handlers/resolve-audit-tenant.js +21 -7
  31. package/dist/audit/index.d.ts +1 -1
  32. package/dist/audit/index.js +1 -1
  33. package/dist/audit/run-escape-hatch-retention.js +1 -1
  34. package/dist/audit/screens.d.ts +65 -0
  35. package/dist/audit/screens.js +73 -0
  36. package/dist/audit/web/client-plugin.js +2 -3
  37. package/dist/audit/{constants.d.ts → web/constants.d.ts} +8 -0
  38. package/dist/audit/{constants.js → web/constants.js} +8 -1
  39. package/dist/audit/web/default-translations.d.ts +2 -0
  40. package/dist/audit/web/default-translations.js +3 -0
  41. package/dist/audit/web/i18n.d.ts +5 -2
  42. package/dist/audit/web/i18n.js +31 -4
  43. package/dist/audit/web/index.js +0 -1
  44. package/dist/auth-email-password/bootstrap.d.ts +1 -1
  45. package/dist/auth-email-password/bootstrap.js +4 -4
  46. package/dist/auth-email-password/errors.js +1 -1
  47. package/dist/auth-email-password/feature.js +2 -2
  48. package/dist/auth-email-password/handlers/confirm-account-unlock.write.js +1 -1
  49. package/dist/auth-email-password/handlers/invite-accept-with-login.write.js +1 -1
  50. package/dist/auth-email-password/handlers/invite-create.write.d.ts +1 -1
  51. package/dist/auth-email-password/handlers/invite-create.write.js +3 -3
  52. package/dist/auth-email-password/handlers/invite-info.query.js +1 -1
  53. package/dist/auth-email-password/handlers/login.write.d.ts +1 -0
  54. package/dist/auth-email-password/handlers/login.write.js +26 -1
  55. package/dist/auth-email-password/handlers/request-account-unlock.write.js +1 -1
  56. package/dist/auth-email-password/handlers/request-email-verification.write.js +1 -1
  57. package/dist/auth-email-password/handlers/request-password-reset.write.js +1 -1
  58. package/dist/auth-email-password/handlers/reset-password.write.js +1 -1
  59. package/dist/auth-email-password/handlers/verify-email.write.js +1 -1
  60. package/dist/auth-email-password/index.d.ts +1 -1
  61. package/dist/auth-email-password/index.js +1 -1
  62. package/dist/auth-email-password/mail-notifications.js +1 -1
  63. package/dist/auth-email-password/signup-activation.js +1 -1
  64. package/dist/auth-email-password/web/auth-client.js +0 -1
  65. package/dist/auth-email-password/web/auth-form-logic.js +0 -1
  66. package/dist/auth-email-password/web/auth-form-primitives.js +0 -1
  67. package/dist/auth-email-password/web/auth-gate.js +0 -1
  68. package/dist/auth-email-password/web/auth-redirect.js +0 -1
  69. package/dist/auth-email-password/web/client-actions.js +0 -1
  70. package/dist/auth-email-password/web/client-plugin.js +1 -2
  71. package/dist/auth-email-password/web/confirm-account-unlock-screen.js +0 -1
  72. package/dist/auth-email-password/{constants.js → web/constants.js} +3 -6
  73. package/dist/auth-email-password/web/default-topbar-actions.js +0 -1
  74. package/dist/auth-email-password/web/forgot-password-screen.js +0 -1
  75. package/dist/auth-email-password/{i18n.js → web/i18n.js} +3 -4
  76. package/dist/auth-email-password/web/index.d.ts +1 -1
  77. package/dist/auth-email-password/web/index.js +1 -2
  78. package/dist/auth-email-password/web/invite-accept-screen.d.ts +2 -2
  79. package/dist/auth-email-password/web/invite-accept-screen.js +0 -1
  80. package/dist/auth-email-password/web/login-screen.js +0 -1
  81. package/dist/auth-email-password/{mail-i18n.js → web/mail-i18n.js} +0 -1
  82. package/dist/auth-email-password/web/request-account-unlock-screen.js +0 -1
  83. package/dist/auth-email-password/web/reset-password-screen.js +0 -1
  84. package/dist/auth-email-password/web/session-bootstrap-error.js +0 -1
  85. package/dist/auth-email-password/web/session.js +0 -1
  86. package/dist/auth-email-password/web/signup-complete-screen.d.ts +2 -2
  87. package/dist/auth-email-password/web/signup-complete-screen.js +0 -1
  88. package/dist/auth-email-password/web/signup-screen.js +0 -1
  89. package/dist/auth-email-password/web/tenant-menu-items.js +0 -1
  90. package/dist/auth-email-password/web/tenant-switcher.js +0 -1
  91. package/dist/auth-email-password/web/use-shell-user.js +0 -1
  92. package/dist/auth-email-password/web/user-menu.js +0 -1
  93. package/dist/auth-email-password/web/verify-email-screen.js +0 -1
  94. package/dist/auth-mfa/errors.d.ts +1 -1
  95. package/dist/auth-mfa/errors.js +2 -2
  96. package/dist/auth-mfa/handlers/enable-confirm-preauth.write.js +1 -1
  97. package/dist/auth-mfa/handlers/enable-start-preauth.write.js +1 -1
  98. package/dist/auth-mfa/handlers/enable-start.write.js +1 -1
  99. package/dist/auth-mfa/handlers/verify.write.js +1 -1
  100. package/dist/auth-mfa/index.d.ts +1 -1
  101. package/dist/auth-mfa/index.js +1 -1
  102. package/dist/auth-mfa/mfa-status-checker.js +1 -1
  103. package/dist/auth-mfa/screens.js +1 -1
  104. package/dist/auth-mfa/web/client-plugin.js +0 -1
  105. package/dist/auth-mfa/{constants.js → web/constants.js} +0 -1
  106. package/dist/auth-mfa/web/i18n.js +0 -1
  107. package/dist/auth-mfa/web/index.js +0 -1
  108. package/dist/auth-mfa/web/mfa-client.js +0 -1
  109. package/dist/auth-mfa/web/mfa-disable-dialog.js +1 -2
  110. package/dist/auth-mfa/web/mfa-recovery-codes-reveal.js +0 -1
  111. package/dist/auth-mfa/web/mfa-regenerate-recovery-dialog.js +1 -2
  112. package/dist/auth-mfa/web/mfa-setup-preauth-screen.js +11 -18
  113. package/dist/auth-mfa/web/mfa-verify-screen.js +0 -1
  114. package/dist/billing-foundation/checkout-core.js +1 -1
  115. package/dist/billing-foundation/consumer-protection/consent-text.d.ts +2 -2
  116. package/dist/billing-foundation/consumer-protection/consent-text.js +1 -1
  117. package/dist/billing-foundation/consumer-protection/issue-confirmation.js +7 -3
  118. package/dist/billing-foundation/consumer-protection/mail-notifications.js +3 -1
  119. package/dist/billing-foundation/consumer-protection/register-consent.js +1 -1
  120. package/dist/billing-foundation/consumer-protection/register-termination.js +8 -2
  121. package/dist/billing-foundation/consumer-protection/stored-user-email.d.ts +1 -0
  122. package/dist/billing-foundation/consumer-protection/stored-user-email.js +8 -0
  123. package/dist/billing-foundation/consumer-protection/termination-mail.d.ts +5 -1
  124. package/dist/billing-foundation/consumer-protection/termination-mail.js +3 -1
  125. package/dist/billing-foundation/consumer-protection/termination-notify.js +1 -1
  126. package/dist/billing-foundation/consumer-protection/termination-pages.js +109 -15
  127. package/dist/billing-foundation/consumer-protection/termination-record.d.ts +8 -1
  128. package/dist/billing-foundation/consumer-protection/termination-record.js +76 -3
  129. package/dist/billing-foundation/consumer-protection/termination-request.js +33 -6
  130. package/dist/billing-foundation/consumer-protection/termination-revoke.d.ts +28 -0
  131. package/dist/billing-foundation/consumer-protection/termination-revoke.js +149 -0
  132. package/dist/billing-foundation/consumer-protection/termination-texts.d.ts +17 -1
  133. package/dist/billing-foundation/consumer-protection/termination-texts.js +39 -0
  134. package/dist/billing-foundation/events.d.ts +9 -0
  135. package/dist/billing-foundation/events.js +14 -2
  136. package/dist/billing-foundation/feature.js +1 -1
  137. package/dist/billing-foundation/handlers/process-event.write.d.ts +5 -1
  138. package/dist/billing-foundation/handlers/process-event.write.js +57 -3
  139. package/dist/billing-foundation/handlers/switch-plan.write.js +1 -1
  140. package/dist/billing-foundation/handlers/sync-subscription.write.js +1 -1
  141. package/dist/billing-foundation/index.d.ts +2 -2
  142. package/dist/billing-foundation/index.js +2 -2
  143. package/dist/billing-foundation/plan-catalog.js +1 -1
  144. package/dist/billing-foundation/screens.js +1 -1
  145. package/dist/billing-foundation/subscription-tier-sync.js +1 -1
  146. package/dist/billing-foundation/types.d.ts +14 -2
  147. package/dist/billing-foundation/types.js +1 -1
  148. package/dist/billing-foundation/validate-options.js +3 -3
  149. package/dist/billing-foundation/web/billing-contact-plan.js +1 -2
  150. package/dist/billing-foundation/web/billing-plans-panel.js +1 -2
  151. package/dist/billing-foundation/web/cancel-contract-dialog.js +1 -2
  152. package/dist/billing-foundation/web/checkout-consent-dialog.js +1 -2
  153. package/dist/billing-foundation/web/client-plugin.js +1 -1
  154. package/dist/billing-foundation/{constants.d.ts → web/constants.d.ts} +21 -14
  155. package/dist/billing-foundation/{constants.js → web/constants.js} +35 -31
  156. package/dist/billing-foundation/{consumer-protection → web/consumer-protection}/consent-locale.js +0 -1
  157. package/dist/billing-foundation/{contact-card.js → web/contact-card.js} +0 -1
  158. package/dist/billing-foundation/web/index.d.ts +2 -2
  159. package/dist/billing-foundation/web/index.js +2 -3
  160. package/dist/billing-foundation/web/localized-params.js +0 -1
  161. package/dist/billing-foundation/webhook-handler.js +4 -1
  162. package/dist/cap-counter/stock-cap-guard.js +8 -0
  163. package/dist/cap-overview/feature.js +1 -1
  164. package/dist/cap-overview/handlers/caps-usage.query.js +1 -1
  165. package/dist/cap-overview/handlers/tenant-caps-list.query.js +2 -2
  166. package/dist/cap-overview/index.d.ts +2 -2
  167. package/dist/cap-overview/index.js +2 -2
  168. package/dist/cap-overview/screens.js +1 -1
  169. package/dist/cap-overview/web/cap-cards-panel.js +1 -1
  170. package/dist/cap-overview/web/cap-usage-bar.js +1 -2
  171. package/dist/cap-overview/web/client-plugin.js +1 -1
  172. package/dist/cap-overview/{constants.js → web/constants.js} +0 -1
  173. package/dist/cap-overview/web/index.js +0 -1
  174. package/dist/cap-overview/{usage-math.d.ts → web/usage-math.d.ts} +1 -1
  175. package/dist/compliance-profiles/feature.js +1 -1
  176. package/dist/compliance-profiles/index.d.ts +1 -1
  177. package/dist/compliance-profiles/index.js +1 -1
  178. package/dist/compliance-profiles/web/client-plugin.js +1 -2
  179. package/dist/compliance-profiles/web/compliance-profile-catalog.js +1 -2
  180. package/dist/compliance-profiles/{constants.js → web/constants.js} +0 -1
  181. package/dist/compliance-profiles/web/index.js +0 -1
  182. package/dist/config/index.d.ts +1 -1
  183. package/dist/config/index.js +1 -1
  184. package/dist/config/web/client-plugin.d.ts +1 -1
  185. package/dist/config/web/client-plugin.js +1 -2
  186. package/dist/config/{constants.js → web/constants.js} +0 -1
  187. package/dist/config/web/i18n.js +1 -1
  188. package/dist/config/web/index.d.ts +1 -1
  189. package/dist/config/web/index.js +1 -2
  190. package/dist/config/write-helpers.js +1 -1
  191. package/dist/custom-fields/feature.js +1 -1
  192. package/dist/custom-fields/handlers/clear-custom-field.write.js +1 -1
  193. package/dist/custom-fields/handlers/define-tenant-field.write.js +1 -1
  194. package/dist/custom-fields/handlers/delete-system-field.write.js +1 -1
  195. package/dist/custom-fields/handlers/delete-tenant-field.write.js +1 -1
  196. package/dist/custom-fields/handlers/set-custom-field.write.js +1 -1
  197. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  198. package/dist/custom-fields/index.d.ts +1 -1
  199. package/dist/custom-fields/index.js +1 -1
  200. package/dist/custom-fields/lib/value-schema.js +1 -1
  201. package/dist/custom-fields/schemas.js +1 -1
  202. package/dist/custom-fields/web/client-plugin.js +1 -2
  203. package/dist/custom-fields/{constants.js → web/constants.js} +18 -19
  204. package/dist/custom-fields/web/custom-fields-form-section.js +1 -2
  205. package/dist/custom-fields/web/i18n.js +0 -1
  206. package/dist/custom-fields/web/index.d.ts +1 -1
  207. package/dist/custom-fields/web/index.js +1 -2
  208. package/dist/custom-fields/wire-for-entity.js +1 -1
  209. package/dist/delivery/address-opt-out.js +1 -1
  210. package/dist/delivery/attempt-log-retention.js +21 -3
  211. package/dist/delivery/constants.d.ts +1 -1
  212. package/dist/delivery/constants.js +2 -2
  213. package/dist/delivery/i18n.js +1 -1
  214. package/dist/delivery/unsubscribe-page.js +1 -1
  215. package/dist/delivery/web/client-plugin.js +1 -1
  216. package/dist/delivery/web/delivery-channel-cell.js +0 -1
  217. package/dist/delivery/web/delivery-error-cell.js +0 -1
  218. package/dist/delivery/web/delivery-status-cell.js +1 -2
  219. package/dist/delivery/web/delivery-time-cell.js +0 -1
  220. package/dist/delivery/web/delivery-type-cell.js +0 -1
  221. package/dist/delivery/web/index.js +0 -1
  222. package/dist/delivery/{public-names.js → web/public-names.js} +0 -1
  223. package/dist/document-ingest-foundation/events.d.ts +1 -0
  224. package/dist/document-ingest-foundation/events.js +3 -0
  225. package/dist/document-ingest-foundation/executor.js +2 -1
  226. package/dist/document-ingest-foundation/feature.js +16 -5
  227. package/dist/document-ingest-foundation/index.d.ts +1 -1
  228. package/dist/document-ingest-foundation/index.js +1 -1
  229. package/dist/feature-toggles/feature.d.ts +1 -1
  230. package/dist/feature-toggles/feature.js +2 -2
  231. package/dist/feature-toggles/handlers/list.query.js +1 -1
  232. package/dist/feature-toggles/handlers/registered.query.js +1 -1
  233. package/dist/feature-toggles/handlers/set.write.js +1 -1
  234. package/dist/feature-toggles/index.d.ts +1 -1
  235. package/dist/feature-toggles/index.js +1 -1
  236. package/dist/feature-toggles/web/client-plugin.js +1 -2
  237. package/dist/feature-toggles/{constants.js → web/constants.js} +0 -1
  238. package/dist/feature-toggles/web/index.js +0 -1
  239. package/dist/folders/feature.js +1 -1
  240. package/dist/folders/handlers/clear-folder.write.js +1 -1
  241. package/dist/folders/handlers/delete-folder.write.js +1 -1
  242. package/dist/folders/handlers/set-folder.write.js +1 -1
  243. package/dist/folders/index.d.ts +1 -1
  244. package/dist/folders/index.js +1 -1
  245. package/dist/folders/web/client-plugin.js +1 -2
  246. package/dist/folders/{constants.js → web/constants.js} +0 -1
  247. package/dist/folders/web/folder-manager.js +1 -2
  248. package/dist/folders/web/folder-section.js +1 -2
  249. package/dist/folders/web/i18n.js +0 -1
  250. package/dist/folders/web/index.d.ts +1 -1
  251. package/dist/folders/web/index.js +1 -2
  252. package/dist/folders/web/tree.js +0 -1
  253. package/dist/form-draft/db/queries/cleanup.d.ts +3 -2
  254. package/dist/form-draft/db/queries/cleanup.js +18 -9
  255. package/dist/form-draft/decrypt-draft.d.ts +2 -0
  256. package/dist/form-draft/decrypt-draft.js +19 -0
  257. package/dist/form-draft/entity.js +6 -9
  258. package/dist/form-draft/feature.js +1 -1
  259. package/dist/form-draft/handlers/cleanup.job.d.ts +1 -0
  260. package/dist/form-draft/handlers/cleanup.job.js +17 -4
  261. package/dist/form-draft/handlers/discard.write.js +1 -1
  262. package/dist/form-draft/handlers/get.query.js +6 -7
  263. package/dist/form-draft/handlers/list.query.js +11 -7
  264. package/dist/form-draft/handlers/save.write.js +1 -1
  265. package/dist/form-draft/index.d.ts +1 -1
  266. package/dist/form-draft/index.js +1 -1
  267. package/dist/form-draft/lookup.d.ts +2 -2
  268. package/dist/form-draft/lookup.js +7 -2
  269. package/dist/form-draft/schemas.js +1 -1
  270. package/dist/form-draft/{constants.js → web/constants.js} +0 -1
  271. package/dist/form-draft-user-data/hooks.js +2 -2
  272. package/dist/inbound-mail-foundation/handlers/list-accounts.query.d.ts +1 -1
  273. package/dist/inbound-mail-foundation/handlers/list-accounts.query.js +11 -3
  274. package/dist/inbound-mail-foundation/retention-sweep.js +7 -5
  275. package/dist/jobs/feature.js +2 -2
  276. package/dist/jobs/handlers/retry.write.js +1 -1
  277. package/dist/jobs/handlers/trigger.write.js +1 -1
  278. package/dist/jobs/index.d.ts +1 -1
  279. package/dist/jobs/index.js +1 -1
  280. package/dist/jobs/web/client-plugin.js +2 -3
  281. package/dist/jobs/{constants.js → web/constants.js} +0 -1
  282. package/dist/jobs/web/default-translations.d.ts +2 -0
  283. package/dist/jobs/web/default-translations.js +3 -0
  284. package/dist/jobs/web/i18n.d.ts +5 -2
  285. package/dist/jobs/web/i18n.js +51 -4
  286. package/dist/jobs/web/index.js +0 -1
  287. package/dist/ledger/entity.d.ts +1 -1
  288. package/dist/ledger/entity.js +1 -1
  289. package/dist/ledger/feature.js +1 -1
  290. package/dist/ledger/handlers/confirm-schedule-period.write.js +2 -5
  291. package/dist/ledger/handlers/create-transaction.write.js +1 -1
  292. package/dist/ledger/handlers/reports.query.js +1 -1
  293. package/dist/ledger/handlers/reverse-transaction.write.js +1 -1
  294. package/dist/ledger/index.d.ts +1 -1
  295. package/dist/ledger/index.js +1 -1
  296. package/dist/ledger/recurring.d.ts +1 -1
  297. package/dist/ledger/reports.d.ts +1 -1
  298. package/dist/ledger/schemas.js +1 -1
  299. package/dist/ledger/{constants.js → web/constants.js} +0 -1
  300. package/dist/ledger/web/index.d.ts +1 -1
  301. package/dist/ledger/web/index.js +1 -2
  302. package/dist/legal-pages/feature.d.ts +1 -1
  303. package/dist/legal-pages/feature.js +1 -1
  304. package/dist/legal-pages/index.d.ts +1 -1
  305. package/dist/legal-pages/index.js +1 -1
  306. package/dist/legal-pages/lib/boot-check.d.ts +1 -1
  307. package/dist/legal-pages/lib/boot-check.js +1 -1
  308. package/dist/legal-pages/lib/validate-routes.d.ts +1 -1
  309. package/dist/legal-pages/web/client-plugin.js +1 -2
  310. package/dist/legal-pages/{constants.js → web/constants.js} +6 -8
  311. package/dist/legal-pages/web/index.js +0 -1
  312. package/dist/mail-foundation/i18n.d.ts +5 -2
  313. package/dist/mail-foundation/i18n.js +3 -2
  314. package/dist/mail-transport-smtp/i18n.d.ts +1 -1
  315. package/dist/mail-transport-smtp/i18n.js +1 -1
  316. package/dist/managed-pages/feature.js +1 -1
  317. package/dist/managed-pages/web/client-plugin.js +1 -2
  318. package/dist/managed-pages/web/default-translations.d.ts +2 -0
  319. package/dist/managed-pages/web/default-translations.js +11 -0
  320. package/dist/managed-pages/web/i18n.d.ts +5 -2
  321. package/dist/managed-pages/web/i18n.js +53 -12
  322. package/dist/managed-pages/web/index.d.ts +1 -1
  323. package/dist/managed-pages/web/index.js +1 -2
  324. package/dist/metrics/compute.d.ts +1 -1
  325. package/dist/metrics/compute.js +1 -1
  326. package/dist/metrics/feature.js +1 -1
  327. package/dist/metrics/index.d.ts +1 -1
  328. package/dist/metrics/index.js +1 -1
  329. package/dist/metrics/types.d.ts +1 -1
  330. package/dist/metrics/validate.js +1 -1
  331. package/dist/metrics/{constants.js → web/constants.js} +0 -1
  332. package/dist/metrics/window.d.ts +1 -1
  333. package/dist/notes-history/feature.js +1 -1
  334. package/dist/notes-history/handlers/add-note.write.js +1 -1
  335. package/dist/notes-history/index.d.ts +1 -1
  336. package/dist/notes-history/index.js +1 -1
  337. package/dist/notes-history/web/client-plugin.js +1 -2
  338. package/dist/notes-history/{constants.js → web/constants.js} +0 -1
  339. package/dist/notes-history/web/i18n.js +0 -1
  340. package/dist/notes-history/web/index.d.ts +1 -1
  341. package/dist/notes-history/web/index.js +1 -2
  342. package/dist/notes-history/web/notes-section.js +2 -3
  343. package/dist/personal-access-tokens/feature.d.ts +2 -2
  344. package/dist/personal-access-tokens/feature.js +6 -4
  345. package/dist/personal-access-tokens/handlers/available-scopes.query.d.ts +1 -1
  346. package/dist/personal-access-tokens/handlers/create.write.js +1 -1
  347. package/dist/personal-access-tokens/handlers/revoke.write.js +1 -1
  348. package/dist/personal-access-tokens/hash.js +1 -1
  349. package/dist/personal-access-tokens/i18n.d.ts +1 -1
  350. package/dist/personal-access-tokens/i18n.js +1 -1
  351. package/dist/personal-access-tokens/index.d.ts +5 -5
  352. package/dist/personal-access-tokens/index.js +3 -3
  353. package/dist/personal-access-tokens/resolver.d.ts +1 -1
  354. package/dist/personal-access-tokens/resolver.js +1 -1
  355. package/dist/personal-access-tokens/schema/api-token.js +1 -1
  356. package/dist/personal-access-tokens/screens.d.ts +1 -1
  357. package/dist/personal-access-tokens/screens.js +1 -1
  358. package/dist/personal-access-tokens/{constants.js → web/constants.js} +0 -1
  359. package/dist/presets/index.d.ts +0 -1
  360. package/dist/presets/index.js +0 -1
  361. package/dist/presets/security-baseline.d.ts +1 -1
  362. package/dist/presets/security-baseline.js +1 -1
  363. package/dist/secrets/feature.js +1 -1
  364. package/dist/secrets/handlers/delete.write.js +1 -1
  365. package/dist/secrets/handlers/list.query.js +1 -1
  366. package/dist/secrets/handlers/set.write.js +1 -1
  367. package/dist/secrets/i18n.js +1 -1
  368. package/dist/secrets/index.d.ts +1 -1
  369. package/dist/secrets/index.js +1 -1
  370. package/dist/secrets/{constants.js → web/constants.js} +0 -1
  371. package/dist/secrets/write-gate.js +1 -1
  372. package/dist/sessions/feature.js +7 -4
  373. package/dist/sessions/{i18n.js → web/i18n.js} +0 -1
  374. package/dist/shared/index.d.ts +1 -1
  375. package/dist/shared/index.js +1 -1
  376. package/dist/shared/purge-files-reaching-subject.js +7 -3
  377. package/dist/subscription-stripe/feature.js +2 -1
  378. package/dist/subscription-stripe/plugin-methods.d.ts +3 -0
  379. package/dist/subscription-stripe/plugin-methods.js +14 -0
  380. package/dist/subscription-stripe/verify-webhook.js +1 -0
  381. package/dist/tags/feature.js +1 -1
  382. package/dist/tags/handlers/assign-tag.write.js +11 -7
  383. package/dist/tags/handlers/create-tag.write.js +1 -1
  384. package/dist/tags/handlers/delete-tag.write.js +4 -1
  385. package/dist/tags/handlers/remove-tag.write.js +1 -1
  386. package/dist/tags/handlers/update-tag.write.js +1 -1
  387. package/dist/tags/index.d.ts +1 -1
  388. package/dist/tags/index.js +1 -1
  389. package/dist/tags/screens.js +1 -1
  390. package/dist/tags/web/client-plugin.js +1 -2
  391. package/dist/tags/{constants.d.ts → web/constants.d.ts} +1 -0
  392. package/dist/tags/{constants.js → web/constants.js} +3 -1
  393. package/dist/tags/web/entity-tags.js +1 -2
  394. package/dist/tags/web/i18n.js +2 -2
  395. package/dist/tags/web/index.d.ts +1 -1
  396. package/dist/tags/web/index.js +1 -2
  397. package/dist/tags/web/tag-filter.js +1 -2
  398. package/dist/tags/web/tag-manager.js +5 -4
  399. package/dist/tags/web/tag-picker.js +0 -1
  400. package/dist/tags/web/tag-section.js +1 -2
  401. package/dist/tags/web/tags-cell.js +1 -2
  402. package/dist/template-resolver/api.d.ts +21 -23
  403. package/dist/template-resolver/api.js +34 -6
  404. package/dist/template-resolver/compile-document-body.d.ts +3 -0
  405. package/dist/template-resolver/compile-document-body.js +51 -4
  406. package/dist/template-resolver/compile-steps-block.js +2 -2
  407. package/dist/template-resolver/document-ops.d.ts +1 -1
  408. package/dist/template-resolver/document-ops.js +3 -3
  409. package/dist/template-resolver/document-sanitizer.d.ts +2 -2
  410. package/dist/template-resolver/document-sanitizer.js +23 -3
  411. package/dist/template-resolver/feature.d.ts +11 -0
  412. package/dist/template-resolver/feature.js +68 -35
  413. package/dist/template-resolver/handlers/by-slug.query.js +6 -1
  414. package/dist/template-resolver/handlers/by-tenant.query.js +6 -2
  415. package/dist/template-resolver/handlers/collection-item.query.js +2 -1
  416. package/dist/template-resolver/handlers/collection-list.query.js +2 -1
  417. package/dist/template-resolver/handlers/collection-set.write.d.ts +2 -1
  418. package/dist/template-resolver/handlers/collection-set.write.js +15 -3
  419. package/dist/template-resolver/handlers/collection-shared.d.ts +1 -2
  420. package/dist/template-resolver/handlers/collection-shared.js +0 -4
  421. package/dist/template-resolver/handlers/copy-locale.write.d.ts +2 -1
  422. package/dist/template-resolver/handlers/copy-locale.write.js +69 -65
  423. package/dist/template-resolver/handlers/diff-to-system.query.js +5 -1
  424. package/dist/template-resolver/handlers/discard-draft.write.d.ts +3 -2
  425. package/dist/template-resolver/handlers/discard-draft.write.js +19 -7
  426. package/dist/template-resolver/handlers/document-base.d.ts +1 -1
  427. package/dist/template-resolver/handlers/document-base.js +6 -1
  428. package/dist/template-resolver/handlers/document-blocks.query.d.ts +1 -1
  429. package/dist/template-resolver/handlers/document-blocks.query.js +2 -2
  430. package/dist/template-resolver/handlers/export-bundle.query.js +5 -2
  431. package/dist/template-resolver/handlers/find-by-id.query.js +4 -2
  432. package/dist/template-resolver/handlers/import-bundle.write.d.ts +2 -1
  433. package/dist/template-resolver/handlers/import-bundle.write.js +30 -25
  434. package/dist/template-resolver/handlers/layout-source.query.js +5 -5
  435. package/dist/template-resolver/handlers/list.query.js +5 -2
  436. package/dist/template-resolver/handlers/overview.query.d.ts +12 -3
  437. package/dist/template-resolver/handlers/overview.query.js +87 -51
  438. package/dist/template-resolver/handlers/patch-draft.write.d.ts +2 -1
  439. package/dist/template-resolver/handlers/patch-draft.write.js +93 -87
  440. package/dist/template-resolver/handlers/reset-to-system.write.d.ts +2 -1
  441. package/dist/template-resolver/handlers/reset-to-system.write.js +51 -44
  442. package/dist/template-resolver/handlers/resource-link-pdf.write.d.ts +2 -1
  443. package/dist/template-resolver/handlers/resource-link-pdf.write.js +34 -28
  444. package/dist/template-resolver/handlers/resource-remove.write.d.ts +2 -1
  445. package/dist/template-resolver/handlers/resource-remove.write.js +39 -33
  446. package/dist/template-resolver/handlers/resource-shared.js +1 -1
  447. package/dist/template-resolver/handlers/resource-upload.write.d.ts +2 -1
  448. package/dist/template-resolver/handlers/resource-upload.write.js +105 -97
  449. package/dist/template-resolver/handlers/send-test-shared.d.ts +5 -0
  450. package/dist/template-resolver/handlers/send-test-shared.js +19 -0
  451. package/dist/template-resolver/handlers/send-test-status.query.d.ts +9 -0
  452. package/dist/template-resolver/handlers/send-test-status.query.js +18 -0
  453. package/dist/template-resolver/handlers/send-test.write.d.ts +2 -1
  454. package/dist/template-resolver/handlers/send-test.write.js +89 -91
  455. package/dist/template-resolver/handlers/set.write.d.ts +2 -1
  456. package/dist/template-resolver/handlers/set.write.js +95 -91
  457. package/dist/template-resolver/handlers/shared.js +1 -1
  458. package/dist/template-resolver/handlers/template-gates.d.ts +1 -1
  459. package/dist/template-resolver/handlers/template-gates.js +1 -1
  460. package/dist/template-resolver/handlers/template-write.d.ts +1 -1
  461. package/dist/template-resolver/handlers/template-write.js +1 -1
  462. package/dist/template-resolver/handlers/toggle-status.write.d.ts +6 -7
  463. package/dist/template-resolver/handlers/toggle-status.write.js +28 -10
  464. package/dist/template-resolver/handlers/upsert-tenant.write.d.ts +2 -1
  465. package/dist/template-resolver/handlers/upsert-tenant.write.js +30 -24
  466. package/dist/template-resolver/handlers/usage.query.js +3 -2
  467. package/dist/template-resolver/handlers/validate.query.d.ts +1 -1
  468. package/dist/template-resolver/handlers/validate.query.js +3 -1
  469. package/dist/template-resolver/i18n.d.ts +3 -0
  470. package/dist/template-resolver/i18n.js +24 -0
  471. package/dist/template-resolver/index.d.ts +8 -5
  472. package/dist/template-resolver/index.js +6 -4
  473. package/dist/template-resolver/layout-appearance.js +1 -1
  474. package/dist/template-resolver/layout-regions.d.ts +1 -1
  475. package/dist/template-resolver/seeding.d.ts +4 -1
  476. package/dist/template-resolver/seeding.js +13 -7
  477. package/dist/template-resolver/store-template-resource.js +2 -2
  478. package/dist/template-resolver/table.js +1 -1
  479. package/dist/template-resolver/template-bundle.js +2 -2
  480. package/dist/template-resolver/template-delivery-policy.d.ts +22 -0
  481. package/dist/template-resolver/template-delivery-policy.js +40 -0
  482. package/dist/template-resolver/template-draft.d.ts +1 -1
  483. package/dist/template-resolver/template-draft.js +1 -1
  484. package/dist/template-resolver/template-edit-policy.d.ts +22 -0
  485. package/dist/template-resolver/template-edit-policy.js +45 -0
  486. package/dist/template-resolver/template-meta.d.ts +2 -2
  487. package/dist/template-resolver/template-meta.js +2 -2
  488. package/dist/template-resolver/template-preview.d.ts +1 -1
  489. package/dist/template-resolver/template-preview.js +15 -6
  490. package/dist/template-resolver/template-usage.d.ts +1 -1
  491. package/dist/template-resolver/template-usage.js +1 -1
  492. package/dist/template-resolver/template-validation.js +34 -14
  493. package/dist/template-resolver/testing.js +1 -1
  494. package/dist/template-resolver/user-content-table.js +1 -1
  495. package/dist/template-resolver/web/client-plugin.js +1 -2
  496. package/dist/template-resolver/{constants.d.ts → web/constants.d.ts} +4 -1
  497. package/dist/template-resolver/{constants.js → web/constants.js} +9 -10
  498. package/dist/template-resolver/{document-blocks.d.ts → web/document-blocks.d.ts} +2 -2
  499. package/dist/template-resolver/{document-blocks.js → web/document-blocks.js} +1 -0
  500. package/dist/template-resolver/web/document-editor-extensions.d.ts +1 -0
  501. package/dist/template-resolver/web/document-editor-extensions.js +22 -2
  502. package/dist/template-resolver/web/document-editor.js +0 -1
  503. package/dist/template-resolver/web/document-images.d.ts +2 -0
  504. package/dist/template-resolver/web/document-images.js +27 -0
  505. package/dist/template-resolver/{document-schema.d.ts → web/document-schema.d.ts} +2 -1
  506. package/dist/template-resolver/{document-schema.js → web/document-schema.js} +4 -1
  507. package/dist/template-resolver/{document-steps.js → web/document-steps.js} +0 -1
  508. package/dist/template-resolver/web/document-tiptap-editor.d.ts +1 -1
  509. package/dist/template-resolver/web/document-tiptap-editor.js +24 -9
  510. package/dist/template-resolver/web/document-toolbar-blocks.d.ts +4 -2
  511. package/dist/template-resolver/web/document-toolbar-blocks.js +1 -1
  512. package/dist/template-resolver/web/editor-handle.js +1 -1
  513. package/dist/template-resolver/web/i18n.js +5 -1
  514. package/dist/template-resolver/web/index.d.ts +3 -3
  515. package/dist/template-resolver/web/index.js +3 -4
  516. package/dist/template-resolver/{mail-constants.js → web/mail-constants.js} +0 -1
  517. package/dist/template-resolver/{pdf-constants.js → web/pdf-constants.js} +0 -1
  518. package/dist/template-resolver/web/placeholder-line-editor-lazy.js +0 -1
  519. package/dist/template-resolver/web/placeholder-line-editor.js +6 -4
  520. package/dist/template-resolver/{qualified-names.d.ts → web/qualified-names.d.ts} +2 -0
  521. package/dist/template-resolver/{qualified-names.js → web/qualified-names.js} +2 -1
  522. package/dist/template-resolver/web/use-stable-by-key.js +0 -1
  523. package/dist/tenant/handlers/add-member.write.js +1 -1
  524. package/dist/tenant/index.d.ts +1 -1
  525. package/dist/tenant/index.js +1 -1
  526. package/dist/tenant/invitation-table.js +1 -1
  527. package/dist/tenant/invited-membership.js +1 -1
  528. package/dist/tenant/last-tenant-admin.js +1 -1
  529. package/dist/tenant/member-role-options.js +1 -1
  530. package/dist/tenant/screens.js +1 -1
  531. package/dist/tenant/web/client-plugin.js +1 -2
  532. package/dist/tenant/{constants.js → web/constants.js} +3 -6
  533. package/dist/tenant/web/index.js +0 -1
  534. package/dist/tenant/web/member-roles-cell.js +0 -1
  535. package/dist/tenant/web/member-status-cell.js +0 -1
  536. package/dist/tenant-lifecycle/stages.js +2 -3
  537. package/dist/tier-engine/entity.d.ts +1 -1
  538. package/dist/tier-engine/entity.js +1 -1
  539. package/dist/tier-engine/feature.js +2 -2
  540. package/dist/tier-engine/handlers/set-tenant-tier.write.js +1 -1
  541. package/dist/tier-engine/index.d.ts +1 -1
  542. package/dist/tier-engine/index.js +1 -1
  543. package/dist/tier-engine/web/client-plugin.js +2 -3
  544. package/dist/tier-engine/{constants.js → web/constants.js} +2 -3
  545. package/dist/tier-engine/{i18n.js → web/i18n.js} +0 -1
  546. package/dist/tier-engine/web/index.js +0 -1
  547. package/dist/user/handlers/create.write.js +1 -1
  548. package/dist/user/handlers/update-roles.js +1 -1
  549. package/dist/user/handlers/update.write.js +1 -1
  550. package/dist/user/index.d.ts +1 -1
  551. package/dist/user/index.js +1 -1
  552. package/dist/user/invited-global-roles.d.ts +1 -1
  553. package/dist/user/invited-global-roles.js +1 -1
  554. package/dist/user/schema/user.js +1 -1
  555. package/dist/user/{constants.js → web/constants.js} +0 -1
  556. package/dist/user-data-rights/env.js +1 -1
  557. package/dist/user-data-rights/feature.js +3 -3
  558. package/dist/user-data-rights/index.d.ts +1 -1
  559. package/dist/user-data-rights/index.js +1 -1
  560. package/dist/user-data-rights/lib/resolve-tenant-model.js +1 -1
  561. package/dist/user-data-rights/mail-notifications.js +1 -1
  562. package/dist/user-data-rights/web/client-plugin.js +2 -3
  563. package/dist/user-data-rights/web/confirm-deletion-screen.js +0 -1
  564. package/dist/user-data-rights/{constants.js → web/constants.js} +11 -12
  565. package/dist/user-data-rights/web/default-translations.d.ts +2 -0
  566. package/dist/user-data-rights/web/default-translations.js +59 -0
  567. package/dist/user-data-rights/web/i18n.d.ts +5 -2
  568. package/dist/user-data-rights/web/i18n.js +37 -59
  569. package/dist/user-data-rights/web/index.d.ts +1 -1
  570. package/dist/user-data-rights/web/index.js +1 -2
  571. package/dist/user-data-rights/web/privacy-center-screen.js +1 -2
  572. package/dist/user-data-rights/web/request-deletion-screen.js +0 -1
  573. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +6 -1
  574. package/dist/user-profile/feature.js +1 -1
  575. package/dist/user-profile/handlers/change-email.write.js +1 -1
  576. package/dist/user-profile/index.d.ts +1 -1
  577. package/dist/user-profile/index.js +1 -1
  578. package/dist/user-profile/web/client-plugin.js +2 -3
  579. package/dist/user-profile/{constants.js → web/constants.js} +0 -1
  580. package/dist/user-profile/{i18n.js → web/i18n.js} +0 -1
  581. package/dist/user-profile/web/profile-screen.js +2 -3
  582. package/dist/waitlist/entity.js +1 -1
  583. package/dist/waitlist/feature.js +1 -1
  584. package/dist/waitlist/handlers/export-purge.write.js +1 -1
  585. package/dist/waitlist/handlers/invite.write.js +1 -1
  586. package/dist/waitlist/handlers/reject.write.js +1 -1
  587. package/dist/waitlist/handlers/submit.write.js +4 -3
  588. package/dist/waitlist/import.d.ts +1 -1
  589. package/dist/waitlist/index.d.ts +1 -1
  590. package/dist/waitlist/index.js +1 -1
  591. package/dist/waitlist/legacy-migrate.js +1 -1
  592. package/dist/waitlist/link-on-signup.js +1 -1
  593. package/dist/waitlist/mail.d.ts +0 -1
  594. package/dist/waitlist/mail.js +6 -4
  595. package/dist/waitlist/payloads.js +1 -1
  596. package/dist/waitlist/screens.js +1 -1
  597. package/dist/waitlist/{constants.js → web/constants.js} +0 -1
  598. package/kumiko-es-tables.json +102 -0
  599. package/package.json +30 -29
  600. package/src/audit/changes.json +7 -0
  601. package/src/auth-email-password/changes.json +6 -0
  602. package/src/auth-mfa/changes.json +6 -0
  603. package/src/billing-foundation/changes.json +18 -0
  604. package/src/cap-counter/changes.json +12 -0
  605. package/src/delivery/changes.json +6 -0
  606. package/src/document-ingest-foundation/changes.json +6 -0
  607. package/src/files/changes.json +7 -0
  608. package/src/form-draft/changes.json +7 -0
  609. package/src/inbound-mail-foundation/changes.json +6 -0
  610. package/src/ledger/changes.json +7 -0
  611. package/src/mail-foundation/changes.json +6 -0
  612. package/src/presets/changes.json +7 -0
  613. package/src/tags/changes.json +6 -0
  614. package/src/template-resolver/changes.json +63 -0
  615. package/src/user-data-rights/changes.json +14 -0
  616. package/src/waitlist/changes.json +6 -0
  617. package/dist/admin-shell/i18n.d.ts +0 -5
  618. package/dist/admin-shell/i18n.js +0 -51
  619. package/dist/audit/i18n.d.ts +0 -5
  620. package/dist/audit/i18n.js +0 -22
  621. package/dist/jobs/i18n.d.ts +0 -5
  622. package/dist/jobs/i18n.js +0 -52
  623. package/dist/managed-pages/i18n.d.ts +0 -5
  624. package/dist/managed-pages/i18n.js +0 -55
  625. package/dist/presets/dsgvo-self-service.d.ts +0 -10
  626. package/dist/presets/dsgvo-self-service.js +0 -24
  627. package/dist/user-data-rights/i18n.d.ts +0 -5
  628. package/dist/user-data-rights/i18n.js +0 -39
  629. /package/dist/account-security/{constants.d.ts → web/constants.d.ts} +0 -0
  630. /package/dist/account-security/{i18n.d.ts → web/i18n.d.ts} +0 -0
  631. /package/dist/admin-shell/{constants.d.ts → web/constants.d.ts} +0 -0
  632. /package/dist/auth-email-password/{constants.d.ts → web/constants.d.ts} +0 -0
  633. /package/dist/auth-email-password/{i18n.d.ts → web/i18n.d.ts} +0 -0
  634. /package/dist/auth-email-password/{mail-i18n.d.ts → web/mail-i18n.d.ts} +0 -0
  635. /package/dist/auth-mfa/{constants.d.ts → web/constants.d.ts} +0 -0
  636. /package/dist/billing-foundation/{consumer-protection → web/consumer-protection}/consent-locale.d.ts +0 -0
  637. /package/dist/billing-foundation/{contact-card.d.ts → web/contact-card.d.ts} +0 -0
  638. /package/dist/cap-overview/{constants.d.ts → web/constants.d.ts} +0 -0
  639. /package/dist/cap-overview/{usage-math.js → web/usage-math.js} +0 -0
  640. /package/dist/compliance-profiles/{constants.d.ts → web/constants.d.ts} +0 -0
  641. /package/dist/config/{constants.d.ts → web/constants.d.ts} +0 -0
  642. /package/dist/custom-fields/{constants.d.ts → web/constants.d.ts} +0 -0
  643. /package/dist/delivery/{public-names.d.ts → web/public-names.d.ts} +0 -0
  644. /package/dist/feature-toggles/{constants.d.ts → web/constants.d.ts} +0 -0
  645. /package/dist/folders/{constants.d.ts → web/constants.d.ts} +0 -0
  646. /package/dist/form-draft/{constants.d.ts → web/constants.d.ts} +0 -0
  647. /package/dist/jobs/{constants.d.ts → web/constants.d.ts} +0 -0
  648. /package/dist/ledger/{constants.d.ts → web/constants.d.ts} +0 -0
  649. /package/dist/legal-pages/{constants.d.ts → web/constants.d.ts} +0 -0
  650. /package/dist/metrics/{constants.d.ts → web/constants.d.ts} +0 -0
  651. /package/dist/notes-history/{constants.d.ts → web/constants.d.ts} +0 -0
  652. /package/dist/personal-access-tokens/{constants.d.ts → web/constants.d.ts} +0 -0
  653. /package/dist/personal-access-tokens/{scopes.d.ts → web/scopes.d.ts} +0 -0
  654. /package/dist/personal-access-tokens/{scopes.js → web/scopes.js} +0 -0
  655. /package/dist/secrets/{constants.d.ts → web/constants.d.ts} +0 -0
  656. /package/dist/sessions/{i18n.d.ts → web/i18n.d.ts} +0 -0
  657. /package/dist/template-resolver/{document-steps.d.ts → web/document-steps.d.ts} +0 -0
  658. /package/dist/template-resolver/{mail-constants.d.ts → web/mail-constants.d.ts} +0 -0
  659. /package/dist/template-resolver/{pdf-constants.d.ts → web/pdf-constants.d.ts} +0 -0
  660. /package/dist/template-resolver/{placeholder-text.d.ts → web/placeholder-text.d.ts} +0 -0
  661. /package/dist/template-resolver/{placeholder-text.js → web/placeholder-text.js} +0 -0
  662. /package/dist/tenant/{constants.d.ts → web/constants.d.ts} +0 -0
  663. /package/dist/tier-engine/{constants.d.ts → web/constants.d.ts} +0 -0
  664. /package/dist/tier-engine/{i18n.d.ts → web/i18n.d.ts} +0 -0
  665. /package/dist/user/{constants.d.ts → web/constants.d.ts} +0 -0
  666. /package/dist/user-data-rights/{constants.d.ts → web/constants.d.ts} +0 -0
  667. /package/dist/user-profile/{constants.d.ts → web/constants.d.ts} +0 -0
  668. /package/dist/user-profile/{i18n.d.ts → web/i18n.d.ts} +0 -0
  669. /package/dist/waitlist/{constants.d.ts → web/constants.d.ts} +0 -0
@@ -1,19 +1,18 @@
1
+ export { isResourceImageContentType } from "../shared/index.js";
1
2
  export { createTemplateResolverApi, requireTemplateResolver, TemplateNotFoundError, } from "./api.js";
2
- export { collectDocumentResourceKeys, compileDocumentBodyToHandlebars, toResourceDataUri, } from "./compile-document-body.js";
3
- export { CONTENT_FORMATS, DEFAULT_MAIL_LAYOUT_SLUG, DEFAULT_PDF_LAYOUT_SLUG, DOCUMENT_HTML_KINDS, FALLBACK_LOCALE, NON_RENDER_KINDS, PDF_DEFAULT_MARGIN_MM, PDF_FOOTER_MARGIN_MM, PDF_HEADER_MARGIN_MM, PDF_ORIENTATIONS, PDF_PAGE_FORMATS, RENDER_KINDS, SYSTEM_TENANT_ID, TEMPLATE_KINDS, TEMPLATE_SCOPES, TEMPLATE_STATUSES, TEXT_BLOCK_KIND, UPSERT_KINDS, } from "./constants.js";
3
+ export { collectDocumentImageVariables, collectDocumentResourceKeys, compileDocumentBodyToHandlebars, toResourceDataUri, } from "./compile-document-body.js";
4
4
  export { documentViolationsToFieldIssues, flattenParagraphsToLineBreaks, sanitizeDocumentHtml, sanitizeTemplateBody, } from "./document-sanitizer.js";
5
- export { DOCUMENT_CONDITION_ATTRIBUTE, DOCUMENT_NODE_NAMES, DOCUMENT_TEXT_ALIGNMENTS, DocumentButton, DocumentCondition, DocumentDivider, DocumentLink, DocumentPageBreak, DocumentResource, DocumentTable, DocumentTableCell, DocumentTableHeader, DocumentTableRow, DocumentTextAlign, DocumentVariable, documentExtensions, isAllowedDocumentLinkHref, isDocumentPlaceholderHref, isDocumentReferenceName, isDocumentResourceKey, } from "./document-schema.js";
6
5
  export { createTemplateResolverFeature } from "./feature.js";
7
6
  export { localeSchema } from "./handlers/shared.js";
8
7
  export { isHexColor, mailLayoutAppearance, } from "./layout-appearance.js";
9
8
  export { readLayoutRegions, sanitizeLayoutHtml, } from "./layout-regions.js";
10
9
  export { fileAttachmentsOf, imageLinksOf, parseLinkedResourceEntries, pdfAttachmentLinksOf, templatePdfAttachmentLinkSchema, } from "./linked-resources.js";
11
10
  export { prepareDocumentForPrint } from "./print-document.js";
12
- export { TEMPLATE_RESOLVER_FEATURE, TemplateResolverErrors, TemplateResolverHandlers, TemplateResolverQueries, } from "./qualified-names.js";
13
11
  export { mapRecordToVariables } from "./record-mapping.js";
14
12
  export { prepareTemplateResourceBeforeTransaction, readTemplateResourceMaxBytes, storePreparedTemplateResource, } from "./store-template-resource.js";
15
13
  export { templateResourceEntity, templateResourcesTable, } from "./table.js";
16
14
  export { templateBundleSchema } from "./template-bundle.js";
15
+ export { templateEditAccess, } from "./template-edit-policy.js";
17
16
  export { isMailTemplateMeta, MAIL_CATEGORIES, MAIL_TONES, parseTemplateMeta, pdfAttachmentFileNamePatternSchema, readMailLayoutMeta, readPdfTemplateMeta, templateSlugSchema, } from "./template-meta.js";
18
17
  export { evaluateDocumentDraft } from "./template-preview.js";
19
18
  export { readTemplateResource } from "./template-resources.js";
@@ -21,3 +20,6 @@ export { isSystemOnlyTemplate } from "./template-system-only.js";
21
20
  export { collectTemplateUsage } from "./template-usage.js";
22
21
  export { hasPlaceholderProblems, resolveTemplateVariables, SYSTEM_PLACEHOLDERS, systemPlaceholdersFor, validateTemplatePlaceholders, } from "./template-validation.js";
23
22
  export { userContentEntriesTable, userContentEntryEntity, } from "./user-content-table.js";
23
+ export { CONTENT_FORMATS, DEFAULT_MAIL_LAYOUT_SLUG, DEFAULT_PDF_LAYOUT_SLUG, DOCUMENT_HTML_KINDS, FALLBACK_LOCALE, NON_RENDER_KINDS, PDF_DEFAULT_MARGIN_MM, PDF_FOOTER_MARGIN_MM, PDF_HEADER_MARGIN_MM, PDF_ORIENTATIONS, PDF_PAGE_FORMATS, RENDER_KINDS, SYSTEM_TENANT_ID, TEMPLATE_KINDS, TEMPLATE_SCOPES, TEMPLATE_STATUSES, TEXT_BLOCK_KIND, UPSERT_KINDS, } from "./web/constants.js";
24
+ export { DOCUMENT_CONDITION_ATTRIBUTE, DOCUMENT_NODE_NAMES, DOCUMENT_TEXT_ALIGNMENTS, DocumentButton, DocumentCondition, DocumentDivider, DocumentLink, DocumentPageBreak, DocumentResource, DocumentTable, DocumentTableCell, DocumentTableHeader, DocumentTableRow, DocumentTextAlign, DocumentVariable, documentExtensions, isAllowedDocumentLinkHref, isDocumentPlaceholderHref, isDocumentReferenceName, isDocumentResourceKey, } from "./web/document-schema.js";
25
+ export { TEMPLATE_RESOLVER_FEATURE, TemplateResolverErrors, TemplateResolverHandlers, TemplateResolverQueries, } from "./web/qualified-names.js";
@@ -1,5 +1,5 @@
1
- import { HEX_COLOR_PATTERN } from "./constants.js";
2
1
  import { readMailLayoutMeta } from "./template-meta.js";
2
+ import { HEX_COLOR_PATTERN } from "./web/constants.js";
3
3
  const FONT_FAMILIES = {
4
4
  sans: "Arial, Helvetica, sans-serif",
5
5
  serif: "Georgia, 'Times New Roman', serif",
@@ -1,5 +1,5 @@
1
- import type { ContentFormat } from "./constants.ts";
2
1
  import { type DocumentViolation, type SanitizeBodyResult } from "./document-sanitizer.ts";
2
+ import type { ContentFormat } from "./web/constants.ts";
3
3
  export type LayoutRegions = {
4
4
  readonly header: string;
5
5
  readonly signature: string;
@@ -2,8 +2,8 @@ import { type DbConnection } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { type Registry, type SessionUser, type TenantId } from "@cosmicdrift/kumiko-framework/engine";
3
3
  import type { Dispatcher } from "@cosmicdrift/kumiko-framework/pipeline";
4
4
  import { type SeedIfExists } from "@cosmicdrift/kumiko-framework/seeding";
5
- import { type ContentFormat, type UpsertKind } from "./constants.ts";
6
5
  import type { TemplateBundle } from "./template-bundle.ts";
6
+ import { type ContentFormat, type UpsertKind } from "./web/constants.ts";
7
7
  export type SeedSystemTemplateOptions = {
8
8
  readonly slug: string;
9
9
  readonly kind: UpsertKind;
@@ -16,6 +16,9 @@ export type SeedSystemTemplateOptions = {
16
16
  readonly linkedResources?: Record<string, string>;
17
17
  readonly meta?: unknown;
18
18
  readonly title?: string;
19
+ /** Translatable title for the overview and designer, stored in the title column; the client
20
+ * shows the translation and falls back to the key. Mutually exclusive with `title`. */
21
+ readonly titleI18nKey?: string;
19
22
  readonly parentTemplateId?: string | null;
20
23
  readonly by?: SessionUser;
21
24
  readonly ifExists?: SeedIfExists;
@@ -8,19 +8,19 @@
8
8
  //
9
9
  // Default ifExists="skip". The actor is `createSystemUser(SYSTEM_TENANT_ID)`,
10
10
  // deliberately not TestUsers (prod seeds are not test utilities).
11
- import { createTenantDb, deleteMany, fetchOne, } from "@cosmicdrift/kumiko-framework/db";
11
+ import { createTenantDb, fetchOne, } from "@cosmicdrift/kumiko-framework/db";
12
12
  import { createSystemUser, SYSTEM_TENANT_ID, } from "@cosmicdrift/kumiko-framework/engine";
13
- import { getStreamVersion, getUnscopedStreamMaxVersionForSeed, } from "@cosmicdrift/kumiko-framework/event-store";
13
+ import { deleteRowsWithoutReplayableStream, getStreamVersion, getUnscopedStreamMaxVersionForSeed, } from "@cosmicdrift/kumiko-framework/event-store";
14
14
  import { runEventStoreSeed } from "@cosmicdrift/kumiko-framework/seeding";
15
15
  import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
16
- import { TEXT_BLOCK_KIND } from "./constants.js";
17
16
  import { executor } from "./handlers/shared.js";
18
17
  import { evaluateTemplateWrite } from "./handlers/template-gates.js";
19
- import { TEMPLATE_RESOLVER_FEATURE, TemplateResolverHandlers } from "./qualified-names.js";
20
18
  import { templateResourcesTable } from "./table.js";
21
19
  import { activeStampChanges, servedStampChanges } from "./template-draft.js";
22
20
  import { templateSlugSchema } from "./template-meta.js";
23
21
  import { variablesFromSchema } from "./template-validation.js";
22
+ import { TEXT_BLOCK_KIND } from "./web/constants.js";
23
+ import { TEMPLATE_RESOLVER_FEATURE, TemplateResolverHandlers } from "./web/qualified-names.js";
24
24
  /** Drop projection orphans (no events anywhere) so boot seeds can recreate. */
25
25
  async function resolveExistingForEventStoreSeed(db, tdb, existingRow, tenantId) {
26
26
  if (existingRow == null)
@@ -34,12 +34,17 @@ async function resolveExistingForEventStoreSeed(db, tdb, existingRow, tenantId)
34
34
  if (unscoped !== 0) {
35
35
  throw new Error(`seed orphan check: projection ${id} has no events for tenant ${tenantId} but unscoped stream version is ${unscoped} — refusing delete/recreate to avoid wiping a live stream`);
36
36
  }
37
- // The cast strips the executor-only brand that WritableTable rejects; the orphan row has no events, so no executor verb applies.
38
- await deleteMany(tdb, templateResourcesTable, { id, tenantId });
37
+ await deleteRowsWithoutReplayableStream(tdb, { table: templateResourcesTable, ids: [id] });
39
38
  return null;
40
39
  }
41
40
  return { id, version: streamVersion };
42
41
  }
42
+ function seedTitleColumn(opts, label) {
43
+ if (opts.title !== undefined && opts.titleI18nKey !== undefined) {
44
+ throw new Error(`${label} rejected: set either title or titleI18nKey, not both`);
45
+ }
46
+ return opts.titleI18nKey ?? opts.title ?? null;
47
+ }
43
48
  export async function seedSystemTemplate(db, opts) {
44
49
  const tenantId = SYSTEM_TENANT_ID;
45
50
  const by = opts.by ?? createSystemUser(tenantId);
@@ -48,6 +53,7 @@ export async function seedSystemTemplate(db, opts) {
48
53
  const slug = templateSlugSchema.safeParse(opts.slug);
49
54
  if (!slug.success)
50
55
  throw new Error(`${label} rejected: ${slug.error.issues[0]?.message}`);
56
+ const title = seedTitleColumn(opts, label);
51
57
  const evaluated = evaluateTemplateWrite({
52
58
  kind: opts.kind,
53
59
  scope: "system",
@@ -81,7 +87,7 @@ export async function seedSystemTemplate(db, opts) {
81
87
  variableSchema,
82
88
  ...(linkedResources !== undefined && { linkedResources }),
83
89
  meta,
84
- title: opts.title ?? null,
90
+ title,
85
91
  folder: null,
86
92
  scope: "system",
87
93
  parentTemplateId,
@@ -3,14 +3,14 @@ import { NotFoundError, UnprocessableError, writeFailure, } from "@cosmicdrift/k
3
3
  import { createFileRefFromUploadedBytes, uploadFileBytesBeforeTransaction, } from "@cosmicdrift/kumiko-framework/files";
4
4
  import { fileContextForTenant } from "../file-foundation/index.js";
5
5
  import { extensionForResourceContentType, requireForTenant } from "../shared/index.js";
6
- import { ACTIVE_TEMPLATE_STATUS, SYSTEM_TENANT_ID } from "./constants.js";
7
6
  import { DEFAULT_RESOURCE_MAX_BYTES, MAX_FILE_ATTACHMENTS_PER_TEMPLATE, RESOURCE_MAX_BYTES_CONFIG_KEY, } from "./handlers/resource-shared.js";
8
7
  import { executor } from "./handlers/shared.js";
9
8
  import { attachmentEntriesOf, parseLinkedResourceEntries, templatePdfAttachmentLinkSchema, } from "./linked-resources.js";
10
- import { TemplateResolverErrors } from "./qualified-names.js";
11
9
  import { normalizeResourceImage } from "./resource-image.js";
12
10
  import { templateResourcesTable } from "./table.js";
13
11
  import { readTemplateResource } from "./template-resources.js";
12
+ import { ACTIVE_TEMPLATE_STATUS, SYSTEM_TENANT_ID } from "./web/constants.js";
13
+ import { TemplateResolverErrors } from "./web/qualified-names.js";
14
14
  export async function readTemplateResourceMaxBytes(config, registry) {
15
15
  if (config === undefined || registry.getConfigKey(RESOURCE_MAX_BYTES_CONFIG_KEY) === undefined) {
16
16
  return DEFAULT_RESOURCE_MAX_BYTES;
@@ -1,6 +1,6 @@
1
1
  import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { createEntity, createLongTextField, createNumberField, createSelectField, createTextField, createTimestampField, } from "@cosmicdrift/kumiko-framework/engine";
3
- import { CONTENT_FORMATS, TEMPLATE_KINDS, TEMPLATE_SCOPES, TEMPLATE_STATUSES, } from "./constants.js";
3
+ import { CONTENT_FORMATS, TEMPLATE_KINDS, TEMPLATE_SCOPES, TEMPLATE_STATUSES, } from "./web/constants.js";
4
4
  // Stored v1 events name the kind "mail-html", which is now "mail".
5
5
  const renameMailHtmlKind = {
6
6
  fromVersion: 1,
@@ -1,8 +1,8 @@
1
1
  import * as z from "zod";
2
- import { CONTENT_FORMATS, UPSERT_KINDS } from "./constants.js";
3
- import { isDocumentResourceKey } from "./document-schema.js";
4
2
  import { templatePdfAttachmentLinkSchema } from "./linked-resources.js";
5
3
  import { templateSlugSchema } from "./template-meta.js";
4
+ import { CONTENT_FORMATS, UPSERT_KINDS } from "./web/constants.js";
5
+ import { isDocumentResourceKey } from "./web/document-schema.js";
6
6
  const MAX_RESOURCES = 20;
7
7
  const MAX_LOCALES = 50;
8
8
  const MAX_RESOURCE_BYTES = 2 * 1024 * 1024;
@@ -0,0 +1,22 @@
1
+ import type { Registry } from "@cosmicdrift/kumiko-framework/engine";
2
+ type DeliveryTarget = {
3
+ readonly kind: string;
4
+ readonly slug: string;
5
+ };
6
+ export type TemplateDeliveryPolicy = {
7
+ readonly tenantEditable: readonly DeliveryTarget[];
8
+ /** Kinds of collections mounted with an explicit `access`; their tenant rows are edited by design. */
9
+ readonly collectionKinds: readonly string[];
10
+ };
11
+ export declare function isTenantOverrideServed(policy: TemplateDeliveryPolicy, target: DeliveryTarget): boolean;
12
+ export declare function isServedByCollectionOnly(policy: TemplateDeliveryPolicy, target: DeliveryTarget): boolean;
13
+ export declare function isRowServed(policy: TemplateDeliveryPolicy, row: DeliveryTarget & {
14
+ readonly tenantId: string;
15
+ }): boolean;
16
+ export declare function isRowServedTo(policy: TemplateDeliveryPolicy, user: {
17
+ readonly roles: readonly string[];
18
+ }, row: DeliveryTarget & {
19
+ readonly tenantId: string;
20
+ }): boolean;
21
+ export declare function deliveryPolicyOf(registry: Registry): TemplateDeliveryPolicy;
22
+ export {};
@@ -0,0 +1,40 @@
1
+ import { isPlainObject, propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
2
+ import { isSystemAdmin } from "./template-draft.js";
3
+ import { SYSTEM_TENANT_ID } from "./web/constants.js";
4
+ import { TEMPLATE_RESOLVER_FEATURE } from "./web/qualified-names.js";
5
+ const NOTHING_UNLOCKED = { tenantEditable: [], collectionKinds: [] };
6
+ export function isTenantOverrideServed(policy, target) {
7
+ return (policy.collectionKinds.includes(target.kind) ||
8
+ policy.tenantEditable.some((entry) => entry.kind === target.kind && entry.slug === target.slug));
9
+ }
10
+ // Served only because its kind belongs to a collection with `access`, not because the template
11
+ // is listed in tenantEditable. For these a system row of the same slug must win.
12
+ export function isServedByCollectionOnly(policy, target) {
13
+ return (policy.collectionKinds.includes(target.kind) &&
14
+ !policy.tenantEditable.some((entry) => entry.kind === target.kind && entry.slug === target.slug));
15
+ }
16
+ export function isRowServed(policy, row) {
17
+ return row.tenantId === SYSTEM_TENANT_ID || isTenantOverrideServed(policy, row);
18
+ }
19
+ // A SystemAdmin sees every stored row, so a locked override can still be reset; everyone else
20
+ // sees only what is delivered, which keeps a locked override out of the template-resolver queries for a TenantAdmin (the audit log keeps the history).
21
+ export function isRowServedTo(policy, user, row) {
22
+ return isSystemAdmin(user) || isRowServed(policy, row);
23
+ }
24
+ function isDeliveryTarget(value) {
25
+ return (typeof propertyOf(value, "kind") === "string" && typeof propertyOf(value, "slug") === "string");
26
+ }
27
+ function isTemplateDeliveryPolicy(value) {
28
+ if (!isPlainObject(value))
29
+ return false;
30
+ const { tenantEditable, collectionKinds } = value;
31
+ return (Array.isArray(tenantEditable) &&
32
+ tenantEditable.every(isDeliveryTarget) &&
33
+ Array.isArray(collectionKinds) &&
34
+ collectionKinds.every((kind) => typeof kind === "string"));
35
+ }
36
+ // Fail closed: without the mounted feature (or its exports) no tenant row counts as unlocked.
37
+ export function deliveryPolicyOf(registry) {
38
+ const exported = propertyOf(propertyOf(registry.getFeature(TEMPLATE_RESOLVER_FEATURE), "exports"), "deliveryPolicy");
39
+ return isTemplateDeliveryPolicy(exported) ? exported : NOTHING_UNLOCKED;
40
+ }
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
2
- import { type ContentFormat } from "./constants.ts";
3
2
  import type { TemplateResourceRow } from "./table.ts";
3
+ import { type ContentFormat } from "./web/constants.ts";
4
4
  export type TemplateDraft = {
5
5
  readonly content: string | null;
6
6
  readonly contentFormat: ContentFormat;
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
2
2
  import * as z from "zod";
3
- import { CONTENT_FORMATS } from "./constants.js";
3
+ import { CONTENT_FORMATS } from "./web/constants.js";
4
4
  const templateDraftSchema = z.object({
5
5
  content: z.string().nullable(),
6
6
  contentFormat: z.enum(CONTENT_FORMATS),
@@ -0,0 +1,22 @@
1
+ import { type HandlerContext, type RoleAccessRule, type SessionUser } from "@cosmicdrift/kumiko-framework/engine";
2
+ import { type WriteFailure } from "@cosmicdrift/kumiko-framework/errors";
3
+ import type { TemplateKind } from "./web/constants.ts";
4
+ export type TenantEditableTemplate = {
5
+ readonly kind: TemplateKind;
6
+ readonly slug: string;
7
+ readonly access: RoleAccessRule;
8
+ };
9
+ export type TemplateEditPolicy = {
10
+ readonly tenantEditable: readonly TenantEditableTemplate[];
11
+ };
12
+ type EditTarget = {
13
+ readonly slug: string;
14
+ readonly kind: string;
15
+ };
16
+ type EditUser = Pick<SessionUser, "roles">;
17
+ export declare function templateEditAccess(entries: readonly TenantEditableTemplate[]): RoleAccessRule;
18
+ export declare function mayEditTemplate(policy: TemplateEditPolicy, user: EditUser, target: EditTarget): boolean;
19
+ export declare function refuseTemplateEdit(policy: TemplateEditPolicy, user: EditUser, target: EditTarget): WriteFailure | null;
20
+ export declare function refuseMissingTemplate(policy: TemplateEditPolicy, user: EditUser): WriteFailure | null;
21
+ export declare function refuseTemplateEditById(db: HandlerContext["db"], policy: TemplateEditPolicy, user: EditUser, tenantId: string, templateId: string): Promise<WriteFailure | null>;
22
+ export {};
@@ -0,0 +1,45 @@
1
+ import { fetchOne } from "@cosmicdrift/kumiko-framework/db";
2
+ import { hasAccess, } from "@cosmicdrift/kumiko-framework/engine";
3
+ import { AccessDeniedError, writeFailure, } from "@cosmicdrift/kumiko-framework/errors";
4
+ import { templateResourcesTable } from "./table.js";
5
+ import { isSystemAdmin } from "./template-draft.js";
6
+ import { TemplateResolverErrors } from "./web/qualified-names.js";
7
+ const SYSTEM_ADMIN_ROLE = "SystemAdmin";
8
+ export function templateEditAccess(entries) {
9
+ const roles = new Set([SYSTEM_ADMIN_ROLE]);
10
+ for (const entry of entries) {
11
+ for (const role of entry.access.roles)
12
+ roles.add(role);
13
+ }
14
+ return { roles: [...roles] };
15
+ }
16
+ export function mayEditTemplate(policy, user, target) {
17
+ if (isSystemAdmin(user))
18
+ return true;
19
+ const entry = policy.tenantEditable.find((candidate) => candidate.slug === target.slug && candidate.kind === target.kind);
20
+ return entry !== undefined && hasAccess(user, entry.access);
21
+ }
22
+ export function refuseTemplateEdit(policy, user, target) {
23
+ if (mayEditTemplate(policy, user, target))
24
+ return null;
25
+ return writeFailure(new AccessDeniedError({
26
+ i18nKey: "templateResolver.errors.templateNotTenantEditable",
27
+ details: { reason: TemplateResolverErrors.templateNotTenantEditable },
28
+ }));
29
+ }
30
+ // Fail closed: a missing row gives a non-SystemAdmin the same refusal as a locked one,
31
+ // so the response never reveals whether an id exists. SystemAdmin keeps the 404.
32
+ export function refuseMissingTemplate(policy, user) {
33
+ return isSystemAdmin(user) ? null : refuseTemplateEdit(policy, user, { slug: "", kind: "" });
34
+ }
35
+ export async function refuseTemplateEditById(db, policy, user, tenantId, templateId) {
36
+ if (isSystemAdmin(user))
37
+ return null;
38
+ const row = await fetchOne(db, templateResourcesTable, {
39
+ tenantId,
40
+ id: templateId,
41
+ });
42
+ return row === undefined
43
+ ? refuseMissingTemplate(policy, user)
44
+ : refuseTemplateEdit(policy, user, row);
45
+ }
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod";
2
- import { type TemplateKind } from "./constants.ts";
3
- import { MAIL_TONES, type MailTone } from "./mail-constants.ts";
2
+ import { type TemplateKind } from "./web/constants.ts";
3
+ import { MAIL_TONES, type MailTone } from "./web/mail-constants.ts";
4
4
  export declare const templateSlugSchema: z.ZodString;
5
5
  export declare const MAIL_CATEGORIES: readonly ["transactional", "marketing"];
6
6
  export type MailCategory = (typeof MAIL_CATEGORIES)[number];
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod";
2
- import { HEX_COLOR_PATTERN, PDF_ORIENTATIONS, PDF_PAGE_FORMATS, } from "./constants.js";
3
- import { MAIL_TONES } from "./mail-constants.js";
2
+ import { HEX_COLOR_PATTERN, PDF_ORIENTATIONS, PDF_PAGE_FORMATS, } from "./web/constants.js";
3
+ import { MAIL_TONES } from "./web/mail-constants.js";
4
4
  // One or more kebab segments joined by ":" — notification templates are seeded
5
5
  // under their qualified name `feature:notify:name`.
6
6
  export const templateSlugSchema = z
@@ -1,10 +1,10 @@
1
1
  import { type HandlerContext, type SessionUser, type TemplateVariables } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { type KumikoError } from "@cosmicdrift/kumiko-framework/errors";
3
3
  import { type MailAttachmentRef } from "../renderer-foundation/index.ts";
4
- import { type TemplateScope } from "./constants.ts";
5
4
  import { validateTemplateDraft } from "./handlers/validate.query.ts";
6
5
  import { type LayoutRegions, type TemplateWriteScope } from "./layout-regions.ts";
7
6
  import { type PdfTemplateMeta } from "./template-meta.ts";
7
+ import { type TemplateScope } from "./web/constants.ts";
8
8
  type LabelText = (label: string) => string;
9
9
  export declare function sampleValuesFor(variables: TemplateVariables, labelText?: LabelText): Record<string, unknown>;
10
10
  export type PreviewCheckCode = "resources_resolved" | "text_present" | "size_under_cap" | "required_placeholders";
@@ -10,15 +10,16 @@ import { fileContextForTenant } from "../file-foundation/index.js";
10
10
  import { collectRendererPlugins, createRendererFoundationApi, RendererError, } from "../renderer-foundation/index.js";
11
11
  import { createTemplateResolverApi, TemplateNotFoundError } from "./api.js";
12
12
  import { collectDocumentResourceKeys } from "./compile-document-body.js";
13
- import { DEFAULT_MAIL_LAYOUT_SLUG, DEFAULT_PDF_LAYOUT_SLUG, MAIL_PREVIEW_MAX_BYTES, SYSTEM_TENANT_ID, } from "./constants.js";
14
13
  import { parseStoredJson } from "./handlers/template-gates.js";
15
14
  import { validateTemplateDraft } from "./handlers/validate.query.js";
16
15
  import { readLayoutRegions, sanitizeLayoutHtml, } from "./layout-regions.js";
17
16
  import { parseLinkedResourceEntries } from "./linked-resources.js";
18
17
  import { buildDisplayHtml } from "./preview-display-html.js";
19
- import { TemplateResolverErrors } from "./qualified-names.js";
20
18
  import { templateResourcesTable } from "./table.js";
19
+ import { deliveryPolicyOf, isRowServedTo } from "./template-delivery-policy.js";
21
20
  import { isMailTemplateMeta, parseTemplateMeta, readPdfTemplateMeta, } from "./template-meta.js";
21
+ import { DEFAULT_MAIL_LAYOUT_SLUG, DEFAULT_PDF_LAYOUT_SLUG, MAIL_PREVIEW_MAX_BYTES, SYSTEM_TENANT_ID, } from "./web/constants.js";
22
+ import { TemplateResolverErrors } from "./web/qualified-names.js";
22
23
  const SAMPLE_LINK = "https://example.com";
23
24
  const SAMPLE_DATE = "2026-01-15";
24
25
  const SAMPLE_LIST_ROWS = 3;
@@ -64,12 +65,17 @@ function sampleList(def, labelText) {
64
65
  rows.push(sampleRow(def.item, labelText));
65
66
  return rows;
66
67
  }
68
+ function sampleValueFor(name, def, labelText) {
69
+ // An images variable has no sample: file ids are record data, never preview content.
70
+ if (def.type === "images")
71
+ return [];
72
+ return def.type === "list" ? sampleList(def, labelText) : sampleScalar(name, def, labelText);
73
+ }
67
74
  // Declared examples win; the fallbacks are deterministic so a preview never differs between calls.
68
75
  export function sampleValuesFor(variables, labelText = (label) => label) {
69
76
  const values = {};
70
77
  for (const [name, def] of Object.entries(variables)) {
71
- values[name] =
72
- def.type === "list" ? sampleList(def, labelText) : sampleScalar(name, def, labelText);
78
+ values[name] = sampleValueFor(name, def, labelText);
73
79
  }
74
80
  return values;
75
81
  }
@@ -81,7 +87,7 @@ const utf8Bytes = (value) => new TextEncoder().encode(value).length;
81
87
  const failed = (error) => ({ ok: false, error });
82
88
  async function loadStoredDraft(ctx, user, input) {
83
89
  try {
84
- return await createTemplateResolverApi(ctx.db).resolveTemplate({
90
+ return await createTemplateResolverApi(ctx.db, ctx.registry).resolveTemplate({
85
91
  tenantId: user.tenantId,
86
92
  slug: input.slug,
87
93
  kind: input.kind,
@@ -143,10 +149,13 @@ export function estimateMailBytes(args) {
143
149
  async function loadEditedRowResources(ctx, user, input) {
144
150
  const rows = await selectMany(ctx.db, templateResourcesTable, { tenantId: user.tenantId, slug: input.slug, kind: "mail", locale: input.locale }, { limit: 1 });
145
151
  const row = rows[0];
152
+ if (row !== undefined && !isRowServedTo(deliveryPolicyOf(ctx.registry), user, row)) {
153
+ return undefined;
154
+ }
146
155
  return row === undefined ? undefined : parseLinkedResourceEntries(row.linkedResources);
147
156
  }
148
157
  async function resolvePdfLayout(ctx, user, slug, locale) {
149
- const api = createTemplateResolverApi(ctx.db);
158
+ const api = createTemplateResolverApi(ctx.db, ctx.registry);
150
159
  const find = async (tenantId) => {
151
160
  try {
152
161
  return await api.resolveLayout({ tenantId, slug, kind: "pdf-layout", locale });
@@ -1,5 +1,5 @@
1
1
  import { type Registry } from "@cosmicdrift/kumiko-framework/engine";
2
- import { type TemplateKind } from "./constants.ts";
2
+ import { type TemplateKind } from "./web/constants.ts";
3
3
  type UsageRole = "template" | "layout";
4
4
  export type TemplateUsageEntry = {
5
5
  readonly qualifiedName: string;
@@ -1,5 +1,5 @@
1
1
  import { parseQn, } from "@cosmicdrift/kumiko-framework/engine";
2
- import { DEFAULT_MAIL_LAYOUT_SLUG } from "./constants.js";
2
+ import { DEFAULT_MAIL_LAYOUT_SLUG } from "./web/constants.js";
3
3
  function layoutSlugsOf(qualifiedName, notification, effectiveLayouts) {
4
4
  const stored = effectiveLayouts.get(qualifiedName);
5
5
  const locales = new Set([
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod";
2
2
  import { conditionScopeElement, withParsedDocument } from "./document-sanitizer.js";
3
- import { DOCUMENT_CONDITION_ATTRIBUTE, isDocumentPlaceholderHref, isDocumentReferenceName, } from "./document-schema.js";
3
+ import { DOCUMENT_CONDITION_ATTRIBUTE, isDocumentPlaceholderHref, isDocumentReferenceName, } from "./web/document-schema.js";
4
4
  export const SYSTEM_PLACEHOLDERS = new Set([
5
5
  "tenantName",
6
6
  "signature",
@@ -38,6 +38,7 @@ const scalarVariableSchema = z.discriminatedUnion("type", [
38
38
  ]);
39
39
  const variableDefSchema = z.union([
40
40
  scalarVariableSchema,
41
+ z.object({ ...variableCommon, type: z.literal("images") }),
41
42
  z.object({
42
43
  ...variableCommon,
43
44
  type: z.literal("list"),
@@ -74,7 +75,9 @@ function listItemFields(variables, listName) {
74
75
  const def = listName !== null && Object.hasOwn(variables, listName) ? variables[listName] : undefined;
75
76
  return def?.type === "list" ? def.item : {};
76
77
  }
77
- function isKnownName(name, scope, itemFields) {
78
+ // An images variable holds file ids: as text it would leak them, so only an images block
79
+ // (and a condition on its presence) may name it.
80
+ function isKnownName(name, scope, itemFields, allowImages = false) {
78
81
  const { variables } = scope;
79
82
  const root = rootName(name);
80
83
  // Declared variables and item fields are scalars: a dotted path under one never renders a value.
@@ -82,12 +85,15 @@ function isKnownName(name, scope, itemFields) {
82
85
  return { known: true, used: "" };
83
86
  if (scope.systemPlaceholders.has(root))
84
87
  return { known: true, used: "" };
85
- if (Object.hasOwn(variables, name))
86
- return { known: true, used: name };
88
+ if (Object.hasOwn(variables, name)) {
89
+ return variables[name]?.type === "images" && !allowImages
90
+ ? { known: false, used: "" }
91
+ : { known: true, used: name };
92
+ }
87
93
  return { known: false, used: "" };
88
94
  }
89
- function recordName(name, itemFields, scope) {
90
- const resolution = isKnownName(name, scope, itemFields);
95
+ function recordName(name, itemFields, scope, allowImages = false) {
96
+ const resolution = isKnownName(name, scope, itemFields, allowImages);
91
97
  if (!resolution.known)
92
98
  scope.unknown.add(name);
93
99
  else if (resolution.used !== "")
@@ -96,10 +102,21 @@ function recordName(name, itemFields, scope) {
96
102
  function enclosingEachName(element) {
97
103
  return element.closest("tr[data-each]")?.getAttribute("data-each") ?? null;
98
104
  }
99
- const NAME_ATTRIBUTE_BY_TAG = {
100
- span: "data-variable",
101
- div: "data-steps",
102
- };
105
+ function nameAttributeOf(element) {
106
+ const tag = element.tagName.toLowerCase();
107
+ if (tag === "span")
108
+ return "data-variable";
109
+ if (tag !== "div")
110
+ return undefined;
111
+ return element.hasAttribute("data-images") ? "data-images" : "data-steps";
112
+ }
113
+ function recordImagesName(name, scope) {
114
+ const def = Object.hasOwn(scope.variables, name) ? scope.variables[name] : undefined;
115
+ if (def?.type === "images")
116
+ scope.used.add(name);
117
+ else
118
+ scope.unknown.add(name);
119
+ }
103
120
  function scanRepeatRows(root, scope) {
104
121
  for (const element of Array.from(root.querySelectorAll("tr[data-each]"))) {
105
122
  const listName = element.getAttribute("data-each") ?? "";
@@ -113,15 +130,18 @@ function scanRepeatRows(root, scope) {
113
130
  function scanConditions(root, scope) {
114
131
  for (const element of Array.from(root.querySelectorAll(`[${DOCUMENT_CONDITION_ATTRIBUTE}]`))) {
115
132
  const itemFields = listItemFields(scope.variables, enclosingEachName(conditionScopeElement(element)));
116
- recordName(element.getAttribute(DOCUMENT_CONDITION_ATTRIBUTE) ?? "", itemFields, scope);
133
+ recordName(element.getAttribute(DOCUMENT_CONDITION_ATTRIBUTE) ?? "", itemFields, scope, true);
117
134
  }
118
135
  }
119
136
  function scanReferences(root, scope) {
120
- for (const element of Array.from(root.querySelectorAll("span[data-variable], div[data-steps], a[href], img[data-resource]"))) {
137
+ for (const element of Array.from(root.querySelectorAll("span[data-variable], div[data-steps], div[data-images], a[href], img[data-resource]"))) {
121
138
  const itemFields = listItemFields(scope.variables, enclosingEachName(element));
122
139
  const tag = element.tagName.toLowerCase();
123
- const nameAttribute = NAME_ATTRIBUTE_BY_TAG[tag];
124
- if (nameAttribute !== undefined) {
140
+ const nameAttribute = nameAttributeOf(element);
141
+ if (nameAttribute === "data-images") {
142
+ recordImagesName(element.getAttribute(nameAttribute) ?? "", scope);
143
+ }
144
+ else if (nameAttribute !== undefined) {
125
145
  recordName(element.getAttribute(nameAttribute) ?? "", itemFields, scope);
126
146
  }
127
147
  else if (tag === "a") {
@@ -3,8 +3,8 @@
3
3
  // No bun:test here — callers register cases with their own test runner.
4
4
  import { seedRow } from "@cosmicdrift/kumiko-testing/helpers";
5
5
  import { TemplateNotFoundError } from "./api.js";
6
- import { FALLBACK_LOCALE, SYSTEM_TENANT_ID, } from "./constants.js";
7
6
  import { templateResourcesTable } from "./table.js";
7
+ import { FALLBACK_LOCALE, SYSTEM_TENANT_ID, } from "./web/constants.js";
8
8
  export class ConformanceAssertionError extends Error {
9
9
  constructor(message) {
10
10
  super(message);
@@ -1,6 +1,6 @@
1
1
  import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { createEntity, createLongTextField, createSelectField, createTextField, } from "@cosmicdrift/kumiko-framework/engine";
3
- import { CONTENT_FORMATS, TEMPLATE_KINDS } from "./constants.js";
3
+ import { CONTENT_FORMATS, TEMPLATE_KINDS } from "./web/constants.js";
4
4
  // UserContentEntry — the per-user half of the content store: mail signatures
5
5
  // and personal reply snippets, one row per (tenantId, ownerId, slug, kind,
6
6
  // locale).
@@ -1,6 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-renderer/headless";
3
- // @runtime client
4
3
  // Client feature factory for the text-block content tree. Apps mount it via
5
4
  // createKumikoApp({ clientFeatures: [textBlocksClient()] }); it loads the
6
5
  // blocks from the by-tenant query, groups them by their `folder` field and
@@ -16,10 +15,10 @@ import { ContentPreview, useAppFeatures, useContentEditor, useDispatcher, usePri
16
15
  import { CSRF_HEADER_NAME, readCsrfToken } from "@cosmicdrift/kumiko-renderer/live";
17
16
  import { PlainContentEditor, RichContentEditor, } from "@cosmicdrift/kumiko-renderer/web";
18
17
  import { useEffect, useId, useState } from "react";
19
- import { collectionHandlerName, collectionQueryName, TemplateResolverHandlers, TemplateResolverQueries, } from "../qualified-names.js";
20
18
  import { DocumentBlocksContext, DocumentContentEditor } from "./document-editor.js";
21
19
  import { documentBlocksForKind } from "./document-toolbar-blocks.js";
22
20
  import { defaultTranslations } from "./i18n.js";
21
+ import { collectionHandlerName, collectionQueryName, TemplateResolverHandlers, TemplateResolverQueries, } from "./qualified-names.js";
23
22
  function newFolderNode() {
24
23
  return { leaves: [], subFolders: new Map() };
25
24
  }
@@ -24,5 +24,8 @@ export declare const DEFAULT_MAIL_LAYOUT_SLUG = "default";
24
24
  export declare const DEFAULT_PDF_LAYOUT_SLUG = "default";
25
25
  export declare const MAIL_PREVIEW_MAX_BYTES: number;
26
26
  export declare const TEST_MAIL_SUBJECT_PREFIX = "[TEST] ";
27
- export { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
27
+ export { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-types/identifiers";
28
28
  export declare const FALLBACK_LOCALE = "de";
29
+ export declare const DEFAULT_COLLECTION_ACCESS: {
30
+ readonly roles: readonly ["SystemAdmin"];
31
+ };
@@ -1,11 +1,9 @@
1
- // @runtime client
2
1
  // Plain data, no imports — the content tree in web/ needs TEXT_BLOCK_KIND to
3
2
  // pick between the public and the admin query.
4
3
  //
5
- // RenderKind identifiziert die Konsumenten-Klasse eines Templates.
6
- // Plugin-Renderer in `renderer-foundation` matchen auf kind; der
7
- // Resolver hier ist kind-agnostisch — er lädt nur, das Content-Format
8
- // (markdown/mjml/html) entscheidet wer's rendert.
4
+ // RenderKind identifies the consumer class of a template. Plugin renderers in
5
+ // `renderer-foundation` match on kind; the resolver here is kind-agnostic: it
6
+ // only loads, and the content format (markdown/mjml/html) decides who renders it.
9
7
  export const RENDER_KINDS = ["mail", "document-pdf", "image-snapshot"];
10
8
  // Kinds whose html body is a rich document: the server rebuilds it through the
11
9
  // document schema on every write (see document-sanitizer.ts).
@@ -60,9 +58,10 @@ export const DEFAULT_PDF_LAYOUT_SLUG = "default";
60
58
  // The mail transport enforces no size limit of its own; 10 MiB is a common provider ceiling.
61
59
  export const MAIL_PREVIEW_MAX_BYTES = 10 * 1024 * 1024;
62
60
  export const TEST_MAIL_SUBJECT_PREFIX = "[TEST] ";
63
- // System-Templates leben unter der canonical SYSTEM_TENANT_ID-Sentinel-UUID.
64
- // Re-Export aus framework — single source of truth, vermeidet Drift.
65
- export { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
66
- // Default-Locale wenn Tenant keinen eigenen Default konfiguriert. Resolver
67
- // fällt darauf zurück wenn requested locale + tenant-default fehlen.
61
+ // System templates live under the SYSTEM_TENANT_ID sentinel; the client-safe types package is its single source.
62
+ export { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-types/identifiers";
63
+ // Default locale when the tenant configures none. The resolver falls back to
64
+ // it when the requested locale and the tenant default are missing.
68
65
  export const FALLBACK_LOCALE = "de";
66
+ // A collection mounted without `access` is maintained by the platform only; TenantAdmin access is an explicit mount decision.
67
+ export const DEFAULT_COLLECTION_ACCESS = { roles: ["SystemAdmin"] };
@@ -1,5 +1,5 @@
1
- export type DocumentToolbarBlock = "image" | "table" | "button" | "divider" | "repeat" | "pageBreak" | "align" | "steps";
1
+ export type DocumentToolbarBlock = "image" | "table" | "button" | "divider" | "repeat" | "pageBreak" | "align" | "steps" | "images";
2
2
  export declare const MAIL_DOCUMENT_BLOCKS: readonly ["image", "table", "button", "divider", "repeat", "steps"];
3
- export declare const PDF_DOCUMENT_BLOCKS: readonly ["align", "image", "table", "divider", "repeat", "steps", "pageBreak"];
3
+ export declare const PDF_DOCUMENT_BLOCKS: readonly ["align", "image", "table", "divider", "repeat", "steps", "images", "pageBreak"];
4
4
  /** Block set for a template-resource kind; every kind except "document-pdf" gets the mail set. */
5
5
  export declare function documentBlocksForKind(kind: string | undefined): readonly DocumentToolbarBlock[];