@cosmicdrift/kumiko-samples 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 (506) hide show
  1. package/package.json +1 -1
  2. package/packages/bundled-features/package.json +18 -17
  3. package/packages/bundled-features/src/account-security/feature.ts +2 -2
  4. package/packages/bundled-features/src/account-security/index.ts +8 -8
  5. package/packages/bundled-features/src/account-security/{constants.ts → web/constants.ts} +0 -2
  6. package/packages/bundled-features/src/account-security/{i18n.ts → web/i18n.ts} +0 -1
  7. package/packages/bundled-features/src/admin-shell/feature.ts +10 -9
  8. package/packages/bundled-features/src/admin-shell/index.ts +8 -8
  9. package/packages/bundled-features/src/admin-shell/web/client-plugin.tsx +2 -3
  10. package/packages/bundled-features/src/admin-shell/{constants.ts → web/constants.ts} +0 -1
  11. package/packages/bundled-features/src/admin-shell/web/default-translations.ts +10 -0
  12. package/packages/bundled-features/src/admin-shell/web/i18n.ts +51 -9
  13. package/packages/bundled-features/src/admin-shell/web/index.ts +0 -1
  14. package/packages/bundled-features/src/audit/changes.json +7 -0
  15. package/packages/bundled-features/src/audit/feature.ts +72 -64
  16. package/packages/bundled-features/src/audit/handlers/audit-events.ts +153 -0
  17. package/packages/bundled-features/src/audit/handlers/audit-system-db.ts +13 -0
  18. package/packages/bundled-features/src/audit/handlers/details-all-tenants.query.ts +26 -0
  19. package/packages/bundled-features/src/audit/handlers/details.query.ts +11 -39
  20. package/packages/bundled-features/src/audit/handlers/list-all-tenants.query.ts +47 -0
  21. package/packages/bundled-features/src/audit/handlers/list.query.ts +16 -123
  22. package/packages/bundled-features/src/audit/handlers/resolve-audit-tenant.ts +21 -7
  23. package/packages/bundled-features/src/audit/index.ts +1 -1
  24. package/packages/bundled-features/src/audit/run-escape-hatch-retention.ts +4 -4
  25. package/packages/bundled-features/src/audit/screens.ts +82 -0
  26. package/packages/bundled-features/src/audit/web/client-plugin.tsx +2 -3
  27. package/packages/bundled-features/src/audit/{constants.ts → web/constants.ts} +11 -1
  28. package/packages/bundled-features/src/audit/web/default-translations.ts +7 -0
  29. package/packages/bundled-features/src/audit/web/i18n.ts +33 -7
  30. package/packages/bundled-features/src/audit/web/index.ts +0 -2
  31. package/packages/bundled-features/src/auth-email-password/bootstrap.ts +6 -6
  32. package/packages/bundled-features/src/auth-email-password/changes.json +6 -0
  33. package/packages/bundled-features/src/auth-email-password/errors.ts +1 -1
  34. package/packages/bundled-features/src/auth-email-password/feature.ts +2 -2
  35. package/packages/bundled-features/src/auth-email-password/handlers/confirm-account-unlock.write.ts +1 -1
  36. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +4 -4
  37. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +3 -3
  38. package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
  39. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +38 -4
  40. package/packages/bundled-features/src/auth-email-password/handlers/request-account-unlock.write.ts +1 -1
  41. package/packages/bundled-features/src/auth-email-password/handlers/request-email-verification.write.ts +1 -1
  42. package/packages/bundled-features/src/auth-email-password/handlers/request-password-reset.write.ts +1 -1
  43. package/packages/bundled-features/src/auth-email-password/handlers/reset-password.write.ts +1 -1
  44. package/packages/bundled-features/src/auth-email-password/handlers/verify-email.write.ts +1 -1
  45. package/packages/bundled-features/src/auth-email-password/index.ts +6 -1
  46. package/packages/bundled-features/src/auth-email-password/mail-notifications.ts +1 -1
  47. package/packages/bundled-features/src/auth-email-password/signup-activation.ts +1 -1
  48. package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +0 -1
  49. package/packages/bundled-features/src/auth-email-password/web/auth-form-logic.ts +0 -1
  50. package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +0 -1
  51. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +0 -1
  52. package/packages/bundled-features/src/auth-email-password/web/auth-redirect.ts +0 -1
  53. package/packages/bundled-features/src/auth-email-password/web/client-actions.ts +0 -1
  54. package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +1 -2
  55. package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +0 -1
  56. package/packages/bundled-features/src/auth-email-password/{constants.ts → web/constants.ts} +3 -6
  57. package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +0 -1
  58. package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +0 -1
  59. package/packages/bundled-features/src/auth-email-password/{i18n.ts → web/i18n.ts} +3 -4
  60. package/packages/bundled-features/src/auth-email-password/web/index.ts +1 -2
  61. package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +2 -3
  62. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +0 -1
  63. package/packages/bundled-features/src/auth-email-password/{mail-i18n.ts → web/mail-i18n.ts} +0 -1
  64. package/packages/bundled-features/src/auth-email-password/web/request-account-unlock-screen.tsx +0 -1
  65. package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +0 -1
  66. package/packages/bundled-features/src/auth-email-password/web/session-bootstrap-error.tsx +0 -1
  67. package/packages/bundled-features/src/auth-email-password/web/session.tsx +0 -1
  68. package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +2 -3
  69. package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +0 -1
  70. package/packages/bundled-features/src/auth-email-password/web/tenant-menu-items.tsx +0 -1
  71. package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +0 -1
  72. package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +0 -1
  73. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +0 -1
  74. package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +0 -1
  75. package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
  76. package/packages/bundled-features/src/auth-mfa/errors.ts +2 -2
  77. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +1 -1
  78. package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
  79. package/packages/bundled-features/src/auth-mfa/handlers/enable-start.write.ts +1 -1
  80. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
  81. package/packages/bundled-features/src/auth-mfa/index.ts +8 -8
  82. package/packages/bundled-features/src/auth-mfa/mfa-status-checker.ts +4 -4
  83. package/packages/bundled-features/src/auth-mfa/screens.ts +1 -1
  84. package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +0 -1
  85. package/packages/bundled-features/src/auth-mfa/{constants.ts → web/constants.ts} +0 -1
  86. package/packages/bundled-features/src/auth-mfa/web/i18n.ts +0 -1
  87. package/packages/bundled-features/src/auth-mfa/web/index.ts +0 -1
  88. package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +0 -1
  89. package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +1 -2
  90. package/packages/bundled-features/src/auth-mfa/web/mfa-recovery-codes-reveal.tsx +0 -1
  91. package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +1 -2
  92. package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +21 -23
  93. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +0 -1
  94. package/packages/bundled-features/src/billing-foundation/changes.json +18 -0
  95. package/packages/bundled-features/src/billing-foundation/checkout-core.ts +3 -3
  96. package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-text.ts +2 -2
  97. package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +11 -3
  98. package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +11 -1
  99. package/packages/bundled-features/src/billing-foundation/consumer-protection/register-consent.ts +1 -1
  100. package/packages/bundled-features/src/billing-foundation/consumer-protection/register-termination.ts +12 -1
  101. package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +12 -0
  102. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-mail.ts +6 -1
  103. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-notify.ts +1 -1
  104. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-pages.ts +167 -28
  105. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +102 -3
  106. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +43 -12
  107. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +202 -0
  108. package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +70 -0
  109. package/packages/bundled-features/src/billing-foundation/events.ts +20 -2
  110. package/packages/bundled-features/src/billing-foundation/feature.ts +5 -5
  111. package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +82 -9
  112. package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +1 -1
  113. package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +1 -1
  114. package/packages/bundled-features/src/billing-foundation/index.ts +27 -27
  115. package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +7 -7
  116. package/packages/bundled-features/src/billing-foundation/screens.ts +1 -1
  117. package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +1 -1
  118. package/packages/bundled-features/src/billing-foundation/types.ts +17 -3
  119. package/packages/bundled-features/src/billing-foundation/validate-options.ts +3 -3
  120. package/packages/bundled-features/src/billing-foundation/web/billing-contact-plan.tsx +1 -3
  121. package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +5 -7
  122. package/packages/bundled-features/src/billing-foundation/web/cancel-contract-dialog.tsx +1 -3
  123. package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +1 -3
  124. package/packages/bundled-features/src/billing-foundation/web/client-plugin.tsx +1 -2
  125. package/packages/bundled-features/src/billing-foundation/{constants.ts → web/constants.ts} +37 -31
  126. package/packages/bundled-features/src/billing-foundation/{consumer-protection → web/consumer-protection}/consent-locale.ts +0 -1
  127. package/packages/bundled-features/src/billing-foundation/{contact-card.ts → web/contact-card.ts} +0 -2
  128. package/packages/bundled-features/src/billing-foundation/web/index.ts +14 -15
  129. package/packages/bundled-features/src/billing-foundation/web/localized-params.ts +0 -2
  130. package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +5 -2
  131. package/packages/bundled-features/src/cap-overview/feature.ts +1 -1
  132. package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -1
  133. package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +2 -2
  134. package/packages/bundled-features/src/cap-overview/index.ts +9 -9
  135. package/packages/bundled-features/src/cap-overview/screens.ts +2 -2
  136. package/packages/bundled-features/src/cap-overview/web/cap-cards-panel.tsx +1 -2
  137. package/packages/bundled-features/src/cap-overview/web/cap-usage-bar.tsx +1 -2
  138. package/packages/bundled-features/src/cap-overview/web/cap-usage-cell.tsx +0 -2
  139. package/packages/bundled-features/src/cap-overview/web/client-plugin.tsx +3 -4
  140. package/packages/bundled-features/src/cap-overview/{constants.ts → web/constants.ts} +0 -1
  141. package/packages/bundled-features/src/cap-overview/web/index.ts +0 -1
  142. package/packages/bundled-features/src/cap-overview/{usage-math.ts → web/usage-math.ts} +1 -2
  143. package/packages/bundled-features/src/compliance-profiles/feature.ts +5 -5
  144. package/packages/bundled-features/src/compliance-profiles/index.ts +6 -6
  145. package/packages/bundled-features/src/compliance-profiles/web/client-plugin.tsx +2 -3
  146. package/packages/bundled-features/src/compliance-profiles/web/compliance-profile-catalog.tsx +1 -2
  147. package/packages/bundled-features/src/compliance-profiles/{constants.ts → web/constants.ts} +0 -1
  148. package/packages/bundled-features/src/compliance-profiles/web/i18n.ts +0 -1
  149. package/packages/bundled-features/src/compliance-profiles/web/index.ts +0 -1
  150. package/packages/bundled-features/src/config/index.ts +6 -6
  151. package/packages/bundled-features/src/config/web/client-plugin.ts +1 -2
  152. package/packages/bundled-features/src/config/{constants.ts → web/constants.ts} +0 -1
  153. package/packages/bundled-features/src/config/web/i18n.ts +0 -1
  154. package/packages/bundled-features/src/config/web/index.ts +1 -3
  155. package/packages/bundled-features/src/config/write-helpers.ts +1 -1
  156. package/packages/bundled-features/src/custom-fields/feature.ts +8 -8
  157. package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +1 -1
  158. package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +1 -1
  159. package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +1 -1
  160. package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +4 -4
  161. package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +1 -1
  162. package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +1 -1
  163. package/packages/bundled-features/src/custom-fields/index.ts +8 -8
  164. package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +1 -1
  165. package/packages/bundled-features/src/custom-fields/schemas.ts +1 -1
  166. package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +1 -2
  167. package/packages/bundled-features/src/custom-fields/{constants.ts → web/constants.ts} +18 -19
  168. package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +1 -2
  169. package/packages/bundled-features/src/custom-fields/web/i18n.ts +0 -1
  170. package/packages/bundled-features/src/custom-fields/web/index.ts +2 -3
  171. package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +1 -2
  172. package/packages/bundled-features/src/delivery/address-opt-out.ts +1 -1
  173. package/packages/bundled-features/src/delivery/attempt-log-retention.ts +24 -8
  174. package/packages/bundled-features/src/delivery/changes.json +6 -0
  175. package/packages/bundled-features/src/delivery/constants.ts +2 -2
  176. package/packages/bundled-features/src/delivery/i18n.ts +1 -1
  177. package/packages/bundled-features/src/delivery/unsubscribe-page.ts +1 -1
  178. package/packages/bundled-features/src/delivery/web/client-plugin.tsx +6 -7
  179. package/packages/bundled-features/src/delivery/web/delivery-channel-cell.tsx +0 -1
  180. package/packages/bundled-features/src/delivery/web/delivery-error-cell.tsx +0 -1
  181. package/packages/bundled-features/src/delivery/web/delivery-status-cell.tsx +1 -2
  182. package/packages/bundled-features/src/delivery/web/delivery-time-cell.tsx +0 -1
  183. package/packages/bundled-features/src/delivery/web/delivery-type-cell.tsx +0 -1
  184. package/packages/bundled-features/src/delivery/web/index.ts +0 -1
  185. package/packages/bundled-features/src/delivery/{public-names.ts → web/public-names.ts} +0 -1
  186. package/packages/bundled-features/src/document-ingest-foundation/changes.json +6 -0
  187. package/packages/bundled-features/src/document-ingest-foundation/events.ts +4 -0
  188. package/packages/bundled-features/src/document-ingest-foundation/executor.ts +2 -1
  189. package/packages/bundled-features/src/document-ingest-foundation/feature.ts +18 -4
  190. package/packages/bundled-features/src/document-ingest-foundation/index.ts +1 -0
  191. package/packages/bundled-features/src/feature-toggles/feature.ts +7 -7
  192. package/packages/bundled-features/src/feature-toggles/handlers/list.query.ts +1 -1
  193. package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +1 -1
  194. package/packages/bundled-features/src/feature-toggles/handlers/set.write.ts +3 -3
  195. package/packages/bundled-features/src/feature-toggles/index.ts +6 -6
  196. package/packages/bundled-features/src/feature-toggles/web/client-plugin.tsx +1 -2
  197. package/packages/bundled-features/src/feature-toggles/{constants.ts → web/constants.ts} +0 -1
  198. package/packages/bundled-features/src/feature-toggles/web/i18n.ts +0 -1
  199. package/packages/bundled-features/src/feature-toggles/web/index.ts +0 -1
  200. package/packages/bundled-features/src/files/changes.json +7 -0
  201. package/packages/bundled-features/src/folders/feature.ts +1 -1
  202. package/packages/bundled-features/src/folders/handlers/clear-folder.write.ts +1 -1
  203. package/packages/bundled-features/src/folders/handlers/delete-folder.write.ts +1 -1
  204. package/packages/bundled-features/src/folders/handlers/set-folder.write.ts +1 -1
  205. package/packages/bundled-features/src/folders/index.ts +8 -8
  206. package/packages/bundled-features/src/folders/web/client-plugin.tsx +1 -3
  207. package/packages/bundled-features/src/folders/{constants.ts → web/constants.ts} +0 -1
  208. package/packages/bundled-features/src/folders/web/folder-manager.tsx +1 -2
  209. package/packages/bundled-features/src/folders/web/folder-section.tsx +1 -2
  210. package/packages/bundled-features/src/folders/web/i18n.ts +0 -1
  211. package/packages/bundled-features/src/folders/web/index.ts +1 -2
  212. package/packages/bundled-features/src/folders/web/tree.ts +0 -1
  213. package/packages/bundled-features/src/form-draft/changes.json +7 -0
  214. package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +25 -11
  215. package/packages/bundled-features/src/form-draft/decrypt-draft.ts +24 -0
  216. package/packages/bundled-features/src/form-draft/entity.ts +6 -9
  217. package/packages/bundled-features/src/form-draft/feature.ts +1 -1
  218. package/packages/bundled-features/src/form-draft/handlers/cleanup.job.ts +26 -5
  219. package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
  220. package/packages/bundled-features/src/form-draft/handlers/get.query.ts +6 -7
  221. package/packages/bundled-features/src/form-draft/handlers/list.query.ts +13 -7
  222. package/packages/bundled-features/src/form-draft/handlers/save.write.ts +5 -5
  223. package/packages/bundled-features/src/form-draft/index.ts +8 -8
  224. package/packages/bundled-features/src/form-draft/lookup.ts +10 -4
  225. package/packages/bundled-features/src/form-draft/schemas.ts +1 -1
  226. package/packages/bundled-features/src/form-draft/{constants.ts → web/constants.ts} +0 -1
  227. package/packages/bundled-features/src/form-draft-user-data/hooks.ts +2 -2
  228. package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +10 -10
  229. package/packages/bundled-features/src/jobs/feature.ts +7 -7
  230. package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
  231. package/packages/bundled-features/src/jobs/handlers/trigger.write.ts +1 -1
  232. package/packages/bundled-features/src/jobs/index.ts +1 -1
  233. package/packages/bundled-features/src/jobs/web/client-plugin.tsx +2 -3
  234. package/packages/bundled-features/src/jobs/{constants.ts → web/constants.ts} +0 -1
  235. package/packages/bundled-features/src/jobs/web/default-translations.ts +7 -0
  236. package/packages/bundled-features/src/jobs/web/i18n.ts +53 -7
  237. package/packages/bundled-features/src/jobs/web/index.ts +0 -1
  238. package/packages/bundled-features/src/ledger/changes.json +7 -0
  239. package/packages/bundled-features/src/ledger/entity.ts +1 -1
  240. package/packages/bundled-features/src/ledger/feature.ts +1 -1
  241. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +2 -10
  242. package/packages/bundled-features/src/ledger/handlers/create-transaction.write.ts +1 -1
  243. package/packages/bundled-features/src/ledger/handlers/reports.query.ts +1 -1
  244. package/packages/bundled-features/src/ledger/handlers/reverse-transaction.write.ts +1 -1
  245. package/packages/bundled-features/src/ledger/index.ts +13 -13
  246. package/packages/bundled-features/src/ledger/recurring.ts +1 -1
  247. package/packages/bundled-features/src/ledger/reports.ts +1 -1
  248. package/packages/bundled-features/src/ledger/schemas.ts +1 -1
  249. package/packages/bundled-features/src/ledger/{constants.ts → web/constants.ts} +0 -1
  250. package/packages/bundled-features/src/ledger/web/index.ts +11 -12
  251. package/packages/bundled-features/src/legal-pages/README.md +1 -1
  252. package/packages/bundled-features/src/legal-pages/feature.ts +5 -5
  253. package/packages/bundled-features/src/legal-pages/index.ts +11 -11
  254. package/packages/bundled-features/src/legal-pages/lib/boot-check.ts +1 -1
  255. package/packages/bundled-features/src/legal-pages/lib/validate-routes.ts +1 -1
  256. package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +1 -2
  257. package/packages/bundled-features/src/legal-pages/{constants.ts → web/constants.ts} +6 -8
  258. package/packages/bundled-features/src/legal-pages/web/index.ts +0 -1
  259. package/packages/bundled-features/src/managed-pages/feature.ts +1 -1
  260. package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +1 -2
  261. package/packages/bundled-features/src/managed-pages/web/default-translations.ts +17 -0
  262. package/packages/bundled-features/src/managed-pages/web/i18n.ts +59 -16
  263. package/packages/bundled-features/src/managed-pages/web/index.ts +1 -2
  264. package/packages/bundled-features/src/metrics/compute.ts +1 -1
  265. package/packages/bundled-features/src/metrics/feature.ts +6 -6
  266. package/packages/bundled-features/src/metrics/index.ts +8 -8
  267. package/packages/bundled-features/src/metrics/types.ts +1 -1
  268. package/packages/bundled-features/src/metrics/validate.ts +1 -1
  269. package/packages/bundled-features/src/metrics/{constants.ts → web/constants.ts} +0 -1
  270. package/packages/bundled-features/src/metrics/window.ts +1 -1
  271. package/packages/bundled-features/src/notes-history/feature.ts +1 -1
  272. package/packages/bundled-features/src/notes-history/handlers/add-note.write.ts +1 -1
  273. package/packages/bundled-features/src/notes-history/index.ts +8 -8
  274. package/packages/bundled-features/src/notes-history/web/client-plugin.tsx +1 -3
  275. package/packages/bundled-features/src/notes-history/{constants.ts → web/constants.ts} +0 -1
  276. package/packages/bundled-features/src/notes-history/web/i18n.ts +0 -1
  277. package/packages/bundled-features/src/notes-history/web/index.ts +2 -3
  278. package/packages/bundled-features/src/notes-history/web/notes-section.tsx +2 -3
  279. package/packages/bundled-features/src/personal-access-tokens/feature.ts +12 -10
  280. package/packages/bundled-features/src/personal-access-tokens/handlers/available-scopes.query.ts +1 -1
  281. package/packages/bundled-features/src/personal-access-tokens/handlers/create.write.ts +1 -1
  282. package/packages/bundled-features/src/personal-access-tokens/handlers/revoke.write.ts +1 -1
  283. package/packages/bundled-features/src/personal-access-tokens/hash.ts +1 -1
  284. package/packages/bundled-features/src/personal-access-tokens/i18n.ts +2 -2
  285. package/packages/bundled-features/src/personal-access-tokens/index.ts +5 -5
  286. package/packages/bundled-features/src/personal-access-tokens/resolver.ts +1 -1
  287. package/packages/bundled-features/src/personal-access-tokens/schema/api-token.ts +1 -1
  288. package/packages/bundled-features/src/personal-access-tokens/screens.ts +2 -2
  289. package/packages/bundled-features/src/personal-access-tokens/{constants.ts → web/constants.ts} +0 -1
  290. package/packages/bundled-features/src/personal-access-tokens/{scopes.ts → web/scopes.ts} +0 -1
  291. package/packages/bundled-features/src/presets/changes.json +7 -0
  292. package/packages/bundled-features/src/presets/index.ts +0 -1
  293. package/packages/bundled-features/src/presets/security-baseline.ts +1 -1
  294. package/packages/bundled-features/src/renderer-foundation/types.ts +1 -1
  295. package/packages/bundled-features/src/secrets/feature.ts +1 -1
  296. package/packages/bundled-features/src/secrets/handlers/delete.write.ts +1 -1
  297. package/packages/bundled-features/src/secrets/handlers/list.query.ts +1 -1
  298. package/packages/bundled-features/src/secrets/handlers/set.write.ts +1 -1
  299. package/packages/bundled-features/src/secrets/i18n.ts +1 -1
  300. package/packages/bundled-features/src/secrets/index.ts +8 -8
  301. package/packages/bundled-features/src/secrets/{constants.ts → web/constants.ts} +0 -1
  302. package/packages/bundled-features/src/secrets/write-gate.ts +1 -1
  303. package/packages/bundled-features/src/sessions/feature.ts +7 -4
  304. package/packages/bundled-features/src/sessions/{i18n.ts → web/i18n.ts} +0 -1
  305. package/packages/bundled-features/src/shared/index.ts +6 -1
  306. package/packages/bundled-features/src/shared/purge-files-reaching-subject.ts +10 -2
  307. package/packages/bundled-features/src/shared/web/translate-or-raw.ts +0 -1
  308. package/packages/bundled-features/src/subscription-stripe/feature.ts +2 -0
  309. package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +19 -0
  310. package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +1 -0
  311. package/packages/bundled-features/src/tags/changes.json +6 -0
  312. package/packages/bundled-features/src/tags/feature.ts +1 -1
  313. package/packages/bundled-features/src/tags/handlers/assign-tag.write.ts +11 -7
  314. package/packages/bundled-features/src/tags/handlers/create-tag.write.ts +1 -1
  315. package/packages/bundled-features/src/tags/handlers/delete-tag.write.ts +4 -1
  316. package/packages/bundled-features/src/tags/handlers/remove-tag.write.ts +1 -1
  317. package/packages/bundled-features/src/tags/handlers/update-tag.write.ts +1 -1
  318. package/packages/bundled-features/src/tags/index.ts +12 -12
  319. package/packages/bundled-features/src/tags/screens.ts +1 -1
  320. package/packages/bundled-features/src/tags/web/client-plugin.tsx +1 -3
  321. package/packages/bundled-features/src/tags/{constants.ts → web/constants.ts} +4 -1
  322. package/packages/bundled-features/src/tags/web/entity-tags.tsx +1 -2
  323. package/packages/bundled-features/src/tags/web/i18n.ts +2 -2
  324. package/packages/bundled-features/src/tags/web/index.ts +2 -3
  325. package/packages/bundled-features/src/tags/web/tag-chip.tsx +0 -1
  326. package/packages/bundled-features/src/tags/web/tag-filter.tsx +1 -2
  327. package/packages/bundled-features/src/tags/web/tag-manager.tsx +5 -4
  328. package/packages/bundled-features/src/tags/web/tag-picker.tsx +0 -1
  329. package/packages/bundled-features/src/tags/web/tag-section.tsx +1 -2
  330. package/packages/bundled-features/src/tags/web/tags-cell.tsx +1 -2
  331. package/packages/bundled-features/src/template-resolver/README.md +1 -1
  332. package/packages/bundled-features/src/template-resolver/api.ts +75 -28
  333. package/packages/bundled-features/src/template-resolver/changes.json +43 -0
  334. package/packages/bundled-features/src/template-resolver/compile-document-body.ts +1 -1
  335. package/packages/bundled-features/src/template-resolver/compile-steps-block.ts +2 -2
  336. package/packages/bundled-features/src/template-resolver/document-ops.ts +5 -5
  337. package/packages/bundled-features/src/template-resolver/document-sanitizer.ts +4 -4
  338. package/packages/bundled-features/src/template-resolver/feature.ts +13 -4
  339. package/packages/bundled-features/src/template-resolver/handlers/by-slug.query.ts +6 -1
  340. package/packages/bundled-features/src/template-resolver/handlers/by-tenant.query.ts +6 -2
  341. package/packages/bundled-features/src/template-resolver/handlers/collection-item.query.ts +1 -1
  342. package/packages/bundled-features/src/template-resolver/handlers/collection-list.query.ts +1 -1
  343. package/packages/bundled-features/src/template-resolver/handlers/collection-set.write.ts +19 -2
  344. package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +2 -2
  345. package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +7 -1
  346. package/packages/bundled-features/src/template-resolver/handlers/discard-draft.write.ts +1 -1
  347. package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +8 -2
  348. package/packages/bundled-features/src/template-resolver/handlers/document-blocks.query.ts +2 -2
  349. package/packages/bundled-features/src/template-resolver/handlers/export-bundle.query.ts +5 -2
  350. package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +4 -2
  351. package/packages/bundled-features/src/template-resolver/handlers/layout-source.query.ts +10 -5
  352. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +5 -2
  353. package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +68 -10
  354. package/packages/bundled-features/src/template-resolver/handlers/patch-draft.write.ts +1 -1
  355. package/packages/bundled-features/src/template-resolver/handlers/resource-shared.ts +1 -1
  356. package/packages/bundled-features/src/template-resolver/handlers/resource-upload.write.ts +1 -1
  357. package/packages/bundled-features/src/template-resolver/handlers/send-test.write.ts +2 -2
  358. package/packages/bundled-features/src/template-resolver/handlers/set.write.ts +1 -1
  359. package/packages/bundled-features/src/template-resolver/handlers/shared.ts +1 -1
  360. package/packages/bundled-features/src/template-resolver/handlers/template-gates.ts +6 -6
  361. package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +2 -2
  362. package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +8 -2
  363. package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +4 -2
  364. package/packages/bundled-features/src/template-resolver/i18n.ts +25 -0
  365. package/packages/bundled-features/src/template-resolver/index.ts +60 -59
  366. package/packages/bundled-features/src/template-resolver/layout-appearance.ts +1 -1
  367. package/packages/bundled-features/src/template-resolver/layout-regions.ts +1 -1
  368. package/packages/bundled-features/src/template-resolver/seeding.ts +16 -7
  369. package/packages/bundled-features/src/template-resolver/store-template-resource.ts +2 -2
  370. package/packages/bundled-features/src/template-resolver/table.ts +1 -1
  371. package/packages/bundled-features/src/template-resolver/template-bundle.ts +2 -2
  372. package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +82 -0
  373. package/packages/bundled-features/src/template-resolver/template-draft.ts +1 -1
  374. package/packages/bundled-features/src/template-resolver/template-edit-policy.ts +2 -2
  375. package/packages/bundled-features/src/template-resolver/template-meta.ts +2 -2
  376. package/packages/bundled-features/src/template-resolver/template-preview.ts +14 -10
  377. package/packages/bundled-features/src/template-resolver/template-usage.ts +1 -1
  378. package/packages/bundled-features/src/template-resolver/template-validation.ts +2 -2
  379. package/packages/bundled-features/src/template-resolver/testing.ts +2 -2
  380. package/packages/bundled-features/src/template-resolver/user-content-table.ts +1 -1
  381. package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +4 -5
  382. package/packages/bundled-features/src/template-resolver/{constants.ts → web/constants.ts} +7 -10
  383. package/packages/bundled-features/src/template-resolver/{document-blocks.ts → web/document-blocks.ts} +0 -1
  384. package/packages/bundled-features/src/template-resolver/web/document-editor-extensions.ts +2 -3
  385. package/packages/bundled-features/src/template-resolver/web/document-editor.tsx +0 -1
  386. package/packages/bundled-features/src/template-resolver/{document-images.ts → web/document-images.ts} +0 -1
  387. package/packages/bundled-features/src/template-resolver/{document-schema.ts → web/document-schema.ts} +0 -1
  388. package/packages/bundled-features/src/template-resolver/{document-steps.ts → web/document-steps.ts} +0 -1
  389. package/packages/bundled-features/src/template-resolver/web/document-tiptap-editor.tsx +6 -7
  390. package/packages/bundled-features/src/template-resolver/web/document-toolbar-blocks.ts +2 -3
  391. package/packages/bundled-features/src/template-resolver/web/editor-handle.ts +1 -2
  392. package/packages/bundled-features/src/template-resolver/web/i18n.ts +2 -1
  393. package/packages/bundled-features/src/template-resolver/web/index.ts +13 -14
  394. package/packages/bundled-features/src/template-resolver/{mail-constants.ts → web/mail-constants.ts} +0 -1
  395. package/packages/bundled-features/src/template-resolver/{pdf-constants.ts → web/pdf-constants.ts} +0 -1
  396. package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor-lazy.tsx +0 -1
  397. package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor.tsx +5 -4
  398. package/packages/bundled-features/src/template-resolver/{placeholder-text.ts → web/placeholder-text.ts} +0 -1
  399. package/packages/bundled-features/src/template-resolver/{qualified-names.ts → web/qualified-names.ts} +0 -1
  400. package/packages/bundled-features/src/template-resolver/web/use-stable-by-key.ts +0 -1
  401. package/packages/bundled-features/src/tenant/handlers/add-member.write.ts +1 -1
  402. package/packages/bundled-features/src/tenant/index.ts +7 -7
  403. package/packages/bundled-features/src/tenant/invitation-table.ts +1 -1
  404. package/packages/bundled-features/src/tenant/invited-membership.ts +1 -1
  405. package/packages/bundled-features/src/tenant/last-tenant-admin.ts +1 -1
  406. package/packages/bundled-features/src/tenant/member-role-options.ts +1 -1
  407. package/packages/bundled-features/src/tenant/screens.ts +2 -2
  408. package/packages/bundled-features/src/tenant/web/client-plugin.tsx +1 -2
  409. package/packages/bundled-features/src/tenant/{constants.ts → web/constants.ts} +3 -6
  410. package/packages/bundled-features/src/tenant/web/index.ts +0 -1
  411. package/packages/bundled-features/src/tenant/web/member-roles-cell.tsx +0 -1
  412. package/packages/bundled-features/src/tenant/web/member-status-cell.tsx +0 -1
  413. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +2 -2
  414. package/packages/bundled-features/src/tier-engine/entity.ts +1 -1
  415. package/packages/bundled-features/src/tier-engine/feature.ts +7 -7
  416. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +1 -1
  417. package/packages/bundled-features/src/tier-engine/index.ts +8 -8
  418. package/packages/bundled-features/src/tier-engine/web/client-plugin.tsx +2 -3
  419. package/packages/bundled-features/src/tier-engine/{constants.ts → web/constants.ts} +2 -3
  420. package/packages/bundled-features/src/tier-engine/{i18n.ts → web/i18n.ts} +0 -1
  421. package/packages/bundled-features/src/tier-engine/web/index.ts +0 -1
  422. package/packages/bundled-features/src/user/handlers/create.write.ts +1 -1
  423. package/packages/bundled-features/src/user/handlers/update-roles.ts +1 -1
  424. package/packages/bundled-features/src/user/handlers/update.write.ts +1 -1
  425. package/packages/bundled-features/src/user/index.ts +1 -1
  426. package/packages/bundled-features/src/user/invited-global-roles.ts +1 -1
  427. package/packages/bundled-features/src/user/schema/user.ts +1 -1
  428. package/packages/bundled-features/src/user/{constants.ts → web/constants.ts} +0 -1
  429. package/packages/bundled-features/src/user-data-rights/changes.json +14 -0
  430. package/packages/bundled-features/src/user-data-rights/env.ts +1 -1
  431. package/packages/bundled-features/src/user-data-rights/feature.ts +9 -9
  432. package/packages/bundled-features/src/user-data-rights/index.ts +1 -1
  433. package/packages/bundled-features/src/user-data-rights/lib/resolve-tenant-model.ts +1 -1
  434. package/packages/bundled-features/src/user-data-rights/mail-notifications.ts +1 -1
  435. package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +2 -3
  436. package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +0 -1
  437. package/packages/bundled-features/src/user-data-rights/{constants.ts → web/constants.ts} +11 -12
  438. package/packages/bundled-features/src/user-data-rights/web/default-translations.ts +91 -0
  439. package/packages/bundled-features/src/user-data-rights/web/i18n.ts +41 -91
  440. package/packages/bundled-features/src/user-data-rights/web/index.ts +1 -2
  441. package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +1 -2
  442. package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +0 -1
  443. package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +0 -1
  444. package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +10 -1
  445. package/packages/bundled-features/src/user-profile/feature.ts +2 -2
  446. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +1 -1
  447. package/packages/bundled-features/src/user-profile/index.ts +3 -2
  448. package/packages/bundled-features/src/user-profile/web/client-plugin.ts +2 -3
  449. package/packages/bundled-features/src/user-profile/{constants.ts → web/constants.ts} +0 -1
  450. package/packages/bundled-features/src/user-profile/{i18n.ts → web/i18n.ts} +0 -1
  451. package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +2 -3
  452. package/packages/bundled-features/src/waitlist/changes.json +6 -0
  453. package/packages/bundled-features/src/waitlist/entity.ts +1 -1
  454. package/packages/bundled-features/src/waitlist/feature.ts +5 -5
  455. package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +3 -3
  456. package/packages/bundled-features/src/waitlist/handlers/invite.write.ts +5 -1
  457. package/packages/bundled-features/src/waitlist/handlers/reject.write.ts +1 -1
  458. package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +3 -3
  459. package/packages/bundled-features/src/waitlist/import.ts +1 -1
  460. package/packages/bundled-features/src/waitlist/index.ts +11 -11
  461. package/packages/bundled-features/src/waitlist/legacy-migrate.ts +1 -1
  462. package/packages/bundled-features/src/waitlist/link-on-signup.ts +1 -1
  463. package/packages/bundled-features/src/waitlist/mail.ts +7 -6
  464. package/packages/bundled-features/src/waitlist/payloads.ts +1 -1
  465. package/packages/bundled-features/src/waitlist/screens.ts +1 -1
  466. package/packages/bundled-features/src/waitlist/{constants.ts → web/constants.ts} +0 -1
  467. package/samples/apps/styleguide/src/features/content/web.tsx +0 -1
  468. package/samples/apps/ui-walkthrough/src/app/client.tsx +2 -0
  469. package/samples/apps/ui-walkthrough/src/app/seed-rental.ts +17 -1
  470. package/samples/apps/ui-walkthrough/src/app/seed-templates.ts +11 -0
  471. package/samples/apps/ui-walkthrough/src/app/server.ts +2 -1
  472. package/samples/apps/ui-walkthrough/src/features/billing/feature.ts +35 -7
  473. package/samples/apps/ui-walkthrough/src/features/billing/i18n.ts +6 -0
  474. package/samples/apps/ui-walkthrough/src/features/rental/entities.ts +27 -0
  475. package/samples/apps/ui-walkthrough/src/features/rental/feature.ts +61 -7
  476. package/samples/apps/ui-walkthrough/src/features/rental/i18n.ts +48 -24
  477. package/samples/apps/ui-walkthrough/src/features/rental/invoice-receive.ts +0 -1
  478. package/samples/apps/ui-walkthrough/src/features/rental/lease-support.ts +17 -1
  479. package/samples/apps/ui-walkthrough/src/features/rental/qualified-names.ts +3 -0
  480. package/samples/apps/ui-walkthrough/src/features/rental/receipts-upload.ts +70 -0
  481. package/samples/apps/ui-walkthrough/src/features/rental/screens.ts +90 -13
  482. package/samples/apps/ui-walkthrough/src/features/rental/web/index.ts +0 -2
  483. package/samples/apps/ui-walkthrough/src/features/subscription-plans/feature.ts +103 -0
  484. package/samples/apps/ui-walkthrough/src/features/subscription-plans/i18n.ts +36 -0
  485. package/samples/apps/ui-walkthrough/src/features/subscription-plans/index.ts +2 -0
  486. package/samples/apps/ui-walkthrough/src/features/subscription-plans/seed.ts +21 -0
  487. package/samples/apps/ui-walkthrough/src/run-config.ts +11 -0
  488. package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +1 -1
  489. package/samples/apps/use-all-bundled/feature-manifest.json +4 -4
  490. package/samples/apps/use-all-bundled/scripts/check-coverage.ts +1 -1
  491. package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +3 -1
  492. package/samples/recipes/compose-stacks/README.md +1 -2
  493. package/samples/recipes/embedded/README.md +5 -5
  494. package/samples/recipes/embedded/src/handlers/invoice-receive.write.ts +0 -1
  495. package/samples/recipes/embedded/src/screens/invoice-receive.screen.ts +9 -12
  496. package/samples/recipes/legal-pages/README.md +2 -2
  497. package/samples/recipes/legal-pages/src/feature.ts +1 -1
  498. package/samples/recipes/reference-data/src/feature.ts +3 -7
  499. package/packages/bundled-features/src/admin-shell/i18n.ts +0 -54
  500. package/packages/bundled-features/src/audit/i18n.ts +0 -25
  501. package/packages/bundled-features/src/auth-mfa/web/qrcode-browser.d.ts +0 -11
  502. package/packages/bundled-features/src/jobs/i18n.ts +0 -55
  503. package/packages/bundled-features/src/managed-pages/i18n.ts +0 -63
  504. package/packages/bundled-features/src/presets/dsgvo-self-service.ts +0 -35
  505. package/packages/bundled-features/src/user-data-rights/i18n.ts +0 -44
  506. package/samples/apps/ui-walkthrough/src/features/rental/web/upload-standard-layout.tsx +0 -61
@@ -1,4 +1,11 @@
1
1
  [
2
+ {
3
+ "version": "0.379.0",
4
+ "type": "breaking",
5
+ "title": "dsgvoSelfServiceFeatures removed",
6
+ "detail": "The deprecated preset dsgvoSelfServiceFeatures and its DsgvoSelfServiceOptions type are gone. composeGdprStack covers the same features.",
7
+ "migration": "Use composeGdprStack({ selfService: { userDataRights } }), or mount createSessionsFeature, createDataRetentionFeature, createComplianceProfilesFeature, createUserDataRightsFeature and createUserProfileFeature yourself."
8
+ },
2
9
  {
3
10
  "version": "0.370.0",
4
11
  "type": "improvement",
@@ -1,2 +1 @@
1
- export { type DsgvoSelfServiceOptions, dsgvoSelfServiceFeatures } from "./dsgvo-self-service.ts";
2
1
  export { type SecurityBaselineOptions, securityBaselineFeatures } from "./security-baseline.ts";
@@ -9,7 +9,7 @@ export type SecurityBaselineOptions = {
9
9
  };
10
10
 
11
11
  // Host app must mount user, tenant, auth-foundation (sessions/audit requires).
12
- /** @deprecated Removed in the next release. Use `composeSecurityStack({ includeSessions })`
12
+ /** @deprecated Removed in 0.390.0. Use `composeSecurityStack({ includeSessions })`
13
13
  * from `@cosmicdrift/kumiko-dev-server/compose-stacks`. */
14
14
  export function securityBaselineFeatures(opts: SecurityBaselineOptions = {}): FeatureDefinition[] {
15
15
  return [
@@ -165,7 +165,7 @@ export type ImageOptions = {
165
165
  //
166
166
  // **Beispiel renderer-mail-html:**
167
167
  // import { createTemplateResolverApi } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
168
- // const tplApi = createTemplateResolverApi(ctx.db);
168
+ // const tplApi = createTemplateResolverApi(ctx.db, ctx.registry);
169
169
  // const layout = await tplApi.resolveTemplate({ tenantId: ctx.tenantId, slug, kind });
170
170
  export type RendererContext = {
171
171
  readonly db: DbRunner | TenantDb;
@@ -10,7 +10,6 @@ import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
10
10
  import { SETTINGS_HUB_I18N } from "@cosmicdrift/kumiko-framework/i18n";
11
11
  import type { SecretsContext } from "@cosmicdrift/kumiko-framework/secrets";
12
12
  import * as z from "zod";
13
- import { DEFAULT_SECRETS_ACCESS } from "./constants.ts";
14
13
  import { createDeleteHandler } from "./handlers/delete.write.ts";
15
14
  import { createListHandler } from "./handlers/list.query.ts";
16
15
  import { rotateJob } from "./handlers/rotate.job.ts";
@@ -18,6 +17,7 @@ import { createSetHandler } from "./handlers/set.write.ts";
18
17
  import { SECRETS_I18N } from "./i18n.ts";
19
18
  import { secretReadSchema } from "./secrets-context.ts";
20
19
  import { tenantSecretEntity, tenantSecretsTable } from "./table.ts";
20
+ import { DEFAULT_SECRETS_ACCESS } from "./web/constants.ts";
21
21
 
22
22
  const ROTATE_ESCAPE_HATCH_REASON = "re-encrypts every tenant's secrets with the new master key";
23
23
 
@@ -2,8 +2,8 @@ import { type AccessRule, defineWriteHandler } from "@cosmicdrift/kumiko-framewo
2
2
  import { failNotFound } from "@cosmicdrift/kumiko-framework/errors";
3
3
  import * as z from "zod";
4
4
  import { announceSecretChange } from "../announce-secret-change.ts";
5
- import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../constants.ts";
6
5
  import { JOIN_REQUEST_TRANSACTION_REASON, requireSecretsContext } from "../feature.ts";
6
+ import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../web/constants.ts";
7
7
  import { checkSecretKeyWrite } from "../write-gate.ts";
8
8
 
9
9
  export function createDeleteHandler(access: AccessRule = DEFAULT_SECRETS_ACCESS) {
@@ -1,7 +1,7 @@
1
1
  import { type AccessRule, defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import * as z from "zod";
3
- import { DEFAULT_SECRETS_ACCESS } from "../constants.ts";
4
3
  import { tenantSecretsTable } from "../table.ts";
4
+ import { DEFAULT_SECRETS_ACCESS } from "../web/constants.ts";
5
5
 
6
6
  // Lists all secrets for the current tenant. Returns redactedPreview, never
7
7
  // the plaintext. Decryption would be pointless here anyway — this is the
@@ -1,8 +1,8 @@
1
1
  import { type AccessRule, defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import * as z from "zod";
3
3
  import { announceSecretChange } from "../announce-secret-change.ts";
4
- import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../constants.ts";
5
4
  import { JOIN_REQUEST_TRANSACTION_REASON, requireSecretsContext } from "../feature.ts";
5
+ import { DEFAULT_SECRETS_ACCESS, SecretsHandlers } from "../web/constants.ts";
6
6
  import { checkSecretKeyWrite, checkSecretValue } from "../write-gate.ts";
7
7
 
8
8
  export function createSetHandler(access: AccessRule = DEFAULT_SECRETS_ACCESS) {
@@ -1,4 +1,4 @@
1
- import { SECRETS_ERROR_KEYS } from "./constants.ts";
1
+ import { SECRETS_ERROR_KEYS } from "./web/constants.ts";
2
2
 
3
3
  export const SECRETS_I18N = {
4
4
  [SECRETS_ERROR_KEYS.unknownKey]: {
@@ -1,11 +1,3 @@
1
- export {
2
- DEFAULT_SECRETS_ACCESS,
3
- DEFAULT_SECRETS_ROLES,
4
- INVALID_SECRET_VALUE_CODE,
5
- SECRETS_ERROR_KEYS,
6
- SecretsHandlers,
7
- SecretsQueries,
8
- } from "./constants.ts";
9
1
  export {
10
2
  createSecretsContext,
11
3
  createSecretsFeature,
@@ -29,4 +21,12 @@ export {
29
21
  rotateJob,
30
22
  } from "./handlers/rotate.job.ts";
31
23
  export { createSetHandler } from "./handlers/set.write.ts";
24
+ export {
25
+ DEFAULT_SECRETS_ACCESS,
26
+ DEFAULT_SECRETS_ROLES,
27
+ INVALID_SECRET_VALUE_CODE,
28
+ SECRETS_ERROR_KEYS,
29
+ SecretsHandlers,
30
+ SecretsQueries,
31
+ } from "./web/constants.ts";
32
32
  export { isInvalidSecretValueError } from "./write-gate.ts";
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // secrets bundle constants — default RBAC for set/delete/list (#2296).
3
2
 
4
3
  import type { AccessRule } from "@cosmicdrift/kumiko-framework/engine";
@@ -11,7 +11,7 @@ import {
11
11
  type WriteFailure,
12
12
  writeFailure,
13
13
  } from "@cosmicdrift/kumiko-framework/errors";
14
- import { INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS } from "./constants.ts";
14
+ import { INVALID_SECRET_VALUE_CODE, SECRETS_ERROR_KEYS } from "./web/constants.ts";
15
15
 
16
16
  // Fixed keys carry their definition (redact fn, writeRoles); namespace keys
17
17
  // only the namespace, which has no redact fn.
@@ -17,7 +17,6 @@ import { mineQuery } from "./handlers/mine.query.ts";
17
17
  import { revokeWrite } from "./handlers/revoke.write.ts";
18
18
  import { revokeAllForUserWrite } from "./handlers/revoke-all-for-user.write.ts";
19
19
  import { revokeAllOthersWrite } from "./handlers/revoke-all-others.write.ts";
20
- import { SESSIONS_I18N } from "./i18n.ts";
21
20
  import { userSessionEntity } from "./schema/user-session.ts";
22
21
  import {
23
22
  createSessionDetailScreen,
@@ -30,6 +29,7 @@ import {
30
29
  type SessionMassRevoker,
31
30
  } from "./session-callbacks.ts";
32
31
  import { SESSION_REVOKED_EVENT_SHORT, sessionRevokedSchema } from "./session-revoked-event.ts";
32
+ import { SESSIONS_I18N } from "./web/i18n.ts";
33
33
 
34
34
  const CLEANUP_ESCAPE_HATCH_REASON = "deletes expired session rows of every tenant";
35
35
 
@@ -211,11 +211,15 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
211
211
  // sessionChecker blocks a status-locked principal on its next request
212
212
  // regardless.
213
213
  const REVOKE_TRIGGERING_FIELDS = ["passwordHash"] as const;
214
- let autoRevoke = options?.autoRevokeOnPasswordChange;
214
+ // Explicit option wins; the runtime binding is replaceable so a second boot of the same
215
+ // feature instance (a new app or test stack in one process) binds its own database.
216
+ const explicitAutoRevoke = options?.autoRevokeOnPasswordChange;
217
+ let boundAutoRevoke: SessionMassRevoker | undefined;
215
218
  r.hook({
216
219
  type: "postSave",
217
220
  target: { allOf: "user" },
218
221
  handler: async (ctx) => {
222
+ const autoRevoke = explicitAutoRevoke ?? boundAutoRevoke;
219
223
  // skip: nothing bound — stateless-JWT deployments without a runtime
220
224
  // that calls bindAutoRevokeOnPasswordChange keep the old behavior.
221
225
  if (!autoRevoke) return;
@@ -231,8 +235,7 @@ export function createSessionsFeature(options?: SessionsFeatureOptions): Feature
231
235
  });
232
236
 
233
237
  const bindAutoRevokeOnPasswordChange: BindAutoRevokeOnPasswordChange = (revoker) => {
234
- // explicit constructor option wins over the runtime binding
235
- autoRevoke ??= revoker;
238
+ boundAutoRevoke = revoker;
236
239
  };
237
240
 
238
241
  r.translations({ keys: SESSIONS_I18N });
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // Server + client i18n for the sessions operator screens.
3
2
 
4
3
  type LocalizedString = { readonly en: string };
@@ -22,7 +22,12 @@ export { isWithinGracePeriod } from "./grace-period.ts";
22
22
  export { isIdentityV3Hash, verifyIdentityV3Hash } from "./identity-v3-hash.ts";
23
23
  export { isTenantDb } from "./is-tenant-db.ts";
24
24
  export { createLockoutCounter, type LockoutCounterState } from "./lockout-counter.ts";
25
- export { mailHeading, mailParagraph, mailRepeatedRows } from "./mail-template-body.ts";
25
+ export {
26
+ mailHeading,
27
+ mailParagraph,
28
+ mailParagraphWithLink,
29
+ mailRepeatedRows,
30
+ } from "./mail-template-body.ts";
26
31
  export { mapWithConcurrency } from "./map-with-concurrency.ts";
27
32
  export {
28
33
  denyUnlessJoinRowParentVisible,
@@ -23,6 +23,7 @@ import {
23
23
  FILE_REF_ENTITY_NAME,
24
24
  fileRefEntity,
25
25
  fileRefsTable,
26
+ listActionFormFileFields,
26
27
  } from "@cosmicdrift/kumiko-framework/files";
27
28
  import {
28
29
  collectSingleFileHolders,
@@ -213,7 +214,7 @@ export async function purgeFilesReachingSubject(args: {
213
214
  db,
214
215
  registry,
215
216
  subject,
216
- fileFieldKeys: pendingFieldKeys(fileEntities),
217
+ fileFieldKeys: pendingFieldKeys(fileEntities, registry),
217
218
  fileHolders,
218
219
  storageByTenant,
219
220
  resolveDeleteBytes,
@@ -226,8 +227,15 @@ export async function purgeFilesReachingSubject(args: {
226
227
  const pendingFieldKey = (entityType: unknown, fieldName: unknown) =>
227
228
  `${entityType}\u0000${fieldName}`;
228
229
 
229
- function pendingFieldKeys(fileEntities: readonly FileEntity[]): ReadonlySet<string> {
230
+ // A pending upload of an actionForm files field is keyed by the screen QN, like an entity's by its name.
231
+ function pendingFieldKeys(
232
+ fileEntities: readonly FileEntity[],
233
+ registry: Registry,
234
+ ): ReadonlySet<string> {
230
235
  const keys = new Set<string>();
236
+ for (const { screenQn, fieldName } of listActionFormFileFields(registry)) {
237
+ keys.add(pendingFieldKey(screenQn, fieldName));
238
+ }
231
239
  for (const { entityName, fileFields } of fileEntities) {
232
240
  for (const fieldName of fileFields) keys.add(pendingFieldKey(entityName, fieldName));
233
241
  }
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  import type { useTranslation } from "@cosmicdrift/kumiko-renderer";
3
2
 
4
3
  type Translate = ReturnType<typeof useTranslation>;
@@ -53,6 +53,7 @@ import {
53
53
  createStripePlanSwitchSession,
54
54
  createStripePortalSession,
55
55
  createStripePriceCache,
56
+ createStripeResumeSubscription,
56
57
  createStripeRetrievePrices,
57
58
  createStripeRetrieveSubscription,
58
59
  } from "./plugin-methods.ts";
@@ -258,6 +259,7 @@ export function createSubscriptionStripeFeature(
258
259
  }),
259
260
  createPortalSession: createStripePortalSession(runtimes.ctx),
260
261
  cancelSubscription: createStripeCancelSubscription(runtimes.ctx),
262
+ resumeSubscription: createStripeResumeSubscription(runtimes.ctx),
261
263
  priceToTier: options.priceToTier ?? {},
262
264
  oneOffPriceIds: options.oneOffPriceIds ?? [],
263
265
  isBillingEnabled: runtimes.ctx.isBillingEnabled,
@@ -219,6 +219,25 @@ export function createStripePortalSession(runtime: StripeCtxRuntime) {
219
219
  };
220
220
  }
221
221
 
222
+ // =============================================================================
223
+ // resumeSubscription
224
+ // =============================================================================
225
+ //
226
+ // Takes back a period-end cancel; the following `customer.subscription.updated`
227
+ // carries cancel_at null, which the projection stores as "renews".
228
+
229
+ export function createStripeResumeSubscription(runtime: StripeCtxRuntime) {
230
+ return async (
231
+ ctx: HandlerContext,
232
+ options: { readonly providerSubscriptionId: string },
233
+ ): Promise<void> => {
234
+ const stripe = await runtime.clientForCtx(ctx);
235
+ await stripe.subscriptions.update(options.providerSubscriptionId, {
236
+ cancel_at_period_end: false,
237
+ });
238
+ };
239
+ }
240
+
222
241
  // =============================================================================
223
242
  // cancelSubscription
224
243
  // =============================================================================
@@ -176,6 +176,7 @@ export function verifyAndParseStripeWebhook(
176
176
  ...(consentId !== undefined && { consentId }),
177
177
  providerCustomerId: typeof sub.customer === "string" ? sub.customer : sub.customer.id,
178
178
  providerSubscriptionId: sub.id,
179
+ providerEventAt: Temporal.Instant.fromEpochMilliseconds(event.created * 1000).toString(),
179
180
  ...state,
180
181
  };
181
182
  };
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.379.0",
4
+ "type": "fix",
5
+ "title": "assign-tag and delete-tag no longer race",
6
+ "detail": "Re-assigning a tag after it was deleted no longer restores the assignment of a gone tag. assign-tag and delete-tag now take the same per-tag advisory lock, so a parallel assign can no longer leave an assignment for a deleted tag."
7
+ },
2
8
  {
3
9
  "version": "0.370.0",
4
10
  "type": "breaking",
@@ -28,7 +28,6 @@ import {
28
28
  type FeatureRegistrar,
29
29
  } from "@cosmicdrift/kumiko-framework/engine";
30
30
  import { assertNoWhereRuleInOwnershipWrite } from "../shared/index.ts";
31
- import { DEFAULT_TAG_ACCESS, TAGS_FEATURE_NAME } from "./constants.ts";
32
31
  import { createTagAssignmentEntity, tagEntity } from "./entity.ts";
33
32
  import { createTagAssignmentExecutor } from "./executor.ts";
34
33
  import { createAssignTagHandler } from "./handlers/assign-tag.write.ts";
@@ -38,6 +37,7 @@ import { createRemoveTagHandler } from "./handlers/remove-tag.write.ts";
38
37
  import { createUpdateTagHandler } from "./handlers/update-tag.write.ts";
39
38
  import { TAGS_FEATURE_I18N } from "./i18n.ts";
40
39
  import { createTagEditScreen, createTagListScreen } from "./screens.ts";
40
+ import { DEFAULT_TAG_ACCESS, TAGS_FEATURE_NAME } from "./web/constants.ts";
41
41
 
42
42
  // Opt-in tier-gating: when set, the feature declares itself r.toggleable so the
43
43
  // dispatcher gate + feature-toggles + tier-engine can switch the WHOLE feature
@@ -3,9 +3,9 @@ import { NotFoundError, writeFailure } from "@cosmicdrift/kumiko-framework/error
3
3
  import { isPlainObject } from "@cosmicdrift/kumiko-types/type-guards";
4
4
  import { denyUnlessJoinRowParentVisible } from "../../shared/index.ts";
5
5
  import { tagAssignmentAggregateId } from "../aggregate-id.ts";
6
- import { DEFAULT_TAG_ACCESS } from "../constants.ts";
7
6
  import { tagAssignmentExecutor, tagExecutor } from "../executor.ts";
8
7
  import { type AssignTagPayload, assignTagPayloadSchema } from "../schemas.ts";
8
+ import { DEFAULT_TAG_ACCESS, TAG_LOCK_NAMESPACE } from "../web/constants.ts";
9
9
 
10
10
  // assign-tag — links a tag to a host entity by (entityType, entityId). The
11
11
  // assignment id is deterministic, so the row is unique per (tag, entity).
@@ -20,9 +20,9 @@ import { type AssignTagPayload, assignTagPayloadSchema } from "../schemas.ts";
20
20
  // create(), the loser's create() version_conflicts, and the handler treats
21
21
  // that as success since the winner already wrote the desired end state.
22
22
  //
23
- // Referential integrity: there is no FK (event-sourced, no JOIN), so before a
24
- // first-time create we verify the tag exists in the catalog — a malformed call
25
- // with an unknown tagId would otherwise project a dangling assignment.
23
+ // Referential integrity: there is no FK (event-sourced, no JOIN), so we verify
24
+ // the tag exists in the catalog before any restore/create — otherwise a call
25
+ // racing delete-tag would resurrect or project an assignment for a gone tag.
26
26
  //
27
27
  // Host reference: entityType/entityId are never trusted client input either —
28
28
  // the aggregate-id is tenant-scoped, so this is not a cross-tenant hole, but
@@ -49,6 +49,13 @@ export function createAssignTagHandler(
49
49
  );
50
50
  if (denied) return denied;
51
51
 
52
+ // Same lock as delete-tag: the existence check below and the assignment
53
+ // write must not interleave with a delete-tag cascade, or the cascade
54
+ // misses the new assignment and leaves an orphan.
55
+ await ctx.db.advisoryXactLock(TAG_LOCK_NAMESPACE, payload.tagId);
56
+ const tag = await tagExecutor.detail({ id: payload.tagId }, event.user, ctx.db);
57
+ if (!tag) return writeFailure(new NotFoundError("tag", payload.tagId));
58
+
52
59
  const id = tagAssignmentAggregateId(
53
60
  event.user.tenantId,
54
61
  payload.tagId,
@@ -76,9 +83,6 @@ export function createAssignTagHandler(
76
83
  }
77
84
  if (restored.error.code !== "not_found") return restored;
78
85
 
79
- const tag = await tagExecutor.detail({ id: payload.tagId }, event.user, ctx.db);
80
- if (!tag) return writeFailure(new NotFoundError("tag", payload.tagId));
81
-
82
86
  const created = await assignmentExecutor.create(
83
87
  {
84
88
  id,
@@ -1,7 +1,7 @@
1
1
  import type { AccessRule, WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
2
- import { DEFAULT_TAG_ACCESS } from "../constants.ts";
3
2
  import { tagExecutor } from "../executor.ts";
4
3
  import { type CreateTagPayload, createTagPayloadSchema } from "../schemas.ts";
4
+ import { DEFAULT_TAG_ACCESS } from "../web/constants.ts";
5
5
 
6
6
  // create-tag — adds a tag to the tenant's catalog. The framework mints a fresh
7
7
  // UUIDv7 id (no explicit id passed). Tag names are not unique by design: the
@@ -1,7 +1,7 @@
1
1
  import type { AccessRule, WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
2
- import { DEFAULT_TAG_ACCESS } from "../constants.ts";
3
2
  import { tagAssignmentExecutor, tagExecutor } from "../executor.ts";
4
3
  import { type DeleteTagPayload, deleteTagPayloadSchema } from "../schemas.ts";
4
+ import { DEFAULT_TAG_ACCESS, TAG_LOCK_NAMESPACE } from "../web/constants.ts";
5
5
 
6
6
  const CASCADE_PAGE = 200;
7
7
 
@@ -30,6 +30,9 @@ export function createDeleteTagHandler(
30
30
  handler: async (event, ctx) => {
31
31
  const payload = event.payload as DeleteTagPayload; // @cast-boundary engine-payload
32
32
 
33
+ // Serialises with assign-tag (see there): the cascade must see every
34
+ // assignment that a concurrent assign-tag committed before the tag goes.
35
+ await ctx.db.advisoryXactLock(TAG_LOCK_NAMESPACE, payload.id);
33
36
  const existing = await tagExecutor.detail({ id: payload.id }, event.user, ctx.db);
34
37
  if (!existing) {
35
38
  return { isSuccess: true as const, data: { id: payload.id } };
@@ -1,9 +1,9 @@
1
1
  import type { AccessRule, WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { denyUnlessJoinRowParentVisible } from "../../shared/index.ts";
3
3
  import { tagAssignmentAggregateId } from "../aggregate-id.ts";
4
- import { DEFAULT_TAG_ACCESS } from "../constants.ts";
5
4
  import { tagAssignmentExecutor } from "../executor.ts";
6
5
  import { type RemoveTagPayload, removeTagPayloadSchema } from "../schemas.ts";
6
+ import { DEFAULT_TAG_ACCESS } from "../web/constants.ts";
7
7
 
8
8
  // remove-tag — unlinks a tag from a host entity. Idempotent: removing an
9
9
  // assignment that doesn't exist is already the requested end state (not
@@ -1,7 +1,7 @@
1
1
  import type { AccessRule, WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
2
- import { DEFAULT_TAG_ACCESS } from "../constants.ts";
3
2
  import { tagExecutor } from "../executor.ts";
4
3
  import { type UpdateTagPayload, updateTagPayloadSchema } from "../schemas.ts";
4
+ import { DEFAULT_TAG_ACCESS } from "../web/constants.ts";
5
5
 
6
6
  // update-tag — edits a catalog tag (rename / recolor / re-scope). Optimistic-
7
7
  // locked: the client sends the `version` it read (mirrors tenant:update). Only
@@ -1,16 +1,4 @@
1
1
  export { tagAssignmentAggregateId } from "./aggregate-id.ts";
2
- export {
3
- DEFAULT_TAG_ACCESS,
4
- DEFAULT_TAG_ROLES,
5
- TAGS_COLUMN_RENDERER_NAME,
6
- TAGS_EDIT_SCREEN_ID,
7
- TAGS_FEATURE_NAME,
8
- TAGS_FILTER_EXTENSION_NAME,
9
- TAGS_SCREEN_ID,
10
- TAGS_SECTION_EXTENSION_NAME,
11
- TagsHandlers,
12
- TagsQueries,
13
- } from "./constants.ts";
14
2
  export { tagAssignmentEntity, tagEntity } from "./entity.ts";
15
3
  export { createTagsFeature, type TagsFeatureOptions } from "./feature.ts";
16
4
  export {
@@ -46,3 +34,15 @@ export {
46
34
  updateTagPayloadSchema,
47
35
  } from "./schemas.ts";
48
36
  export { createTagEditScreen, createTagListScreen } from "./screens.ts";
37
+ export {
38
+ DEFAULT_TAG_ACCESS,
39
+ DEFAULT_TAG_ROLES,
40
+ TAGS_COLUMN_RENDERER_NAME,
41
+ TAGS_EDIT_SCREEN_ID,
42
+ TAGS_FEATURE_NAME,
43
+ TAGS_FILTER_EXTENSION_NAME,
44
+ TAGS_SCREEN_ID,
45
+ TAGS_SECTION_EXTENSION_NAME,
46
+ TagsHandlers,
47
+ TagsQueries,
48
+ } from "./web/constants.ts";
@@ -4,7 +4,7 @@ import {
4
4
  type EntityListScreenDefinition,
5
5
  i18nKey,
6
6
  } from "@cosmicdrift/kumiko-framework/engine";
7
- import { DEFAULT_TAG_ACCESS, TAGS_EDIT_SCREEN_ID, TAGS_SCREEN_ID } from "./constants.ts";
7
+ import { DEFAULT_TAG_ACCESS, TAGS_EDIT_SCREEN_ID, TAGS_SCREEN_ID } from "./web/constants.ts";
8
8
 
9
9
  // Declarative catalog screens (Phase-3 / #2312). Access matches create/update/
10
10
  // delete so createTagsFeature({ access|roles }) stays consistent. TagManager
@@ -1,12 +1,10 @@
1
- // @runtime client
2
-
3
1
  import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
4
2
  import {
5
3
  TAGS_COLUMN_RENDERER_NAME,
6
4
  TAGS_FEATURE_NAME,
7
5
  TAGS_FILTER_EXTENSION_NAME,
8
6
  TAGS_SECTION_EXTENSION_NAME,
9
- } from "../constants.ts";
7
+ } from "./constants.ts";
10
8
  import { defaultTranslations } from "./i18n.ts";
11
9
  import { TagFilter } from "./tag-filter.tsx";
12
10
  import { TagSection } from "./tag-section.tsx";
@@ -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
@@ -59,3 +58,7 @@ export const DEFAULT_TAG_ROLES = ["TenantAdmin", "TenantMember"] as const;
59
58
  // makes tagging reachable for any authenticated tenant user — matching apps
60
59
  // whose other handlers are openToAll rather than role-gated.
61
60
  export const DEFAULT_TAG_ACCESS: AccessRule = { roles: DEFAULT_TAG_ROLES };
61
+
62
+ // Advisory-lock namespace serialising assign-tag against delete-tag per tag id
63
+ // (no FK in the event-sourced catalog, so the DB cannot guard the orphan race).
64
+ export const TAG_LOCK_NAMESPACE = 0x74_61_67_73; // 'tags'
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // EntityTags — read-only colored tag row for ANY entity. Drop it on a card or
3
2
  // detail view: <EntityTags entityName="note" entityId={id} />. Loads the
4
3
  // catalog (for name+color) and the entity's assignments, renders a TagChip per
@@ -6,7 +5,7 @@
6
5
 
7
6
  import { useQuery } from "@cosmicdrift/kumiko-renderer";
8
7
  import type { ReactNode } from "react";
9
- import { TagsQueries } from "../constants.ts";
8
+ import { TagsQueries } from "./constants.ts";
10
9
  import { TagChip } from "./tag-chip.tsx";
11
10
 
12
11
  type TagRow = { readonly id: string; readonly name: string; readonly color?: string | 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>`.
@@ -25,7 +24,8 @@ export const defaultTranslations: TranslationsByLocale = {
25
24
  "tags.manage.toggle": "Toggle label",
26
25
  "tags.manage.usage": "{count}×",
27
26
  "tags.manage.deleteConfirmTitle": "Delete label “{name}”?",
28
- "tags.manage.deleteConfirmDesc": "Removes it from {count} objects. This can't be undone.",
27
+ "tags.manage.deleteConfirmDesc.one": "Removes it from 1 object. This can't be undone.",
28
+ "tags.manage.deleteConfirmDesc.other": "Removes it from {count} objects. This can't be undone.",
29
29
  "tags.picker.title": "Tags",
30
30
  "tags.picker.done": "Done",
31
31
  "tags.filter.label": "Filter by tag",
@@ -1,4 +1,4 @@
1
- // @runtime client
1
+ export { tagsClient } from "./client-plugin.tsx";
2
2
  export {
3
3
  TAGS_COLUMN_RENDERER_NAME,
4
4
  TAGS_EDIT_SCREEN_ID,
@@ -7,8 +7,7 @@ export {
7
7
  TAGS_SECTION_EXTENSION_NAME,
8
8
  TagsHandlers,
9
9
  TagsQueries,
10
- } from "../constants.ts";
11
- export { tagsClient } from "./client-plugin.tsx";
10
+ } from "./constants.ts";
12
11
  export { EntityTags } from "./entity-tags.tsx";
13
12
  export { contrastText, TagChip } from "./tag-chip.tsx";
14
13
  export { TagFilter } from "./tag-filter.tsx";
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // TagChip — read-only colored label pill, GitLab-labels style. The tag's `color`
3
2
  // (a hex like "#22cc88") drives the background; the text color is chosen for
4
3
  // contrast (YIQ luminance) so light and dark labels both stay legible. A tag
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // TagFilter — a drop-in tag filter for ANY entityList toolbar. Register it as
3
2
  // the list's header slot (`screen.slots.header`); the renderer passes it the
4
3
  // list's screenId, and picking tags resolves the matching row ids and narrows
@@ -20,7 +19,7 @@ import {
20
19
  useTranslation,
21
20
  } from "@cosmicdrift/kumiko-renderer";
22
21
  import { type ReactNode, useState } from "react";
23
- import { TagsQueries } from "../constants.ts";
22
+ import { TagsQueries } from "./constants.ts";
24
23
  import { TagChip } from "./tag-chip.tsx";
25
24
  import { TagPicker } from "./tag-picker.tsx";
26
25
 
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // TagManager — the shared tag-catalog UI, GitLab-labels style. Built ONCE,
3
2
  // mounted twice:
4
3
  // - standalone: <TagManager /> → the Tags admin screen
@@ -16,8 +15,9 @@ import {
16
15
  useQuery,
17
16
  useTranslation,
18
17
  } from "@cosmicdrift/kumiko-renderer";
18
+ import { pluralKey } from "@cosmicdrift/kumiko-renderer/headless";
19
19
  import { type ReactNode, useState } from "react";
20
- import { TagsHandlers, TagsQueries } from "../constants.ts";
20
+ import { TagsHandlers, TagsQueries } from "./constants.ts";
21
21
  import { TagChip } from "./tag-chip.tsx";
22
22
 
23
23
  type TagRow = {
@@ -139,6 +139,7 @@ export function TagManager({
139
139
  const usage = new Map<string, number>();
140
140
  for (const a of assignments.data?.rows ?? []) usage.set(a.tagId, (usage.get(a.tagId) ?? 0) + 1);
141
141
 
142
+ const deletingUsage = usage.get(deleting?.id ?? "") ?? 0;
142
143
  const selecting = selection !== undefined;
143
144
  const allTags = catalog.data?.rows ?? [];
144
145
  const tags = selecting
@@ -378,8 +379,8 @@ export function TagManager({
378
379
  if (!open) setDeleting(null);
379
380
  }}
380
381
  title={t("tags.manage.deleteConfirmTitle", { name: deleting?.name ?? "" })}
381
- description={t("tags.manage.deleteConfirmDesc", {
382
- count: usage.get(deleting?.id ?? "") ?? 0,
382
+ description={t(pluralKey("tags.manage.deleteConfirmDesc", deletingUsage), {
383
+ count: deletingUsage,
383
384
  })}
384
385
  confirmLabel={t("tags.manage.delete")}
385
386
  variant="danger"
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // TagPicker — the shared "manage + pick labels" modal. Wraps TagManager in
3
2
  // select-mode inside a Dialog: the user can create/recolor/delete labels (those
4
3
  // hit the catalog immediately) and toggle which ones apply (buffered). On
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // TagSection — drop-in tag editor for ANY entity, GitLab-labels style. Shows the
3
2
  // entity's tags as colored chips plus an "Edit tags" button that opens the
4
3
  // shared TagPicker modal (pick + manage). Applying the picker diffs the
@@ -19,7 +18,7 @@ import {
19
18
  useTranslation,
20
19
  } from "@cosmicdrift/kumiko-renderer";
21
20
  import { type ReactNode, useState } from "react";
22
- import { TagsHandlers, TagsQueries } from "../constants.ts";
21
+ import { TagsHandlers, TagsQueries } from "./constants.ts";
23
22
  import { TagChip } from "./tag-chip.tsx";
24
23
  import { TagPicker } from "./tag-picker.tsx";
25
24
 
@@ -1,4 +1,3 @@
1
- // @runtime client
2
1
  // TagsCell — a reusable columnRenderer that shows an entity's tags as colored
3
2
  // chips inline in a list row. Drop it into ANY entityList by declaring a labeled
4
3
  // virtual column (no host-schema change), after mounting tagsClient():
@@ -17,7 +16,7 @@
17
16
 
18
17
  import { type ColumnRendererProps, useQuery } from "@cosmicdrift/kumiko-renderer";
19
18
  import type { ReactNode } from "react";
20
- import { TagsQueries } from "../constants.ts";
19
+ import { TagsQueries } from "./constants.ts";
21
20
  import { TagChip } from "./tag-chip.tsx";
22
21
 
23
22
  type TagRow = { readonly id: string; readonly name: string; readonly color?: string | null };