@cosmicdrift/kumiko-bundled-features 0.378.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 (632) 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-overview/feature.js +1 -1
  163. package/dist/cap-overview/handlers/caps-usage.query.js +1 -1
  164. package/dist/cap-overview/handlers/tenant-caps-list.query.js +2 -2
  165. package/dist/cap-overview/index.d.ts +2 -2
  166. package/dist/cap-overview/index.js +2 -2
  167. package/dist/cap-overview/screens.js +1 -1
  168. package/dist/cap-overview/web/cap-cards-panel.js +1 -1
  169. package/dist/cap-overview/web/cap-usage-bar.js +1 -2
  170. package/dist/cap-overview/web/client-plugin.js +1 -1
  171. package/dist/cap-overview/{constants.js → web/constants.js} +0 -1
  172. package/dist/cap-overview/web/index.js +0 -1
  173. package/dist/cap-overview/{usage-math.d.ts → web/usage-math.d.ts} +1 -1
  174. package/dist/compliance-profiles/feature.js +1 -1
  175. package/dist/compliance-profiles/index.d.ts +1 -1
  176. package/dist/compliance-profiles/index.js +1 -1
  177. package/dist/compliance-profiles/web/client-plugin.js +1 -2
  178. package/dist/compliance-profiles/web/compliance-profile-catalog.js +1 -2
  179. package/dist/compliance-profiles/{constants.js → web/constants.js} +0 -1
  180. package/dist/compliance-profiles/web/index.js +0 -1
  181. package/dist/config/index.d.ts +1 -1
  182. package/dist/config/index.js +1 -1
  183. package/dist/config/web/client-plugin.d.ts +1 -1
  184. package/dist/config/web/client-plugin.js +1 -2
  185. package/dist/config/{constants.js → web/constants.js} +0 -1
  186. package/dist/config/web/i18n.js +0 -1
  187. package/dist/config/web/index.d.ts +1 -1
  188. package/dist/config/web/index.js +1 -2
  189. package/dist/config/write-helpers.js +1 -1
  190. package/dist/custom-fields/feature.js +1 -1
  191. package/dist/custom-fields/handlers/clear-custom-field.write.js +1 -1
  192. package/dist/custom-fields/handlers/define-tenant-field.write.js +1 -1
  193. package/dist/custom-fields/handlers/delete-system-field.write.js +1 -1
  194. package/dist/custom-fields/handlers/delete-tenant-field.write.js +1 -1
  195. package/dist/custom-fields/handlers/set-custom-field.write.js +1 -1
  196. package/dist/custom-fields/handlers/update-tenant-field.write.js +1 -1
  197. package/dist/custom-fields/index.d.ts +1 -1
  198. package/dist/custom-fields/index.js +1 -1
  199. package/dist/custom-fields/lib/value-schema.js +1 -1
  200. package/dist/custom-fields/schemas.js +1 -1
  201. package/dist/custom-fields/web/client-plugin.js +1 -2
  202. package/dist/custom-fields/{constants.js → web/constants.js} +18 -19
  203. package/dist/custom-fields/web/custom-fields-form-section.js +1 -2
  204. package/dist/custom-fields/web/i18n.js +0 -1
  205. package/dist/custom-fields/web/index.d.ts +1 -1
  206. package/dist/custom-fields/web/index.js +1 -2
  207. package/dist/custom-fields/wire-for-entity.js +1 -1
  208. package/dist/delivery/address-opt-out.js +1 -1
  209. package/dist/delivery/attempt-log-retention.js +21 -3
  210. package/dist/delivery/constants.d.ts +1 -1
  211. package/dist/delivery/constants.js +2 -2
  212. package/dist/delivery/i18n.js +1 -1
  213. package/dist/delivery/unsubscribe-page.js +1 -1
  214. package/dist/delivery/web/client-plugin.js +1 -1
  215. package/dist/delivery/web/delivery-channel-cell.js +0 -1
  216. package/dist/delivery/web/delivery-error-cell.js +0 -1
  217. package/dist/delivery/web/delivery-status-cell.js +1 -2
  218. package/dist/delivery/web/delivery-time-cell.js +0 -1
  219. package/dist/delivery/web/delivery-type-cell.js +0 -1
  220. package/dist/delivery/web/index.js +0 -1
  221. package/dist/delivery/{public-names.js → web/public-names.js} +0 -1
  222. package/dist/document-ingest-foundation/events.d.ts +1 -0
  223. package/dist/document-ingest-foundation/events.js +3 -0
  224. package/dist/document-ingest-foundation/executor.js +2 -1
  225. package/dist/document-ingest-foundation/feature.js +16 -5
  226. package/dist/document-ingest-foundation/index.d.ts +1 -1
  227. package/dist/document-ingest-foundation/index.js +1 -1
  228. package/dist/feature-toggles/feature.d.ts +1 -1
  229. package/dist/feature-toggles/feature.js +2 -2
  230. package/dist/feature-toggles/handlers/list.query.js +1 -1
  231. package/dist/feature-toggles/handlers/registered.query.js +1 -1
  232. package/dist/feature-toggles/handlers/set.write.js +1 -1
  233. package/dist/feature-toggles/index.d.ts +1 -1
  234. package/dist/feature-toggles/index.js +1 -1
  235. package/dist/feature-toggles/web/client-plugin.js +1 -2
  236. package/dist/feature-toggles/{constants.js → web/constants.js} +0 -1
  237. package/dist/feature-toggles/web/index.js +0 -1
  238. package/dist/folders/feature.js +1 -1
  239. package/dist/folders/handlers/clear-folder.write.js +1 -1
  240. package/dist/folders/handlers/delete-folder.write.js +1 -1
  241. package/dist/folders/handlers/set-folder.write.js +1 -1
  242. package/dist/folders/index.d.ts +1 -1
  243. package/dist/folders/index.js +1 -1
  244. package/dist/folders/web/client-plugin.js +1 -2
  245. package/dist/folders/{constants.js → web/constants.js} +0 -1
  246. package/dist/folders/web/folder-manager.js +1 -2
  247. package/dist/folders/web/folder-section.js +1 -2
  248. package/dist/folders/web/i18n.js +0 -1
  249. package/dist/folders/web/index.d.ts +1 -1
  250. package/dist/folders/web/index.js +1 -2
  251. package/dist/folders/web/tree.js +0 -1
  252. package/dist/form-draft/db/queries/cleanup.d.ts +3 -2
  253. package/dist/form-draft/db/queries/cleanup.js +18 -9
  254. package/dist/form-draft/decrypt-draft.d.ts +2 -0
  255. package/dist/form-draft/decrypt-draft.js +19 -0
  256. package/dist/form-draft/entity.js +6 -9
  257. package/dist/form-draft/feature.js +1 -1
  258. package/dist/form-draft/handlers/cleanup.job.d.ts +1 -0
  259. package/dist/form-draft/handlers/cleanup.job.js +17 -4
  260. package/dist/form-draft/handlers/discard.write.js +1 -1
  261. package/dist/form-draft/handlers/get.query.js +6 -7
  262. package/dist/form-draft/handlers/list.query.js +11 -7
  263. package/dist/form-draft/handlers/save.write.js +1 -1
  264. package/dist/form-draft/index.d.ts +1 -1
  265. package/dist/form-draft/index.js +1 -1
  266. package/dist/form-draft/lookup.d.ts +2 -2
  267. package/dist/form-draft/lookup.js +7 -2
  268. package/dist/form-draft/schemas.js +1 -1
  269. package/dist/form-draft/{constants.js → web/constants.js} +0 -1
  270. package/dist/form-draft-user-data/hooks.js +2 -2
  271. package/dist/inbound-mail-foundation/retention-sweep.js +7 -5
  272. package/dist/jobs/feature.js +2 -2
  273. package/dist/jobs/handlers/retry.write.js +1 -1
  274. package/dist/jobs/handlers/trigger.write.js +1 -1
  275. package/dist/jobs/index.d.ts +1 -1
  276. package/dist/jobs/index.js +1 -1
  277. package/dist/jobs/web/client-plugin.js +2 -3
  278. package/dist/jobs/{constants.js → web/constants.js} +0 -1
  279. package/dist/jobs/web/default-translations.d.ts +2 -0
  280. package/dist/jobs/web/default-translations.js +3 -0
  281. package/dist/jobs/web/i18n.d.ts +5 -2
  282. package/dist/jobs/web/i18n.js +51 -4
  283. package/dist/jobs/web/index.js +0 -1
  284. package/dist/ledger/entity.d.ts +1 -1
  285. package/dist/ledger/entity.js +1 -1
  286. package/dist/ledger/feature.js +1 -1
  287. package/dist/ledger/handlers/confirm-schedule-period.write.js +2 -5
  288. package/dist/ledger/handlers/create-transaction.write.js +1 -1
  289. package/dist/ledger/handlers/reports.query.js +1 -1
  290. package/dist/ledger/handlers/reverse-transaction.write.js +1 -1
  291. package/dist/ledger/index.d.ts +1 -1
  292. package/dist/ledger/index.js +1 -1
  293. package/dist/ledger/recurring.d.ts +1 -1
  294. package/dist/ledger/reports.d.ts +1 -1
  295. package/dist/ledger/schemas.js +1 -1
  296. package/dist/ledger/{constants.js → web/constants.js} +0 -1
  297. package/dist/ledger/web/index.d.ts +1 -1
  298. package/dist/ledger/web/index.js +1 -2
  299. package/dist/legal-pages/feature.d.ts +1 -1
  300. package/dist/legal-pages/feature.js +1 -1
  301. package/dist/legal-pages/index.d.ts +1 -1
  302. package/dist/legal-pages/index.js +1 -1
  303. package/dist/legal-pages/lib/boot-check.d.ts +1 -1
  304. package/dist/legal-pages/lib/boot-check.js +1 -1
  305. package/dist/legal-pages/lib/validate-routes.d.ts +1 -1
  306. package/dist/legal-pages/web/client-plugin.js +1 -2
  307. package/dist/legal-pages/{constants.js → web/constants.js} +6 -8
  308. package/dist/legal-pages/web/index.js +0 -1
  309. package/dist/managed-pages/feature.js +1 -1
  310. package/dist/managed-pages/web/client-plugin.js +1 -2
  311. package/dist/managed-pages/web/default-translations.d.ts +2 -0
  312. package/dist/managed-pages/web/default-translations.js +11 -0
  313. package/dist/managed-pages/web/i18n.d.ts +5 -2
  314. package/dist/managed-pages/web/i18n.js +53 -12
  315. package/dist/managed-pages/web/index.d.ts +1 -1
  316. package/dist/managed-pages/web/index.js +1 -2
  317. package/dist/metrics/compute.d.ts +1 -1
  318. package/dist/metrics/compute.js +1 -1
  319. package/dist/metrics/feature.js +1 -1
  320. package/dist/metrics/index.d.ts +1 -1
  321. package/dist/metrics/index.js +1 -1
  322. package/dist/metrics/types.d.ts +1 -1
  323. package/dist/metrics/validate.js +1 -1
  324. package/dist/metrics/{constants.js → web/constants.js} +0 -1
  325. package/dist/metrics/window.d.ts +1 -1
  326. package/dist/notes-history/feature.js +1 -1
  327. package/dist/notes-history/handlers/add-note.write.js +1 -1
  328. package/dist/notes-history/index.d.ts +1 -1
  329. package/dist/notes-history/index.js +1 -1
  330. package/dist/notes-history/web/client-plugin.js +1 -2
  331. package/dist/notes-history/{constants.js → web/constants.js} +0 -1
  332. package/dist/notes-history/web/i18n.js +0 -1
  333. package/dist/notes-history/web/index.d.ts +1 -1
  334. package/dist/notes-history/web/index.js +1 -2
  335. package/dist/notes-history/web/notes-section.js +2 -3
  336. package/dist/personal-access-tokens/feature.d.ts +2 -2
  337. package/dist/personal-access-tokens/feature.js +6 -4
  338. package/dist/personal-access-tokens/handlers/available-scopes.query.d.ts +1 -1
  339. package/dist/personal-access-tokens/handlers/create.write.js +1 -1
  340. package/dist/personal-access-tokens/handlers/revoke.write.js +1 -1
  341. package/dist/personal-access-tokens/hash.js +1 -1
  342. package/dist/personal-access-tokens/i18n.d.ts +1 -1
  343. package/dist/personal-access-tokens/i18n.js +1 -1
  344. package/dist/personal-access-tokens/index.d.ts +5 -5
  345. package/dist/personal-access-tokens/index.js +3 -3
  346. package/dist/personal-access-tokens/resolver.d.ts +1 -1
  347. package/dist/personal-access-tokens/resolver.js +1 -1
  348. package/dist/personal-access-tokens/schema/api-token.js +1 -1
  349. package/dist/personal-access-tokens/screens.d.ts +1 -1
  350. package/dist/personal-access-tokens/screens.js +1 -1
  351. package/dist/personal-access-tokens/{constants.js → web/constants.js} +0 -1
  352. package/dist/presets/index.d.ts +0 -1
  353. package/dist/presets/index.js +0 -1
  354. package/dist/presets/security-baseline.d.ts +1 -1
  355. package/dist/presets/security-baseline.js +1 -1
  356. package/dist/secrets/feature.js +1 -1
  357. package/dist/secrets/handlers/delete.write.js +1 -1
  358. package/dist/secrets/handlers/list.query.js +1 -1
  359. package/dist/secrets/handlers/set.write.js +1 -1
  360. package/dist/secrets/i18n.js +1 -1
  361. package/dist/secrets/index.d.ts +1 -1
  362. package/dist/secrets/index.js +1 -1
  363. package/dist/secrets/{constants.js → web/constants.js} +0 -1
  364. package/dist/secrets/write-gate.js +1 -1
  365. package/dist/sessions/feature.js +7 -4
  366. package/dist/sessions/{i18n.js → web/i18n.js} +0 -1
  367. package/dist/shared/index.d.ts +1 -1
  368. package/dist/shared/index.js +1 -1
  369. package/dist/shared/purge-files-reaching-subject.js +7 -3
  370. package/dist/subscription-stripe/feature.js +2 -1
  371. package/dist/subscription-stripe/plugin-methods.d.ts +3 -0
  372. package/dist/subscription-stripe/plugin-methods.js +14 -0
  373. package/dist/subscription-stripe/verify-webhook.js +1 -0
  374. package/dist/tags/feature.js +1 -1
  375. package/dist/tags/handlers/assign-tag.write.js +11 -7
  376. package/dist/tags/handlers/create-tag.write.js +1 -1
  377. package/dist/tags/handlers/delete-tag.write.js +4 -1
  378. package/dist/tags/handlers/remove-tag.write.js +1 -1
  379. package/dist/tags/handlers/update-tag.write.js +1 -1
  380. package/dist/tags/index.d.ts +1 -1
  381. package/dist/tags/index.js +1 -1
  382. package/dist/tags/screens.js +1 -1
  383. package/dist/tags/web/client-plugin.js +1 -2
  384. package/dist/tags/{constants.d.ts → web/constants.d.ts} +1 -0
  385. package/dist/tags/{constants.js → web/constants.js} +3 -1
  386. package/dist/tags/web/entity-tags.js +1 -2
  387. package/dist/tags/web/i18n.js +2 -2
  388. package/dist/tags/web/index.d.ts +1 -1
  389. package/dist/tags/web/index.js +1 -2
  390. package/dist/tags/web/tag-filter.js +1 -2
  391. package/dist/tags/web/tag-manager.js +5 -4
  392. package/dist/tags/web/tag-picker.js +0 -1
  393. package/dist/tags/web/tag-section.js +1 -2
  394. package/dist/tags/web/tags-cell.js +1 -2
  395. package/dist/template-resolver/api.d.ts +21 -23
  396. package/dist/template-resolver/api.js +34 -6
  397. package/dist/template-resolver/compile-document-body.js +1 -1
  398. package/dist/template-resolver/compile-steps-block.js +2 -2
  399. package/dist/template-resolver/document-ops.d.ts +1 -1
  400. package/dist/template-resolver/document-ops.js +3 -3
  401. package/dist/template-resolver/document-sanitizer.d.ts +1 -1
  402. package/dist/template-resolver/document-sanitizer.js +3 -3
  403. package/dist/template-resolver/feature.d.ts +2 -0
  404. package/dist/template-resolver/feature.js +12 -4
  405. package/dist/template-resolver/handlers/by-slug.query.js +6 -1
  406. package/dist/template-resolver/handlers/by-tenant.query.js +6 -2
  407. package/dist/template-resolver/handlers/collection-item.query.js +1 -1
  408. package/dist/template-resolver/handlers/collection-list.query.js +1 -1
  409. package/dist/template-resolver/handlers/collection-set.write.d.ts +2 -1
  410. package/dist/template-resolver/handlers/collection-set.write.js +14 -2
  411. package/dist/template-resolver/handlers/copy-locale.write.js +2 -2
  412. package/dist/template-resolver/handlers/diff-to-system.query.js +5 -1
  413. package/dist/template-resolver/handlers/discard-draft.write.js +1 -1
  414. package/dist/template-resolver/handlers/document-base.d.ts +1 -1
  415. package/dist/template-resolver/handlers/document-base.js +6 -1
  416. package/dist/template-resolver/handlers/document-blocks.query.d.ts +1 -1
  417. package/dist/template-resolver/handlers/document-blocks.query.js +2 -2
  418. package/dist/template-resolver/handlers/export-bundle.query.js +5 -2
  419. package/dist/template-resolver/handlers/find-by-id.query.js +4 -2
  420. package/dist/template-resolver/handlers/layout-source.query.js +5 -5
  421. package/dist/template-resolver/handlers/list.query.js +5 -2
  422. package/dist/template-resolver/handlers/overview.query.d.ts +10 -2
  423. package/dist/template-resolver/handlers/overview.query.js +44 -12
  424. package/dist/template-resolver/handlers/patch-draft.write.js +1 -1
  425. package/dist/template-resolver/handlers/resource-shared.js +1 -1
  426. package/dist/template-resolver/handlers/resource-upload.write.js +1 -1
  427. package/dist/template-resolver/handlers/send-test.write.js +2 -2
  428. package/dist/template-resolver/handlers/set.write.js +1 -1
  429. package/dist/template-resolver/handlers/shared.js +1 -1
  430. package/dist/template-resolver/handlers/template-gates.d.ts +1 -1
  431. package/dist/template-resolver/handlers/template-gates.js +1 -1
  432. package/dist/template-resolver/handlers/template-write.d.ts +1 -1
  433. package/dist/template-resolver/handlers/template-write.js +1 -1
  434. package/dist/template-resolver/handlers/usage.query.js +3 -2
  435. package/dist/template-resolver/handlers/validate.query.d.ts +1 -1
  436. package/dist/template-resolver/handlers/validate.query.js +3 -1
  437. package/dist/template-resolver/i18n.d.ts +3 -0
  438. package/dist/template-resolver/i18n.js +24 -0
  439. package/dist/template-resolver/index.d.ts +4 -3
  440. package/dist/template-resolver/index.js +3 -3
  441. package/dist/template-resolver/layout-appearance.js +1 -1
  442. package/dist/template-resolver/layout-regions.d.ts +1 -1
  443. package/dist/template-resolver/seeding.d.ts +4 -1
  444. package/dist/template-resolver/seeding.js +13 -7
  445. package/dist/template-resolver/store-template-resource.js +2 -2
  446. package/dist/template-resolver/table.js +1 -1
  447. package/dist/template-resolver/template-bundle.js +2 -2
  448. package/dist/template-resolver/template-delivery-policy.d.ts +22 -0
  449. package/dist/template-resolver/template-delivery-policy.js +40 -0
  450. package/dist/template-resolver/template-draft.d.ts +1 -1
  451. package/dist/template-resolver/template-draft.js +1 -1
  452. package/dist/template-resolver/template-edit-policy.d.ts +1 -1
  453. package/dist/template-resolver/template-edit-policy.js +1 -1
  454. package/dist/template-resolver/template-meta.d.ts +2 -2
  455. package/dist/template-resolver/template-meta.js +2 -2
  456. package/dist/template-resolver/template-preview.d.ts +1 -1
  457. package/dist/template-resolver/template-preview.js +8 -4
  458. package/dist/template-resolver/template-usage.d.ts +1 -1
  459. package/dist/template-resolver/template-usage.js +1 -1
  460. package/dist/template-resolver/template-validation.js +1 -1
  461. package/dist/template-resolver/testing.js +1 -1
  462. package/dist/template-resolver/user-content-table.js +1 -1
  463. package/dist/template-resolver/web/client-plugin.js +1 -2
  464. package/dist/template-resolver/{constants.d.ts → web/constants.d.ts} +1 -1
  465. package/dist/template-resolver/{constants.js → web/constants.js} +7 -10
  466. package/dist/template-resolver/web/document-editor-extensions.js +2 -2
  467. package/dist/template-resolver/web/document-editor.js +0 -1
  468. package/dist/template-resolver/{document-images.js → web/document-images.js} +0 -1
  469. package/dist/template-resolver/{document-schema.js → web/document-schema.js} +0 -1
  470. package/dist/template-resolver/{document-steps.js → web/document-steps.js} +0 -1
  471. package/dist/template-resolver/web/document-tiptap-editor.js +2 -3
  472. package/dist/template-resolver/web/document-toolbar-blocks.d.ts +2 -2
  473. package/dist/template-resolver/web/document-toolbar-blocks.js +1 -1
  474. package/dist/template-resolver/web/editor-handle.js +1 -1
  475. package/dist/template-resolver/web/i18n.js +1 -1
  476. package/dist/template-resolver/web/index.d.ts +3 -3
  477. package/dist/template-resolver/web/index.js +3 -4
  478. package/dist/template-resolver/{mail-constants.js → web/mail-constants.js} +0 -1
  479. package/dist/template-resolver/{pdf-constants.js → web/pdf-constants.js} +0 -1
  480. package/dist/template-resolver/web/placeholder-line-editor-lazy.js +0 -1
  481. package/dist/template-resolver/web/placeholder-line-editor.js +6 -4
  482. package/dist/template-resolver/{qualified-names.js → web/qualified-names.js} +0 -1
  483. package/dist/template-resolver/web/use-stable-by-key.js +0 -1
  484. package/dist/tenant/handlers/add-member.write.js +1 -1
  485. package/dist/tenant/index.d.ts +1 -1
  486. package/dist/tenant/index.js +1 -1
  487. package/dist/tenant/invitation-table.js +1 -1
  488. package/dist/tenant/invited-membership.js +1 -1
  489. package/dist/tenant/last-tenant-admin.js +1 -1
  490. package/dist/tenant/member-role-options.js +1 -1
  491. package/dist/tenant/screens.js +1 -1
  492. package/dist/tenant/web/client-plugin.js +1 -2
  493. package/dist/tenant/{constants.js → web/constants.js} +3 -6
  494. package/dist/tenant/web/index.js +0 -1
  495. package/dist/tenant/web/member-roles-cell.js +0 -1
  496. package/dist/tenant/web/member-status-cell.js +0 -1
  497. package/dist/tenant-lifecycle/stages.js +2 -3
  498. package/dist/tier-engine/entity.d.ts +1 -1
  499. package/dist/tier-engine/entity.js +1 -1
  500. package/dist/tier-engine/feature.js +2 -2
  501. package/dist/tier-engine/handlers/set-tenant-tier.write.js +1 -1
  502. package/dist/tier-engine/index.d.ts +1 -1
  503. package/dist/tier-engine/index.js +1 -1
  504. package/dist/tier-engine/web/client-plugin.js +2 -3
  505. package/dist/tier-engine/{constants.js → web/constants.js} +2 -3
  506. package/dist/tier-engine/{i18n.js → web/i18n.js} +0 -1
  507. package/dist/tier-engine/web/index.js +0 -1
  508. package/dist/user/handlers/create.write.js +1 -1
  509. package/dist/user/handlers/update-roles.js +1 -1
  510. package/dist/user/handlers/update.write.js +1 -1
  511. package/dist/user/index.d.ts +1 -1
  512. package/dist/user/index.js +1 -1
  513. package/dist/user/invited-global-roles.d.ts +1 -1
  514. package/dist/user/invited-global-roles.js +1 -1
  515. package/dist/user/schema/user.js +1 -1
  516. package/dist/user/{constants.js → web/constants.js} +0 -1
  517. package/dist/user-data-rights/env.js +1 -1
  518. package/dist/user-data-rights/feature.js +3 -3
  519. package/dist/user-data-rights/index.d.ts +1 -1
  520. package/dist/user-data-rights/index.js +1 -1
  521. package/dist/user-data-rights/lib/resolve-tenant-model.js +1 -1
  522. package/dist/user-data-rights/mail-notifications.js +1 -1
  523. package/dist/user-data-rights/web/client-plugin.js +2 -3
  524. package/dist/user-data-rights/web/confirm-deletion-screen.js +0 -1
  525. package/dist/user-data-rights/{constants.js → web/constants.js} +11 -12
  526. package/dist/user-data-rights/web/default-translations.d.ts +2 -0
  527. package/dist/user-data-rights/web/default-translations.js +59 -0
  528. package/dist/user-data-rights/web/i18n.d.ts +5 -2
  529. package/dist/user-data-rights/web/i18n.js +37 -59
  530. package/dist/user-data-rights/web/index.d.ts +1 -1
  531. package/dist/user-data-rights/web/index.js +1 -2
  532. package/dist/user-data-rights/web/privacy-center-screen.js +1 -2
  533. package/dist/user-data-rights/web/request-deletion-screen.js +0 -1
  534. package/dist/user-data-rights-defaults/hooks/file-ref.userdata-hook.js +6 -1
  535. package/dist/user-profile/feature.js +1 -1
  536. package/dist/user-profile/handlers/change-email.write.js +1 -1
  537. package/dist/user-profile/index.d.ts +1 -1
  538. package/dist/user-profile/index.js +1 -1
  539. package/dist/user-profile/web/client-plugin.js +2 -3
  540. package/dist/user-profile/{constants.js → web/constants.js} +0 -1
  541. package/dist/user-profile/{i18n.js → web/i18n.js} +0 -1
  542. package/dist/user-profile/web/profile-screen.js +2 -3
  543. package/dist/waitlist/entity.js +1 -1
  544. package/dist/waitlist/feature.js +1 -1
  545. package/dist/waitlist/handlers/export-purge.write.js +1 -1
  546. package/dist/waitlist/handlers/invite.write.js +1 -1
  547. package/dist/waitlist/handlers/reject.write.js +1 -1
  548. package/dist/waitlist/handlers/submit.write.js +4 -3
  549. package/dist/waitlist/import.d.ts +1 -1
  550. package/dist/waitlist/index.d.ts +1 -1
  551. package/dist/waitlist/index.js +1 -1
  552. package/dist/waitlist/legacy-migrate.js +1 -1
  553. package/dist/waitlist/link-on-signup.js +1 -1
  554. package/dist/waitlist/mail.d.ts +0 -1
  555. package/dist/waitlist/mail.js +6 -4
  556. package/dist/waitlist/payloads.js +1 -1
  557. package/dist/waitlist/screens.js +1 -1
  558. package/dist/waitlist/{constants.js → web/constants.js} +0 -1
  559. package/kumiko-es-tables.json +102 -0
  560. package/package.json +30 -29
  561. package/src/audit/changes.json +7 -0
  562. package/src/auth-email-password/changes.json +6 -0
  563. package/src/auth-mfa/changes.json +6 -0
  564. package/src/billing-foundation/changes.json +18 -0
  565. package/src/delivery/changes.json +6 -0
  566. package/src/document-ingest-foundation/changes.json +6 -0
  567. package/src/files/changes.json +7 -0
  568. package/src/form-draft/changes.json +7 -0
  569. package/src/ledger/changes.json +7 -0
  570. package/src/presets/changes.json +7 -0
  571. package/src/tags/changes.json +6 -0
  572. package/src/template-resolver/changes.json +43 -0
  573. package/src/user-data-rights/changes.json +14 -0
  574. package/src/waitlist/changes.json +6 -0
  575. package/dist/admin-shell/i18n.d.ts +0 -5
  576. package/dist/admin-shell/i18n.js +0 -51
  577. package/dist/audit/i18n.d.ts +0 -5
  578. package/dist/audit/i18n.js +0 -22
  579. package/dist/jobs/i18n.d.ts +0 -5
  580. package/dist/jobs/i18n.js +0 -52
  581. package/dist/managed-pages/i18n.d.ts +0 -5
  582. package/dist/managed-pages/i18n.js +0 -55
  583. package/dist/presets/dsgvo-self-service.d.ts +0 -10
  584. package/dist/presets/dsgvo-self-service.js +0 -24
  585. package/dist/user-data-rights/i18n.d.ts +0 -5
  586. package/dist/user-data-rights/i18n.js +0 -39
  587. /package/dist/account-security/{constants.d.ts → web/constants.d.ts} +0 -0
  588. /package/dist/account-security/{i18n.d.ts → web/i18n.d.ts} +0 -0
  589. /package/dist/admin-shell/{constants.d.ts → web/constants.d.ts} +0 -0
  590. /package/dist/auth-email-password/{constants.d.ts → web/constants.d.ts} +0 -0
  591. /package/dist/auth-email-password/{i18n.d.ts → web/i18n.d.ts} +0 -0
  592. /package/dist/auth-email-password/{mail-i18n.d.ts → web/mail-i18n.d.ts} +0 -0
  593. /package/dist/auth-mfa/{constants.d.ts → web/constants.d.ts} +0 -0
  594. /package/dist/billing-foundation/{consumer-protection → web/consumer-protection}/consent-locale.d.ts +0 -0
  595. /package/dist/billing-foundation/{contact-card.d.ts → web/contact-card.d.ts} +0 -0
  596. /package/dist/cap-overview/{constants.d.ts → web/constants.d.ts} +0 -0
  597. /package/dist/cap-overview/{usage-math.js → web/usage-math.js} +0 -0
  598. /package/dist/compliance-profiles/{constants.d.ts → web/constants.d.ts} +0 -0
  599. /package/dist/config/{constants.d.ts → web/constants.d.ts} +0 -0
  600. /package/dist/custom-fields/{constants.d.ts → web/constants.d.ts} +0 -0
  601. /package/dist/delivery/{public-names.d.ts → web/public-names.d.ts} +0 -0
  602. /package/dist/feature-toggles/{constants.d.ts → web/constants.d.ts} +0 -0
  603. /package/dist/folders/{constants.d.ts → web/constants.d.ts} +0 -0
  604. /package/dist/form-draft/{constants.d.ts → web/constants.d.ts} +0 -0
  605. /package/dist/jobs/{constants.d.ts → web/constants.d.ts} +0 -0
  606. /package/dist/ledger/{constants.d.ts → web/constants.d.ts} +0 -0
  607. /package/dist/legal-pages/{constants.d.ts → web/constants.d.ts} +0 -0
  608. /package/dist/metrics/{constants.d.ts → web/constants.d.ts} +0 -0
  609. /package/dist/notes-history/{constants.d.ts → web/constants.d.ts} +0 -0
  610. /package/dist/personal-access-tokens/{constants.d.ts → web/constants.d.ts} +0 -0
  611. /package/dist/personal-access-tokens/{scopes.d.ts → web/scopes.d.ts} +0 -0
  612. /package/dist/personal-access-tokens/{scopes.js → web/scopes.js} +0 -0
  613. /package/dist/secrets/{constants.d.ts → web/constants.d.ts} +0 -0
  614. /package/dist/sessions/{i18n.d.ts → web/i18n.d.ts} +0 -0
  615. /package/dist/template-resolver/{document-blocks.d.ts → web/document-blocks.d.ts} +0 -0
  616. /package/dist/template-resolver/{document-blocks.js → web/document-blocks.js} +0 -0
  617. /package/dist/template-resolver/{document-images.d.ts → web/document-images.d.ts} +0 -0
  618. /package/dist/template-resolver/{document-schema.d.ts → web/document-schema.d.ts} +0 -0
  619. /package/dist/template-resolver/{document-steps.d.ts → web/document-steps.d.ts} +0 -0
  620. /package/dist/template-resolver/{mail-constants.d.ts → web/mail-constants.d.ts} +0 -0
  621. /package/dist/template-resolver/{pdf-constants.d.ts → web/pdf-constants.d.ts} +0 -0
  622. /package/dist/template-resolver/{placeholder-text.d.ts → web/placeholder-text.d.ts} +0 -0
  623. /package/dist/template-resolver/{placeholder-text.js → web/placeholder-text.js} +0 -0
  624. /package/dist/template-resolver/{qualified-names.d.ts → web/qualified-names.d.ts} +0 -0
  625. /package/dist/tenant/{constants.d.ts → web/constants.d.ts} +0 -0
  626. /package/dist/tier-engine/{constants.d.ts → web/constants.d.ts} +0 -0
  627. /package/dist/tier-engine/{i18n.d.ts → web/i18n.d.ts} +0 -0
  628. /package/dist/user/{constants.d.ts → web/constants.d.ts} +0 -0
  629. /package/dist/user-data-rights/{constants.d.ts → web/constants.d.ts} +0 -0
  630. /package/dist/user-profile/{constants.d.ts → web/constants.d.ts} +0 -0
  631. /package/dist/user-profile/{i18n.d.ts → web/i18n.d.ts} +0 -0
  632. /package/dist/waitlist/{constants.d.ts → web/constants.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  import type { TokenVerifier } from "@cosmicdrift/kumiko-framework/api";
2
2
  import type { DbConnection } from "@cosmicdrift/kumiko-framework/db";
3
- import { type PatScopeConfig } from "./scopes.ts";
3
+ import { type PatScopeConfig } from "./web/scopes.ts";
4
4
  export declare function createPatResolver(opts: {
5
5
  readonly db: DbConnection;
6
6
  readonly scopes: PatScopeConfig;
@@ -3,7 +3,7 @@ import { isExpiredAt } from "./expiry.js";
3
3
  import { hashPatToken } from "./hash.js";
4
4
  import { resolvePatRoles } from "./roles.js";
5
5
  import { apiTokenTable } from "./schema/api-token.js";
6
- import { expandScopes } from "./scopes.js";
6
+ import { expandScopes } from "./web/scopes.js";
7
7
  // Hot-path resolver — raw-DB like session-callbacks (a dispatcher roundtrip on
8
8
  // every request buys nothing here). Hash the bearer token, point-read the row,
9
9
  // reject revoked/expired, resolve LIVE roles, expand granted scopes into
@@ -1,6 +1,6 @@
1
1
  import { deriveEntityTableMeta } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { access, createEntity, createTextField, createTimestampField, } from "@cosmicdrift/kumiko-framework/engine";
3
- import { API_TOKEN_ENTITY_NAME } from "../constants.js";
3
+ import { API_TOKEN_ENTITY_NAME } from "../web/constants.js";
4
4
  // One row per Personal Access Token. Like store_user_sessions this is a
5
5
  // direct-write store (r.unmanagedTable): the create/revoke handlers write it and
6
6
  // the resolver point-reads it on the hot auth path. `tokenHash` is the SHA-256
@@ -1,5 +1,5 @@
1
1
  import { type ProjectionListScreenDefinition, type SecretMintScreenDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
- import type { PatScopeConfig } from "./scopes.ts";
2
+ import type { PatScopeConfig } from "./web/scopes.ts";
3
3
  export declare const patListScreen: ProjectionListScreenDefinition;
4
4
  export declare function patGrantOptions(scopes: PatScopeConfig): string[];
5
5
  export declare function createPatMintScreen(scopes: PatScopeConfig): SecretMintScreenDefinition;
@@ -1,7 +1,7 @@
1
1
  import { i18nKey, MAX_LIST_LIMIT, } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { ACTION_FORM_ENTITY } from "@cosmicdrift/kumiko-framework/ui-types";
3
3
  import { fieldOptionLabelKeyPrefix } from "@cosmicdrift/kumiko-renderer/headless";
4
- import { PAT_FEATURE, PAT_MINT_SCREEN_ID, PAT_SCREEN_ID, PatHandlers, PatQueries, } from "./constants.js";
4
+ import { PAT_FEATURE, PAT_MINT_SCREEN_ID, PAT_SCREEN_ID, PatHandlers, PatQueries, } from "./web/constants.js";
5
5
  const PAT_STATUS_OPTION_KEY_PREFIX = "pat.list.status.";
6
6
  // Same keys the mint form's `scopes` multiSelect options resolve through
7
7
  // (see patScopeOptionTranslations), so list and form show identical labels.
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // Pure constants — client-marked so the web screen (web/) may import screen-id
3
2
  // and QN names without pulling the feature's server runtime barrel.
4
3
  export const PAT_FEATURE = "personal-access-tokens";
@@ -1,2 +1 @@
1
- export { type DsgvoSelfServiceOptions, dsgvoSelfServiceFeatures } from "./dsgvo-self-service.ts";
2
1
  export { type SecurityBaselineOptions, securityBaselineFeatures } from "./security-baseline.ts";
@@ -1,2 +1 @@
1
- export { dsgvoSelfServiceFeatures } from "./dsgvo-self-service.js";
2
1
  export { securityBaselineFeatures } from "./security-baseline.js";
@@ -2,6 +2,6 @@ import type { FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
2
  export type SecurityBaselineOptions = {
3
3
  readonly includeSessions?: boolean;
4
4
  };
5
- /** @deprecated Removed in the next release. Use `composeSecurityStack({ includeSessions })`
5
+ /** @deprecated Removed in 0.390.0. Use `composeSecurityStack({ includeSessions })`
6
6
  * from `@cosmicdrift/kumiko-dev-server/compose-stacks`. */
7
7
  export declare function securityBaselineFeatures(opts?: SecurityBaselineOptions): FeatureDefinition[];
@@ -3,7 +3,7 @@ import { createCryptoShreddingFeature } from "../crypto-shredding/index.js";
3
3
  import { createRateLimitingFeature } from "../rate-limiting/index.js";
4
4
  import { createSessionsFeature } from "../sessions/index.js";
5
5
  // Host app must mount user, tenant, auth-foundation (sessions/audit requires).
6
- /** @deprecated Removed in the next release. Use `composeSecurityStack({ includeSessions })`
6
+ /** @deprecated Removed in 0.390.0. Use `composeSecurityStack({ includeSessions })`
7
7
  * from `@cosmicdrift/kumiko-dev-server/compose-stacks`. */
8
8
  export function securityBaselineFeatures(opts = {}) {
9
9
  return [
@@ -3,7 +3,6 @@ import { featureWithEnvSchema } from "@cosmicdrift/kumiko-framework/env";
3
3
  import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
4
4
  import { SETTINGS_HUB_I18N } from "@cosmicdrift/kumiko-framework/i18n";
5
5
  import * as z from "zod";
6
- import { DEFAULT_SECRETS_ACCESS } from "./constants.js";
7
6
  import { createDeleteHandler } from "./handlers/delete.write.js";
8
7
  import { createListHandler } from "./handlers/list.query.js";
9
8
  import { rotateJob } from "./handlers/rotate.job.js";
@@ -11,6 +10,7 @@ import { createSetHandler } from "./handlers/set.write.js";
11
10
  import { SECRETS_I18N } from "./i18n.js";
12
11
  import { secretReadSchema } from "./secrets-context.js";
13
12
  import { tenantSecretEntity, tenantSecretsTable } from "./table.js";
13
+ import { DEFAULT_SECRETS_ACCESS } from "./web/constants.js";
14
14
  const ROTATE_ESCAPE_HATCH_REASON = "re-encrypts every tenant's secrets with the new master key";
15
15
  /**
16
16
  * Env-vars contract for the `secrets` feature. Apps merge this via
@@ -2,8 +2,8 @@ import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { failNotFound } from "@cosmicdrift/kumiko-framework/errors";
3
3
  import * as z from "zod";
4
4
  import { announceSecretChange } from "../announce-secret-change.js";
5
- import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../constants.js";
6
5
  import { JOIN_REQUEST_TRANSACTION_REASON, requireSecretsContext } from "../feature.js";
6
+ import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../web/constants.js";
7
7
  import { checkSecretKeyWrite } from "../write-gate.js";
8
8
  export function createDeleteHandler(access = DEFAULT_SECRETS_ACCESS) {
9
9
  return defineWriteHandler({
@@ -1,7 +1,7 @@
1
1
  import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import * as z from "zod";
3
- import { DEFAULT_SECRETS_ACCESS } from "../constants.js";
4
3
  import { tenantSecretsTable } from "../table.js";
4
+ import { DEFAULT_SECRETS_ACCESS } from "../web/constants.js";
5
5
  // Lists all secrets for the current tenant. Returns redactedPreview, never
6
6
  // the plaintext. Decryption would be pointless here anyway — this is the
7
7
  // TenantAdmin UI, not feature code that needs the value.
@@ -1,8 +1,8 @@
1
1
  import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import * as z from "zod";
3
3
  import { announceSecretChange } from "../announce-secret-change.js";
4
- import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../constants.js";
5
4
  import { JOIN_REQUEST_TRANSACTION_REASON, requireSecretsContext } from "../feature.js";
5
+ import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../web/constants.js";
6
6
  import { checkSecretKeyWrite, checkSecretValue } from "../write-gate.js";
7
7
  export function createSetHandler(access = DEFAULT_SECRETS_ACCESS) {
8
8
  return defineWriteHandler({
@@ -1,4 +1,4 @@
1
- import { SECRETS_ERROR_KEYS } from "./constants.js";
1
+ import { SECRETS_ERROR_KEYS } from "./web/constants.js";
2
2
  export const SECRETS_I18N = {
3
3
  [SECRETS_ERROR_KEYS.unknownKey]: {
4
4
  en: "Unknown secret key.",
@@ -1,7 +1,7 @@
1
- export { DEFAULT_SECRETS_ACCESS, DEFAULT_SECRETS_ROLES, INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS, SecretsHandlers, SecretsQueries, } from "./constants.ts";
2
1
  export { createSecretsContext, createSecretsFeature, requireSecretsContext, SECRETS_FEATURE_NAME, SECRETS_MASTER_KEK_ENV_KEYS, type SecretsContext, type SecretsContextOptions, type SecretsFeatureOptions, type StoredEnvelope, type StoredMetadata, secretsEnvSchema, TENANT_SECRET_READ_EVENT, tenantSecretsTable, } from "./feature.ts";
3
2
  export { createDeleteHandler } from "./handlers/delete.write.ts";
4
3
  export { createListHandler } from "./handlers/list.query.ts";
5
4
  export { type RotateJobPayload, type RotateJobResult, rotateJob, } from "./handlers/rotate.job.ts";
6
5
  export { createSetHandler } from "./handlers/set.write.ts";
6
+ export { DEFAULT_SECRETS_ACCESS, DEFAULT_SECRETS_ROLES, INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS, SecretsHandlers, SecretsQueries, } from "./web/constants.ts";
7
7
  export { isInvalidSecretValueError } from "./write-gate.ts";
@@ -1,7 +1,7 @@
1
- export { DEFAULT_SECRETS_ACCESS, DEFAULT_SECRETS_ROLES, INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS, SecretsHandlers, SecretsQueries, } from "./constants.js";
2
1
  export { createSecretsContext, createSecretsFeature, requireSecretsContext, SECRETS_FEATURE_NAME, SECRETS_MASTER_KEK_ENV_KEYS, secretsEnvSchema, TENANT_SECRET_READ_EVENT, tenantSecretsTable, } from "./feature.js";
3
2
  export { createDeleteHandler } from "./handlers/delete.write.js";
4
3
  export { createListHandler } from "./handlers/list.query.js";
5
4
  export { rotateJob, } from "./handlers/rotate.job.js";
6
5
  export { createSetHandler } from "./handlers/set.write.js";
6
+ export { DEFAULT_SECRETS_ACCESS, DEFAULT_SECRETS_ROLES, INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS, SecretsHandlers, SecretsQueries, } from "./web/constants.js";
7
7
  export { isInvalidSecretValueError } from "./write-gate.js";
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // secrets bundle constants — default RBAC for set/delete/list (#2296).
3
2
  // Default-RBAC of the set/delete/list handlers, hard-wired to ["TenantAdmin"]
4
3
  // before #2296. Apps with their own role vocabulary override via
@@ -1,5 +1,5 @@
1
1
  import { AccessDeniedError, isKumikoError, NotFoundError, ValidationError, writeFailure, } from "@cosmicdrift/kumiko-framework/errors";
2
- import { INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS } from "./constants.js";
2
+ import { INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS } from "./web/constants.js";
3
3
  function unknownKeyFailure(key) {
4
4
  return {
5
5
  ok: false,
@@ -9,11 +9,11 @@ import { mineQuery } from "./handlers/mine.query.js";
9
9
  import { revokeWrite } from "./handlers/revoke.write.js";
10
10
  import { revokeAllForUserWrite } from "./handlers/revoke-all-for-user.write.js";
11
11
  import { revokeAllOthersWrite } from "./handlers/revoke-all-others.write.js";
12
- import { SESSIONS_I18N } from "./i18n.js";
13
12
  import { userSessionEntity } from "./schema/user-session.js";
14
13
  import { createSessionDetailScreen, createSessionListScreen, sessionMineScreen, } from "./screens.js";
15
14
  import { createSessionCallbacks, } from "./session-callbacks.js";
16
15
  import { SESSION_REVOKED_EVENT_SHORT, sessionRevokedSchema } from "./session-revoked-event.js";
16
+ import { SESSIONS_I18N } from "./web/i18n.js";
17
17
  const CLEANUP_ESCAPE_HATCH_REASON = "deletes expired session rows of every tenant";
18
18
  // Reads the late-bind setter off a mounted sessions feature's exports.
19
19
  // run{Prod,Dev}App call it once the DB connection is concrete — the feature
@@ -143,11 +143,15 @@ export function createSessionsFeature(options) {
143
143
  // sessionChecker blocks a status-locked principal on its next request
144
144
  // regardless.
145
145
  const REVOKE_TRIGGERING_FIELDS = ["passwordHash"];
146
- let autoRevoke = options?.autoRevokeOnPasswordChange;
146
+ // Explicit option wins; the runtime binding is replaceable so a second boot of the same
147
+ // feature instance (a new app or test stack in one process) binds its own database.
148
+ const explicitAutoRevoke = options?.autoRevokeOnPasswordChange;
149
+ let boundAutoRevoke;
147
150
  r.hook({
148
151
  type: "postSave",
149
152
  target: { allOf: "user" },
150
153
  handler: async (ctx) => {
154
+ const autoRevoke = explicitAutoRevoke ?? boundAutoRevoke;
151
155
  // skip: nothing bound — stateless-JWT deployments without a runtime
152
156
  // that calls bindAutoRevokeOnPasswordChange keep the old behavior.
153
157
  if (!autoRevoke)
@@ -165,8 +169,7 @@ export function createSessionsFeature(options) {
165
169
  },
166
170
  });
167
171
  const bindAutoRevokeOnPasswordChange = (revoker) => {
168
- // explicit constructor option wins over the runtime binding
169
- autoRevoke ??= revoker;
172
+ boundAutoRevoke = revoker;
170
173
  };
171
174
  r.translations({ keys: SESSIONS_I18N });
172
175
  r.screen(createSessionListScreen(adminRoles));
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // Server + client i18n for the sessions operator screens.
3
2
  export const SESSIONS_I18N = {
4
3
  "screen:session-list.title": { en: "Sessions" },
@@ -10,7 +10,7 @@ export { isWithinGracePeriod } from "./grace-period.ts";
10
10
  export { isIdentityV3Hash, verifyIdentityV3Hash } from "./identity-v3-hash.ts";
11
11
  export { isTenantDb } from "./is-tenant-db.ts";
12
12
  export { createLockoutCounter, type LockoutCounterState } from "./lockout-counter.ts";
13
- export { mailHeading, mailParagraph, mailRepeatedRows } from "./mail-template-body.ts";
13
+ export { mailHeading, mailParagraph, mailParagraphWithLink, mailRepeatedRows, } from "./mail-template-body.ts";
14
14
  export { mapWithConcurrency } from "./map-with-concurrency.ts";
15
15
  export { denyUnlessJoinRowParentVisible, hostRowIsGone, joinRowParentIsVisible, parentRowIsVisible, } from "./parent-visibility.ts";
16
16
  export { hashPassword, verifyDummyPassword, verifyPassword } from "./password-hashing.ts";
@@ -10,7 +10,7 @@ export { isWithinGracePeriod } from "./grace-period.js";
10
10
  export { isIdentityV3Hash, verifyIdentityV3Hash } from "./identity-v3-hash.js";
11
11
  export { isTenantDb } from "./is-tenant-db.js";
12
12
  export { createLockoutCounter } from "./lockout-counter.js";
13
- export { mailHeading, mailParagraph, mailRepeatedRows } from "./mail-template-body.js";
13
+ export { mailHeading, mailParagraph, mailParagraphWithLink, mailRepeatedRows, } from "./mail-template-body.js";
14
14
  export { mapWithConcurrency } from "./map-with-concurrency.js";
15
15
  export { denyUnlessJoinRowParentVisible, hostRowIsGone, joinRowParentIsVisible, parentRowIsVisible, } from "./parent-visibility.js";
16
16
  export { hashPassword, verifyDummyPassword, verifyPassword } from "./password-hashing.js";
@@ -1,7 +1,7 @@
1
1
  import { resolveSubjectForField, SubjectResolutionError, subjectIdToKey, } from "@cosmicdrift/kumiko-framework/crypto";
2
2
  import { createEventStoreExecutor, createTenantDb, selectMany, } from "@cosmicdrift/kumiko-framework/db";
3
3
  import { createSystemUser, parseTenantId, SYSTEM_USER_ID, } from "@cosmicdrift/kumiko-framework/engine";
4
- import { FILE_REF_ENTITY_NAME, fileRefEntity, fileRefsTable, } from "@cosmicdrift/kumiko-framework/files";
4
+ import { FILE_REF_ENTITY_NAME, fileRefEntity, fileRefsTable, listActionFormFileFields, } from "@cosmicdrift/kumiko-framework/files";
5
5
  import { collectSingleFileHolders, planFileFields, purgeRowFileRefs, } from "./purge-row-file-refs.js";
6
6
  // Callers' error labels read err.code, so audit events name the failure class.
7
7
  export class FileSweepError extends Error {
@@ -147,7 +147,7 @@ export async function purgeFilesReachingSubject(args) {
147
147
  db,
148
148
  registry,
149
149
  subject,
150
- fileFieldKeys: pendingFieldKeys(fileEntities),
150
+ fileFieldKeys: pendingFieldKeys(fileEntities, registry),
151
151
  fileHolders,
152
152
  storageByTenant,
153
153
  resolveDeleteBytes,
@@ -158,8 +158,12 @@ export async function purgeFilesReachingSubject(args) {
158
158
  throw firstFailure;
159
159
  }
160
160
  const pendingFieldKey = (entityType, fieldName) => `${entityType}\u0000${fieldName}`;
161
- function pendingFieldKeys(fileEntities) {
161
+ // A pending upload of an actionForm files field is keyed by the screen QN, like an entity's by its name.
162
+ function pendingFieldKeys(fileEntities, registry) {
162
163
  const keys = new Set();
164
+ for (const { screenQn, fieldName } of listActionFormFileFields(registry)) {
165
+ keys.add(pendingFieldKey(screenQn, fieldName));
166
+ }
163
167
  for (const { entityName, fileFields } of fileEntities) {
164
168
  for (const fieldName of fileFields)
165
169
  keys.add(pendingFieldKey(entityName, fieldName));
@@ -34,7 +34,7 @@ import { access, createSystemConfig, defineFeature, } from "@cosmicdrift/kumiko-
34
34
  import { featureWithEnvSchema } from "@cosmicdrift/kumiko-framework/env";
35
35
  import * as z from "zod";
36
36
  import { STRIPE_API_KEY_CONFIG, STRIPE_BILLING_LIVE_CONFIG, STRIPE_PROVIDER_NAME, STRIPE_WEBHOOK_SECRET_CONFIG, SUBSCRIPTION_STRIPE_FEATURE, } from "./constants.js";
37
- import { createStripeCancelSubscription, createStripeCheckoutSession, createStripePlanSwitchSession, createStripePortalSession, createStripePriceCache, createStripeRetrievePrices, createStripeRetrieveSubscription, } from "./plugin-methods.js";
37
+ import { createStripeCancelSubscription, createStripeCheckoutSession, createStripePlanSwitchSession, createStripePortalSession, createStripePriceCache, createStripeResumeSubscription, createStripeRetrievePrices, createStripeRetrieveSubscription, } from "./plugin-methods.js";
38
38
  import { createStripeRuntimes } from "./runtime.js";
39
39
  import { verifyAndParseStripeWebhook } from "./verify-webhook.js";
40
40
  /**
@@ -181,6 +181,7 @@ export function createSubscriptionStripeFeature(options = {}) {
181
181
  }),
182
182
  createPortalSession: createStripePortalSession(runtimes.ctx),
183
183
  cancelSubscription: createStripeCancelSubscription(runtimes.ctx),
184
+ resumeSubscription: createStripeResumeSubscription(runtimes.ctx),
184
185
  priceToTier: options.priceToTier ?? {},
185
186
  oneOffPriceIds: options.oneOffPriceIds ?? [],
186
187
  isBillingEnabled: runtimes.ctx.isBillingEnabled,
@@ -16,6 +16,9 @@ export type StripePortalOptions = Parameters<NonNullable<SubscriptionProviderPlu
16
16
  export declare function createStripePortalSession(runtime: StripeCtxRuntime): (ctx: HandlerContext, options: StripePortalOptions) => Promise<{
17
17
  url: string;
18
18
  }>;
19
+ export declare function createStripeResumeSubscription(runtime: StripeCtxRuntime): (ctx: HandlerContext, options: {
20
+ readonly providerSubscriptionId: string;
21
+ }) => Promise<void>;
19
22
  export type StripeCancelOptions = Parameters<NonNullable<SubscriptionProviderPlugin["cancelSubscription"]>>[1];
20
23
  export declare function createStripeCancelSubscription(runtime: StripeCtxRuntime): (ctx: HandlerContext, options: StripeCancelOptions) => Promise<void>;
21
24
  export type StripeRetrieveSubscriptionOptions = {
@@ -164,6 +164,20 @@ export function createStripePortalSession(runtime) {
164
164
  }
165
165
  };
166
166
  }
167
+ // =============================================================================
168
+ // resumeSubscription
169
+ // =============================================================================
170
+ //
171
+ // Takes back a period-end cancel; the following `customer.subscription.updated`
172
+ // carries cancel_at null, which the projection stores as "renews".
173
+ export function createStripeResumeSubscription(runtime) {
174
+ return async (ctx, options) => {
175
+ const stripe = await runtime.clientForCtx(ctx);
176
+ await stripe.subscriptions.update(options.providerSubscriptionId, {
177
+ cancel_at_period_end: false,
178
+ });
179
+ };
180
+ }
167
181
  export function createStripeCancelSubscription(runtime) {
168
182
  return async (ctx, options) => {
169
183
  const stripe = await runtime.clientForCtx(ctx);
@@ -125,6 +125,7 @@ export function verifyAndParseStripeWebhook(runtime, options) {
125
125
  ...(consentId !== undefined && { consentId }),
126
126
  providerCustomerId: typeof sub.customer === "string" ? sub.customer : sub.customer.id,
127
127
  providerSubscriptionId: sub.id,
128
+ providerEventAt: Temporal.Instant.fromEpochMilliseconds(event.created * 1000).toString(),
128
129
  ...state,
129
130
  };
130
131
  };
@@ -19,7 +19,6 @@
19
19
  // Deferred: optional host-projection decoration (`wireTagsFor`), search indexing.
20
20
  import { defineEntityDetailHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, } from "@cosmicdrift/kumiko-framework/engine";
21
21
  import { assertNoWhereRuleInOwnershipWrite } from "../shared/index.js";
22
- import { DEFAULT_TAG_ACCESS, TAGS_FEATURE_NAME } from "./constants.js";
23
22
  import { createTagAssignmentEntity, tagEntity } from "./entity.js";
24
23
  import { createTagAssignmentExecutor } from "./executor.js";
25
24
  import { createAssignTagHandler } from "./handlers/assign-tag.write.js";
@@ -29,6 +28,7 @@ import { createRemoveTagHandler } from "./handlers/remove-tag.write.js";
29
28
  import { createUpdateTagHandler } from "./handlers/update-tag.write.js";
30
29
  import { TAGS_FEATURE_I18N } from "./i18n.js";
31
30
  import { createTagEditScreen, createTagListScreen } from "./screens.js";
31
+ import { DEFAULT_TAG_ACCESS, TAGS_FEATURE_NAME } from "./web/constants.js";
32
32
  function registerTags(r, access, toggleable, ownership, parents) {
33
33
  r.describe("Generic, host-agnostic tagging for any entity. Owns two event-sourced entities — the per-tenant `tag` catalog (`read_tags`, with optional `color` and `scope`) and `tag-assignment` join rows keyed by (entityType, entityId) (`read_tag_assignments`) — so tagging adds NO column to the host entity and needs no relational pivot or JOIN. Catalog screens are declarative (`entityList` + `entityEdit`) and use convention QNs `tag:{create,update,delete}`; TagManager/TagPicker keep `create-tag`/`update-tag`/`delete-tag`. Also: `assign-tag` (idempotent), `remove-tag` (idempotent) and list queries for the catalog and the assignments. Read which tags an entity has, or which entities carry a tag, by listing `tag-assignment` filtered on `entityId` or `tagId` and composing in the read-layer. A tag with empty `scope` is global; a `scope` of an entityType restricts it to that type in the picker. Every path uses one access rule — adopt the host's model with createTagsFeature({ access: { openToAll: { reason } } }) or pin roles with createTagsFeature({ roles }). Pass { toggleable: { default: false } } to make the whole feature tier-gatable via the tier-engine (no host hook).");
34
34
  r.uiHints({
@@ -2,9 +2,9 @@ import { NotFoundError, writeFailure } from "@cosmicdrift/kumiko-framework/error
2
2
  import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
3
3
  import { denyUnlessJoinRowParentVisible } from "../../shared/index.js";
4
4
  import { tagAssignmentAggregateId } from "../aggregate-id.js";
5
- import { DEFAULT_TAG_ACCESS } from "../constants.js";
6
5
  import { tagAssignmentExecutor, tagExecutor } from "../executor.js";
7
6
  import { assignTagPayloadSchema } from "../schemas.js";
7
+ import { DEFAULT_TAG_ACCESS, TAG_LOCK_NAMESPACE } from "../web/constants.js";
8
8
  // assign-tag — links a tag to a host entity by (entityType, entityId). The
9
9
  // assignment id is deterministic, so the row is unique per (tag, entity).
10
10
  //
@@ -18,9 +18,9 @@ import { assignTagPayloadSchema } from "../schemas.js";
18
18
  // create(), the loser's create() version_conflicts, and the handler treats
19
19
  // that as success since the winner already wrote the desired end state.
20
20
  //
21
- // Referential integrity: there is no FK (event-sourced, no JOIN), so before a
22
- // first-time create we verify the tag exists in the catalog — a malformed call
23
- // with an unknown tagId would otherwise project a dangling assignment.
21
+ // Referential integrity: there is no FK (event-sourced, no JOIN), so we verify
22
+ // the tag exists in the catalog before any restore/create — otherwise a call
23
+ // racing delete-tag would resurrect or project an assignment for a gone tag.
24
24
  //
25
25
  // Host reference: entityType/entityId are never trusted client input either —
26
26
  // the aggregate-id is tenant-scoped, so this is not a cross-tenant hole, but
@@ -37,6 +37,13 @@ export function createAssignTagHandler(access = DEFAULT_TAG_ACCESS, assignmentEx
37
37
  const denied = await denyUnlessJoinRowParentVisible(ctx.registry, "tag-assignment", payload, event.user, ctx.db);
38
38
  if (denied)
39
39
  return denied;
40
+ // Same lock as delete-tag: the existence check below and the assignment
41
+ // write must not interleave with a delete-tag cascade, or the cascade
42
+ // misses the new assignment and leaves an orphan.
43
+ await ctx.db.advisoryXactLock(TAG_LOCK_NAMESPACE, payload.tagId);
44
+ const tag = await tagExecutor.detail({ id: payload.tagId }, event.user, ctx.db);
45
+ if (!tag)
46
+ return writeFailure(new NotFoundError("tag", payload.tagId));
40
47
  const id = tagAssignmentAggregateId(event.user.tenantId, payload.tagId, payload.entityType, payload.entityId);
41
48
  const existing = await assignmentExecutor.detail({ id }, event.user, ctx.db);
42
49
  if (existing) {
@@ -56,9 +63,6 @@ export function createAssignTagHandler(access = DEFAULT_TAG_ACCESS, assignmentEx
56
63
  }
57
64
  if (restored.error.code !== "not_found")
58
65
  return restored;
59
- const tag = await tagExecutor.detail({ id: payload.tagId }, event.user, ctx.db);
60
- if (!tag)
61
- return writeFailure(new NotFoundError("tag", payload.tagId));
62
66
  const created = await assignmentExecutor.create({
63
67
  id,
64
68
  tagId: payload.tagId,
@@ -1,6 +1,6 @@
1
- import { DEFAULT_TAG_ACCESS } from "../constants.js";
2
1
  import { tagExecutor } from "../executor.js";
3
2
  import { createTagPayloadSchema } from "../schemas.js";
3
+ import { DEFAULT_TAG_ACCESS } from "../web/constants.js";
4
4
  // create-tag — adds a tag to the tenant's catalog. The framework mints a fresh
5
5
  // UUIDv7 id (no explicit id passed). Tag names are not unique by design: the
6
6
  // catalog is a free list and dedup is a UI concern (autocomplete from existing
@@ -1,6 +1,6 @@
1
- import { DEFAULT_TAG_ACCESS } from "../constants.js";
2
1
  import { tagAssignmentExecutor, tagExecutor } from "../executor.js";
3
2
  import { deleteTagPayloadSchema } from "../schemas.js";
3
+ import { DEFAULT_TAG_ACCESS, TAG_LOCK_NAMESPACE } from "../web/constants.js";
4
4
  const CASCADE_PAGE = 200;
5
5
  // delete-tag — removes a tag from the catalog and detaches it everywhere. No FK
6
6
  // (event-sourced, no JOIN), so the handler cascades: soft-delete every
@@ -22,6 +22,9 @@ export function createDeleteTagHandler(access = DEFAULT_TAG_ACCESS, name = "dele
22
22
  agent: { risk: "high" },
23
23
  handler: async (event, ctx) => {
24
24
  const payload = event.payload; // @cast-boundary engine-payload
25
+ // Serialises with assign-tag (see there): the cascade must see every
26
+ // assignment that a concurrent assign-tag committed before the tag goes.
27
+ await ctx.db.advisoryXactLock(TAG_LOCK_NAMESPACE, payload.id);
25
28
  const existing = await tagExecutor.detail({ id: payload.id }, event.user, ctx.db);
26
29
  if (!existing) {
27
30
  return { isSuccess: true, data: { id: payload.id } };
@@ -1,8 +1,8 @@
1
1
  import { denyUnlessJoinRowParentVisible } from "../../shared/index.js";
2
2
  import { tagAssignmentAggregateId } from "../aggregate-id.js";
3
- import { DEFAULT_TAG_ACCESS } from "../constants.js";
4
3
  import { tagAssignmentExecutor } from "../executor.js";
5
4
  import { removeTagPayloadSchema } from "../schemas.js";
5
+ import { DEFAULT_TAG_ACCESS } from "../web/constants.js";
6
6
  // remove-tag — unlinks a tag from a host entity. Idempotent: removing an
7
7
  // assignment that doesn't exist is already the requested end state (not
8
8
  // assigned), so we pre-check and return success without a delete.
@@ -1,6 +1,6 @@
1
- import { DEFAULT_TAG_ACCESS } from "../constants.js";
2
1
  import { tagExecutor } from "../executor.js";
3
2
  import { updateTagPayloadSchema } from "../schemas.js";
3
+ import { DEFAULT_TAG_ACCESS } from "../web/constants.js";
4
4
  // update-tag — edits a catalog tag (rename / recolor / re-scope). Optimistic-
5
5
  // locked: the client sends the `version` it read (mirrors tenant:update). Only
6
6
  // the fields present in the payload go into `changes`, and the executor merges
@@ -1,5 +1,4 @@
1
1
  export { tagAssignmentAggregateId } from "./aggregate-id.ts";
2
- export { DEFAULT_TAG_ACCESS, DEFAULT_TAG_ROLES, TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FEATURE_NAME, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "./constants.ts";
3
2
  export { tagAssignmentEntity, tagEntity } from "./entity.ts";
4
3
  export { createTagsFeature, type TagsFeatureOptions } from "./feature.ts";
5
4
  export { assignTagHandler, createAssignTagHandler, } from "./handlers/assign-tag.write.ts";
@@ -9,3 +8,4 @@ export { createRemoveTagHandler, removeTagHandler, } from "./handlers/remove-tag
9
8
  export { createUpdateTagHandler, updateTagHandler, } from "./handlers/update-tag.write.ts";
10
9
  export { type AssignTagPayload, assignTagPayloadSchema, type CreateTagPayload, createTagPayloadSchema, type DeleteTagPayload, deleteTagPayloadSchema, type RemoveTagPayload, removeTagPayloadSchema, type UpdateTagPayload, updateTagPayloadSchema, } from "./schemas.ts";
11
10
  export { createTagEditScreen, createTagListScreen } from "./screens.ts";
11
+ export { DEFAULT_TAG_ACCESS, DEFAULT_TAG_ROLES, TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FEATURE_NAME, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "./web/constants.ts";
@@ -1,5 +1,4 @@
1
1
  export { tagAssignmentAggregateId } from "./aggregate-id.js";
2
- export { DEFAULT_TAG_ACCESS, DEFAULT_TAG_ROLES, TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FEATURE_NAME, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "./constants.js";
3
2
  export { tagAssignmentEntity, tagEntity } from "./entity.js";
4
3
  export { createTagsFeature } from "./feature.js";
5
4
  export { assignTagHandler, createAssignTagHandler, } from "./handlers/assign-tag.write.js";
@@ -9,3 +8,4 @@ export { createRemoveTagHandler, removeTagHandler, } from "./handlers/remove-tag
9
8
  export { createUpdateTagHandler, updateTagHandler, } from "./handlers/update-tag.write.js";
10
9
  export { assignTagPayloadSchema, createTagPayloadSchema, deleteTagPayloadSchema, removeTagPayloadSchema, updateTagPayloadSchema, } from "./schemas.js";
11
10
  export { createTagEditScreen, createTagListScreen } from "./screens.js";
11
+ export { DEFAULT_TAG_ACCESS, DEFAULT_TAG_ROLES, TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FEATURE_NAME, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "./web/constants.js";
@@ -1,5 +1,5 @@
1
1
  import { i18nKey, } from "@cosmicdrift/kumiko-framework/engine";
2
- import { DEFAULT_TAG_ACCESS, TAGS_EDIT_SCREEN_ID, TAGS_SCREEN_ID } from "./constants.js";
2
+ import { DEFAULT_TAG_ACCESS, TAGS_EDIT_SCREEN_ID, TAGS_SCREEN_ID } from "./web/constants.js";
3
3
  // Declarative catalog screens (Phase-3 / #2312). Access matches create/update/
4
4
  // delete so createTagsFeature({ access|roles }) stays consistent. TagManager
5
5
  // remains for TagPicker/TagSection — only the standalone admin screen moved.
@@ -1,5 +1,4 @@
1
- // @runtime client
2
- import { TAGS_COLUMN_RENDERER_NAME, TAGS_FEATURE_NAME, TAGS_FILTER_EXTENSION_NAME, TAGS_SECTION_EXTENSION_NAME, } from "../constants.js";
1
+ import { TAGS_COLUMN_RENDERER_NAME, TAGS_FEATURE_NAME, TAGS_FILTER_EXTENSION_NAME, TAGS_SECTION_EXTENSION_NAME, } from "./constants.js";
3
2
  import { defaultTranslations } from "./i18n.js";
4
3
  import { TagFilter } from "./tag-filter.js";
5
4
  import { TagSection } from "./tag-section.js";
@@ -18,3 +18,4 @@ export declare const TagsQueries: {
18
18
  };
19
19
  export declare const DEFAULT_TAG_ROLES: readonly ["TenantAdmin", "TenantMember"];
20
20
  export declare const DEFAULT_TAG_ACCESS: AccessRule;
21
+ export declare const TAG_LOCK_NAMESPACE = 1952540531;
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // tags bundle constants — feature-name + qualified handler/query names.
3
2
  //
4
3
  // Spec: kumiko-platform/docs/plans/features/tags.md
@@ -48,3 +47,6 @@ export const DEFAULT_TAG_ROLES = ["TenantAdmin", "TenantMember"];
48
47
  // makes tagging reachable for any authenticated tenant user — matching apps
49
48
  // whose other handlers are openToAll rather than role-gated.
50
49
  export const DEFAULT_TAG_ACCESS = { roles: DEFAULT_TAG_ROLES };
50
+ // Advisory-lock namespace serialising assign-tag against delete-tag per tag id
51
+ // (no FK in the event-sourced catalog, so the DB cannot guard the orphan race).
52
+ export const TAG_LOCK_NAMESPACE = 0x74_61_67_73; // 'tags'
@@ -1,11 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- // @runtime client
3
2
  // EntityTags — read-only colored tag row for ANY entity. Drop it on a card or
4
3
  // detail view: <EntityTags entityName="note" entityId={id} />. Loads the
5
4
  // catalog (for name+color) and the entity's assignments, renders a TagChip per
6
5
  // assigned tag. Renders nothing when the entity has no tags.
7
6
  import { useQuery } from "@cosmicdrift/kumiko-renderer";
8
- import { TagsQueries } from "../constants.js";
7
+ import { TagsQueries } from "./constants.js";
9
8
  import { TagChip } from "./tag-chip.js";
10
9
  export function EntityTags({ entityName, entityId, }) {
11
10
  const enabled = entityId !== null;
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // Default translation bundle for the tags UI. tagsClient() hangs it into the
3
2
  // LocaleProvider as a fallback bundle — apps override individual keys via
4
3
  // tagsClient({ translations }). Keys follow `tags.<area>.<slug>`.
@@ -22,7 +21,8 @@ export const defaultTranslations = {
22
21
  "tags.manage.toggle": "Toggle label",
23
22
  "tags.manage.usage": "{count}×",
24
23
  "tags.manage.deleteConfirmTitle": "Delete label “{name}”?",
25
- "tags.manage.deleteConfirmDesc": "Removes it from {count} objects. This can't be undone.",
24
+ "tags.manage.deleteConfirmDesc.one": "Removes it from 1 object. This can't be undone.",
25
+ "tags.manage.deleteConfirmDesc.other": "Removes it from {count} objects. This can't be undone.",
26
26
  "tags.picker.title": "Tags",
27
27
  "tags.picker.done": "Done",
28
28
  "tags.filter.label": "Filter by tag",
@@ -1,5 +1,5 @@
1
- export { TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "../constants.ts";
2
1
  export { tagsClient } from "./client-plugin.tsx";
2
+ export { TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "./constants.ts";
3
3
  export { EntityTags } from "./entity-tags.tsx";
4
4
  export { contrastText, TagChip } from "./tag-chip.tsx";
5
5
  export { TagFilter } from "./tag-filter.tsx";
@@ -1,6 +1,5 @@
1
- // @runtime client
2
- export { TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "../constants.js";
3
1
  export { tagsClient } from "./client-plugin.js";
2
+ export { TAGS_COLUMN_RENDERER_NAME, TAGS_EDIT_SCREEN_ID, TAGS_FILTER_EXTENSION_NAME, TAGS_SCREEN_ID, TAGS_SECTION_EXTENSION_NAME, TagsHandlers, TagsQueries, } from "./constants.js";
4
3
  export { EntityTags } from "./entity-tags.js";
5
4
  export { contrastText, TagChip } from "./tag-chip.js";
6
5
  export { TagFilter } from "./tag-filter.js";
@@ -1,5 +1,4 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // @runtime client
3
2
  // TagFilter — a drop-in tag filter for ANY entityList toolbar. Register it as
4
3
  // the list's header slot (`screen.slots.header`); the renderer passes it the
5
4
  // list's screenId, and picking tags resolves the matching row ids and narrows
@@ -15,7 +14,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
14
  // server-side `entitiesByTag` query + a server-side join filter instead.
16
15
  import { useListUrlState, usePrimitives, useQuery, useTranslation, } from "@cosmicdrift/kumiko-renderer";
17
16
  import { useState } from "react";
18
- import { TagsQueries } from "../constants.js";
17
+ import { TagsQueries } from "./constants.js";
19
18
  import { TagChip } from "./tag-chip.js";
20
19
  import { TagPicker } from "./tag-picker.js";
21
20
  // Tags chosen but zero matching entities → filter to a value that matches no row