@cosmicdrift/kumiko-bundled-features 0.332.0 → 0.334.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 (53) hide show
  1. package/dist/audit/handlers/list.query.js +4 -3
  2. package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -1
  3. package/dist/auth-email-password/handlers/invite-create.write.js +2 -2
  4. package/dist/auth-mfa/schema/user-mfa.d.ts +6 -0
  5. package/dist/billing-foundation/entities.d.ts +8 -0
  6. package/dist/billing-foundation/projection.d.ts +8 -0
  7. package/dist/cap-counter/entity.d.ts +1 -0
  8. package/dist/compliance-profiles/schema/profile-selection.d.ts +2 -2
  9. package/dist/config/table.d.ts +6 -0
  10. package/dist/config/web/i18n.js +12 -4
  11. package/dist/custom-fields/entity.d.ts +4 -0
  12. package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -0
  13. package/dist/delivery/tables.d.ts +6 -0
  14. package/dist/document-ingest-foundation/entity.d.ts +4 -0
  15. package/dist/file-provider-s3/feature.js +1 -1
  16. package/dist/folders/entity.d.ts +8 -0
  17. package/dist/form-draft/entity.d.ts +2 -0
  18. package/dist/inbound-mail-foundation/entities.d.ts +25 -0
  19. package/dist/inbound-mail-foundation/projection.d.ts +20 -0
  20. package/dist/jobs/job-run-table.d.ts +6 -0
  21. package/dist/ledger/entity.d.ts +16 -3
  22. package/dist/managed-pages/table.d.ts +12 -0
  23. package/dist/notes-history/entity.d.ts +12 -0
  24. package/dist/personal-access-tokens/schema/api-token.d.ts +6 -0
  25. package/dist/secrets/table.d.ts +1 -0
  26. package/dist/sessions/schema/user-session.d.ts +4 -0
  27. package/dist/subscription-stripe/feature.js +3 -3
  28. package/dist/tags/entity.d.ts +9 -0
  29. package/dist/template-resolver/table.d.ts +18 -8
  30. package/dist/template-resolver/user-content-table.d.ts +14 -4
  31. package/dist/tenant/constants.d.ts +1 -1
  32. package/dist/tenant/constants.js +7 -1
  33. package/dist/tenant/feature.d.ts +4 -1
  34. package/dist/tenant/feature.js +13 -4
  35. package/dist/tenant/handlers/update-member-roles.write.js +2 -2
  36. package/dist/tenant/i18n.js +2 -0
  37. package/dist/tenant/index.d.ts +1 -1
  38. package/dist/tenant/index.js +1 -1
  39. package/dist/tenant/invitation-table.d.ts +8 -2
  40. package/dist/tenant/membership-table.d.ts +4 -0
  41. package/dist/tenant/schema/tenant.d.ts +8 -2
  42. package/dist/tenant/screens.d.ts +59 -3
  43. package/dist/tenant/screens.js +54 -36
  44. package/dist/tenant-settings/feature.js +9 -6
  45. package/dist/tier-engine/entity.d.ts +2 -0
  46. package/dist/tier-engine/tier-resolver.d.ts +2 -0
  47. package/dist/user/schema/user.d.ts +14 -2
  48. package/dist/user-data-rights/run-user-export.js +6 -2
  49. package/dist/user-data-rights/schema/download-attempt.d.ts +14 -0
  50. package/dist/user-data-rights/schema/download-token.d.ts +8 -0
  51. package/dist/user-data-rights/schema/export-job.d.ts +8 -2
  52. package/package.json +9 -9
  53. package/src/tenant/changes.json +5 -0
@@ -10,6 +10,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
10
10
  readonly filterable?: boolean;
11
11
  readonly encrypted?: boolean;
12
12
  readonly sensitive?: boolean;
13
+ readonly writeOnly?: boolean;
13
14
  readonly readAsInstruction?: boolean;
14
15
  readonly format?: "email" | "url" | "phone" | "password";
15
16
  readonly default?: string;
@@ -30,6 +31,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
30
31
  readonly filterable?: boolean;
31
32
  readonly encrypted?: boolean;
32
33
  readonly sensitive?: boolean;
34
+ readonly writeOnly?: boolean;
33
35
  readonly readAsInstruction?: boolean;
34
36
  readonly format?: "email" | "url" | "phone" | "password";
35
37
  readonly default?: string;
@@ -50,6 +52,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
50
52
  readonly filterable?: boolean;
51
53
  readonly encrypted?: boolean;
52
54
  readonly sensitive?: boolean;
55
+ readonly writeOnly?: boolean;
53
56
  readonly readAsInstruction?: boolean;
54
57
  readonly format?: "email" | "url" | "phone" | "password";
55
58
  readonly default?: string;
@@ -70,6 +73,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
70
73
  readonly filterable?: boolean;
71
74
  readonly encrypted?: boolean;
72
75
  readonly sensitive?: boolean;
76
+ readonly writeOnly?: boolean;
73
77
  readonly readAsInstruction?: boolean;
74
78
  readonly format?: "email" | "url" | "phone" | "password";
75
79
  readonly default?: string;
@@ -108,6 +112,7 @@ export declare const noteEntryEntity: EntityDefinition<{
108
112
  readonly filterable?: boolean;
109
113
  readonly encrypted?: boolean;
110
114
  readonly sensitive?: boolean;
115
+ readonly writeOnly?: boolean;
111
116
  readonly readAsInstruction?: boolean;
112
117
  readonly format?: "email" | "url" | "phone" | "password";
113
118
  readonly default?: string;
@@ -128,6 +133,7 @@ export declare const noteEntryEntity: EntityDefinition<{
128
133
  readonly filterable?: boolean;
129
134
  readonly encrypted?: boolean;
130
135
  readonly sensitive?: boolean;
136
+ readonly writeOnly?: boolean;
131
137
  readonly readAsInstruction?: boolean;
132
138
  readonly format?: "email" | "url" | "phone" | "password";
133
139
  readonly default?: string;
@@ -148,6 +154,7 @@ export declare const noteEntryEntity: EntityDefinition<{
148
154
  readonly filterable?: boolean;
149
155
  readonly encrypted?: boolean;
150
156
  readonly sensitive?: boolean;
157
+ readonly writeOnly?: boolean;
151
158
  readonly readAsInstruction?: boolean;
152
159
  readonly format?: "email" | "url" | "phone" | "password";
153
160
  readonly default?: string;
@@ -168,6 +175,7 @@ export declare const noteEntryEntity: EntityDefinition<{
168
175
  readonly filterable?: boolean;
169
176
  readonly encrypted?: boolean;
170
177
  readonly sensitive?: boolean;
178
+ readonly writeOnly?: boolean;
171
179
  readonly readAsInstruction?: boolean;
172
180
  readonly format?: "email" | "url" | "phone" | "password";
173
181
  readonly default?: string;
@@ -206,6 +214,7 @@ export declare function createNoteMentionEntity(): EntityDefinition<{
206
214
  readonly filterable?: boolean;
207
215
  readonly encrypted?: boolean;
208
216
  readonly sensitive?: boolean;
217
+ readonly writeOnly?: boolean;
209
218
  readonly readAsInstruction?: boolean;
210
219
  readonly format?: "email" | "url" | "phone" | "password";
211
220
  readonly default?: string;
@@ -226,6 +235,7 @@ export declare function createNoteMentionEntity(): EntityDefinition<{
226
235
  readonly filterable?: boolean;
227
236
  readonly encrypted?: boolean;
228
237
  readonly sensitive?: boolean;
238
+ readonly writeOnly?: boolean;
229
239
  readonly readAsInstruction?: boolean;
230
240
  readonly format?: "email" | "url" | "phone" | "password";
231
241
  readonly default?: string;
@@ -248,6 +258,7 @@ export declare const noteMentionEntity: EntityDefinition<{
248
258
  readonly filterable?: boolean;
249
259
  readonly encrypted?: boolean;
250
260
  readonly sensitive?: boolean;
261
+ readonly writeOnly?: boolean;
251
262
  readonly readAsInstruction?: boolean;
252
263
  readonly format?: "email" | "url" | "phone" | "password";
253
264
  readonly default?: string;
@@ -268,6 +279,7 @@ export declare const noteMentionEntity: EntityDefinition<{
268
279
  readonly filterable?: boolean;
269
280
  readonly encrypted?: boolean;
270
281
  readonly sensitive?: boolean;
282
+ readonly writeOnly?: boolean;
271
283
  readonly readAsInstruction?: boolean;
272
284
  readonly format?: "email" | "url" | "phone" | "password";
273
285
  readonly default?: string;
@@ -9,6 +9,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
9
9
  readonly filterable?: boolean;
10
10
  readonly encrypted?: boolean;
11
11
  readonly sensitive?: boolean;
12
+ readonly writeOnly?: boolean;
12
13
  readonly readAsInstruction?: boolean;
13
14
  readonly format?: "email" | "url" | "phone" | "password";
14
15
  readonly default?: string;
@@ -29,6 +30,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
29
30
  readonly filterable?: boolean;
30
31
  readonly encrypted?: boolean;
31
32
  readonly sensitive?: boolean;
33
+ readonly writeOnly?: boolean;
32
34
  readonly readAsInstruction?: boolean;
33
35
  readonly format?: "email" | "url" | "phone" | "password";
34
36
  readonly default?: string;
@@ -49,6 +51,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
49
51
  readonly filterable?: boolean;
50
52
  readonly encrypted?: boolean;
51
53
  readonly sensitive?: boolean;
54
+ readonly writeOnly?: boolean;
52
55
  readonly readAsInstruction?: boolean;
53
56
  readonly format?: "email" | "url" | "phone" | "password";
54
57
  readonly default?: string;
@@ -69,6 +72,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
69
72
  readonly filterable?: boolean;
70
73
  readonly encrypted?: boolean;
71
74
  readonly sensitive?: boolean;
75
+ readonly writeOnly?: boolean;
72
76
  readonly readAsInstruction?: boolean;
73
77
  readonly format?: "email" | "url" | "phone" | "password";
74
78
  readonly default?: string;
@@ -89,6 +93,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
89
93
  readonly filterable?: boolean;
90
94
  readonly encrypted?: boolean;
91
95
  readonly sensitive?: boolean;
96
+ readonly writeOnly?: boolean;
92
97
  readonly readAsInstruction?: boolean;
93
98
  readonly format?: "email" | "url" | "phone" | "password";
94
99
  readonly default?: string;
@@ -109,6 +114,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
109
114
  readonly filterable?: boolean;
110
115
  readonly encrypted?: boolean;
111
116
  readonly sensitive?: boolean;
117
+ readonly writeOnly?: boolean;
112
118
  readonly readAsInstruction?: boolean;
113
119
  readonly format?: "email" | "url" | "phone" | "password";
114
120
  readonly default?: string;
@@ -14,6 +14,7 @@ export declare const tenantSecretEntity: import("@cosmicdrift/kumiko-types/field
14
14
  readonly filterable?: boolean;
15
15
  readonly encrypted?: boolean;
16
16
  readonly sensitive?: boolean;
17
+ readonly writeOnly?: boolean;
17
18
  readonly readAsInstruction?: boolean;
18
19
  readonly format?: "email" | "url" | "phone" | "password";
19
20
  readonly default?: string;
@@ -9,6 +9,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
9
9
  readonly filterable?: boolean;
10
10
  readonly encrypted?: boolean;
11
11
  readonly sensitive?: boolean;
12
+ readonly writeOnly?: boolean;
12
13
  readonly readAsInstruction?: boolean;
13
14
  readonly format?: "email" | "url" | "phone" | "password";
14
15
  readonly default?: string;
@@ -29,6 +30,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
29
30
  readonly filterable?: boolean;
30
31
  readonly encrypted?: boolean;
31
32
  readonly sensitive?: boolean;
33
+ readonly writeOnly?: boolean;
32
34
  readonly readAsInstruction?: boolean;
33
35
  readonly format?: "email" | "url" | "phone" | "password";
34
36
  readonly default?: string;
@@ -109,6 +111,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
109
111
  readonly filterable?: boolean;
110
112
  readonly encrypted?: boolean;
111
113
  readonly sensitive?: boolean;
114
+ readonly writeOnly?: boolean;
112
115
  readonly readAsInstruction?: boolean;
113
116
  readonly format?: "email" | "url" | "phone" | "password";
114
117
  readonly default?: string;
@@ -129,6 +132,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
129
132
  readonly filterable?: boolean;
130
133
  readonly encrypted?: boolean;
131
134
  readonly sensitive?: boolean;
135
+ readonly writeOnly?: boolean;
132
136
  readonly readAsInstruction?: boolean;
133
137
  readonly format?: "email" | "url" | "phone" | "password";
134
138
  readonly default?: string;
@@ -135,9 +135,9 @@ export function createSubscriptionStripeFeature(options = {}) {
135
135
  });
136
136
  r.translations({
137
137
  keys: {
138
- "subscription-stripe.api-key": { en: "Stripe API Key" },
139
- "subscription-stripe.webhook-secret": { en: "Stripe Webhook Secret" },
140
- "subscription-stripe.billing-live": { en: "Stripe Billing Live" },
138
+ "subscription-stripe.api-key": { en: "Stripe API key" },
139
+ "subscription-stripe.webhook-secret": { en: "Stripe webhook secret" },
140
+ "subscription-stripe.billing-live": { en: "Live billing" },
141
141
  "subscription-stripe.settings": { en: "Stripe" },
142
142
  "screen:subscription-stripe-system.title": { en: "Stripe" },
143
143
  },
@@ -10,6 +10,7 @@ export declare const tagEntity: EntityDefinition<{
10
10
  readonly filterable?: boolean;
11
11
  readonly encrypted?: boolean;
12
12
  readonly sensitive?: boolean;
13
+ readonly writeOnly?: boolean;
13
14
  readonly readAsInstruction?: boolean;
14
15
  readonly format?: "email" | "url" | "phone" | "password";
15
16
  readonly default?: string;
@@ -30,6 +31,7 @@ export declare const tagEntity: EntityDefinition<{
30
31
  readonly filterable?: boolean;
31
32
  readonly encrypted?: boolean;
32
33
  readonly sensitive?: boolean;
34
+ readonly writeOnly?: boolean;
33
35
  readonly readAsInstruction?: boolean;
34
36
  readonly format?: "email" | "url" | "phone" | "password";
35
37
  readonly default?: string;
@@ -50,6 +52,7 @@ export declare const tagEntity: EntityDefinition<{
50
52
  readonly filterable?: boolean;
51
53
  readonly encrypted?: boolean;
52
54
  readonly sensitive?: boolean;
55
+ readonly writeOnly?: boolean;
53
56
  readonly readAsInstruction?: boolean;
54
57
  readonly format?: "email" | "url" | "phone" | "password";
55
58
  readonly default?: string;
@@ -72,6 +75,7 @@ export declare function createTagAssignmentEntity(access?: EntityDefinition["acc
72
75
  readonly filterable?: boolean;
73
76
  readonly encrypted?: boolean;
74
77
  readonly sensitive?: boolean;
78
+ readonly writeOnly?: boolean;
75
79
  readonly readAsInstruction?: boolean;
76
80
  readonly format?: "email" | "url" | "phone" | "password";
77
81
  readonly default?: string;
@@ -92,6 +96,7 @@ export declare function createTagAssignmentEntity(access?: EntityDefinition["acc
92
96
  readonly filterable?: boolean;
93
97
  readonly encrypted?: boolean;
94
98
  readonly sensitive?: boolean;
99
+ readonly writeOnly?: boolean;
95
100
  readonly readAsInstruction?: boolean;
96
101
  readonly format?: "email" | "url" | "phone" | "password";
97
102
  readonly default?: string;
@@ -112,6 +117,7 @@ export declare function createTagAssignmentEntity(access?: EntityDefinition["acc
112
117
  readonly filterable?: boolean;
113
118
  readonly encrypted?: boolean;
114
119
  readonly sensitive?: boolean;
120
+ readonly writeOnly?: boolean;
115
121
  readonly readAsInstruction?: boolean;
116
122
  readonly format?: "email" | "url" | "phone" | "password";
117
123
  readonly default?: string;
@@ -134,6 +140,7 @@ export declare const tagAssignmentEntity: EntityDefinition<{
134
140
  readonly filterable?: boolean;
135
141
  readonly encrypted?: boolean;
136
142
  readonly sensitive?: boolean;
143
+ readonly writeOnly?: boolean;
137
144
  readonly readAsInstruction?: boolean;
138
145
  readonly format?: "email" | "url" | "phone" | "password";
139
146
  readonly default?: string;
@@ -154,6 +161,7 @@ export declare const tagAssignmentEntity: EntityDefinition<{
154
161
  readonly filterable?: boolean;
155
162
  readonly encrypted?: boolean;
156
163
  readonly sensitive?: boolean;
164
+ readonly writeOnly?: boolean;
157
165
  readonly readAsInstruction?: boolean;
158
166
  readonly format?: "email" | "url" | "phone" | "password";
159
167
  readonly default?: string;
@@ -174,6 +182,7 @@ export declare const tagAssignmentEntity: EntityDefinition<{
174
182
  readonly filterable?: boolean;
175
183
  readonly encrypted?: boolean;
176
184
  readonly sensitive?: boolean;
185
+ readonly writeOnly?: boolean;
177
186
  readonly readAsInstruction?: boolean;
178
187
  readonly format?: "email" | "url" | "phone" | "password";
179
188
  readonly default?: string;
@@ -9,6 +9,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
9
9
  readonly filterable?: boolean;
10
10
  readonly encrypted?: boolean;
11
11
  readonly sensitive?: boolean;
12
+ readonly writeOnly?: boolean;
12
13
  readonly readAsInstruction?: boolean;
13
14
  readonly format?: "email" | "url" | "phone" | "password";
14
15
  readonly default?: string;
@@ -39,7 +40,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
39
40
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
40
41
  } | undefined;
41
42
  readonly optionsQuery?: string;
42
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
43
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
43
44
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
44
45
  required: true;
45
46
  };
@@ -53,6 +54,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
53
54
  readonly filterable?: boolean;
54
55
  readonly encrypted?: boolean;
55
56
  readonly sensitive?: boolean;
57
+ readonly writeOnly?: boolean;
56
58
  readonly readAsInstruction?: boolean;
57
59
  readonly format?: "email" | "url" | "phone" | "password";
58
60
  readonly default?: string;
@@ -73,6 +75,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
73
75
  readonly filterable?: boolean;
74
76
  readonly encrypted?: boolean;
75
77
  readonly sensitive?: boolean;
78
+ readonly writeOnly?: boolean;
76
79
  readonly readAsInstruction?: boolean;
77
80
  readonly format?: "email" | "url" | "phone" | "password";
78
81
  readonly default?: string;
@@ -93,6 +96,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
93
96
  readonly filterable?: boolean;
94
97
  readonly encrypted?: boolean;
95
98
  readonly sensitive?: boolean;
99
+ readonly writeOnly?: boolean;
96
100
  readonly readAsInstruction?: boolean;
97
101
  readonly format?: "email" | "url" | "phone" | "password";
98
102
  readonly default?: string;
@@ -137,7 +141,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
137
141
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
138
142
  } | undefined;
139
143
  readonly optionsQuery?: string;
140
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
144
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
141
145
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
142
146
  required: true;
143
147
  };
@@ -189,7 +193,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
189
193
  readonly tenant?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
190
194
  } | undefined;
191
195
  readonly optionsQuery?: string;
192
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
196
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
193
197
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
194
198
  required: true;
195
199
  };
@@ -203,6 +207,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
203
207
  readonly filterable?: boolean;
204
208
  readonly encrypted?: boolean;
205
209
  readonly sensitive?: boolean;
210
+ readonly writeOnly?: boolean;
206
211
  readonly readAsInstruction?: boolean;
207
212
  readonly format?: "email" | "url" | "phone" | "password";
208
213
  readonly default?: string;
@@ -230,7 +235,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
230
235
  readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
231
236
  } | undefined;
232
237
  readonly optionsQuery?: string;
233
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
238
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
234
239
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
235
240
  required: true;
236
241
  };
@@ -246,6 +251,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
246
251
  readonly filterable?: boolean;
247
252
  readonly encrypted?: boolean;
248
253
  readonly sensitive?: boolean;
254
+ readonly writeOnly?: boolean;
249
255
  readonly readAsInstruction?: boolean;
250
256
  readonly format?: "email" | "url" | "phone" | "password";
251
257
  readonly default?: string;
@@ -276,7 +282,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
276
282
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
277
283
  } | undefined;
278
284
  readonly optionsQuery?: string;
279
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
285
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
280
286
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
281
287
  required: true;
282
288
  };
@@ -290,6 +296,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
290
296
  readonly filterable?: boolean;
291
297
  readonly encrypted?: boolean;
292
298
  readonly sensitive?: boolean;
299
+ readonly writeOnly?: boolean;
293
300
  readonly readAsInstruction?: boolean;
294
301
  readonly format?: "email" | "url" | "phone" | "password";
295
302
  readonly default?: string;
@@ -310,6 +317,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
310
317
  readonly filterable?: boolean;
311
318
  readonly encrypted?: boolean;
312
319
  readonly sensitive?: boolean;
320
+ readonly writeOnly?: boolean;
313
321
  readonly readAsInstruction?: boolean;
314
322
  readonly format?: "email" | "url" | "phone" | "password";
315
323
  readonly default?: string;
@@ -330,6 +338,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
330
338
  readonly filterable?: boolean;
331
339
  readonly encrypted?: boolean;
332
340
  readonly sensitive?: boolean;
341
+ readonly writeOnly?: boolean;
333
342
  readonly readAsInstruction?: boolean;
334
343
  readonly format?: "email" | "url" | "phone" | "password";
335
344
  readonly default?: string;
@@ -374,7 +383,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
374
383
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
375
384
  } | undefined;
376
385
  readonly optionsQuery?: string;
377
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
386
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
378
387
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
379
388
  required: true;
380
389
  };
@@ -426,7 +435,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
426
435
  readonly tenant?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
427
436
  } | undefined;
428
437
  readonly optionsQuery?: string;
429
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
438
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
430
439
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
431
440
  required: true;
432
441
  };
@@ -440,6 +449,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
440
449
  readonly filterable?: boolean;
441
450
  readonly encrypted?: boolean;
442
451
  readonly sensitive?: boolean;
452
+ readonly writeOnly?: boolean;
443
453
  readonly readAsInstruction?: boolean;
444
454
  readonly format?: "email" | "url" | "phone" | "password";
445
455
  readonly default?: string;
@@ -467,7 +477,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
467
477
  readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
468
478
  } | undefined;
469
479
  readonly optionsQuery?: string;
470
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
480
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
471
481
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
472
482
  required: true;
473
483
  };
@@ -9,6 +9,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
9
9
  readonly filterable?: boolean;
10
10
  readonly encrypted?: boolean;
11
11
  readonly sensitive?: boolean;
12
+ readonly writeOnly?: boolean;
12
13
  readonly readAsInstruction?: boolean;
13
14
  readonly format?: "email" | "url" | "phone" | "password";
14
15
  readonly default?: string;
@@ -29,6 +30,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
29
30
  readonly filterable?: boolean;
30
31
  readonly encrypted?: boolean;
31
32
  readonly sensitive?: boolean;
33
+ readonly writeOnly?: boolean;
32
34
  readonly readAsInstruction?: boolean;
33
35
  readonly format?: "email" | "url" | "phone" | "password";
34
36
  readonly default?: string;
@@ -59,7 +61,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
59
61
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
60
62
  } | undefined;
61
63
  readonly optionsQuery?: string;
62
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
64
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
63
65
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
64
66
  required: true;
65
67
  };
@@ -73,6 +75,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
73
75
  readonly filterable?: boolean;
74
76
  readonly encrypted?: boolean;
75
77
  readonly sensitive?: boolean;
78
+ readonly writeOnly?: boolean;
76
79
  readonly readAsInstruction?: boolean;
77
80
  readonly format?: "email" | "url" | "phone" | "password";
78
81
  readonly default?: string;
@@ -93,6 +96,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
93
96
  readonly filterable?: boolean;
94
97
  readonly encrypted?: boolean;
95
98
  readonly sensitive?: boolean;
99
+ readonly writeOnly?: boolean;
96
100
  readonly readAsInstruction?: boolean;
97
101
  readonly format?: "email" | "url" | "phone" | "password";
98
102
  readonly default?: string;
@@ -113,6 +117,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
113
117
  readonly filterable?: boolean;
114
118
  readonly encrypted?: boolean;
115
119
  readonly sensitive?: boolean;
120
+ readonly writeOnly?: boolean;
116
121
  readonly readAsInstruction?: boolean;
117
122
  readonly format?: "email" | "url" | "phone" | "password";
118
123
  readonly default?: string;
@@ -157,7 +162,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
157
162
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
158
163
  } | undefined;
159
164
  readonly optionsQuery?: string;
160
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
165
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
161
166
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
162
167
  required: true;
163
168
  };
@@ -173,6 +178,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
173
178
  readonly filterable?: boolean;
174
179
  readonly encrypted?: boolean;
175
180
  readonly sensitive?: boolean;
181
+ readonly writeOnly?: boolean;
176
182
  readonly readAsInstruction?: boolean;
177
183
  readonly format?: "email" | "url" | "phone" | "password";
178
184
  readonly default?: string;
@@ -193,6 +199,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
193
199
  readonly filterable?: boolean;
194
200
  readonly encrypted?: boolean;
195
201
  readonly sensitive?: boolean;
202
+ readonly writeOnly?: boolean;
196
203
  readonly readAsInstruction?: boolean;
197
204
  readonly format?: "email" | "url" | "phone" | "password";
198
205
  readonly default?: string;
@@ -223,7 +230,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
223
230
  readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
224
231
  } | undefined;
225
232
  readonly optionsQuery?: string;
226
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
233
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
227
234
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
228
235
  required: true;
229
236
  };
@@ -237,6 +244,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
237
244
  readonly filterable?: boolean;
238
245
  readonly encrypted?: boolean;
239
246
  readonly sensitive?: boolean;
247
+ readonly writeOnly?: boolean;
240
248
  readonly readAsInstruction?: boolean;
241
249
  readonly format?: "email" | "url" | "phone" | "password";
242
250
  readonly default?: string;
@@ -257,6 +265,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
257
265
  readonly filterable?: boolean;
258
266
  readonly encrypted?: boolean;
259
267
  readonly sensitive?: boolean;
268
+ readonly writeOnly?: boolean;
260
269
  readonly readAsInstruction?: boolean;
261
270
  readonly format?: "email" | "url" | "phone" | "password";
262
271
  readonly default?: string;
@@ -277,6 +286,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
277
286
  readonly filterable?: boolean;
278
287
  readonly encrypted?: boolean;
279
288
  readonly sensitive?: boolean;
289
+ readonly writeOnly?: boolean;
280
290
  readonly readAsInstruction?: boolean;
281
291
  readonly format?: "email" | "url" | "phone" | "password";
282
292
  readonly default?: string;
@@ -321,7 +331,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
321
331
  readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
322
332
  } | undefined;
323
333
  readonly optionsQuery?: string;
324
- readonly optionsQueryPayload?: Readonly<Record<string, string | number | boolean>>;
334
+ readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
325
335
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
326
336
  required: true;
327
337
  };
@@ -11,7 +11,7 @@ export declare const MEMBER_STATUS_CELL_COMPONENT: "MemberStatusCell";
11
11
  export declare const MEMBER_ROLES_CELL_COMPONENT: "MemberRolesCell";
12
12
  /** Closed allowlist for invite-role picker — never free text (escalation guard). */
13
13
  export declare const DEFAULT_INVITE_ROLE_OPTIONS: readonly ["User", "Editor", "Admin"];
14
- export declare const OWNER_INVITE_ROLE_OPTIONS: readonly ["User", "Editor", "Admin", "TenantAdmin"];
14
+ export declare const OWNER_INVITE_ROLE_OPTIONS: readonly ["User", "Member", "Editor", "Admin", "TenantAdmin"];
15
15
  export declare const TenantHandlers: {
16
16
  readonly create: "tenant:write:create";
17
17
  readonly update: "tenant:write:update";
@@ -22,7 +22,13 @@ export const DEFAULT_INVITE_ROLE_OPTIONS = ["User", "Editor", "Admin"];
22
22
  // Full assignable rank list, used by memberRolesEditScreen: that screen is
23
23
  // prefilled with a member's *current* roles, so it must be able to represent
24
24
  // every rank a membership can actually hold, including TenantAdmin (fw#2452).
25
- export const OWNER_INVITE_ROLE_OPTIONS = ["User", "Editor", "Admin", "TenantAdmin"];
25
+ export const OWNER_INVITE_ROLE_OPTIONS = [
26
+ "User",
27
+ "Member",
28
+ "Editor",
29
+ "Admin",
30
+ "TenantAdmin",
31
+ ];
26
32
  // Qualified write handler names (QN format: scope:type:name)
27
33
  export const TenantHandlers = {
28
34
  create: "tenant:write:create",
@@ -1,4 +1,4 @@
1
- import { type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
1
+ import { type AssignableAppRoles, type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
2
  export { tenantEntity, tenantTable } from "./schema/tenant.js";
3
3
  export type TenantFeatureOptions = {
4
4
  /** Adds the /members "invite" drawer button + its `invite-create`
@@ -9,5 +9,8 @@ export type TenantFeatureOptions = {
9
9
  * handler lookup fails). Off by default: `tenant` cannot see whether an
10
10
  * app configured that optional auth-email-password flow. */
11
11
  readonly inviteScreen?: boolean;
12
+ /** Screen options only — the elevation guard always reads the registry. */
13
+ readonly assignableAppRoles?: AssignableAppRoles;
12
14
  };
15
+ export declare function collectAssignableAppRoles(features: readonly FeatureDefinition[]): AssignableAppRoles;
13
16
  export declare function createTenantFeature(options?: TenantFeatureOptions): FeatureDefinition;
@@ -1,4 +1,4 @@
1
- import { access, createSystemConfig, createTenantConfig, defineEntityDetailHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, i18nKey, } from "@cosmicdrift/kumiko-framework/engine";
1
+ import { access, assignableAppRolesFromUsages, createSystemConfig, createTenantConfig, defineEntityDetailHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, EXT_ASSIGNABLE_ROLE, i18nKey, } from "@cosmicdrift/kumiko-framework/engine";
2
2
  import { activeTenantIdsQuery } from "./handlers/active-tenant-ids.query.js";
3
3
  import { addMemberWrite } from "./handlers/add-member.write.js";
4
4
  import { cancelInvitationWrite } from "./handlers/cancel-invitation.write.js";
@@ -20,8 +20,13 @@ import { TENANT_I18N } from "./i18n.js";
20
20
  import { tenantInvitationEntity } from "./invitation-table.js";
21
21
  import { tenantMembershipEntity } from "./membership-table.js";
22
22
  import { tenantEntity } from "./schema/tenant.js";
23
- import { createMembersScreen, inviteCreateScreen, memberRolesEditScreen, tenantEditScreen, tenantListScreen, } from "./screens.js";
23
+ import { createInviteCreateScreen, createMemberRolesEditScreen, createMembersScreen, tenantEditScreen, tenantListScreen, } from "./screens.js";
24
24
  export { tenantEntity, tenantTable } from "./schema/tenant.js";
25
+ export function collectAssignableAppRoles(features) {
26
+ return assignableAppRolesFromUsages(features
27
+ .flatMap((feature) => feature.extensionUsages)
28
+ .filter((usage) => usage.extensionName === EXT_ASSIGNABLE_ROLE));
29
+ }
25
30
  // --- Feature ---
26
31
  export function createTenantFeature(options) {
27
32
  return defineFeature("tenant", (r) => {
@@ -33,6 +38,10 @@ export function createTenantFeature(options) {
33
38
  });
34
39
  r.systemScope();
35
40
  r.requires("config");
41
+ r.extendsRegistrar(EXT_ASSIGNABLE_ROLE, {});
42
+ r.bootCheck(({ features }) => {
43
+ collectAssignableAppRoles(features);
44
+ });
36
45
  r.entity("tenant", tenantEntity);
37
46
  r.entity("tenant-membership", tenantMembershipEntity);
38
47
  r.entity("tenant-invitation", tenantInvitationEntity);
@@ -128,9 +137,9 @@ export function createTenantFeature(options) {
128
137
  // §2.6), invite via a drawer-hosted actionForm, role-edit via
129
138
  // actionForm. Screen access matches handler access.admin.
130
139
  r.screen(createMembersScreen(options));
131
- r.screen(memberRolesEditScreen);
140
+ r.screen(createMemberRolesEditScreen(options?.assignableAppRoles));
132
141
  if (options?.inviteScreen) {
133
- r.screen(inviteCreateScreen);
142
+ r.screen(createInviteCreateScreen(options.assignableAppRoles));
134
143
  }
135
144
  r.nav({
136
145
  id: "members",
@@ -1,6 +1,6 @@
1
1
  import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
2
2
  import { createEventStoreExecutor } from "@cosmicdrift/kumiko-framework/db";
3
- import { access, createSystemUser, defineWriteHandler, findForbiddenRoleAssignment, withResponseData, } from "@cosmicdrift/kumiko-framework/engine";
3
+ import { access, assignableAppRolesFromUsages, createSystemUser, defineWriteHandler, EXT_ASSIGNABLE_ROLE, findForbiddenRoleAssignment, withResponseData, } from "@cosmicdrift/kumiko-framework/engine";
4
4
  import { InternalError, NotFoundError, ValidationError, writeFailure, } from "@cosmicdrift/kumiko-framework/errors";
5
5
  import { parseRoles } from "@cosmicdrift/kumiko-framework/utils";
6
6
  import * as z from "zod";
@@ -70,7 +70,7 @@ export const updateMemberRolesWrite = defineWriteHandler({
70
70
  const row = existing; // @cast-boundary generic-record
71
71
  const currentTargetRoles = parseRoles(row["roles"]);
72
72
  if (!event.user.roles.includes("system")) {
73
- const forbiddenElevation = findForbiddenRoleAssignment(event.user.roles, event.payload.roles, currentTargetRoles);
73
+ const forbiddenElevation = findForbiddenRoleAssignment(event.user.roles, event.payload.roles, currentTargetRoles, assignableAppRolesFromUsages(ctx.registry.getExtensionUsages(EXT_ASSIGNABLE_ROLE)));
74
74
  if (forbiddenElevation !== undefined) {
75
75
  return writeFailure(unassignableMembershipRoleError(forbiddenElevation));
76
76
  }
@@ -24,12 +24,14 @@ export const TENANT_I18N = {
24
24
  "tenant:entity:__action-form__:field:email": { en: "Email" },
25
25
  "tenant:entity:__action-form__:field:role": { en: "Role" },
26
26
  "tenant:entity:__action-form__:field:role:option:User": { en: "User" },
27
+ "tenant:entity:__action-form__:field:role:option:Member": { en: "Member" },
27
28
  "tenant:entity:__action-form__:field:role:option:Admin": { en: "Admin" },
28
29
  "tenant:entity:__action-form__:field:role:option:TenantAdmin": { en: "Tenant Admin" },
29
30
  "tenant:entity:__action-form__:field:role:option:Editor": { en: "Editor" },
30
31
  "tenant:entity:__action-form__:field:userId": { en: "User ID" },
31
32
  "tenant:entity:__action-form__:field:roles": { en: "Roles" },
32
33
  "tenant:entity:__action-form__:field:roles:option:User": { en: "User" },
34
+ "tenant:entity:__action-form__:field:roles:option:Member": { en: "Member" },
33
35
  "tenant:entity:__action-form__:field:roles:option:Admin": { en: "Admin" },
34
36
  "tenant:entity:__action-form__:field:roles:option:TenantAdmin": { en: "Tenant Admin" },
35
37
  "tenant:entity:__action-form__:field:roles:option:Editor": { en: "Editor" },