@cosmicdrift/kumiko-bundled-features 0.371.0 → 0.372.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 (92) hide show
  1. package/dist/auth-mfa/db/queries.d.ts +3 -2
  2. package/dist/auth-mfa/db/queries.js +2 -5
  3. package/dist/auth-mfa/schema/user-mfa.d.ts +10 -10
  4. package/dist/billing-foundation/entities.d.ts +10 -10
  5. package/dist/billing-foundation/projection.d.ts +10 -10
  6. package/dist/cap-counter/entity.d.ts +4 -4
  7. package/dist/cap-overview/web/cap-cards-panel.js +2 -1
  8. package/dist/compliance-profiles/schema/profile-selection.d.ts +4 -4
  9. package/dist/config/table.d.ts +6 -6
  10. package/dist/config/web/index.d.ts +1 -0
  11. package/dist/config/web/index.js +1 -0
  12. package/dist/crypto-shredding/handlers/forget-subject.write.js +55 -30
  13. package/dist/crypto-shredding/resolve-file-bytes-deleter.d.ts +3 -0
  14. package/dist/crypto-shredding/resolve-file-bytes-deleter.js +24 -0
  15. package/dist/custom-fields/entity.d.ts +9 -7
  16. package/dist/custom-fields/executor.d.ts +19 -1
  17. package/dist/data-retention/index.d.ts +1 -0
  18. package/dist/data-retention/index.js +1 -0
  19. package/dist/data-retention/run-retention-cleanup.js +27 -159
  20. package/dist/data-retention/schema/tenant-retention-override.d.ts +6 -6
  21. package/dist/delivery/delivery-service.d.ts +2 -1
  22. package/dist/delivery/delivery-service.js +3 -2
  23. package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +2 -2
  24. package/dist/delivery/index.d.ts +1 -1
  25. package/dist/delivery/index.js +1 -1
  26. package/dist/delivery/jobs.js +21 -7
  27. package/dist/delivery/recipient-address-seal.d.ts +13 -0
  28. package/dist/delivery/recipient-address-seal.js +53 -0
  29. package/dist/delivery/tables.d.ts +8 -7
  30. package/dist/delivery/testing.d.ts +2 -1
  31. package/dist/delivery/testing.js +1 -0
  32. package/dist/delivery/unsubscribe.d.ts +13 -2
  33. package/dist/delivery/unsubscribe.js +9 -1
  34. package/dist/document-ingest-foundation/entity.d.ts +8 -8
  35. package/dist/document-ingest-foundation/executor.d.ts +16 -1
  36. package/dist/file-foundation/read-file-ref-content.js +2 -2
  37. package/dist/folders/entity.d.ts +8 -8
  38. package/dist/folders/executor.d.ts +29 -2
  39. package/dist/form-draft/entity.d.ts +3 -3
  40. package/dist/form-draft/executor.d.ts +15 -1
  41. package/dist/inbound-mail-foundation/entities.d.ts +31 -31
  42. package/dist/inbound-mail-foundation/projection.d.ts +24 -24
  43. package/dist/jobs/job-run-table.d.ts +10 -10
  44. package/dist/ledger/entity.d.ts +21 -21
  45. package/dist/ledger/executor.d.ts +57 -3
  46. package/dist/managed-pages/table.d.ts +16 -14
  47. package/dist/notes-history/entity.d.ts +14 -14
  48. package/dist/notes-history/executor.d.ts +31 -2
  49. package/dist/personal-access-tokens/schema/api-token.d.ts +9 -9
  50. package/dist/personal-access-tokens/screens.js +14 -9
  51. package/dist/secrets/table.d.ts +2 -2
  52. package/dist/sessions/schema/user-session.d.ts +8 -8
  53. package/dist/shared/index.d.ts +2 -0
  54. package/dist/shared/index.js +2 -0
  55. package/dist/shared/purge-files-reaching-subject.d.ts +25 -0
  56. package/dist/shared/purge-files-reaching-subject.js +146 -0
  57. package/dist/shared/purge-row-file-refs.d.ts +33 -0
  58. package/dist/shared/purge-row-file-refs.js +152 -0
  59. package/dist/tags/entity.d.ts +9 -9
  60. package/dist/tags/executor.d.ts +30 -2
  61. package/dist/template-resolver/handlers/shared.d.ts +28 -1
  62. package/dist/template-resolver/table.d.ts +32 -32
  63. package/dist/template-resolver/template-preview.js +13 -4
  64. package/dist/template-resolver/user-content-table.d.ts +16 -16
  65. package/dist/template-resolver/web/client-plugin.js +2 -1
  66. package/dist/template-resolver/web/document-editor-extensions.d.ts +1 -1
  67. package/dist/template-resolver/web/document-editor-extensions.js +2 -5
  68. package/dist/template-resolver/web/placeholder-line-editor.js +2 -2
  69. package/dist/tenant/handlers/list.query.d.ts +21 -1
  70. package/dist/tenant/invitation-table.d.ts +14 -14
  71. package/dist/tenant/membership-table.d.ts +4 -4
  72. package/dist/tenant/schema/tenant.d.ts +20 -18
  73. package/dist/tier-engine/entity.d.ts +2 -2
  74. package/dist/tier-engine/tier-resolver.d.ts +2 -2
  75. package/dist/user/handlers/me.query.d.ts +21 -0
  76. package/dist/user/schema/user.d.ts +24 -22
  77. package/dist/user-data-rights/run-export-jobs.d.ts +20 -1
  78. package/dist/user-data-rights/run-forget-cleanup.js +35 -1
  79. package/dist/user-data-rights/schema/download-attempt.d.ts +16 -16
  80. package/dist/user-data-rights/schema/download-token.d.ts +16 -16
  81. package/dist/user-data-rights/schema/export-job.d.ts +20 -20
  82. package/dist/user-data-rights/web/privacy-center-screen.js +2 -1
  83. package/dist/waitlist/entity.d.ts +24 -24
  84. package/dist/waitlist/lib.d.ts +24 -1
  85. package/package.json +11 -11
  86. package/src/crypto-shredding/changes.json +6 -0
  87. package/src/data-retention/changes.json +6 -0
  88. package/src/delivery/changes.json +13 -0
  89. package/src/files/changes.json +7 -0
  90. package/src/personal-access-tokens/changes.json +12 -0
  91. package/src/template-resolver/changes.json +6 -0
  92. package/src/user-data-rights/changes.json +6 -0
@@ -13,7 +13,7 @@ export type ExportJobStatus = (typeof EXPORT_JOB_STATUS)[keyof typeof EXPORT_JOB
13
13
  */
14
14
  export declare const ACTIVE_JOB_CONSTRAINT = "read_export_jobs_one_active_per_user";
15
15
  export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
16
- userId: {
16
+ readonly userId: {
17
17
  readonly type: "text";
18
18
  readonly description?: string;
19
19
  readonly maxLength?: number;
@@ -36,7 +36,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
36
36
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
37
37
  required: true;
38
38
  };
39
- requestedFromTenantId: {
39
+ readonly requestedFromTenantId: {
40
40
  readonly type: "text";
41
41
  readonly description?: string;
42
42
  readonly maxLength?: number;
@@ -59,7 +59,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
59
59
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
60
60
  required: true;
61
61
  };
62
- status: {
62
+ readonly status: {
63
63
  readonly type: "select";
64
64
  readonly description?: string;
65
65
  readonly options: readonly ["pending", "running", "done", "failed"];
@@ -83,7 +83,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
83
83
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
84
84
  required: true;
85
85
  };
86
- requestedAt: {
86
+ readonly requestedAt: {
87
87
  readonly type: "timestamp";
88
88
  readonly description?: string;
89
89
  readonly required?: boolean;
@@ -98,7 +98,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
98
98
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
99
99
  required: true;
100
100
  };
101
- startedAt: {
101
+ readonly startedAt: {
102
102
  readonly type: "timestamp";
103
103
  readonly description?: string;
104
104
  readonly required?: boolean;
@@ -113,7 +113,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
113
113
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
114
114
  required: false;
115
115
  };
116
- completedAt: {
116
+ readonly completedAt: {
117
117
  readonly type: "timestamp";
118
118
  readonly description?: string;
119
119
  readonly required?: boolean;
@@ -128,7 +128,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
128
128
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
129
129
  required: false;
130
130
  };
131
- downloadStorageKey: {
131
+ readonly downloadStorageKey: {
132
132
  readonly type: "text";
133
133
  readonly description?: string;
134
134
  readonly maxLength?: number;
@@ -151,7 +151,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
151
151
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
152
152
  required: false;
153
153
  };
154
- expiresAt: {
154
+ readonly expiresAt: {
155
155
  readonly type: "timestamp";
156
156
  readonly description?: string;
157
157
  readonly required?: boolean;
@@ -166,7 +166,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
166
166
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
167
167
  required: false;
168
168
  };
169
- errorMessage: {
169
+ readonly errorMessage: {
170
170
  readonly type: "longText";
171
171
  readonly description?: string;
172
172
  readonly maxLength?: number;
@@ -182,7 +182,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
182
182
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
183
183
  required: false;
184
184
  };
185
- bytesWritten: {
185
+ readonly bytesWritten: {
186
186
  readonly type: "bigInt";
187
187
  readonly description?: string;
188
188
  readonly required?: boolean;
@@ -196,7 +196,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
196
196
  };
197
197
  }, "tenant">;
198
198
  export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db").EntityTable<import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
199
- userId: {
199
+ readonly userId: {
200
200
  readonly type: "text";
201
201
  readonly description?: string;
202
202
  readonly maxLength?: number;
@@ -219,7 +219,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
219
219
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
220
220
  required: true;
221
221
  };
222
- requestedFromTenantId: {
222
+ readonly requestedFromTenantId: {
223
223
  readonly type: "text";
224
224
  readonly description?: string;
225
225
  readonly maxLength?: number;
@@ -242,7 +242,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
242
242
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
243
243
  required: true;
244
244
  };
245
- status: {
245
+ readonly status: {
246
246
  readonly type: "select";
247
247
  readonly description?: string;
248
248
  readonly options: readonly ["pending", "running", "done", "failed"];
@@ -266,7 +266,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
266
266
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
267
267
  required: true;
268
268
  };
269
- requestedAt: {
269
+ readonly requestedAt: {
270
270
  readonly type: "timestamp";
271
271
  readonly description?: string;
272
272
  readonly required?: boolean;
@@ -281,7 +281,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
281
281
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
282
282
  required: true;
283
283
  };
284
- startedAt: {
284
+ readonly startedAt: {
285
285
  readonly type: "timestamp";
286
286
  readonly description?: string;
287
287
  readonly required?: boolean;
@@ -296,7 +296,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
296
296
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
297
297
  required: false;
298
298
  };
299
- completedAt: {
299
+ readonly completedAt: {
300
300
  readonly type: "timestamp";
301
301
  readonly description?: string;
302
302
  readonly required?: boolean;
@@ -311,7 +311,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
311
311
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
312
312
  required: false;
313
313
  };
314
- downloadStorageKey: {
314
+ readonly downloadStorageKey: {
315
315
  readonly type: "text";
316
316
  readonly description?: string;
317
317
  readonly maxLength?: number;
@@ -334,7 +334,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
334
334
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
335
335
  required: false;
336
336
  };
337
- expiresAt: {
337
+ readonly expiresAt: {
338
338
  readonly type: "timestamp";
339
339
  readonly description?: string;
340
340
  readonly required?: boolean;
@@ -349,7 +349,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
349
349
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
350
350
  required: false;
351
351
  };
352
- errorMessage: {
352
+ readonly errorMessage: {
353
353
  readonly type: "longText";
354
354
  readonly description?: string;
355
355
  readonly maxLength?: number;
@@ -365,7 +365,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
365
365
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
366
366
  required: false;
367
367
  };
368
- bytesWritten: {
368
+ readonly bytesWritten: {
369
369
  readonly type: "bigInt";
370
370
  readonly description?: string;
371
371
  readonly required?: boolean;
@@ -1,4 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-headless";
2
3
  // @runtime client
3
4
  // Export section (Art. 20) — the one part of user-data-rights' privacy-center
4
5
  // screen that stays custom (fw#2312). Registered as an EditExtensionSection
@@ -29,7 +30,7 @@ function failureKey(error) {
29
30
  // kein Date-API (no-date-api-Guard) und universell. Leer/null → "—".
30
31
  export function formatDate(iso) {
31
32
  if (!iso)
32
- return "—";
33
+ return EMPTY_VALUE_PLACEHOLDER;
33
34
  const tIndex = iso.indexOf("T");
34
35
  return tIndex > 0 ? iso.slice(0, tIndex) : iso;
35
36
  }
@@ -1,6 +1,6 @@
1
1
  export declare function isOpenWaitlistStatus(status: unknown): boolean;
2
2
  export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
3
- name: {
3
+ readonly name: {
4
4
  readonly type: "text";
5
5
  readonly description?: string;
6
6
  readonly maxLength?: number;
@@ -23,7 +23,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
23
23
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
24
24
  required: true;
25
25
  };
26
- email: {
26
+ readonly email: {
27
27
  readonly type: "text";
28
28
  readonly description?: string;
29
29
  readonly maxLength?: number;
@@ -46,7 +46,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
46
46
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
47
47
  required: true;
48
48
  };
49
- company: {
49
+ readonly company: {
50
50
  readonly type: "text";
51
51
  readonly description?: string;
52
52
  readonly maxLength?: number;
@@ -69,7 +69,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
69
69
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
70
70
  required: false;
71
71
  };
72
- portfolio: {
72
+ readonly portfolio: {
73
73
  readonly type: "text";
74
74
  readonly description?: string;
75
75
  readonly maxLength?: number;
@@ -92,7 +92,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
92
92
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
93
93
  required: false;
94
94
  };
95
- message: {
95
+ readonly message: {
96
96
  readonly type: "longText";
97
97
  readonly description?: string;
98
98
  readonly maxLength?: number;
@@ -108,7 +108,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
108
108
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
109
109
  required: false;
110
110
  };
111
- locale: {
111
+ readonly locale: {
112
112
  readonly type: "text";
113
113
  readonly description?: string;
114
114
  readonly maxLength?: number;
@@ -131,7 +131,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
131
131
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
132
132
  required: true;
133
133
  };
134
- status: {
134
+ readonly status: {
135
135
  readonly type: "select";
136
136
  readonly description?: string;
137
137
  readonly options: readonly ["pending", "invited", "provisioned", "rejected"];
@@ -155,7 +155,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
155
155
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
156
156
  required: true;
157
157
  };
158
- submittedAt: {
158
+ readonly submittedAt: {
159
159
  readonly type: "timestamp";
160
160
  readonly description?: string;
161
161
  readonly required?: boolean;
@@ -170,7 +170,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
170
170
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
171
171
  required: true;
172
172
  };
173
- invitedAt: {
173
+ readonly invitedAt: {
174
174
  readonly type: "timestamp";
175
175
  readonly description?: string;
176
176
  readonly required?: boolean;
@@ -185,7 +185,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
185
185
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
186
186
  required: false;
187
187
  };
188
- invitedBy: {
188
+ readonly invitedBy: {
189
189
  readonly type: "text";
190
190
  readonly description?: string;
191
191
  readonly maxLength?: number;
@@ -208,7 +208,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
208
208
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
209
209
  required: false;
210
210
  };
211
- provisionedAt: {
211
+ readonly provisionedAt: {
212
212
  readonly type: "timestamp";
213
213
  readonly description?: string;
214
214
  readonly required?: boolean;
@@ -223,7 +223,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
223
223
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
224
224
  required: false;
225
225
  };
226
- linkedTenantId: {
226
+ readonly linkedTenantId: {
227
227
  readonly type: "text";
228
228
  readonly description?: string;
229
229
  readonly maxLength?: number;
@@ -248,7 +248,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
248
248
  };
249
249
  }, "global">;
250
250
  export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/db").EntityTable<import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
251
- name: {
251
+ readonly name: {
252
252
  readonly type: "text";
253
253
  readonly description?: string;
254
254
  readonly maxLength?: number;
@@ -271,7 +271,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
271
271
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
272
272
  required: true;
273
273
  };
274
- email: {
274
+ readonly email: {
275
275
  readonly type: "text";
276
276
  readonly description?: string;
277
277
  readonly maxLength?: number;
@@ -294,7 +294,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
294
294
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
295
295
  required: true;
296
296
  };
297
- company: {
297
+ readonly company: {
298
298
  readonly type: "text";
299
299
  readonly description?: string;
300
300
  readonly maxLength?: number;
@@ -317,7 +317,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
317
317
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
318
318
  required: false;
319
319
  };
320
- portfolio: {
320
+ readonly portfolio: {
321
321
  readonly type: "text";
322
322
  readonly description?: string;
323
323
  readonly maxLength?: number;
@@ -340,7 +340,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
340
340
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
341
341
  required: false;
342
342
  };
343
- message: {
343
+ readonly message: {
344
344
  readonly type: "longText";
345
345
  readonly description?: string;
346
346
  readonly maxLength?: number;
@@ -356,7 +356,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
356
356
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
357
357
  required: false;
358
358
  };
359
- locale: {
359
+ readonly locale: {
360
360
  readonly type: "text";
361
361
  readonly description?: string;
362
362
  readonly maxLength?: number;
@@ -379,7 +379,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
379
379
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
380
380
  required: true;
381
381
  };
382
- status: {
382
+ readonly status: {
383
383
  readonly type: "select";
384
384
  readonly description?: string;
385
385
  readonly options: readonly ["pending", "invited", "provisioned", "rejected"];
@@ -403,7 +403,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
403
403
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
404
404
  required: true;
405
405
  };
406
- submittedAt: {
406
+ readonly submittedAt: {
407
407
  readonly type: "timestamp";
408
408
  readonly description?: string;
409
409
  readonly required?: boolean;
@@ -418,7 +418,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
418
418
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
419
419
  required: true;
420
420
  };
421
- invitedAt: {
421
+ readonly invitedAt: {
422
422
  readonly type: "timestamp";
423
423
  readonly description?: string;
424
424
  readonly required?: boolean;
@@ -433,7 +433,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
433
433
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
434
434
  required: false;
435
435
  };
436
- invitedBy: {
436
+ readonly invitedBy: {
437
437
  readonly type: "text";
438
438
  readonly description?: string;
439
439
  readonly maxLength?: number;
@@ -456,7 +456,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
456
456
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
457
457
  required: false;
458
458
  };
459
- provisionedAt: {
459
+ readonly provisionedAt: {
460
460
  readonly type: "timestamp";
461
461
  readonly description?: string;
462
462
  readonly required?: boolean;
@@ -471,7 +471,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
471
471
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
472
472
  required: false;
473
473
  };
474
- linkedTenantId: {
474
+ readonly linkedTenantId: {
475
475
  readonly type: "text";
476
476
  readonly description?: string;
477
477
  readonly maxLength?: number;
@@ -4,7 +4,30 @@ export declare const WAITLIST_CROSS_TENANT_REASON = "waitlist is platform-wide (
4
4
  export declare const adminAccess: {
5
5
  readonly roles: readonly string[];
6
6
  };
7
- export declare const waitlistExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor;
7
+ export declare const waitlistExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor<{
8
+ readonly id: string;
9
+ readonly tenantId: string;
10
+ readonly version: number;
11
+ readonly insertedAt: Temporal.Instant;
12
+ readonly modifiedAt: Temporal.Instant | null;
13
+ readonly insertedById: string | null;
14
+ readonly modifiedById: string | null;
15
+ readonly isDeleted?: boolean | undefined;
16
+ readonly deletedAt?: Temporal.Instant | null | undefined;
17
+ readonly deletedById?: string | null | undefined;
18
+ readonly company: string | null;
19
+ readonly email: string;
20
+ readonly invitedAt: Temporal.Instant | null;
21
+ readonly invitedBy: string | null;
22
+ readonly linkedTenantId: string | null;
23
+ readonly locale: string;
24
+ readonly message: string | null;
25
+ readonly name: string;
26
+ readonly portfolio: string | null;
27
+ readonly provisionedAt: Temporal.Instant | null;
28
+ readonly status: string;
29
+ readonly submittedAt: Temporal.Instant;
30
+ }>;
8
31
  export declare function normalizeEmail(email: string): string;
9
32
  export declare function waitlistDb(ctx: Pick<AppContext, "systemDb">): TenantDb;
10
33
  export declare function platformActor(): SessionUser;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-bundled-features",
3
- "version": "0.371.0",
3
+ "version": "0.372.0",
4
4
  "description": "Built-in features — tenant, user, auth, delivery. The stuff you'd rewrite anyway, already typed.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -536,12 +536,12 @@
536
536
  }
537
537
  },
538
538
  "dependencies": {
539
- "@cosmicdrift/kumiko-dispatcher-live": "0.371.0",
540
- "@cosmicdrift/kumiko-framework": "0.371.0",
541
- "@cosmicdrift/kumiko-headless": "0.371.0",
542
- "@cosmicdrift/kumiko-renderer": "0.371.0",
543
- "@cosmicdrift/kumiko-renderer-web": "0.371.0",
544
- "@cosmicdrift/kumiko-types": "0.371.0",
539
+ "@cosmicdrift/kumiko-dispatcher-live": "0.372.0",
540
+ "@cosmicdrift/kumiko-framework": "0.372.0",
541
+ "@cosmicdrift/kumiko-headless": "0.372.0",
542
+ "@cosmicdrift/kumiko-renderer": "0.372.0",
543
+ "@cosmicdrift/kumiko-renderer-web": "0.372.0",
544
+ "@cosmicdrift/kumiko-types": "0.372.0",
545
545
  "@mollie/api-client": "^4.5.0",
546
546
  "@node-rs/argon2": "^2.0.2",
547
547
  "@tiptap/core": "3.31.3",
@@ -1102,12 +1102,12 @@
1102
1102
  ],
1103
1103
  "devDependencies": {
1104
1104
  "@testing-library/user-event": "^14.6.1",
1105
- "@cosmicdrift/kumiko-locale-de": "0.371.0",
1106
- "@cosmicdrift/kumiko-locale-es": "0.371.0",
1107
- "@cosmicdrift/kumiko-renderer-mail-html": "0.371.0",
1105
+ "@cosmicdrift/kumiko-locale-de": "0.372.0",
1106
+ "@cosmicdrift/kumiko-locale-es": "0.372.0",
1107
+ "@cosmicdrift/kumiko-renderer-mail-html": "0.372.0",
1108
1108
  "jsqr": "^1.4.0",
1109
1109
  "unpdf": "^1.8.1",
1110
- "@cosmicdrift/kumiko-testing": "0.371.0"
1110
+ "@cosmicdrift/kumiko-testing": "0.372.0"
1111
1111
  },
1112
1112
  "peerDependencies": {
1113
1113
  "@cosmicdrift/kumiko-testing": ">=0.366.0 <1.0.0"
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "fix",
5
+ "title": "forget-subject removes files bound to the forgotten subject",
6
+ "detail": "Forgetting a record or user subject now deletes the bytes, derivatives and file_refs rows behind that subject's personal file fields (fail closed with missing_file_storage or file_delete_failed in cleanupError), so a retry can finish the job; the entity row stays."
7
+ },
2
8
  {
3
9
  "version": "0.370.0",
4
10
  "type": "improvement",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "improvement",
5
+ "title": "runRetentionCleanup is exported for app tests",
6
+ "detail": "The data-retention entry point now exports runRetentionCleanup with its argument, result and skip types, so an app test can drive a retention run with its own now and file context and check that bytes, file_refs rows and the entity row are gone. The user-data-rights recipe shows the pattern."
7
+ },
2
8
  {
3
9
  "version": "0.363.0",
4
10
  "type": "improvement",
@@ -1,4 +1,17 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "breaking",
5
+ "title": "Queued delivery jobs carry the recipient address sealed",
6
+ "detail": "createDeliveryService takes an addressCipher; the boot wiring passes the master-key cipher, so delivery.render and delivery.send payloads hold sealedAddress instead of address. Workers open it through ctx.configEncryption.",
7
+ "migration": "Roll out worker and web together with the same KUMIKO_SECRETS_MASTER_KEY_V<n>; a worker without the master key fails sealed jobs with send_failed. Code that calls createDeliveryService itself passes addressCipher to get sealed payloads."
8
+ },
9
+ {
10
+ "version": "0.372.0",
11
+ "type": "improvement",
12
+ "title": "createUnsubscribePageChromeReader gives app routes the tenant branding for unsubscribe pages",
13
+ "detail": "The JSDoc of renderUnsubscribeResultPage pointed to a chrome read that only works for SystemAdmin, so app routes for legacy unsubscribe links rendered without branding. The new `createUnsubscribePageChromeReader({ dispatchSystemQuery })` returns `(tenantId, locale) => MailChrome | null`, failing soft to null. Build it once in the `wire` hook, whose deps now also carry `dispatchSystemQuery` (runProdApp, runWorkerApp.wireComponents, createKumikoServer), and call it with a tenant the route resolved itself, for example from the Host, never with a tenantId from the query string or body. The chrome query itself stays SystemAdmin-only; anonymous `/api/query` callers are still rejected for every tenant."
14
+ },
2
15
  {
3
16
  "version": "0.371.0",
4
17
  "type": "improvement",
@@ -1,4 +1,11 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "breaking",
5
+ "title": "Orphaned upload bytes are swept through a new upload ledger",
6
+ "detail": "The files feature registers the store_file_upload_ledger table and an hourly sweep job. FileContext has the new methods writeUploadBytes and forgetUploadBytes, which the four upload paths use; a custom FileContext or resolver must provide the ledger (withUploadLedger wraps a resolver). TenantDb.deleteMany resolves to the number of deleted rows instead of void. A fileRef commit whose ledger row was already swept throws InternalError \"upload expired\".",
7
+ "migration": "Generate and apply a migration with `kumiko-schema generate` — uploads fail without the new store_file_upload_ledger table"
8
+ },
2
9
  {
3
10
  "version": "0.354.0",
4
11
  "type": "breaking",
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "fix",
5
+ "title": "Tenants whose tier excludes API tokens now reach the lockedFallbackScreen",
6
+ "detail": "GET /api/schema removed every screen of a feature the tenant has switched off, and the role projection then dropped the navs of other features that pointed at them. The token list screen was gone, so the upgrade screen set via lockedFallbackScreen was never shown. Screens that declare a fallback (and the same-feature screens those fallbacks name) now stay in the schema; the server still rejects their queries and writes with feature_disabled, which makes the renderer show the fallback. Navs, content collections and workspaces of the disabled feature are still removed."
7
+ },
8
+ {
9
+ "version": "0.372.0",
10
+ "type": "improvement",
11
+ "title": "The token list looks like any other Kumiko list",
12
+ "detail": "The create button now sits in the page header next to the title, and an empty list shows the standard hint with a create button. The German title of the list screen is \"API-Tokens\" instead of \"Personal Access Tokens\", which also fixes the breadcrumb of the mint screen. Renderer, all apps: a projection list without an entity create button now shows its first primary toolbar action (one that needs no confirmation dialog) in the page header on desktop as well, with its label, instead of in the toolbar row; on phones it already did. On desktop only an icon derived from the action id (or declared on the action) is shown; the plus fallback exists only on phones. Consumers get this after the bump without code changes."
13
+ },
2
14
  {
3
15
  "version": "0.368.0",
4
16
  "type": "improvement",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "improvement",
5
+ "title": "Text examples of template variables follow the template's language",
6
+ "detail": "The `example` of a text or richText templateVariable is now read like `label`: an i18n key resolves to the translation of the edited template's locale, plain text stays as it is. Preview, the sample values bar and send-test therefore show German examples for a German template. Example values of other types (link, number, enum-like text values) stay as declared; put the explanation of such a value into the variable's label. Apps: register `templateVariable.text({ example: \"<app>:mail.example.x\" })` and add the key with de, en and es via `r.translations`."
7
+ },
2
8
  {
3
9
  "version": "0.370.0",
4
10
  "type": "improvement",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.372.0",
4
+ "type": "fix",
5
+ "title": "Account forget-cleanup removes userOwned files uploaded by someone else",
6
+ "detail": "runForgetCleanup now purges the bytes, derivatives and file_refs rows behind every file field whose subject is the deleted user, not only files the user uploaded; a failing byte delete keeps the user in DeletionRequested so the next run retries."
7
+ },
2
8
  {
3
9
  "version": "0.369.0",
4
10
  "type": "fix",