@cosmicdrift/kumiko-bundled-features 0.356.0 → 0.358.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 (84) hide show
  1. package/dist/auth-mfa/i18n.js +1 -0
  2. package/dist/auth-mfa/schema/user-mfa.d.ts +6 -0
  3. package/dist/auth-mfa/screens.js +8 -1
  4. package/dist/billing-foundation/entities.d.ts +8 -0
  5. package/dist/billing-foundation/projection.d.ts +8 -0
  6. package/dist/cap-counter/book-cap-usage.d.ts +11 -5
  7. package/dist/cap-counter/book-cap-usage.js +54 -13
  8. package/dist/cap-counter/calendar-cap-usage-reservation.d.ts +17 -0
  9. package/dist/cap-counter/calendar-cap-usage-reservation.js +53 -0
  10. package/dist/cap-counter/cap-reservation.d.ts +15 -6
  11. package/dist/cap-counter/cap-reservation.js +80 -31
  12. package/dist/cap-counter/enforce-cap.d.ts +5 -5
  13. package/dist/cap-counter/enforce-cap.js +7 -20
  14. package/dist/cap-counter/entity.d.ts +1 -0
  15. package/dist/cap-counter/feature.js +7 -1
  16. package/dist/cap-counter/index.d.ts +1 -0
  17. package/dist/cap-counter/index.js +1 -0
  18. package/dist/cap-counter/with-cap-enforcement.js +4 -19
  19. package/dist/cap-overview/screens.js +3 -1
  20. package/dist/config/table.d.ts +6 -0
  21. package/dist/crypto-shredding/handlers/forget-subject.write.js +14 -3
  22. package/dist/custom-fields/entity.d.ts +4 -0
  23. package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -0
  24. package/dist/delivery/chat-webhook-sender.js +1 -1
  25. package/dist/delivery/constants.d.ts +1 -0
  26. package/dist/delivery/constants.js +4 -0
  27. package/dist/delivery/delivery-service.js +62 -25
  28. package/dist/delivery/feature.js +7 -1
  29. package/dist/delivery/jobs.js +25 -1
  30. package/dist/delivery/tables.d.ts +6 -0
  31. package/dist/delivery/testing.d.ts +1 -0
  32. package/dist/document-ingest-foundation/entity.d.ts +4 -0
  33. package/dist/folders/entity.d.ts +8 -0
  34. package/dist/form-draft/entity.d.ts +2 -0
  35. package/dist/inbound-mail-foundation/entities.d.ts +25 -0
  36. package/dist/inbound-mail-foundation/projection.d.ts +20 -0
  37. package/dist/jobs/job-run-logger.js +21 -17
  38. package/dist/jobs/job-run-table.d.ts +6 -0
  39. package/dist/jobs/job-run-table.js +10 -3
  40. package/dist/ledger/entity.d.ts +13 -0
  41. package/dist/managed-pages/table.d.ts +12 -0
  42. package/dist/notes-history/entity.d.ts +12 -0
  43. package/dist/notes-history/entity.js +9 -7
  44. package/dist/notes-history-user-data/hooks.d.ts +8 -0
  45. package/dist/notes-history-user-data/hooks.js +56 -72
  46. package/dist/notes-history-user-data/index.d.ts +1 -0
  47. package/dist/notes-history-user-data/index.js +2 -1
  48. package/dist/personal-access-tokens/schema/api-token.d.ts +6 -0
  49. package/dist/personal-access-tokens/screens.js +2 -0
  50. package/dist/secrets/table.d.ts +1 -0
  51. package/dist/sessions/schema/user-session.d.ts +4 -0
  52. package/dist/sessions/screens.js +2 -0
  53. package/dist/tags/entity.d.ts +9 -0
  54. package/dist/template-resolver/table.d.ts +10 -0
  55. package/dist/template-resolver/user-content-table.d.ts +10 -0
  56. package/dist/tenant/constants.d.ts +1 -0
  57. package/dist/tenant/constants.js +6 -3
  58. package/dist/tenant/feature.js +2 -0
  59. package/dist/tenant/handlers/member-role-availability.query.d.ts +7 -0
  60. package/dist/tenant/handlers/member-role-availability.query.js +18 -0
  61. package/dist/tenant/invitation-table.d.ts +6 -0
  62. package/dist/tenant/member-role-options.d.ts +2 -0
  63. package/dist/tenant/member-role-options.js +4 -0
  64. package/dist/tenant/membership-table.d.ts +4 -0
  65. package/dist/tenant/schema/tenant.d.ts +6 -0
  66. package/dist/tenant/screens.d.ts +4 -2
  67. package/dist/tenant/screens.js +10 -6
  68. package/dist/tier-engine/entity.d.ts +2 -0
  69. package/dist/tier-engine/tier-resolver.d.ts +2 -0
  70. package/dist/user/schema/user.d.ts +12 -0
  71. package/dist/user/screens.js +8 -1
  72. package/dist/user-data-rights/schema/download-attempt.d.ts +14 -0
  73. package/dist/user-data-rights/schema/download-token.d.ts +8 -0
  74. package/dist/user-data-rights/schema/export-job.d.ts +6 -0
  75. package/dist/user-data-rights/screens.js +8 -1
  76. package/dist/waitlist/entity.d.ts +14 -0
  77. package/dist/waitlist/screens.js +8 -1
  78. package/package.json +9 -9
  79. package/src/auth-mfa/changes.json +6 -0
  80. package/src/cap-counter/changes.json +7 -0
  81. package/src/crypto-shredding/changes.json +6 -0
  82. package/src/delivery/changes.json +6 -0
  83. package/src/notes-history/changes.json +6 -0
  84. package/src/tenant/changes.json +6 -0
@@ -7,6 +7,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
7
7
  readonly description?: string;
8
8
  readonly maxLength?: number;
9
9
  readonly minLength?: number;
10
+ readonly autoComplete?: string;
10
11
  readonly required?: boolean;
11
12
  readonly searchable?: boolean;
12
13
  readonly sortable?: boolean;
@@ -29,6 +30,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
29
30
  readonly description?: string;
30
31
  readonly maxLength?: number;
31
32
  readonly minLength?: number;
33
+ readonly autoComplete?: string;
32
34
  readonly required?: boolean;
33
35
  readonly searchable?: boolean;
34
36
  readonly sortable?: boolean;
@@ -51,6 +53,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
51
53
  readonly description?: string;
52
54
  readonly maxLength?: number;
53
55
  readonly minLength?: number;
56
+ readonly autoComplete?: string;
54
57
  readonly required?: boolean;
55
58
  readonly searchable?: boolean;
56
59
  readonly sortable?: boolean;
@@ -79,6 +82,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
79
82
  readonly description?: string;
80
83
  readonly maxLength?: number;
81
84
  readonly minLength?: number;
85
+ readonly autoComplete?: string;
82
86
  readonly required?: boolean;
83
87
  readonly searchable?: boolean;
84
88
  readonly sortable?: boolean;
@@ -101,6 +105,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
101
105
  readonly description?: string;
102
106
  readonly maxLength?: number;
103
107
  readonly minLength?: number;
108
+ readonly autoComplete?: string;
104
109
  readonly required?: boolean;
105
110
  readonly searchable?: boolean;
106
111
  readonly sortable?: boolean;
@@ -123,6 +128,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
123
128
  readonly description?: string;
124
129
  readonly maxLength?: number;
125
130
  readonly minLength?: number;
131
+ readonly autoComplete?: string;
126
132
  readonly required?: boolean;
127
133
  readonly searchable?: boolean;
128
134
  readonly sortable?: boolean;
@@ -15,6 +15,7 @@ export type CreateDeliveryTestContextOptions = {
15
15
  readonly log?: Logger;
16
16
  readonly jobRunner?: JobRunner;
17
17
  readonly secrets?: SecretsContext;
18
+ readonly idempotencyRedis?: Redis;
18
19
  };
19
20
  /**
20
21
  * Helper for setupTestStack: creates a DeliveryService + _notifyFactory for the test context.
@@ -15,6 +15,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
15
15
  readonly description?: string;
16
16
  readonly maxLength?: number;
17
17
  readonly minLength?: number;
18
+ readonly autoComplete?: string;
18
19
  readonly required?: boolean;
19
20
  readonly searchable?: boolean;
20
21
  readonly sortable?: boolean;
@@ -37,6 +38,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
37
38
  readonly description?: string;
38
39
  readonly maxLength?: number;
39
40
  readonly minLength?: number;
41
+ readonly autoComplete?: string;
40
42
  readonly required?: boolean;
41
43
  readonly searchable?: boolean;
42
44
  readonly sortable?: boolean;
@@ -78,6 +80,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
78
80
  readonly description?: string;
79
81
  readonly maxLength?: number;
80
82
  readonly minLength?: number;
83
+ readonly autoComplete?: string;
81
84
  readonly required?: boolean;
82
85
  readonly searchable?: boolean;
83
86
  readonly sortable?: boolean;
@@ -100,6 +103,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
100
103
  readonly description?: string;
101
104
  readonly maxLength?: number;
102
105
  readonly minLength?: number;
106
+ readonly autoComplete?: string;
103
107
  readonly required?: boolean;
104
108
  readonly searchable?: boolean;
105
109
  readonly sortable?: boolean;
@@ -5,6 +5,7 @@ export declare const folderEntity: EntityDefinition<{
5
5
  readonly description?: string;
6
6
  readonly maxLength?: number;
7
7
  readonly minLength?: number;
8
+ readonly autoComplete?: string;
8
9
  readonly required?: boolean;
9
10
  readonly searchable?: boolean;
10
11
  readonly sortable?: boolean;
@@ -27,6 +28,7 @@ export declare const folderEntity: EntityDefinition<{
27
28
  readonly description?: string;
28
29
  readonly maxLength?: number;
29
30
  readonly minLength?: number;
31
+ readonly autoComplete?: string;
30
32
  readonly required?: boolean;
31
33
  readonly searchable?: boolean;
32
34
  readonly sortable?: boolean;
@@ -51,6 +53,7 @@ export declare function createFolderAssignmentEntity(access?: EntityDefinition["
51
53
  readonly description?: string;
52
54
  readonly maxLength?: number;
53
55
  readonly minLength?: number;
56
+ readonly autoComplete?: string;
54
57
  readonly required?: boolean;
55
58
  readonly searchable?: boolean;
56
59
  readonly sortable?: boolean;
@@ -73,6 +76,7 @@ export declare function createFolderAssignmentEntity(access?: EntityDefinition["
73
76
  readonly description?: string;
74
77
  readonly maxLength?: number;
75
78
  readonly minLength?: number;
79
+ readonly autoComplete?: string;
76
80
  readonly required?: boolean;
77
81
  readonly searchable?: boolean;
78
82
  readonly sortable?: boolean;
@@ -95,6 +99,7 @@ export declare function createFolderAssignmentEntity(access?: EntityDefinition["
95
99
  readonly description?: string;
96
100
  readonly maxLength?: number;
97
101
  readonly minLength?: number;
102
+ readonly autoComplete?: string;
98
103
  readonly required?: boolean;
99
104
  readonly searchable?: boolean;
100
105
  readonly sortable?: boolean;
@@ -119,6 +124,7 @@ export declare const folderAssignmentEntity: EntityDefinition<{
119
124
  readonly description?: string;
120
125
  readonly maxLength?: number;
121
126
  readonly minLength?: number;
127
+ readonly autoComplete?: string;
122
128
  readonly required?: boolean;
123
129
  readonly searchable?: boolean;
124
130
  readonly sortable?: boolean;
@@ -141,6 +147,7 @@ export declare const folderAssignmentEntity: EntityDefinition<{
141
147
  readonly description?: string;
142
148
  readonly maxLength?: number;
143
149
  readonly minLength?: number;
150
+ readonly autoComplete?: string;
144
151
  readonly required?: boolean;
145
152
  readonly searchable?: boolean;
146
153
  readonly sortable?: boolean;
@@ -163,6 +170,7 @@ export declare const folderAssignmentEntity: EntityDefinition<{
163
170
  readonly description?: string;
164
171
  readonly maxLength?: number;
165
172
  readonly minLength?: number;
173
+ readonly autoComplete?: string;
166
174
  readonly required?: boolean;
167
175
  readonly searchable?: boolean;
168
176
  readonly sortable?: boolean;
@@ -4,6 +4,7 @@ export declare const formDraftEntity: import("@cosmicdrift/kumiko-types/fields")
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
6
6
  readonly minLength?: number;
7
+ readonly autoComplete?: string;
7
8
  readonly required?: boolean;
8
9
  readonly searchable?: boolean;
9
10
  readonly sortable?: boolean;
@@ -26,6 +27,7 @@ export declare const formDraftEntity: import("@cosmicdrift/kumiko-types/fields")
26
27
  readonly description?: string;
27
28
  readonly maxLength?: number;
28
29
  readonly minLength?: number;
30
+ readonly autoComplete?: string;
29
31
  readonly required?: boolean;
30
32
  readonly searchable?: boolean;
31
33
  readonly sortable?: boolean;
@@ -6,6 +6,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
6
6
  readonly description?: string;
7
7
  readonly maxLength?: number;
8
8
  readonly minLength?: number;
9
+ readonly autoComplete?: string;
9
10
  readonly required?: boolean;
10
11
  readonly searchable?: boolean;
11
12
  readonly sortable?: boolean;
@@ -28,6 +29,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
28
29
  readonly description?: string;
29
30
  readonly maxLength?: number;
30
31
  readonly minLength?: number;
32
+ readonly autoComplete?: string;
31
33
  readonly required?: boolean;
32
34
  readonly searchable?: boolean;
33
35
  readonly sortable?: boolean;
@@ -50,6 +52,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
50
52
  readonly description?: string;
51
53
  readonly maxLength?: number;
52
54
  readonly minLength?: number;
55
+ readonly autoComplete?: string;
53
56
  readonly required?: boolean;
54
57
  readonly searchable?: boolean;
55
58
  readonly sortable?: boolean;
@@ -72,6 +75,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
72
75
  readonly description?: string;
73
76
  readonly maxLength?: number;
74
77
  readonly minLength?: number;
78
+ readonly autoComplete?: string;
75
79
  readonly required?: boolean;
76
80
  readonly searchable?: boolean;
77
81
  readonly sortable?: boolean;
@@ -94,6 +98,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
94
98
  readonly description?: string;
95
99
  readonly maxLength?: number;
96
100
  readonly minLength?: number;
101
+ readonly autoComplete?: string;
97
102
  readonly required?: boolean;
98
103
  readonly searchable?: boolean;
99
104
  readonly sortable?: boolean;
@@ -116,6 +121,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
116
121
  readonly description?: string;
117
122
  readonly maxLength?: number;
118
123
  readonly minLength?: number;
124
+ readonly autoComplete?: string;
119
125
  readonly required?: boolean;
120
126
  readonly searchable?: boolean;
121
127
  readonly sortable?: boolean;
@@ -138,6 +144,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
138
144
  readonly description?: string;
139
145
  readonly maxLength?: number;
140
146
  readonly minLength?: number;
147
+ readonly autoComplete?: string;
141
148
  readonly required?: boolean;
142
149
  readonly searchable?: boolean;
143
150
  readonly sortable?: boolean;
@@ -180,6 +187,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
180
187
  readonly description?: string;
181
188
  readonly maxLength?: number;
182
189
  readonly minLength?: number;
190
+ readonly autoComplete?: string;
183
191
  readonly required?: boolean;
184
192
  readonly searchable?: boolean;
185
193
  readonly sortable?: boolean;
@@ -202,6 +210,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
202
210
  readonly description?: string;
203
211
  readonly maxLength?: number;
204
212
  readonly minLength?: number;
213
+ readonly autoComplete?: string;
205
214
  readonly required?: boolean;
206
215
  readonly searchable?: boolean;
207
216
  readonly sortable?: boolean;
@@ -224,6 +233,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
224
233
  readonly description?: string;
225
234
  readonly maxLength?: number;
226
235
  readonly minLength?: number;
236
+ readonly autoComplete?: string;
227
237
  readonly required?: boolean;
228
238
  readonly searchable?: boolean;
229
239
  readonly sortable?: boolean;
@@ -246,6 +256,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
246
256
  readonly description?: string;
247
257
  readonly maxLength?: number;
248
258
  readonly minLength?: number;
259
+ readonly autoComplete?: string;
249
260
  readonly required?: boolean;
250
261
  readonly searchable?: boolean;
251
262
  readonly sortable?: boolean;
@@ -268,6 +279,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
268
279
  readonly description?: string;
269
280
  readonly maxLength?: number;
270
281
  readonly minLength?: number;
282
+ readonly autoComplete?: string;
271
283
  readonly required?: boolean;
272
284
  readonly searchable?: boolean;
273
285
  readonly sortable?: boolean;
@@ -290,6 +302,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
290
302
  readonly description?: string;
291
303
  readonly maxLength?: number;
292
304
  readonly minLength?: number;
305
+ readonly autoComplete?: string;
293
306
  readonly required?: boolean;
294
307
  readonly searchable?: boolean;
295
308
  readonly sortable?: boolean;
@@ -312,6 +325,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
312
325
  readonly description?: string;
313
326
  readonly maxLength?: number;
314
327
  readonly minLength?: number;
328
+ readonly autoComplete?: string;
315
329
  readonly required?: boolean;
316
330
  readonly searchable?: boolean;
317
331
  readonly sortable?: boolean;
@@ -334,6 +348,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
334
348
  readonly description?: string;
335
349
  readonly maxLength?: number;
336
350
  readonly minLength?: number;
351
+ readonly autoComplete?: string;
337
352
  readonly required?: boolean;
338
353
  readonly searchable?: boolean;
339
354
  readonly sortable?: boolean;
@@ -356,6 +371,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
356
371
  readonly description?: string;
357
372
  readonly maxLength?: number;
358
373
  readonly minLength?: number;
374
+ readonly autoComplete?: string;
359
375
  readonly required?: boolean;
360
376
  readonly searchable?: boolean;
361
377
  readonly sortable?: boolean;
@@ -393,6 +409,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
393
409
  readonly description?: string;
394
410
  readonly maxLength?: number;
395
411
  readonly minLength?: number;
412
+ readonly autoComplete?: string;
396
413
  readonly required?: boolean;
397
414
  readonly searchable?: boolean;
398
415
  readonly sortable?: boolean;
@@ -415,6 +432,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
415
432
  readonly description?: string;
416
433
  readonly maxLength?: number;
417
434
  readonly minLength?: number;
435
+ readonly autoComplete?: string;
418
436
  readonly required?: boolean;
419
437
  readonly searchable?: boolean;
420
438
  readonly sortable?: boolean;
@@ -441,6 +459,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
441
459
  readonly description?: string;
442
460
  readonly maxLength?: number;
443
461
  readonly minLength?: number;
462
+ readonly autoComplete?: string;
444
463
  readonly required?: boolean;
445
464
  readonly searchable?: boolean;
446
465
  readonly sortable?: boolean;
@@ -463,6 +482,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
463
482
  readonly description?: string;
464
483
  readonly maxLength?: number;
465
484
  readonly minLength?: number;
485
+ readonly autoComplete?: string;
466
486
  readonly required?: boolean;
467
487
  readonly searchable?: boolean;
468
488
  readonly sortable?: boolean;
@@ -528,6 +548,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
528
548
  readonly description?: string;
529
549
  readonly maxLength?: number;
530
550
  readonly minLength?: number;
551
+ readonly autoComplete?: string;
531
552
  readonly required?: boolean;
532
553
  readonly searchable?: boolean;
533
554
  readonly sortable?: boolean;
@@ -550,6 +571,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
550
571
  readonly description?: string;
551
572
  readonly maxLength?: number;
552
573
  readonly minLength?: number;
574
+ readonly autoComplete?: string;
553
575
  readonly required?: boolean;
554
576
  readonly searchable?: boolean;
555
577
  readonly sortable?: boolean;
@@ -572,6 +594,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
572
594
  readonly description?: string;
573
595
  readonly maxLength?: number;
574
596
  readonly minLength?: number;
597
+ readonly autoComplete?: string;
575
598
  readonly required?: boolean;
576
599
  readonly searchable?: boolean;
577
600
  readonly sortable?: boolean;
@@ -615,6 +638,7 @@ export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields
615
638
  readonly description?: string;
616
639
  readonly maxLength?: number;
617
640
  readonly minLength?: number;
641
+ readonly autoComplete?: string;
618
642
  readonly required?: boolean;
619
643
  readonly searchable?: boolean;
620
644
  readonly sortable?: boolean;
@@ -637,6 +661,7 @@ export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields
637
661
  readonly description?: string;
638
662
  readonly maxLength?: number;
639
663
  readonly minLength?: number;
664
+ readonly autoComplete?: string;
640
665
  readonly required?: boolean;
641
666
  readonly searchable?: boolean;
642
667
  readonly sortable?: boolean;
@@ -4,6 +4,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
6
6
  readonly minLength?: number;
7
+ readonly autoComplete?: string;
7
8
  readonly required?: boolean;
8
9
  readonly searchable?: boolean;
9
10
  readonly sortable?: boolean;
@@ -26,6 +27,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
26
27
  readonly description?: string;
27
28
  readonly maxLength?: number;
28
29
  readonly minLength?: number;
30
+ readonly autoComplete?: string;
29
31
  readonly required?: boolean;
30
32
  readonly searchable?: boolean;
31
33
  readonly sortable?: boolean;
@@ -48,6 +50,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
48
50
  readonly description?: string;
49
51
  readonly maxLength?: number;
50
52
  readonly minLength?: number;
53
+ readonly autoComplete?: string;
51
54
  readonly required?: boolean;
52
55
  readonly searchable?: boolean;
53
56
  readonly sortable?: boolean;
@@ -70,6 +73,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
70
73
  readonly description?: string;
71
74
  readonly maxLength?: number;
72
75
  readonly minLength?: number;
76
+ readonly autoComplete?: string;
73
77
  readonly required?: boolean;
74
78
  readonly searchable?: boolean;
75
79
  readonly sortable?: boolean;
@@ -92,6 +96,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
92
96
  readonly description?: string;
93
97
  readonly maxLength?: number;
94
98
  readonly minLength?: number;
99
+ readonly autoComplete?: string;
95
100
  readonly required?: boolean;
96
101
  readonly searchable?: boolean;
97
102
  readonly sortable?: boolean;
@@ -114,6 +119,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
114
119
  readonly description?: string;
115
120
  readonly maxLength?: number;
116
121
  readonly minLength?: number;
122
+ readonly autoComplete?: string;
117
123
  readonly required?: boolean;
118
124
  readonly searchable?: boolean;
119
125
  readonly sortable?: boolean;
@@ -136,6 +142,7 @@ export declare const mailAccountsProjectionTable: import("@cosmicdrift/kumiko-fr
136
142
  readonly description?: string;
137
143
  readonly maxLength?: number;
138
144
  readonly minLength?: number;
145
+ readonly autoComplete?: string;
139
146
  readonly required?: boolean;
140
147
  readonly searchable?: boolean;
141
148
  readonly sortable?: boolean;
@@ -175,6 +182,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
175
182
  readonly description?: string;
176
183
  readonly maxLength?: number;
177
184
  readonly minLength?: number;
185
+ readonly autoComplete?: string;
178
186
  readonly required?: boolean;
179
187
  readonly searchable?: boolean;
180
188
  readonly sortable?: boolean;
@@ -197,6 +205,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
197
205
  readonly description?: string;
198
206
  readonly maxLength?: number;
199
207
  readonly minLength?: number;
208
+ readonly autoComplete?: string;
200
209
  readonly required?: boolean;
201
210
  readonly searchable?: boolean;
202
211
  readonly sortable?: boolean;
@@ -219,6 +228,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
219
228
  readonly description?: string;
220
229
  readonly maxLength?: number;
221
230
  readonly minLength?: number;
231
+ readonly autoComplete?: string;
222
232
  readonly required?: boolean;
223
233
  readonly searchable?: boolean;
224
234
  readonly sortable?: boolean;
@@ -241,6 +251,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
241
251
  readonly description?: string;
242
252
  readonly maxLength?: number;
243
253
  readonly minLength?: number;
254
+ readonly autoComplete?: string;
244
255
  readonly required?: boolean;
245
256
  readonly searchable?: boolean;
246
257
  readonly sortable?: boolean;
@@ -263,6 +274,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
263
274
  readonly description?: string;
264
275
  readonly maxLength?: number;
265
276
  readonly minLength?: number;
277
+ readonly autoComplete?: string;
266
278
  readonly required?: boolean;
267
279
  readonly searchable?: boolean;
268
280
  readonly sortable?: boolean;
@@ -285,6 +297,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
285
297
  readonly description?: string;
286
298
  readonly maxLength?: number;
287
299
  readonly minLength?: number;
300
+ readonly autoComplete?: string;
288
301
  readonly required?: boolean;
289
302
  readonly searchable?: boolean;
290
303
  readonly sortable?: boolean;
@@ -307,6 +320,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
307
320
  readonly description?: string;
308
321
  readonly maxLength?: number;
309
322
  readonly minLength?: number;
323
+ readonly autoComplete?: string;
310
324
  readonly required?: boolean;
311
325
  readonly searchable?: boolean;
312
326
  readonly sortable?: boolean;
@@ -329,6 +343,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
329
343
  readonly description?: string;
330
344
  readonly maxLength?: number;
331
345
  readonly minLength?: number;
346
+ readonly autoComplete?: string;
332
347
  readonly required?: boolean;
333
348
  readonly searchable?: boolean;
334
349
  readonly sortable?: boolean;
@@ -351,6 +366,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
351
366
  readonly description?: string;
352
367
  readonly maxLength?: number;
353
368
  readonly minLength?: number;
369
+ readonly autoComplete?: string;
354
370
  readonly required?: boolean;
355
371
  readonly searchable?: boolean;
356
372
  readonly sortable?: boolean;
@@ -388,6 +404,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
388
404
  readonly description?: string;
389
405
  readonly maxLength?: number;
390
406
  readonly minLength?: number;
407
+ readonly autoComplete?: string;
391
408
  readonly required?: boolean;
392
409
  readonly searchable?: boolean;
393
410
  readonly sortable?: boolean;
@@ -410,6 +427,7 @@ export declare const inboundMessagesProjectionTable: import("@cosmicdrift/kumiko
410
427
  readonly description?: string;
411
428
  readonly maxLength?: number;
412
429
  readonly minLength?: number;
430
+ readonly autoComplete?: string;
413
431
  readonly required?: boolean;
414
432
  readonly searchable?: boolean;
415
433
  readonly sortable?: boolean;
@@ -434,6 +452,7 @@ export declare const mailThreadsProjectionTable: import("@cosmicdrift/kumiko-fra
434
452
  readonly description?: string;
435
453
  readonly maxLength?: number;
436
454
  readonly minLength?: number;
455
+ readonly autoComplete?: string;
437
456
  readonly required?: boolean;
438
457
  readonly searchable?: boolean;
439
458
  readonly sortable?: boolean;
@@ -456,6 +475,7 @@ export declare const mailThreadsProjectionTable: import("@cosmicdrift/kumiko-fra
456
475
  readonly description?: string;
457
476
  readonly maxLength?: number;
458
477
  readonly minLength?: number;
478
+ readonly autoComplete?: string;
459
479
  readonly required?: boolean;
460
480
  readonly searchable?: boolean;
461
481
  readonly sortable?: boolean;
@@ -25,6 +25,14 @@ const DEFAULT_CACHE_MAX_ENTRIES = 10_000;
25
25
  // complete/failed; either way the cache entry has no value. Falls back
26
26
  // to DB-lookup if actually needed.
27
27
  const DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
28
+ // Run rows hang on SYSTEM_TENANT_ID and a null trigger is a cron/system run;
29
+ // job-run-table.ts declares whenAbsent: "tenant" for exactly that case, so the
30
+ // logger must resolve the same subject the entity chain would (fw#3654).
31
+ function jobRunSubject(triggeredById) {
32
+ return triggeredById === null
33
+ ? { kind: "tenant", tenantId: SYSTEM_TENANT_ID }
34
+ : { kind: "user", userId: triggeredById };
35
+ }
28
36
  // Same per-subject encryption as encryptFailureError/encryptStartedPayload,
29
37
  // applied to a single value — shared so payload/message/error all go
30
38
  // through the identical erased-key fallback. A key erased right before (or
@@ -33,9 +41,9 @@ const DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
33
41
  // sentinel like decryptPiiValueForSubject does on the read side, instead of
34
42
  // throwing and dropping the rest of the batch — or, for onJobStart, the
35
43
  // whole run row.
36
- async function encryptOrSentinel(kms, subjectUserId, value, field) {
44
+ async function encryptOrSentinel(kms, subject, value, field) {
37
45
  try {
38
- return await encryptPiiValueForSubject(kms, { kind: "user", userId: subjectUserId }, value, { requestId: "jobs:job-run-logger" }, field);
46
+ return await encryptPiiValueForSubject(kms, subject, value, { requestId: "jobs:job-run-logger" }, field);
39
47
  }
40
48
  catch (e) {
41
49
  if (!(e instanceof KeyErasedError))
@@ -48,19 +56,18 @@ async function encryptOrSentinel(kms, subjectUserId, value, field) {
48
56
  // jobRunLogsTable — that table is unmanaged/direct-write, so there is no
49
57
  // event-piiFields catalog to lean on here either. "message" is the AAD
50
58
  // field name and must match the field passed to decryptStoredPii on read
51
- // (detail.query.ts) or decrypt fails loud. Same skip rules as the payload:
52
- // null subject (system/cron runs) and absent KMS (rollout mode) both stay
53
- // plaintext. Bounded concurrency (#2307) — unbounded Promise.all would fire
54
- // one getOrCreateDek per log line at once against the KMS adapter's pool.
59
+ // (detail.query.ts) or decrypt fails loud. Same skip rule as the payload:
60
+ // absent KMS (rollout mode) stays plaintext. Bounded concurrency (#2307) —
61
+ // unbounded Promise.all would fire one getOrCreateDek per log line at once
62
+ // against the KMS adapter's pool.
55
63
  async function encryptLogMessages(logs, triggeredById) {
56
- if (triggeredById === null)
57
- return [...logs];
58
64
  const kms = configuredPiiSubjectKms();
59
65
  if (!kms)
60
66
  return [...logs];
67
+ const subject = jobRunSubject(triggeredById);
61
68
  return mapWithConcurrency(logs, KMS_POOL_CONCURRENCY, async (log) => ({
62
69
  ...log,
63
- message: await encryptOrSentinel(kms, triggeredById, log.message, "message"),
70
+ message: await encryptOrSentinel(kms, subject, log.message, "message"),
64
71
  }));
65
72
  }
66
73
  // Mirrors encryptFailureError for the failure-path `error` column (#2307):
@@ -70,29 +77,26 @@ async function encryptLogMessages(logs, triggeredById) {
70
77
  // separate, per-row batch path outside onJobFailed) applies the identical
71
78
  // per-subject encryption instead of writing `error` in the clear.
72
79
  export async function encryptFailureError(error, triggeredById) {
73
- if (triggeredById === null)
74
- return error;
75
80
  const kms = configuredPiiSubjectKms();
76
81
  if (!kms)
77
82
  return error;
78
- return encryptOrSentinel(kms, triggeredById, error, "error");
83
+ return encryptOrSentinel(kms, jobRunSubject(triggeredById), error, "error");
79
84
  }
80
85
  // The run-started payload can carry arbitrary user data; triggeredById
81
86
  // names its owning user. No event-PII catalog involved (#2243 removed the
82
87
  // jobRun r.defineEvent registrations, so there is nothing to catalog) —
83
88
  // the subject is known statically, so we encrypt directly. A null subject
84
- // (system cron runs, recipient-less triggers) stays plaintext: there is no
85
- // user key to shred, mirroring the previous event-pii catalog's own skip
86
- // rule. Absent KMS adapter stays plaintext too (rollout mode, unchanged).
89
+ // (system cron runs, recipient-less triggers) encrypts under the system
90
+ // tenant key. Absent KMS adapter stays plaintext (rollout mode, unchanged).
87
91
  // A key already erased by the time the trigger lands (#2307) must not fail
88
92
  // the whole run-start write — sentinel like the log/error paths.
89
93
  async function encryptStartedPayload(payload, triggeredById) {
90
- if (payload === null || triggeredById === null)
94
+ if (payload === null)
91
95
  return payload;
92
96
  const kms = configuredPiiSubjectKms();
93
97
  if (!kms)
94
98
  return payload;
95
- return encryptOrSentinel(kms, triggeredById, payload, "payload");
99
+ return encryptOrSentinel(kms, jobRunSubject(triggeredById), payload, "payload");
96
100
  }
97
101
  // pg_advisory_xact_lock namespace (int4): 'tjfl' as ASCII, disjoint from the
98
102
  // framework's other fixed advisory-lock keys.
@@ -7,6 +7,7 @@ export declare const jobRunEntity: import("@cosmicdrift/kumiko-types/fields").En
7
7
  readonly description?: string;
8
8
  readonly maxLength?: number;
9
9
  readonly minLength?: number;
10
+ readonly autoComplete?: string;
10
11
  readonly required?: boolean;
11
12
  readonly searchable?: boolean;
12
13
  readonly sortable?: boolean;
@@ -29,6 +30,7 @@ export declare const jobRunEntity: import("@cosmicdrift/kumiko-types/fields").En
29
30
  readonly description?: string;
30
31
  readonly maxLength?: number;
31
32
  readonly minLength?: number;
33
+ readonly autoComplete?: string;
32
34
  readonly required?: boolean;
33
35
  readonly searchable?: boolean;
34
36
  readonly sortable?: boolean;
@@ -51,6 +53,7 @@ export declare const jobRunEntity: import("@cosmicdrift/kumiko-types/fields").En
51
53
  readonly description?: string;
52
54
  readonly maxLength?: number;
53
55
  readonly minLength?: number;
56
+ readonly autoComplete?: string;
54
57
  readonly required?: boolean;
55
58
  readonly searchable?: boolean;
56
59
  readonly sortable?: boolean;
@@ -73,6 +76,7 @@ export declare const jobRunEntity: import("@cosmicdrift/kumiko-types/fields").En
73
76
  readonly description?: string;
74
77
  readonly maxLength?: number;
75
78
  readonly minLength?: number;
79
+ readonly autoComplete?: string;
76
80
  readonly required?: boolean;
77
81
  readonly searchable?: boolean;
78
82
  readonly sortable?: boolean;
@@ -95,6 +99,7 @@ export declare const jobRunEntity: import("@cosmicdrift/kumiko-types/fields").En
95
99
  readonly description?: string;
96
100
  readonly maxLength?: number;
97
101
  readonly minLength?: number;
102
+ readonly autoComplete?: string;
98
103
  readonly required?: boolean;
99
104
  readonly searchable?: boolean;
100
105
  readonly sortable?: boolean;
@@ -185,6 +190,7 @@ export declare const jobRunEntity: import("@cosmicdrift/kumiko-types/fields").En
185
190
  readonly description?: string;
186
191
  readonly maxLength?: number;
187
192
  readonly minLength?: number;
193
+ readonly autoComplete?: string;
188
194
  readonly required?: boolean;
189
195
  readonly searchable?: boolean;
190
196
  readonly sortable?: boolean;
@@ -29,11 +29,18 @@ export const jobRunEntity = createEntity({
29
29
  status: createTextField({ required: true, personal: false, reason: "system_metadata" }),
30
30
  // The run-started payload can carry arbitrary caller-supplied data,
31
31
  // encrypted by job-run-logger.ts under the triggering user's DEK (see
32
- // jobs-pii-kms.integration.test.ts) — same subject as `triggeredById`.
33
- payload: createTextField({ personal: { of: "triggeredById" }, find: "none" }),
32
+ // jobs-pii-kms.integration.test.ts) — same subject as `triggeredById`;
33
+ // cron runs have none and use the system tenant key (whenAbsent).
34
+ payload: createTextField({
35
+ personal: { of: "triggeredById", whenAbsent: "tenant" },
36
+ find: "none",
37
+ }),
34
38
  // Failure messages can echo payload content back — same subject/DEK as
35
39
  // `payload` (job-run-logger.ts encryptFailureError).
36
- error: createTextField({ personal: { of: "triggeredById" }, find: "none" }),
40
+ error: createTextField({
41
+ personal: { of: "triggeredById", whenAbsent: "tenant" },
42
+ find: "none",
43
+ }),
37
44
  attempt: createNumberField({ required: true, default: 1, integer: true }),
38
45
  startedAt: createTimestampField({ required: true }),
39
46
  finishedAt: createTimestampField(),