@cosmicdrift/kumiko-bundled-features 0.355.0 → 0.357.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 (88) 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/entity.d.ts +1 -0
  7. package/dist/cap-counter/feature.js +7 -1
  8. package/dist/cap-overview/screens.js +3 -1
  9. package/dist/compliance-profiles/handlers/set-profile.write.js +14 -22
  10. package/dist/config/table.d.ts +6 -0
  11. package/dist/crypto-shredding/handlers/forget-subject.write.js +15 -3
  12. package/dist/custom-fields/entity.d.ts +4 -0
  13. package/dist/custom-fields/handlers/define-system-field.write.js +8 -16
  14. package/dist/custom-fields/handlers/delete-system-field.write.js +5 -2
  15. package/dist/custom-fields/lib/define-or-resurrect.d.ts +2 -1
  16. package/dist/custom-fields/lib/define-or-resurrect.js +11 -4
  17. package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -0
  18. package/dist/delivery/chat-webhook-sender.js +1 -1
  19. package/dist/delivery/constants.d.ts +1 -0
  20. package/dist/delivery/constants.js +4 -0
  21. package/dist/delivery/delivery-service.js +62 -25
  22. package/dist/delivery/feature.js +7 -1
  23. package/dist/delivery/jobs.js +25 -1
  24. package/dist/delivery/tables.d.ts +6 -0
  25. package/dist/delivery/testing.d.ts +1 -0
  26. package/dist/document-ingest-foundation/entity.d.ts +4 -0
  27. package/dist/folders/entity.d.ts +8 -0
  28. package/dist/form-draft/entity.d.ts +2 -0
  29. package/dist/inbound-mail-foundation/entities.d.ts +25 -0
  30. package/dist/inbound-mail-foundation/projection.d.ts +20 -0
  31. package/dist/jobs/job-run-table.d.ts +6 -0
  32. package/dist/ledger/entity.d.ts +13 -0
  33. package/dist/managed-pages/handlers/set.write.js +6 -17
  34. package/dist/managed-pages/table.d.ts +12 -0
  35. package/dist/notes-history/entity.d.ts +12 -0
  36. package/dist/notes-history/entity.js +7 -6
  37. package/dist/notes-history-user-data/hooks.d.ts +10 -1
  38. package/dist/notes-history-user-data/hooks.js +78 -61
  39. package/dist/notes-history-user-data/index.d.ts +1 -0
  40. package/dist/notes-history-user-data/index.js +2 -1
  41. package/dist/personal-access-tokens/schema/api-token.d.ts +6 -0
  42. package/dist/personal-access-tokens/screens.js +2 -0
  43. package/dist/secrets/table.d.ts +1 -0
  44. package/dist/sessions/schema/user-session.d.ts +4 -0
  45. package/dist/sessions/screens.js +2 -0
  46. package/dist/shared/index.d.ts +1 -0
  47. package/dist/shared/index.js +1 -0
  48. package/dist/shared/require-for-tenant.d.ts +2 -0
  49. package/dist/shared/require-for-tenant.js +9 -0
  50. package/dist/tags/entity.d.ts +9 -0
  51. package/dist/template-resolver/handlers/collection-set.write.js +4 -4
  52. package/dist/template-resolver/handlers/set.write.js +6 -7
  53. package/dist/template-resolver/handlers/upsert-system.write.js +6 -6
  54. package/dist/template-resolver/handlers/upsert-tenant.write.js +6 -4
  55. package/dist/template-resolver/table.d.ts +10 -0
  56. package/dist/template-resolver/user-content-table.d.ts +10 -0
  57. package/dist/tenant/cancel-pending-invitation.d.ts +2 -2
  58. package/dist/tenant/cancel-pending-invitation.js +2 -2
  59. package/dist/tenant/constants.d.ts +1 -0
  60. package/dist/tenant/constants.js +6 -3
  61. package/dist/tenant/feature.js +2 -0
  62. package/dist/tenant/handlers/member-role-availability.query.d.ts +7 -0
  63. package/dist/tenant/handlers/member-role-availability.query.js +18 -0
  64. package/dist/tenant/handlers/remove-member.write.js +13 -10
  65. package/dist/tenant/handlers/update-member-roles.write.js +12 -9
  66. package/dist/tenant/invitation-table.d.ts +6 -0
  67. package/dist/tenant/member-role-options.d.ts +2 -0
  68. package/dist/tenant/member-role-options.js +4 -0
  69. package/dist/tenant/membership-table.d.ts +4 -0
  70. package/dist/tenant/schema/tenant.d.ts +6 -0
  71. package/dist/tenant/screens.d.ts +4 -2
  72. package/dist/tenant/screens.js +10 -6
  73. package/dist/tier-engine/entity.d.ts +2 -0
  74. package/dist/tier-engine/handlers/set-tenant-tier.write.js +7 -18
  75. package/dist/tier-engine/tier-resolver.d.ts +2 -0
  76. package/dist/user/schema/user.d.ts +12 -0
  77. package/dist/user/screens.js +8 -1
  78. package/dist/user-data-rights/schema/download-attempt.d.ts +14 -0
  79. package/dist/user-data-rights/schema/download-token.d.ts +8 -0
  80. package/dist/user-data-rights/schema/export-job.d.ts +6 -0
  81. package/dist/user-data-rights/screens.js +8 -1
  82. package/dist/waitlist/entity.d.ts +14 -0
  83. package/dist/waitlist/screens.js +8 -1
  84. package/package.json +9 -9
  85. package/src/auth-mfa/changes.json +6 -0
  86. package/src/crypto-shredding/changes.json +6 -0
  87. package/src/delivery/changes.json +6 -0
  88. package/src/tenant/changes.json +6 -0
@@ -1,7 +1,8 @@
1
1
  import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
2
- import { buildEntityTable, createEventStoreExecutor, createTenantDb, } from "@cosmicdrift/kumiko-framework/db";
2
+ import { buildEntityTable, createEventStoreExecutor } from "@cosmicdrift/kumiko-framework/db";
3
3
  import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
4
4
  import * as z from "zod";
5
+ import { requireForTenant } from "../../shared/index.js";
5
6
  import { tierAssignmentAggregateId } from "../aggregate-id.js";
6
7
  import { TierAssignmentSources } from "../constants.js";
7
8
  import { tierAssignmentEntity } from "../entity.js";
@@ -9,13 +10,8 @@ import { tierAssignmentEntity } from "../entity.js";
9
10
  // Billing. Cross-tenant, daher SystemAdmin-only (kein TenantAdmin: sonst
10
11
  // Gratis-Self-Upgrade).
11
12
  //
12
- // **Cross-tenant-Mechanik:** ein "system"-mode TenantDb auf den Ziel-Tenant legt
13
- // KEINEN Tenant-Filter an (tenant-db.ts:141 — mode==="system" überspringt ihn);
14
- // der executor-user wird ebenfalls auf den Ziel-Tenant gestellt, sonst landet das
15
- // Event im Stream des Admins (Memory feedback_event_store_tenant_consistency).
16
- // Das set.write-"override-user"-Muster trägt NICHT für beliebige Tenants — es
17
- // funktioniert nur für SYSTEM_TENANT_ID (immer im IN-Filter). Dies ist das
18
- // auto-default-Hook-Muster (feature.ts), generalisiert auf einen Request-Handler.
13
+ // Cross-tenant mechanics: ctx.forTenant(tenantId) yields a tenant-mode db bound to the target plus
14
+ // the streamTenantId, so the event lands in the target's stream with the operator as actor.
19
15
  //
20
16
  // `source: TierAssignmentSources.manual` marks the grant so the billing sync skips it.
21
17
  // Upsert: one aggregate per tenant (deterministic aggregate id).
@@ -31,7 +27,6 @@ const tierAssignmentTable = buildEntityTable("tier-assignment", tierAssignmentEn
31
27
  const executor = createEventStoreExecutor(tierAssignmentTable, tierAssignmentEntity, {
32
28
  entityName: "tier-assignment",
33
29
  });
34
- const SET_TENANT_TIER_REASON = "SystemAdmin assigns the tier of the tenant named in the payload";
35
30
  export function createSetTenantTierWrite(opts = {}) {
36
31
  return defineWriteHandler({
37
32
  name: "set-tenant-tier",
@@ -46,10 +41,6 @@ export function createSetTenantTierWrite(opts = {}) {
46
41
  }),
47
42
  access: { roles: ["SystemAdmin"] },
48
43
  agent: { risk: "high" },
49
- escapeHatch: {
50
- grants: ["unsafeRaw"],
51
- reason: SET_TENANT_TIER_REASON,
52
- },
53
44
  handler: async (event, ctx) => {
54
45
  // Without a commit sink (unit harness) there is no transaction to wait for.
55
46
  const afterCommit = (tenantId, tier) => {
@@ -60,9 +51,7 @@ export function createSetTenantTierWrite(opts = {}) {
60
51
  opts.onAssigned?.(tenantId, tier);
61
52
  };
62
53
  const tenantId = event.payload.tenantId; // @cast-boundary engine-bridge
63
- const rawDb = ctx.db.unsafeRaw();
64
- const tdb = createTenantDb(rawDb, tenantId, "system");
65
- const systemUser = { ...event.user, tenantId };
54
+ const { db: tdb, streamTenantId } = requireForTenant(ctx, tenantId);
66
55
  const tier = event.payload.tier;
67
56
  const existing = await fetchOne(tdb, tierAssignmentTable, { tenantId });
68
57
  if (existing) {
@@ -70,7 +59,7 @@ export function createSetTenantTierWrite(opts = {}) {
70
59
  id: existing.id,
71
60
  version: existing.version,
72
61
  changes: { tier, source: TierAssignmentSources.manual },
73
- }, systemUser, tdb);
62
+ }, event.user, tdb, { streamTenantId });
74
63
  if (!result.isSuccess)
75
64
  return result;
76
65
  afterCommit(tenantId, tier);
@@ -81,7 +70,7 @@ export function createSetTenantTierWrite(opts = {}) {
81
70
  tier,
82
71
  source: TierAssignmentSources.manual,
83
72
  tenantId,
84
- }, systemUser, tdb);
73
+ }, event.user, tdb, { streamTenantId });
85
74
  if (!result.isSuccess)
86
75
  return result;
87
76
  afterCommit(tenantId, tier);
@@ -12,6 +12,7 @@ export declare function createTierResolver<TTier extends string, TCaps>(deps: Ti
12
12
  readonly description?: string;
13
13
  readonly maxLength?: number;
14
14
  readonly minLength?: number;
15
+ readonly autoComplete?: string;
15
16
  readonly required?: boolean;
16
17
  readonly searchable?: boolean;
17
18
  readonly sortable?: boolean;
@@ -34,6 +35,7 @@ export declare function createTierResolver<TTier extends string, TCaps>(deps: Ti
34
35
  readonly description?: string;
35
36
  readonly maxLength?: number;
36
37
  readonly minLength?: number;
38
+ readonly autoComplete?: string;
37
39
  readonly required?: boolean;
38
40
  readonly searchable?: boolean;
39
41
  readonly sortable?: boolean;
@@ -33,6 +33,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
33
33
  readonly description?: string;
34
34
  readonly maxLength?: number;
35
35
  readonly minLength?: number;
36
+ readonly autoComplete?: string;
36
37
  readonly required?: boolean;
37
38
  readonly searchable?: boolean;
38
39
  readonly sortable?: boolean;
@@ -55,6 +56,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
55
56
  readonly description?: string;
56
57
  readonly maxLength?: number;
57
58
  readonly minLength?: number;
59
+ readonly autoComplete?: string;
58
60
  readonly required?: boolean;
59
61
  readonly searchable?: boolean;
60
62
  readonly sortable?: boolean;
@@ -77,6 +79,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
77
79
  readonly description?: string;
78
80
  readonly maxLength?: number;
79
81
  readonly minLength?: number;
82
+ readonly autoComplete?: string;
80
83
  readonly required?: boolean;
81
84
  readonly searchable?: boolean;
82
85
  readonly sortable?: boolean;
@@ -99,6 +102,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
99
102
  readonly description?: string;
100
103
  readonly maxLength?: number;
101
104
  readonly minLength?: number;
105
+ readonly autoComplete?: string;
102
106
  readonly required?: boolean;
103
107
  readonly searchable?: boolean;
104
108
  readonly sortable?: boolean;
@@ -130,6 +134,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
130
134
  readonly description?: string;
131
135
  readonly maxLength?: number;
132
136
  readonly minLength?: number;
137
+ readonly autoComplete?: string;
133
138
  readonly required?: boolean;
134
139
  readonly searchable?: boolean;
135
140
  readonly sortable?: boolean;
@@ -195,6 +200,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
195
200
  readonly description?: string;
196
201
  readonly maxLength?: number;
197
202
  readonly minLength?: number;
203
+ readonly autoComplete?: string;
198
204
  readonly required?: boolean;
199
205
  readonly searchable?: boolean;
200
206
  readonly sortable?: boolean;
@@ -219,6 +225,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
219
225
  readonly description?: string;
220
226
  readonly maxLength?: number;
221
227
  readonly minLength?: number;
228
+ readonly autoComplete?: string;
222
229
  readonly required?: boolean;
223
230
  readonly searchable?: boolean;
224
231
  readonly sortable?: boolean;
@@ -241,6 +248,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
241
248
  readonly description?: string;
242
249
  readonly maxLength?: number;
243
250
  readonly minLength?: number;
251
+ readonly autoComplete?: string;
244
252
  readonly required?: boolean;
245
253
  readonly searchable?: boolean;
246
254
  readonly sortable?: boolean;
@@ -263,6 +271,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
263
271
  readonly description?: string;
264
272
  readonly maxLength?: number;
265
273
  readonly minLength?: number;
274
+ readonly autoComplete?: string;
266
275
  readonly required?: boolean;
267
276
  readonly searchable?: boolean;
268
277
  readonly sortable?: boolean;
@@ -285,6 +294,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
285
294
  readonly description?: string;
286
295
  readonly maxLength?: number;
287
296
  readonly minLength?: number;
297
+ readonly autoComplete?: string;
288
298
  readonly required?: boolean;
289
299
  readonly searchable?: boolean;
290
300
  readonly sortable?: boolean;
@@ -316,6 +326,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
316
326
  readonly description?: string;
317
327
  readonly maxLength?: number;
318
328
  readonly minLength?: number;
329
+ readonly autoComplete?: string;
319
330
  readonly required?: boolean;
320
331
  readonly searchable?: boolean;
321
332
  readonly sortable?: boolean;
@@ -381,6 +392,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
381
392
  readonly description?: string;
382
393
  readonly maxLength?: number;
383
394
  readonly minLength?: number;
395
+ readonly autoComplete?: string;
384
396
  readonly required?: boolean;
385
397
  readonly searchable?: boolean;
386
398
  readonly sortable?: boolean;
@@ -11,7 +11,14 @@ export const userListScreen = {
11
11
  id: "user-list",
12
12
  type: "entityList",
13
13
  entity: "user",
14
- columns: ["email", "displayName", "roles", "tenants", "status", "emailVerified"],
14
+ columns: [
15
+ "email",
16
+ "displayName",
17
+ "roles",
18
+ "tenants",
19
+ "status",
20
+ { field: "emailVerified", hideOnNarrow: true },
21
+ ],
15
22
  rowActions: [
16
23
  {
17
24
  kind: "navigate",
@@ -4,6 +4,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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 downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
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;
@@ -4,6 +4,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
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 exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
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;
@@ -105,6 +107,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
105
107
  readonly description?: string;
106
108
  readonly maxLength?: number;
107
109
  readonly minLength?: number;
110
+ readonly autoComplete?: string;
108
111
  readonly required?: boolean;
109
112
  readonly searchable?: boolean;
110
113
  readonly sortable?: boolean;
@@ -127,6 +130,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
127
130
  readonly description?: string;
128
131
  readonly maxLength?: number;
129
132
  readonly minLength?: number;
133
+ readonly autoComplete?: string;
130
134
  readonly required?: boolean;
131
135
  readonly searchable?: boolean;
132
136
  readonly sortable?: boolean;
@@ -151,6 +155,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
151
155
  readonly description?: string;
152
156
  readonly maxLength?: number;
153
157
  readonly minLength?: number;
158
+ readonly autoComplete?: string;
154
159
  readonly required?: boolean;
155
160
  readonly searchable?: boolean;
156
161
  readonly sortable?: boolean;
@@ -173,6 +178,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
173
178
  readonly description?: string;
174
179
  readonly maxLength?: number;
175
180
  readonly minLength?: number;
181
+ readonly autoComplete?: string;
176
182
  readonly required?: boolean;
177
183
  readonly searchable?: boolean;
178
184
  readonly sortable?: boolean;
@@ -252,6 +258,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
252
258
  readonly description?: string;
253
259
  readonly maxLength?: number;
254
260
  readonly minLength?: number;
261
+ readonly autoComplete?: string;
255
262
  readonly required?: boolean;
256
263
  readonly searchable?: boolean;
257
264
  readonly sortable?: boolean;
@@ -274,6 +281,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
274
281
  readonly description?: string;
275
282
  readonly maxLength?: number;
276
283
  readonly minLength?: number;
284
+ readonly autoComplete?: string;
277
285
  readonly required?: boolean;
278
286
  readonly searchable?: boolean;
279
287
  readonly sortable?: boolean;
@@ -18,6 +18,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
18
18
  readonly description?: string;
19
19
  readonly maxLength?: number;
20
20
  readonly minLength?: number;
21
+ readonly autoComplete?: string;
21
22
  readonly required?: boolean;
22
23
  readonly searchable?: boolean;
23
24
  readonly sortable?: boolean;
@@ -40,6 +41,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
40
41
  readonly description?: string;
41
42
  readonly maxLength?: number;
42
43
  readonly minLength?: number;
44
+ readonly autoComplete?: string;
43
45
  readonly required?: boolean;
44
46
  readonly searchable?: boolean;
45
47
  readonly sortable?: boolean;
@@ -131,6 +133,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
131
133
  readonly description?: string;
132
134
  readonly maxLength?: number;
133
135
  readonly minLength?: number;
136
+ readonly autoComplete?: string;
134
137
  readonly required?: boolean;
135
138
  readonly searchable?: boolean;
136
139
  readonly sortable?: boolean;
@@ -198,6 +201,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
198
201
  readonly description?: string;
199
202
  readonly maxLength?: number;
200
203
  readonly minLength?: number;
204
+ readonly autoComplete?: string;
201
205
  readonly required?: boolean;
202
206
  readonly searchable?: boolean;
203
207
  readonly sortable?: boolean;
@@ -220,6 +224,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
220
224
  readonly description?: string;
221
225
  readonly maxLength?: number;
222
226
  readonly minLength?: number;
227
+ readonly autoComplete?: string;
223
228
  readonly required?: boolean;
224
229
  readonly searchable?: boolean;
225
230
  readonly sortable?: boolean;
@@ -311,6 +316,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
311
316
  readonly description?: string;
312
317
  readonly maxLength?: number;
313
318
  readonly minLength?: number;
319
+ readonly autoComplete?: string;
314
320
  readonly required?: boolean;
315
321
  readonly searchable?: boolean;
316
322
  readonly sortable?: boolean;
@@ -58,7 +58,14 @@ export const downloadAttemptListScreen = {
58
58
  id: "download-attempt-list",
59
59
  type: "entityList",
60
60
  entity: "download-attempt",
61
- columns: ["attemptedAt", "result", "via", "ip", "attemptedByUserId", "jobId"],
61
+ columns: [
62
+ "attemptedAt",
63
+ "result",
64
+ "via",
65
+ "ip",
66
+ { field: "attemptedByUserId", hideOnNarrow: true },
67
+ { field: "jobId", hideOnNarrow: true },
68
+ ],
62
69
  searchable: false,
63
70
  access: { roles: access.systemAdmin },
64
71
  // Inert until an app navs it (see file header) — no nav area to resolve
@@ -5,6 +5,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
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 waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
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;
@@ -49,6 +51,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
49
51
  readonly description?: string;
50
52
  readonly maxLength?: number;
51
53
  readonly minLength?: number;
54
+ readonly autoComplete?: string;
52
55
  readonly required?: boolean;
53
56
  readonly searchable?: boolean;
54
57
  readonly sortable?: boolean;
@@ -71,6 +74,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
71
74
  readonly description?: string;
72
75
  readonly maxLength?: number;
73
76
  readonly minLength?: number;
77
+ readonly autoComplete?: string;
74
78
  readonly required?: boolean;
75
79
  readonly searchable?: boolean;
76
80
  readonly sortable?: boolean;
@@ -109,6 +113,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
109
113
  readonly description?: string;
110
114
  readonly maxLength?: number;
111
115
  readonly minLength?: number;
116
+ readonly autoComplete?: string;
112
117
  readonly required?: boolean;
113
118
  readonly searchable?: boolean;
114
119
  readonly sortable?: boolean;
@@ -184,6 +189,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
184
189
  readonly description?: string;
185
190
  readonly maxLength?: number;
186
191
  readonly minLength?: number;
192
+ readonly autoComplete?: string;
187
193
  readonly required?: boolean;
188
194
  readonly searchable?: boolean;
189
195
  readonly sortable?: boolean;
@@ -206,6 +212,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
206
212
  readonly description?: string;
207
213
  readonly maxLength?: number;
208
214
  readonly minLength?: number;
215
+ readonly autoComplete?: string;
209
216
  readonly required?: boolean;
210
217
  readonly searchable?: boolean;
211
218
  readonly sortable?: boolean;
@@ -230,6 +237,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
230
237
  readonly description?: string;
231
238
  readonly maxLength?: number;
232
239
  readonly minLength?: number;
240
+ readonly autoComplete?: string;
233
241
  readonly required?: boolean;
234
242
  readonly searchable?: boolean;
235
243
  readonly sortable?: boolean;
@@ -252,6 +260,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
252
260
  readonly description?: string;
253
261
  readonly maxLength?: number;
254
262
  readonly minLength?: number;
263
+ readonly autoComplete?: string;
255
264
  readonly required?: boolean;
256
265
  readonly searchable?: boolean;
257
266
  readonly sortable?: boolean;
@@ -274,6 +283,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
274
283
  readonly description?: string;
275
284
  readonly maxLength?: number;
276
285
  readonly minLength?: number;
286
+ readonly autoComplete?: string;
277
287
  readonly required?: boolean;
278
288
  readonly searchable?: boolean;
279
289
  readonly sortable?: boolean;
@@ -296,6 +306,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
296
306
  readonly description?: string;
297
307
  readonly maxLength?: number;
298
308
  readonly minLength?: number;
309
+ readonly autoComplete?: string;
299
310
  readonly required?: boolean;
300
311
  readonly searchable?: boolean;
301
312
  readonly sortable?: boolean;
@@ -334,6 +345,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
334
345
  readonly description?: string;
335
346
  readonly maxLength?: number;
336
347
  readonly minLength?: number;
348
+ readonly autoComplete?: string;
337
349
  readonly required?: boolean;
338
350
  readonly searchable?: boolean;
339
351
  readonly sortable?: boolean;
@@ -409,6 +421,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
409
421
  readonly description?: string;
410
422
  readonly maxLength?: number;
411
423
  readonly minLength?: number;
424
+ readonly autoComplete?: string;
412
425
  readonly required?: boolean;
413
426
  readonly searchable?: boolean;
414
427
  readonly sortable?: boolean;
@@ -431,6 +444,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
431
444
  readonly description?: string;
432
445
  readonly maxLength?: number;
433
446
  readonly minLength?: number;
447
+ readonly autoComplete?: string;
434
448
  readonly required?: boolean;
435
449
  readonly searchable?: boolean;
436
450
  readonly sortable?: boolean;
@@ -5,7 +5,14 @@ export const waitlistListScreen = {
5
5
  id: "waitlist-list",
6
6
  type: "entityList",
7
7
  entity: "waitlistEntry",
8
- columns: ["name", "email", "company", "status", "locale", "submittedAt"],
8
+ columns: [
9
+ "name",
10
+ "email",
11
+ "company",
12
+ "status",
13
+ "locale",
14
+ { field: "submittedAt", hideOnNarrow: true },
15
+ ],
9
16
  defaultSort: { field: "submittedAt", dir: "desc" },
10
17
  access: adminAccess,
11
18
  searchable: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-bundled-features",
3
- "version": "0.355.0",
3
+ "version": "0.357.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>",
@@ -516,12 +516,12 @@
516
516
  }
517
517
  },
518
518
  "dependencies": {
519
- "@cosmicdrift/kumiko-dispatcher-live": "0.355.0",
520
- "@cosmicdrift/kumiko-framework": "0.355.0",
521
- "@cosmicdrift/kumiko-headless": "0.355.0",
522
- "@cosmicdrift/kumiko-renderer": "0.355.0",
523
- "@cosmicdrift/kumiko-renderer-web": "0.355.0",
524
- "@cosmicdrift/kumiko-types": "0.355.0",
519
+ "@cosmicdrift/kumiko-dispatcher-live": "0.357.0",
520
+ "@cosmicdrift/kumiko-framework": "0.357.0",
521
+ "@cosmicdrift/kumiko-headless": "0.357.0",
522
+ "@cosmicdrift/kumiko-renderer": "0.357.0",
523
+ "@cosmicdrift/kumiko-renderer-web": "0.357.0",
524
+ "@cosmicdrift/kumiko-types": "0.357.0",
525
525
  "@mollie/api-client": "^4.5.0",
526
526
  "@node-rs/argon2": "^2.0.2",
527
527
  "@types/mailparser": "^3.4.6",
@@ -1050,8 +1050,8 @@
1050
1050
  ],
1051
1051
  "devDependencies": {
1052
1052
  "@testing-library/user-event": "^14.6.1",
1053
- "@cosmicdrift/kumiko-locale-de": "0.355.0",
1054
- "@cosmicdrift/kumiko-locale-es": "0.355.0",
1053
+ "@cosmicdrift/kumiko-locale-de": "0.357.0",
1054
+ "@cosmicdrift/kumiko-locale-es": "0.357.0",
1055
1055
  "jsqr": "^1.4.0"
1056
1056
  }
1057
1057
  }
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.357.0",
4
+ "type": "improvement",
5
+ "title": "MFA enable asks to confirm saved recovery codes, code field autocompletes one-time codes",
6
+ "detail": "secretMint `reveal.acknowledge` (i18n key) renders a checkbox on the reveal card that must be ticked before the confirm step or the acknowledge button can be used; the tick never reaches the payload. Text fields accept an `autoComplete` token that reaches the input. The MFA enable screen uses both: a \"saved my recovery codes\" gate and `one-time-code` on the code field"
7
+ },
2
8
  {
3
9
  "version": "0.354.0",
4
10
  "type": "breaking",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.357.0",
4
+ "type": "improvement",
5
+ "title": "forget-subject shreds note bodies attached to the subject and notes that mention it",
6
+ "detail": "`forget-subject` on a user or record subject now also erases the per-note keys of every `note-entry` that hangs on the subject as host entity (entityId, plus entityType for record subjects) or @-mentions it, unless the host entity's retention strategy is anonymize/blockDelete. The automated Art. 17 delete hook reaches notes on the user as host too, and the export lists them. Before, `forget-subject(contact)` left the note bodies readable. Consumer tests that expect readable note bodies after `forget-subject` on a contact (e.g. solon contact-notes-forget) now see the erased sentinel. Forgetting only the author still leaves the bodies readable."
7
+ },
2
8
  {
3
9
  "version": "0.354.0",
4
10
  "type": "fix",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.357.0",
4
+ "type": "improvement",
5
+ "title": "Delivery idempotencyKey is released when nothing was delivered",
6
+ "detail": "A retry of a failed notify() with the same idempotencyKey is no longer skipped as a duplicate. The key is deleted when no recipient got a `sent` or `queued` delivery, also when notify() throws; one successful recipient keeps it, even if notify() throws afterwards (a retry would re-send to them). For queued channels the send/render job deletes the key after its final failed attempt, not per retry. That reference is only attached when a `route` call has exactly one channel address; `to` calls (user lists) and multi-channel routes keep the key after queueing. The job payload gains an optional `idempotencyKey`, backward compatible. `createDeliveryTestContext` accepts `idempotencyRedis`."
7
+ },
2
8
  {
3
9
  "version": "0.354.0",
4
10
  "type": "breaking",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.357.0",
4
+ "type": "improvement",
5
+ "title": "The member roles form only offers roles the signed-in admin may assign",
6
+ "detail": "New query tenant:query:member-role-availability; TenantAdmin still sees every role."
7
+ },
2
8
  {
3
9
  "version": "0.354.0",
4
10
  "type": "breaking",