@cosmicdrift/kumiko-bundled-features 0.374.0 → 0.377.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 (205) hide show
  1. package/dist/account-security/constants.d.ts +1 -0
  2. package/dist/account-security/constants.js +1 -0
  3. package/dist/account-security/index.d.ts +1 -1
  4. package/dist/account-security/index.js +1 -1
  5. package/dist/admin-shell/web/client-plugin.d.ts +1 -1
  6. package/dist/audit/web/client-plugin.d.ts +1 -1
  7. package/dist/auth-email-password/mail-notifications.js +1 -1
  8. package/dist/auth-email-password/web/auth-client.js +1 -1
  9. package/dist/auth-email-password/web/auth-form-primitives.js +1 -1
  10. package/dist/auth-email-password/web/default-topbar-actions.js +1 -1
  11. package/dist/auth-email-password/web/index.js +1 -1
  12. package/dist/auth-email-password/web/session.js +1 -1
  13. package/dist/auth-email-password/web/tenant-menu-items.js +1 -1
  14. package/dist/auth-email-password/web/tenant-switcher.js +1 -1
  15. package/dist/auth-email-password/web/user-menu.js +1 -1
  16. package/dist/auth-foundation/env.d.ts +9 -0
  17. package/dist/auth-foundation/env.js +21 -0
  18. package/dist/auth-foundation/index.d.ts +1 -0
  19. package/dist/auth-foundation/index.js +1 -0
  20. package/dist/auth-mfa/schema/user-mfa.d.ts +6 -6
  21. package/dist/billing-foundation/consumer-protection/confirmation-mail.js +1 -1
  22. package/dist/billing-foundation/consumer-protection/termination-pages.js +1 -1
  23. package/dist/billing-foundation/contact-card.d.ts +2 -0
  24. package/dist/billing-foundation/contact-card.js +16 -0
  25. package/dist/billing-foundation/entities.d.ts +8 -8
  26. package/dist/billing-foundation/handlers/billing-plans.query.js +1 -1
  27. package/dist/billing-foundation/index.d.ts +1 -1
  28. package/dist/billing-foundation/plan-catalog.js +1 -0
  29. package/dist/billing-foundation/projection.d.ts +8 -8
  30. package/dist/billing-foundation/types.d.ts +11 -0
  31. package/dist/billing-foundation/validate-options.js +13 -0
  32. package/dist/billing-foundation/web/billing-contact-plan.d.ts +5 -0
  33. package/dist/billing-foundation/web/billing-contact-plan.js +17 -0
  34. package/dist/billing-foundation/web/billing-plans-panel.js +5 -13
  35. package/dist/billing-foundation/web/cancel-contract-dialog.js +2 -2
  36. package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +1 -1
  37. package/dist/billing-foundation/web/checkout-consent-dialog.js +1 -0
  38. package/dist/billing-foundation/web/client-plugin.d.ts +1 -1
  39. package/dist/billing-foundation/web/localized-params.d.ts +1 -0
  40. package/dist/billing-foundation/web/localized-params.js +11 -0
  41. package/dist/cap-counter/entity.d.ts +1 -1
  42. package/dist/cap-overview/web/cap-cards-panel.js +3 -3
  43. package/dist/cap-overview/web/client-plugin.d.ts +1 -1
  44. package/dist/channel-email/email-channel.d.ts +2 -1
  45. package/dist/compliance-profiles/web/client-plugin.d.ts +1 -1
  46. package/dist/config/feature.js +2 -2
  47. package/dist/config/table.d.ts +6 -6
  48. package/dist/custom-fields/entity.d.ts +4 -4
  49. package/dist/custom-fields/web/client-plugin.d.ts +1 -1
  50. package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -4
  51. package/dist/delivery/tables.d.ts +6 -6
  52. package/dist/delivery/unsubscribe-page.js +1 -1
  53. package/dist/delivery/web/client-plugin.d.ts +1 -1
  54. package/dist/delivery/web/delivery-status-cell.js +1 -1
  55. package/dist/document-ingest-foundation/entity.d.ts +4 -4
  56. package/dist/feature-toggles/web/client-plugin.d.ts +1 -1
  57. package/dist/file-provider-s3/env-named-feature.d.ts +17 -0
  58. package/dist/file-provider-s3/env-named-feature.js +23 -0
  59. package/dist/file-provider-s3/env-schema.d.ts +7 -0
  60. package/dist/file-provider-s3/env-schema.js +15 -10
  61. package/dist/file-provider-s3/index.d.ts +1 -0
  62. package/dist/file-provider-s3/index.js +1 -0
  63. package/dist/folders/entity.d.ts +8 -8
  64. package/dist/folders/web/client-plugin.d.ts +1 -1
  65. package/dist/form-draft/entity.d.ts +2 -2
  66. package/dist/host-routing/constants.d.ts +2 -0
  67. package/dist/host-routing/constants.js +3 -0
  68. package/dist/host-routing/dispatch.d.ts +1 -1
  69. package/dist/host-routing/dispatch.js +35 -25
  70. package/dist/host-routing/feature.js +100 -27
  71. package/dist/host-routing/host.d.ts +9 -0
  72. package/dist/host-routing/host.js +24 -2
  73. package/dist/host-routing/index.d.ts +2 -1
  74. package/dist/host-routing/index.js +1 -0
  75. package/dist/host-routing/options.d.ts +14 -0
  76. package/dist/host-routing/redirects.d.ts +6 -0
  77. package/dist/host-routing/redirects.js +27 -0
  78. package/dist/host-routing/tenant-lookup.d.ts +7 -0
  79. package/dist/host-routing/tenant-lookup.js +39 -0
  80. package/dist/host-routing/validate-options.js +34 -1
  81. package/dist/inbound-mail-foundation/entities.d.ts +25 -25
  82. package/dist/inbound-mail-foundation/feature.js +7 -0
  83. package/dist/inbound-mail-foundation/i18n.d.ts +3 -0
  84. package/dist/inbound-mail-foundation/i18n.js +35 -0
  85. package/dist/inbound-mail-foundation/index.d.ts +1 -0
  86. package/dist/inbound-mail-foundation/index.js +1 -0
  87. package/dist/inbound-mail-foundation/projection.d.ts +20 -20
  88. package/dist/inbound-mail-foundation/screens.d.ts +7 -0
  89. package/dist/inbound-mail-foundation/screens.js +86 -0
  90. package/dist/inbound-mail-foundation/types.d.ts +2 -2
  91. package/dist/jobs/job-run-table.d.ts +6 -6
  92. package/dist/jobs/web/client-plugin.d.ts +1 -1
  93. package/dist/ledger/entity.d.ts +13 -13
  94. package/dist/legal-pages/feature.js +11 -1
  95. package/dist/legal-pages/layout.d.ts +2 -2
  96. package/dist/legal-pages/layout.js +4 -4
  97. package/dist/legal-pages/web/client-plugin.d.ts +1 -1
  98. package/dist/mail-foundation/feature.d.ts +20 -21
  99. package/dist/mail-foundation/feature.js +1 -1
  100. package/dist/managed-pages/table.d.ts +12 -12
  101. package/dist/managed-pages/web/client-plugin.d.ts +1 -1
  102. package/dist/notes-history/entity.d.ts +12 -12
  103. package/dist/notes-history/web/client-plugin.d.ts +1 -1
  104. package/dist/page-render/branding.js +1 -1
  105. package/dist/page-render/layout.d.ts +1 -1
  106. package/dist/page-render/layout.js +2 -2
  107. package/dist/page-render/markdown.js +1 -1
  108. package/dist/personal-access-tokens/i18n.js +1 -1
  109. package/dist/personal-access-tokens/schema/api-token.d.ts +6 -6
  110. package/dist/personal-access-tokens/screens.js +1 -1
  111. package/dist/secrets/feature.d.ts +1 -1
  112. package/dist/secrets/feature.js +3 -3
  113. package/dist/secrets/table.d.ts +1 -1
  114. package/dist/seo/sitemap.js +1 -1
  115. package/dist/sessions/schema/user-session.d.ts +4 -4
  116. package/dist/shared/mail-template-body.js +1 -1
  117. package/dist/shared/purge-files-reaching-subject.js +98 -3
  118. package/dist/tags/entity.d.ts +9 -9
  119. package/dist/tags/web/client-plugin.d.ts +1 -1
  120. package/dist/template-resolver/document-blocks.d.ts +5 -0
  121. package/dist/template-resolver/document-blocks.js +21 -0
  122. package/dist/template-resolver/document-ops.d.ts +167 -0
  123. package/dist/template-resolver/document-ops.js +390 -0
  124. package/dist/template-resolver/document-sanitizer.d.ts +3 -0
  125. package/dist/template-resolver/document-sanitizer.js +6 -0
  126. package/dist/template-resolver/feature.d.ts +2 -0
  127. package/dist/template-resolver/feature.js +4 -0
  128. package/dist/template-resolver/handlers/bundle-import.js +1 -0
  129. package/dist/template-resolver/handlers/document-base.d.ts +23 -0
  130. package/dist/template-resolver/handlers/document-base.js +55 -0
  131. package/dist/template-resolver/handlers/document-blocks.query.d.ts +22 -0
  132. package/dist/template-resolver/handlers/document-blocks.query.js +46 -0
  133. package/dist/template-resolver/handlers/export-bundle.query.d.ts +1 -0
  134. package/dist/template-resolver/handlers/export-bundle.query.js +9 -2
  135. package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +1 -0
  136. package/dist/template-resolver/handlers/import-bundle.write.d.ts +1 -0
  137. package/dist/template-resolver/handlers/patch-draft.write.d.ts +66 -0
  138. package/dist/template-resolver/handlers/patch-draft.write.js +105 -0
  139. package/dist/template-resolver/handlers/preview.query.d.ts +1 -0
  140. package/dist/template-resolver/handlers/preview.query.js +2 -1
  141. package/dist/template-resolver/handlers/send-test.write.d.ts +1 -0
  142. package/dist/template-resolver/handlers/send-test.write.js +2 -1
  143. package/dist/template-resolver/handlers/template-write.d.ts +2 -0
  144. package/dist/template-resolver/handlers/template-write.js +14 -2
  145. package/dist/template-resolver/handlers/validate.query.d.ts +10 -4
  146. package/dist/template-resolver/handlers/validate.query.js +12 -7
  147. package/dist/template-resolver/{web/placeholder-text.js → placeholder-text.js} +1 -1
  148. package/dist/template-resolver/qualified-names.d.ts +2 -0
  149. package/dist/template-resolver/qualified-names.js +2 -0
  150. package/dist/template-resolver/seeding.d.ts +1 -0
  151. package/dist/template-resolver/seeding.js +2 -1
  152. package/dist/template-resolver/table.d.ts +10 -10
  153. package/dist/template-resolver/template-bundle.d.ts +1 -0
  154. package/dist/template-resolver/template-bundle.js +6 -1
  155. package/dist/template-resolver/template-preview.d.ts +4 -1
  156. package/dist/template-resolver/template-preview.js +16 -3
  157. package/dist/template-resolver/template-validation.d.ts +2 -1
  158. package/dist/template-resolver/template-validation.js +1 -1
  159. package/dist/template-resolver/user-content-table.d.ts +10 -10
  160. package/dist/template-resolver/web/client-plugin.d.ts +1 -1
  161. package/dist/template-resolver/web/client-plugin.js +3 -3
  162. package/dist/template-resolver/web/document-tiptap-editor.js +1 -1
  163. package/dist/template-resolver/web/document-toolbar-blocks.d.ts +2 -5
  164. package/dist/template-resolver/web/document-toolbar-blocks.js +1 -21
  165. package/dist/template-resolver/web/i18n.js +14 -0
  166. package/dist/template-resolver/web/placeholder-line-editor.js +2 -2
  167. package/dist/tenant/invitation-table.d.ts +6 -6
  168. package/dist/tenant/membership-table.d.ts +4 -4
  169. package/dist/tenant/schema/tenant.d.ts +6 -6
  170. package/dist/tenant/web/client-plugin.d.ts +1 -1
  171. package/dist/tenant/web/member-status-cell.js +1 -1
  172. package/dist/tier-engine/entity.d.ts +1 -1
  173. package/dist/tier-engine/tier-resolver.d.ts +1 -1
  174. package/dist/tier-engine/web/client-plugin.d.ts +1 -1
  175. package/dist/user/schema/user.d.ts +12 -12
  176. package/dist/user-data-rights/env.d.ts +5 -0
  177. package/dist/user-data-rights/env.js +11 -0
  178. package/dist/user-data-rights/feature.js +4 -2
  179. package/dist/user-data-rights/index.d.ts +1 -0
  180. package/dist/user-data-rights/index.js +1 -0
  181. package/dist/user-data-rights/lib/mail-transport-resolver.js +1 -1
  182. package/dist/user-data-rights/lib/storage-provider-resolver.js +1 -1
  183. package/dist/user-data-rights/mail-notifications.js +1 -1
  184. package/dist/user-data-rights/schema/download-attempt.d.ts +14 -14
  185. package/dist/user-data-rights/schema/download-token.d.ts +8 -8
  186. package/dist/user-data-rights/schema/export-job.d.ts +6 -6
  187. package/dist/user-data-rights/web/client-plugin.d.ts +1 -1
  188. package/dist/user-data-rights/web/privacy-center-screen.js +2 -2
  189. package/dist/waitlist/entity.d.ts +14 -14
  190. package/dist/waitlist/legacy-migrate.d.ts +2 -0
  191. package/dist/waitlist/legacy-migrate.js +38 -3
  192. package/package.json +16 -11
  193. package/src/account-security/changes.json +6 -0
  194. package/src/auth-foundation/changes.json +6 -0
  195. package/src/billing-foundation/changes.json +6 -0
  196. package/src/channel-email/changes.json +6 -0
  197. package/src/crypto-shredding/changes.json +6 -0
  198. package/src/file-provider-s3/changes.json +6 -0
  199. package/src/host-routing/changes.json +6 -0
  200. package/src/inbound-mail-foundation/changes.json +7 -0
  201. package/src/legal-pages/changes.json +6 -0
  202. package/src/template-resolver/changes.json +18 -0
  203. package/src/user-data-rights/changes.json +6 -0
  204. package/src/waitlist/changes.json +6 -0
  205. /package/dist/template-resolver/{web/placeholder-text.d.ts → placeholder-text.d.ts} +0 -0
@@ -15,7 +15,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
15
15
  readonly sensitive?: boolean;
16
16
  readonly writeOnly?: boolean;
17
17
  readonly readAsInstruction?: boolean;
18
- readonly format?: "email" | "url" | "phone" | "password";
18
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
19
19
  readonly default?: string;
20
20
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
21
21
  readonly multiline?: boolean | {
@@ -38,7 +38,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
38
38
  readonly sensitive?: boolean;
39
39
  readonly writeOnly?: boolean;
40
40
  readonly readAsInstruction?: boolean;
41
- readonly format?: "email" | "url" | "phone" | "password";
41
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
42
42
  readonly default?: string;
43
43
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
44
44
  readonly multiline?: boolean | {
@@ -61,7 +61,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
61
61
  readonly sensitive?: boolean;
62
62
  readonly writeOnly?: boolean;
63
63
  readonly readAsInstruction?: boolean;
64
- readonly format?: "email" | "url" | "phone" | "password";
64
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
65
65
  readonly default?: string;
66
66
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
67
67
  readonly multiline?: boolean | {
@@ -84,7 +84,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
84
84
  readonly sensitive?: boolean;
85
85
  readonly writeOnly?: boolean;
86
86
  readonly readAsInstruction?: boolean;
87
- readonly format?: "email" | "url" | "phone" | "password";
87
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
88
88
  readonly default?: string;
89
89
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
90
90
  readonly multiline?: boolean | {
@@ -107,7 +107,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
107
107
  readonly sensitive?: boolean;
108
108
  readonly writeOnly?: boolean;
109
109
  readonly readAsInstruction?: boolean;
110
- readonly format?: "email" | "url" | "phone" | "password";
110
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
111
111
  readonly default?: string;
112
112
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
113
113
  readonly multiline?: boolean | {
@@ -130,7 +130,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
130
130
  readonly sensitive?: boolean;
131
131
  readonly writeOnly?: boolean;
132
132
  readonly readAsInstruction?: boolean;
133
- readonly format?: "email" | "url" | "phone" | "password";
133
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
134
134
  readonly default?: string;
135
135
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
136
136
  readonly multiline?: boolean | {
@@ -153,7 +153,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
153
153
  readonly sensitive?: boolean;
154
154
  readonly writeOnly?: boolean;
155
155
  readonly readAsInstruction?: boolean;
156
- readonly format?: "email" | "url" | "phone" | "password";
156
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
157
157
  readonly default?: string;
158
158
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
159
159
  readonly multiline?: boolean | {
@@ -196,7 +196,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
196
196
  readonly sensitive?: boolean;
197
197
  readonly writeOnly?: boolean;
198
198
  readonly readAsInstruction?: boolean;
199
- readonly format?: "email" | "url" | "phone" | "password";
199
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
200
200
  readonly default?: string;
201
201
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
202
202
  readonly multiline?: boolean | {
@@ -219,7 +219,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
219
219
  readonly sensitive?: boolean;
220
220
  readonly writeOnly?: boolean;
221
221
  readonly readAsInstruction?: boolean;
222
- readonly format?: "email" | "url" | "phone" | "password";
222
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
223
223
  readonly default?: string;
224
224
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
225
225
  readonly multiline?: boolean | {
@@ -242,7 +242,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
242
242
  readonly sensitive?: boolean;
243
243
  readonly writeOnly?: boolean;
244
244
  readonly readAsInstruction?: boolean;
245
- readonly format?: "email" | "url" | "phone" | "password";
245
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
246
246
  readonly default?: string;
247
247
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
248
248
  readonly multiline?: boolean | {
@@ -265,7 +265,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
265
265
  readonly sensitive?: boolean;
266
266
  readonly writeOnly?: boolean;
267
267
  readonly readAsInstruction?: boolean;
268
- readonly format?: "email" | "url" | "phone" | "password";
268
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
269
269
  readonly default?: string;
270
270
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
271
271
  readonly multiline?: boolean | {
@@ -288,7 +288,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
288
288
  readonly sensitive?: boolean;
289
289
  readonly writeOnly?: boolean;
290
290
  readonly readAsInstruction?: boolean;
291
- readonly format?: "email" | "url" | "phone" | "password";
291
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
292
292
  readonly default?: string;
293
293
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
294
294
  readonly multiline?: boolean | {
@@ -311,7 +311,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
311
311
  readonly sensitive?: boolean;
312
312
  readonly writeOnly?: boolean;
313
313
  readonly readAsInstruction?: boolean;
314
- readonly format?: "email" | "url" | "phone" | "password";
314
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
315
315
  readonly default?: string;
316
316
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
317
317
  readonly multiline?: boolean | {
@@ -334,7 +334,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
334
334
  readonly sensitive?: boolean;
335
335
  readonly writeOnly?: boolean;
336
336
  readonly readAsInstruction?: boolean;
337
- readonly format?: "email" | "url" | "phone" | "password";
337
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
338
338
  readonly default?: string;
339
339
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
340
340
  readonly multiline?: boolean | {
@@ -357,7 +357,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
357
357
  readonly sensitive?: boolean;
358
358
  readonly writeOnly?: boolean;
359
359
  readonly readAsInstruction?: boolean;
360
- readonly format?: "email" | "url" | "phone" | "password";
360
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
361
361
  readonly default?: string;
362
362
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
363
363
  readonly multiline?: boolean | {
@@ -380,7 +380,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
380
380
  readonly sensitive?: boolean;
381
381
  readonly writeOnly?: boolean;
382
382
  readonly readAsInstruction?: boolean;
383
- readonly format?: "email" | "url" | "phone" | "password";
383
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
384
384
  readonly default?: string;
385
385
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
386
386
  readonly multiline?: boolean | {
@@ -418,7 +418,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
418
418
  readonly sensitive?: boolean;
419
419
  readonly writeOnly?: boolean;
420
420
  readonly readAsInstruction?: boolean;
421
- readonly format?: "email" | "url" | "phone" | "password";
421
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
422
422
  readonly default?: string;
423
423
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
424
424
  readonly multiline?: boolean | {
@@ -441,7 +441,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
441
441
  readonly sensitive?: boolean;
442
442
  readonly writeOnly?: boolean;
443
443
  readonly readAsInstruction?: boolean;
444
- readonly format?: "email" | "url" | "phone" | "password";
444
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
445
445
  readonly default?: string;
446
446
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
447
447
  readonly multiline?: boolean | {
@@ -468,7 +468,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
468
468
  readonly sensitive?: boolean;
469
469
  readonly writeOnly?: boolean;
470
470
  readonly readAsInstruction?: boolean;
471
- readonly format?: "email" | "url" | "phone" | "password";
471
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
472
472
  readonly default?: string;
473
473
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
474
474
  readonly multiline?: boolean | {
@@ -491,7 +491,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
491
491
  readonly sensitive?: boolean;
492
492
  readonly writeOnly?: boolean;
493
493
  readonly readAsInstruction?: boolean;
494
- readonly format?: "email" | "url" | "phone" | "password";
494
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
495
495
  readonly default?: string;
496
496
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
497
497
  readonly multiline?: boolean | {
@@ -557,7 +557,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
557
557
  readonly sensitive?: boolean;
558
558
  readonly writeOnly?: boolean;
559
559
  readonly readAsInstruction?: boolean;
560
- readonly format?: "email" | "url" | "phone" | "password";
560
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
561
561
  readonly default?: string;
562
562
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
563
563
  readonly multiline?: boolean | {
@@ -580,7 +580,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
580
580
  readonly sensitive?: boolean;
581
581
  readonly writeOnly?: boolean;
582
582
  readonly readAsInstruction?: boolean;
583
- readonly format?: "email" | "url" | "phone" | "password";
583
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
584
584
  readonly default?: string;
585
585
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
586
586
  readonly multiline?: boolean | {
@@ -603,7 +603,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
603
603
  readonly sensitive?: boolean;
604
604
  readonly writeOnly?: boolean;
605
605
  readonly readAsInstruction?: boolean;
606
- readonly format?: "email" | "url" | "phone" | "password";
606
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
607
607
  readonly default?: string;
608
608
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
609
609
  readonly multiline?: boolean | {
@@ -647,7 +647,7 @@ export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields
647
647
  readonly sensitive?: boolean;
648
648
  readonly writeOnly?: boolean;
649
649
  readonly readAsInstruction?: boolean;
650
- readonly format?: "email" | "url" | "phone" | "password";
650
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
651
651
  readonly default?: string;
652
652
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
653
653
  readonly multiline?: boolean | {
@@ -670,7 +670,7 @@ export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields
670
670
  readonly sensitive?: boolean;
671
671
  readonly writeOnly?: boolean;
672
672
  readonly readAsInstruction?: boolean;
673
- readonly format?: "email" | "url" | "phone" | "password";
673
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
674
674
  readonly default?: string;
675
675
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
676
676
  readonly multiline?: boolean | {
@@ -51,8 +51,10 @@ import { ingestMessageHandler } from "./handlers/ingest-message.write.js";
51
51
  import { listAccountsQuery } from "./handlers/list-accounts.query.js";
52
52
  import { listMessagesQuery } from "./handlers/list-messages.query.js";
53
53
  import { updateAccountHandler } from "./handlers/update-account.write.js";
54
+ import { INBOUND_MAIL_FOUNDATION_I18N } from "./i18n.js";
54
55
  import { applyInboundMessageReceived, applyMailAccountConnected, applyMailAccountDisconnected, applyMailAccountUpdated, applyMailThreadUpdated, inboundMessagesProjectionTable, mailAccountsProjectionTable, mailThreadsProjectionTable, } from "./projection.js";
55
56
  import { runInboundMailRetention } from "./retention-sweep.js";
57
+ import { mailAccountEditScreen, mailAccountListScreen } from "./screens.js";
56
58
  import { INBOUND_MAIL_TENANT_DESTROY_ARCHIVE_REASON, inboundMessageTenantDestroyHook, mailAccountTenantDestroyHook, mailThreadTenantDestroyHook, } from "./tenant-destroy-hook.js";
57
59
  export function createInboundMailFoundationFeature() {
58
60
  return defineFeature(INBOUND_MAIL_FOUNDATION_FEATURE, (r) => {
@@ -141,6 +143,11 @@ export function createInboundMailFoundationFeature() {
141
143
  // List-Queries (PII-decrypted, scope-gefiltert).
142
144
  r.queryHandler(listAccountsQuery);
143
145
  r.queryHandler(listMessagesQuery);
146
+ // Declarative mailbox admin: list (rename, disconnect) and rename form.
147
+ // The app places `mailAccountListScreen` via r.nav in its settings area.
148
+ r.screen(mailAccountListScreen);
149
+ r.screen(mailAccountEditScreen);
150
+ r.translations({ keys: INBOUND_MAIL_FOUNDATION_I18N });
144
151
  // Entity-genaue GDPR-Destroy-Hooks — der gdpr-storage-Boot-Validator
145
152
  // prueft die EXT_TENANT_DATA-Registrierung pro tenant-subject-Entity.
146
153
  r.useExtension(EXT_TENANT_DATA, "mail-account", {
@@ -0,0 +1,3 @@
1
+ export declare const INBOUND_MAIL_FOUNDATION_I18N: Readonly<Record<string, {
2
+ readonly en: string;
3
+ }>>;
@@ -0,0 +1,35 @@
1
+ import { ACTION_FORM_ENTITY } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import { fieldLabelKey } from "@cosmicdrift/kumiko-renderer/headless";
3
+ import { INBOUND_MAIL_FOUNDATION_FEATURE, InboundMailAccountStatuses } from "./constants.js";
4
+ import { MAIL_ACCOUNT_EDIT_SCREEN_ID, MAIL_ACCOUNT_LIST_SCREEN_ID, MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX, } from "./screens.js";
5
+ const formFieldKey = (field) => fieldLabelKey(INBOUND_MAIL_FOUNDATION_FEATURE, ACTION_FORM_ENTITY, field);
6
+ export const INBOUND_MAIL_FOUNDATION_I18N = {
7
+ [`screen:${MAIL_ACCOUNT_LIST_SCREEN_ID}.title`]: { en: "Mailboxes" },
8
+ [`screen:${MAIL_ACCOUNT_EDIT_SCREEN_ID}.title`]: { en: "Edit mailbox" },
9
+ "inboundMail.accounts.col.name": { en: "Name" },
10
+ "inboundMail.accounts.col.address": { en: "Address" },
11
+ "inboundMail.accounts.col.provider": { en: "Provider" },
12
+ "inboundMail.accounts.col.status": { en: "Status" },
13
+ "inboundMail.accounts.col.connected": { en: "Connected" },
14
+ [`${MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX}${InboundMailAccountStatuses.active}`]: {
15
+ en: "Active",
16
+ },
17
+ [`${MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX}${InboundMailAccountStatuses.authError}`]: {
18
+ en: "Sign-in failed",
19
+ },
20
+ [`${MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX}${InboundMailAccountStatuses.degraded}`]: {
21
+ en: "Interrupted",
22
+ },
23
+ [`${MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX}${InboundMailAccountStatuses.disconnected}`]: {
24
+ en: "Disconnected",
25
+ },
26
+ "inboundMail.accounts.edit": { en: "Rename" },
27
+ "inboundMail.accounts.edit.submit": { en: "Save" },
28
+ "inboundMail.accounts.disconnect": { en: "Disconnect" },
29
+ "inboundMail.accounts.disconnect.confirm": {
30
+ en: "Disconnect this mailbox? No new mail is fetched; stored mail is kept.",
31
+ },
32
+ [formFieldKey("accountId")]: { en: "Mailbox" },
33
+ [formFieldKey("displayName")]: { en: "Name" },
34
+ [formFieldKey("reason")]: { en: "Reason" },
35
+ };
@@ -8,5 +8,6 @@ export { createOAuthAccessTokenManager, inboundRefreshTokenSecretOptions, type O
8
8
  export { type OAuthStatePayload, signOAuthState, type VerifyOAuthStateResult, verifyOAuthState, } from "./oauth-state.ts";
9
9
  export { inboundMessagesProjectionTable, mailAccountsProjectionTable, mailThreadsProjectionTable, } from "./projection.ts";
10
10
  export { resolveInboundProviderForAccount, resolveInboundProviderForKey, } from "./provider-factory.ts";
11
+ export { MAIL_ACCOUNT_EDIT_SCREEN_ID, MAIL_ACCOUNT_LIST_SCREEN_ID, } from "./screens.ts";
11
12
  export { InboundAuthError, InboundCursorInvalidError, type InboundFetchResult, type InboundMailContext, type InboundMailProviderPlugin, type InboundOAuthFlow, InboundRateLimitError, InboundTransientError, isInboundAuthError, isInboundCursorInvalidError, isInboundMailProviderPlugin, isInboundRateLimitError, isInboundTransientError, type MailAccountRecord, type OAuthTokenSet, type RawInboundMessage, type SyncCursorPayload, } from "./types.ts";
12
13
  export { createInboundMailSupervisor, type InboundMailSupervisor, type InboundMailSupervisorDeps, } from "./watch-supervisor.ts";
@@ -9,5 +9,6 @@ export { createOAuthAccessTokenManager, inboundRefreshTokenSecretOptions, usesFo
9
9
  export { signOAuthState, verifyOAuthState, } from "./oauth-state.js";
10
10
  export { inboundMessagesProjectionTable, mailAccountsProjectionTable, mailThreadsProjectionTable, } from "./projection.js";
11
11
  export { resolveInboundProviderForAccount, resolveInboundProviderForKey, } from "./provider-factory.js";
12
+ export { MAIL_ACCOUNT_EDIT_SCREEN_ID, MAIL_ACCOUNT_LIST_SCREEN_ID, } from "./screens.js";
12
13
  export { InboundAuthError, InboundCursorInvalidError, InboundRateLimitError, InboundTransientError, isInboundAuthError, isInboundCursorInvalidError, isInboundMailProviderPlugin, isInboundRateLimitError, isInboundTransientError, } from "./types.js";
13
14
  export { createInboundMailSupervisor, } from "./watch-supervisor.js";
@@ -13,7 +13,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
13
13
  readonly sensitive?: boolean;
14
14
  readonly writeOnly?: boolean;
15
15
  readonly readAsInstruction?: boolean;
16
- readonly format?: "email" | "url" | "phone" | "password";
16
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
17
17
  readonly default?: string;
18
18
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
19
19
  readonly multiline?: boolean | {
@@ -36,7 +36,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
36
36
  readonly sensitive?: boolean;
37
37
  readonly writeOnly?: boolean;
38
38
  readonly readAsInstruction?: boolean;
39
- readonly format?: "email" | "url" | "phone" | "password";
39
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
40
40
  readonly default?: string;
41
41
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
42
42
  readonly multiline?: boolean | {
@@ -59,7 +59,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
59
59
  readonly sensitive?: boolean;
60
60
  readonly writeOnly?: boolean;
61
61
  readonly readAsInstruction?: boolean;
62
- readonly format?: "email" | "url" | "phone" | "password";
62
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
63
63
  readonly default?: string;
64
64
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
65
65
  readonly multiline?: boolean | {
@@ -82,7 +82,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
82
82
  readonly sensitive?: boolean;
83
83
  readonly writeOnly?: boolean;
84
84
  readonly readAsInstruction?: boolean;
85
- readonly format?: "email" | "url" | "phone" | "password";
85
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
86
86
  readonly default?: string;
87
87
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
88
88
  readonly multiline?: boolean | {
@@ -105,7 +105,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
105
105
  readonly sensitive?: boolean;
106
106
  readonly writeOnly?: boolean;
107
107
  readonly readAsInstruction?: boolean;
108
- readonly format?: "email" | "url" | "phone" | "password";
108
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
109
109
  readonly default?: string;
110
110
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
111
111
  readonly multiline?: boolean | {
@@ -128,7 +128,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
128
128
  readonly sensitive?: boolean;
129
129
  readonly writeOnly?: boolean;
130
130
  readonly readAsInstruction?: boolean;
131
- readonly format?: "email" | "url" | "phone" | "password";
131
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
132
132
  readonly default?: string;
133
133
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
134
134
  readonly multiline?: boolean | {
@@ -151,7 +151,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
151
151
  readonly sensitive?: boolean;
152
152
  readonly writeOnly?: boolean;
153
153
  readonly readAsInstruction?: boolean;
154
- readonly format?: "email" | "url" | "phone" | "password";
154
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
155
155
  readonly default?: string;
156
156
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
157
157
  readonly multiline?: boolean | {
@@ -191,7 +191,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
191
191
  readonly sensitive?: boolean;
192
192
  readonly writeOnly?: boolean;
193
193
  readonly readAsInstruction?: boolean;
194
- readonly format?: "email" | "url" | "phone" | "password";
194
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
195
195
  readonly default?: string;
196
196
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
197
197
  readonly multiline?: boolean | {
@@ -214,7 +214,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
214
214
  readonly sensitive?: boolean;
215
215
  readonly writeOnly?: boolean;
216
216
  readonly readAsInstruction?: boolean;
217
- readonly format?: "email" | "url" | "phone" | "password";
217
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
218
218
  readonly default?: string;
219
219
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
220
220
  readonly multiline?: boolean | {
@@ -237,7 +237,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
237
237
  readonly sensitive?: boolean;
238
238
  readonly writeOnly?: boolean;
239
239
  readonly readAsInstruction?: boolean;
240
- readonly format?: "email" | "url" | "phone" | "password";
240
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
241
241
  readonly default?: string;
242
242
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
243
243
  readonly multiline?: boolean | {
@@ -260,7 +260,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
260
260
  readonly sensitive?: boolean;
261
261
  readonly writeOnly?: boolean;
262
262
  readonly readAsInstruction?: boolean;
263
- readonly format?: "email" | "url" | "phone" | "password";
263
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
264
264
  readonly default?: string;
265
265
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
266
266
  readonly multiline?: boolean | {
@@ -283,7 +283,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
283
283
  readonly sensitive?: boolean;
284
284
  readonly writeOnly?: boolean;
285
285
  readonly readAsInstruction?: boolean;
286
- readonly format?: "email" | "url" | "phone" | "password";
286
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
287
287
  readonly default?: string;
288
288
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
289
289
  readonly multiline?: boolean | {
@@ -306,7 +306,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
306
306
  readonly sensitive?: boolean;
307
307
  readonly writeOnly?: boolean;
308
308
  readonly readAsInstruction?: boolean;
309
- readonly format?: "email" | "url" | "phone" | "password";
309
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
310
310
  readonly default?: string;
311
311
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
312
312
  readonly multiline?: boolean | {
@@ -329,7 +329,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
329
329
  readonly sensitive?: boolean;
330
330
  readonly writeOnly?: boolean;
331
331
  readonly readAsInstruction?: boolean;
332
- readonly format?: "email" | "url" | "phone" | "password";
332
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
333
333
  readonly default?: string;
334
334
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
335
335
  readonly multiline?: boolean | {
@@ -352,7 +352,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
352
352
  readonly sensitive?: boolean;
353
353
  readonly writeOnly?: boolean;
354
354
  readonly readAsInstruction?: boolean;
355
- readonly format?: "email" | "url" | "phone" | "password";
355
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
356
356
  readonly default?: string;
357
357
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
358
358
  readonly multiline?: boolean | {
@@ -375,7 +375,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
375
375
  readonly sensitive?: boolean;
376
376
  readonly writeOnly?: boolean;
377
377
  readonly readAsInstruction?: boolean;
378
- readonly format?: "email" | "url" | "phone" | "password";
378
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
379
379
  readonly default?: string;
380
380
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
381
381
  readonly multiline?: boolean | {
@@ -413,7 +413,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
413
413
  readonly sensitive?: boolean;
414
414
  readonly writeOnly?: boolean;
415
415
  readonly readAsInstruction?: boolean;
416
- readonly format?: "email" | "url" | "phone" | "password";
416
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
417
417
  readonly default?: string;
418
418
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
419
419
  readonly multiline?: boolean | {
@@ -436,7 +436,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
436
436
  readonly sensitive?: boolean;
437
437
  readonly writeOnly?: boolean;
438
438
  readonly readAsInstruction?: boolean;
439
- readonly format?: "email" | "url" | "phone" | "password";
439
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
440
440
  readonly default?: string;
441
441
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
442
442
  readonly multiline?: boolean | {
@@ -461,7 +461,7 @@ export declare const mailThreadsProjectionTable: import("@cosmicdrift/kumiko-fra
461
461
  readonly sensitive?: boolean;
462
462
  readonly writeOnly?: boolean;
463
463
  readonly readAsInstruction?: boolean;
464
- readonly format?: "email" | "url" | "phone" | "password";
464
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
465
465
  readonly default?: string;
466
466
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
467
467
  readonly multiline?: boolean | {
@@ -484,7 +484,7 @@ export declare const mailThreadsProjectionTable: import("@cosmicdrift/kumiko-fra
484
484
  readonly sensitive?: boolean;
485
485
  readonly writeOnly?: boolean;
486
486
  readonly readAsInstruction?: boolean;
487
- readonly format?: "email" | "url" | "phone" | "password";
487
+ readonly format?: "email" | "url" | "phone" | "password" | "month";
488
488
  readonly default?: string;
489
489
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
490
490
  readonly multiline?: boolean | {
@@ -0,0 +1,7 @@
1
+ import { type ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
+ import type { ActionFormScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
3
+ export declare const MAIL_ACCOUNT_LIST_SCREEN_ID = "mail-accounts";
4
+ export declare const MAIL_ACCOUNT_EDIT_SCREEN_ID = "mail-account-edit";
5
+ export declare const MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX = "inboundMail.accounts.status.";
6
+ export declare const mailAccountListScreen: ProjectionListScreenDefinition;
7
+ export declare const mailAccountEditScreen: ActionFormScreenDefinition;
@@ -0,0 +1,86 @@
1
+ import { i18nKey, MAX_LIST_LIMIT, } from "@cosmicdrift/kumiko-framework/engine";
2
+ import { InboundMailAccountStatuses, InboundMailFoundationHandlers, InboundMailFoundationQueries, } from "./constants.js";
3
+ export const MAIL_ACCOUNT_LIST_SCREEN_ID = "mail-accounts";
4
+ export const MAIL_ACCOUNT_EDIT_SCREEN_ID = "mail-account-edit";
5
+ export const MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX = "inboundMail.accounts.status.";
6
+ // Same roles as the update/disconnect handlers: a screen rule wider than the
7
+ // handlers would only render actions that 403.
8
+ const MAIL_ACCOUNT_ADMIN_ACCESS = { roles: ["SystemAdmin", "TenantAdmin"] };
9
+ // Several mailboxes per tenant, one row each. The bound query already filters
10
+ // personal mailboxes the caller neither owns nor administers and returns no
11
+ // credential: the secret lives in the secrets feature, never in the row.
12
+ // dormant: the consuming app places the list in its own settings nav.
13
+ export const mailAccountListScreen = {
14
+ id: MAIL_ACCOUNT_LIST_SCREEN_ID,
15
+ type: "projectionList",
16
+ agent: { expose: false },
17
+ query: InboundMailFoundationQueries.listAccounts,
18
+ pagination: false,
19
+ pageSize: MAX_LIST_LIMIT,
20
+ columns: [
21
+ { field: "displayName", label: i18nKey("inboundMail.accounts.col.name"), sortable: false },
22
+ { field: "address", label: i18nKey("inboundMail.accounts.col.address"), sortable: false },
23
+ {
24
+ field: "provider",
25
+ label: i18nKey("inboundMail.accounts.col.provider"),
26
+ sortable: false,
27
+ hideOnNarrow: true,
28
+ },
29
+ {
30
+ field: "status",
31
+ label: i18nKey("inboundMail.accounts.col.status"),
32
+ sortable: false,
33
+ renderer: { format: "enumOption", keyPrefix: MAIL_ACCOUNT_STATUS_OPTION_KEY_PREFIX },
34
+ },
35
+ {
36
+ field: "connectedAt",
37
+ label: i18nKey("inboundMail.accounts.col.connected"),
38
+ sortable: false,
39
+ hideOnNarrow: true,
40
+ renderer: { format: "timestamp" },
41
+ },
42
+ ],
43
+ rowActions: [
44
+ {
45
+ kind: "navigate",
46
+ id: "edit",
47
+ label: i18nKey("inboundMail.accounts.edit"),
48
+ screen: MAIL_ACCOUNT_EDIT_SCREEN_ID,
49
+ params: { map: { accountId: "id", displayName: "displayName" } },
50
+ visible: { field: "status", ne: InboundMailAccountStatuses.disconnected },
51
+ },
52
+ {
53
+ kind: "writeHandler",
54
+ id: "disconnect",
55
+ label: i18nKey("inboundMail.accounts.disconnect"),
56
+ handler: InboundMailFoundationHandlers.disconnectAccount,
57
+ payload: { map: { accountId: "id" } },
58
+ style: "danger",
59
+ confirm: i18nKey("inboundMail.accounts.disconnect.confirm"),
60
+ visible: { field: "status", ne: InboundMailAccountStatuses.disconnected },
61
+ },
62
+ ],
63
+ access: MAIL_ACCOUNT_ADMIN_ACCESS,
64
+ dormant: true,
65
+ };
66
+ // The reason is the audit label update-account requires; it is not in the
67
+ // layout, so the default is what gets written.
68
+ export const mailAccountEditScreen = {
69
+ id: MAIL_ACCOUNT_EDIT_SCREEN_ID,
70
+ type: "actionForm",
71
+ agent: { expose: false },
72
+ handler: InboundMailFoundationHandlers.updateAccount,
73
+ fields: {
74
+ accountId: { type: "text", required: true },
75
+ displayName: { type: "text", required: true, maxLength: 200 },
76
+ reason: { type: "text", default: "tenant_admin" },
77
+ },
78
+ layout: {
79
+ sections: [{ fields: [{ field: "accountId", readOnly: true }, "displayName"] }],
80
+ },
81
+ submitLabel: i18nKey("inboundMail.accounts.edit.submit"),
82
+ redirect: MAIL_ACCOUNT_LIST_SCREEN_ID,
83
+ cancelTarget: MAIL_ACCOUNT_LIST_SCREEN_ID,
84
+ access: MAIL_ACCOUNT_ADMIN_ACCESS,
85
+ dormant: true,
86
+ };
@@ -8,7 +8,7 @@ import { INBOUND_MAIL_PROVIDER_EXTENSION, type InboundMailAccountStatus } from "
8
8
  * config — tenant config reads (host/port/... of the plugins)
9
9
  * registry — extension lookup in the factory (not plugin-internal)
10
10
  * secrets — tenant secret reads (IMAP password, OAuth refresh token)
11
- * _userId — audit identity for secret reads. Handler path: the dispatcher
11
+ * auditUserId — audit identity for secret reads. Handler path: the dispatcher
12
12
  * sets the caller user ID; worker path: system identity.
13
13
  * metricsFor — metrics handle of a feature by name, same behavior as
14
14
  * HandlerContext.metricsFor: unregistered metrics are a silent
@@ -18,7 +18,7 @@ export type InboundMailContext = {
18
18
  readonly config?: ConfigAccessor;
19
19
  readonly registry?: Registry;
20
20
  readonly secrets?: import("@cosmicdrift/kumiko-framework/secrets").SecretsContext;
21
- readonly _userId?: string | undefined;
21
+ readonly auditUserId?: string | undefined;
22
22
  readonly metricsFor?: (featureName: string) => MetricsHandle;
23
23
  };
24
24
  /**