@cosmicdrift/kumiko-bundled-features 0.351.0 → 0.353.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 (164) hide show
  1. package/dist/agent-tools/agent-manifest.js +8 -2
  2. package/dist/agent-tools/manifest-deny-qns.d.ts +3 -0
  3. package/dist/agent-tools/manifest-deny-qns.js +17 -0
  4. package/dist/agent-tools/tool-catalog.d.ts +2 -1
  5. package/dist/agent-tools/tool-catalog.js +4 -1
  6. package/dist/audit/handlers/list.query.js +13 -8
  7. package/dist/auth-email-password/handlers/signup-confirm.write.js +2 -3
  8. package/dist/auth-mfa/schema/user-mfa.d.ts +6 -0
  9. package/dist/auth-mfa/screens.js +2 -2
  10. package/dist/billing-foundation/checkout-core.d.ts +7 -0
  11. package/dist/billing-foundation/checkout-core.js +7 -2
  12. package/dist/billing-foundation/entities.d.ts +8 -0
  13. package/dist/billing-foundation/handlers/start-plan-checkout.write.js +7 -1
  14. package/dist/billing-foundation/projection.d.ts +8 -0
  15. package/dist/cap-counter/book-cap-usage.d.ts +5 -1
  16. package/dist/cap-counter/book-cap-usage.js +65 -44
  17. package/dist/cap-counter/cap-reservation.d.ts +12 -0
  18. package/dist/cap-counter/cap-reservation.js +135 -0
  19. package/dist/cap-counter/constants.d.ts +3 -0
  20. package/dist/cap-counter/constants.js +6 -0
  21. package/dist/cap-counter/entity.d.ts +1 -0
  22. package/dist/cap-counter/feature.js +7 -2
  23. package/dist/cap-counter/handlers/increment-rolling.write.d.ts +5 -0
  24. package/dist/cap-counter/handlers/increment-rolling.write.js +4 -0
  25. package/dist/cap-counter/index.d.ts +4 -2
  26. package/dist/cap-counter/index.js +3 -1
  27. package/dist/cap-counter/payload-field.d.ts +1 -0
  28. package/dist/cap-counter/payload-field.js +11 -0
  29. package/dist/cap-counter/reservation-chain.d.ts +2 -0
  30. package/dist/cap-counter/reservation-chain.js +44 -0
  31. package/dist/cap-counter/stock-cap-guard.d.ts +3 -0
  32. package/dist/cap-counter/tables.d.ts +3 -0
  33. package/dist/cap-counter/tables.js +36 -0
  34. package/dist/cap-counter/value-cap-guard.d.ts +18 -0
  35. package/dist/cap-counter/value-cap-guard.js +33 -0
  36. package/dist/cap-counter/with-cap-enforcement.d.ts +5 -7
  37. package/dist/cap-counter/with-cap-enforcement.js +35 -51
  38. package/dist/cap-overview/access.js +2 -9
  39. package/dist/cap-overview/handlers/tenant-caps-list.query.js +2 -2
  40. package/dist/cap-overview/handlers/tenant-options.query.js +4 -5
  41. package/dist/channel-discord/feature.js +1 -0
  42. package/dist/channel-slack/feature.js +1 -0
  43. package/dist/channel-teams/feature.js +1 -0
  44. package/dist/compliance-profiles/schema/profile-selection.d.ts +10 -8
  45. package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +2 -4
  46. package/dist/config/handlers/values.query.d.ts +3 -1
  47. package/dist/config/handlers/values.query.js +7 -2
  48. package/dist/config/table.d.ts +6 -0
  49. package/dist/custom-fields/entity.d.ts +4 -0
  50. package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -0
  51. package/dist/delivery/attempt-log-retention.d.ts +9 -0
  52. package/dist/delivery/attempt-log-retention.js +23 -0
  53. package/dist/delivery/attempt-log.d.ts +1 -1
  54. package/dist/delivery/attempt-log.js +21 -2
  55. package/dist/delivery/constants.d.ts +1 -1
  56. package/dist/delivery/constants.js +1 -1
  57. package/dist/delivery/events.d.ts +1 -0
  58. package/dist/delivery/events.js +2 -0
  59. package/dist/delivery/feature.d.ts +1 -0
  60. package/dist/delivery/feature.js +39 -3
  61. package/dist/delivery/index.d.ts +2 -1
  62. package/dist/delivery/index.js +2 -1
  63. package/dist/delivery/mask-recipient-address.d.ts +1 -0
  64. package/dist/delivery/mask-recipient-address.js +41 -0
  65. package/dist/delivery/public-names.d.ts +2 -0
  66. package/dist/delivery/public-names.js +4 -1
  67. package/dist/delivery/tables.d.ts +6 -0
  68. package/dist/delivery/types.d.ts +1 -0
  69. package/dist/delivery/types.js +6 -2
  70. package/dist/document-ingest-foundation/entity.d.ts +4 -0
  71. package/dist/files-tenant-data/hooks.js +3 -2
  72. package/dist/folders/entity.d.ts +8 -0
  73. package/dist/folders/feature.js +2 -10
  74. package/dist/form-draft/db/queries/cleanup.d.ts +1 -1
  75. package/dist/form-draft/db/queries/cleanup.js +4 -3
  76. package/dist/form-draft/entity.d.ts +2 -0
  77. package/dist/form-draft/handlers/cleanup.job.d.ts +5 -1
  78. package/dist/form-draft/handlers/cleanup.job.js +11 -5
  79. package/dist/inbound-mail-foundation/entities.d.ts +25 -0
  80. package/dist/inbound-mail-foundation/projection.d.ts +20 -0
  81. package/dist/jobs/handlers/list.query.d.ts +2 -1
  82. package/dist/jobs/handlers/list.query.js +39 -14
  83. package/dist/jobs/i18n.js +1 -0
  84. package/dist/jobs/job-run-table.d.ts +6 -0
  85. package/dist/ledger/entity.d.ts +24 -8
  86. package/dist/ledger/entity.js +4 -0
  87. package/dist/ledger/schemas.js +8 -2
  88. package/dist/managed-pages/feature.js +28 -10
  89. package/dist/managed-pages/table.d.ts +12 -0
  90. package/dist/notes-history/entity.d.ts +12 -0
  91. package/dist/notes-history/feature.js +2 -10
  92. package/dist/personal-access-tokens/schema/api-token.d.ts +6 -0
  93. package/dist/personal-access-tokens/screens.js +14 -3
  94. package/dist/renderer-foundation/types.d.ts +1 -0
  95. package/dist/renderer-simple/feature.js +4 -6
  96. package/dist/renderer-simple/index.d.ts +1 -0
  97. package/dist/renderer-simple/mail-blocks.d.ts +21 -0
  98. package/dist/renderer-simple/mail-blocks.js +107 -0
  99. package/dist/renderer-simple/simple-renderer.js +21 -3
  100. package/dist/secrets/table.d.ts +1 -0
  101. package/dist/seo/feature.js +28 -6
  102. package/dist/sessions/schema/user-session.d.ts +4 -0
  103. package/dist/shared/assert-no-where-rule-in-ownership-write.d.ts +2 -0
  104. package/dist/shared/assert-no-where-rule-in-ownership-write.js +18 -0
  105. package/dist/shared/index.d.ts +2 -1
  106. package/dist/shared/index.js +2 -1
  107. package/dist/shared/rate-limited-text-response.d.ts +2 -0
  108. package/dist/shared/rate-limited-text-response.js +9 -0
  109. package/dist/tags/entity.d.ts +9 -0
  110. package/dist/tags/feature.js +2 -10
  111. package/dist/template-resolver/table.d.ts +48 -30
  112. package/dist/template-resolver/user-content-table.d.ts +34 -20
  113. package/dist/tenant/decrypt-tenant-names.d.ts +3 -0
  114. package/dist/tenant/decrypt-tenant-names.js +10 -0
  115. package/dist/tenant/handlers/me.query.js +5 -1
  116. package/dist/tenant/handlers/memberships.query.js +3 -2
  117. package/dist/tenant/handlers/tenant-directory.query.js +9 -3
  118. package/dist/tenant/index.d.ts +1 -0
  119. package/dist/tenant/index.js +1 -0
  120. package/dist/tenant/invitation-table.d.ts +16 -8
  121. package/dist/tenant/membership-table.d.ts +4 -0
  122. package/dist/tenant/schema/tenant.d.ts +18 -10
  123. package/dist/tenant/schema/tenant.js +4 -6
  124. package/dist/tenant/screens.js +1 -1
  125. package/dist/tenant-handover/move-entity-graph.js +11 -18
  126. package/dist/tenant-lifecycle/feature.js +1 -0
  127. package/dist/tenant-lifecycle/run-tenant-destroy.d.ts +3 -0
  128. package/dist/tenant-lifecycle/run-tenant-destroy.js +2 -0
  129. package/dist/tenant-lifecycle/stages.d.ts +2 -0
  130. package/dist/tenant-lifecycle/stages.js +7 -1
  131. package/dist/tier-engine/entity.d.ts +2 -0
  132. package/dist/tier-engine/index.d.ts +1 -0
  133. package/dist/tier-engine/index.js +1 -0
  134. package/dist/tier-engine/tier-option-gate.d.ts +32 -0
  135. package/dist/tier-engine/tier-option-gate.js +62 -0
  136. package/dist/tier-engine/tier-resolver.d.ts +2 -0
  137. package/dist/user/handlers/list.query.js +2 -2
  138. package/dist/user/schema/user.d.ts +22 -8
  139. package/dist/user-data-rights/boot-checks.js +5 -0
  140. package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +2 -2
  141. package/dist/user-data-rights/schema/download-attempt.d.ts +14 -0
  142. package/dist/user-data-rights/schema/download-token.d.ts +8 -0
  143. package/dist/user-data-rights/schema/export-job.d.ts +16 -8
  144. package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +25 -6
  145. package/dist/waitlist/entity.d.ts +22 -6
  146. package/dist/workflow-runner/event-trigger.js +6 -3
  147. package/dist/workflow-runner/handlers/resume-run.write.js +3 -0
  148. package/package.json +10 -10
  149. package/src/agent-tools/changes.json +12 -0
  150. package/src/audit/changes.json +6 -0
  151. package/src/cap-counter/changes.json +28 -0
  152. package/src/delivery/changes.json +12 -0
  153. package/src/derivatives-sharp/changes.json +6 -0
  154. package/src/form-draft/changes.json +7 -1
  155. package/src/legal-pages/changes.json +6 -0
  156. package/src/managed-pages/changes.json +6 -0
  157. package/src/renderer-simple/changes.json +6 -0
  158. package/src/seo/changes.json +5 -0
  159. package/src/tenant/changes.json +7 -0
  160. package/src/tenant-handover/changes.json +6 -0
  161. package/src/tier-engine/changes.json +6 -0
  162. package/src/workflow-runner/changes.json +5 -0
  163. package/dist/shared/has-where-rule.d.ts +0 -2
  164. package/dist/shared/has-where-rule.js +0 -10
@@ -3,6 +3,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
3
3
  readonly type: "text";
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
6
+ readonly minLength?: number;
6
7
  readonly required?: boolean;
7
8
  readonly searchable?: boolean;
8
9
  readonly sortable?: boolean;
@@ -24,6 +25,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
24
25
  readonly type: "text";
25
26
  readonly description?: string;
26
27
  readonly maxLength?: number;
28
+ readonly minLength?: number;
27
29
  readonly required?: boolean;
28
30
  readonly searchable?: boolean;
29
31
  readonly sortable?: boolean;
@@ -45,6 +47,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
45
47
  readonly type: "text";
46
48
  readonly description?: string;
47
49
  readonly maxLength?: number;
50
+ readonly minLength?: number;
48
51
  readonly required?: boolean;
49
52
  readonly searchable?: boolean;
50
53
  readonly sortable?: boolean;
@@ -66,6 +69,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
66
69
  readonly type: "text";
67
70
  readonly description?: string;
68
71
  readonly maxLength?: number;
72
+ readonly minLength?: number;
69
73
  readonly required?: boolean;
70
74
  readonly searchable?: boolean;
71
75
  readonly sortable?: boolean;
@@ -87,6 +91,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
87
91
  readonly type: "text";
88
92
  readonly description?: string;
89
93
  readonly maxLength?: number;
94
+ readonly minLength?: number;
90
95
  readonly required?: boolean;
91
96
  readonly searchable?: boolean;
92
97
  readonly sortable?: boolean;
@@ -108,6 +113,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
108
113
  readonly type: "text";
109
114
  readonly description?: string;
110
115
  readonly maxLength?: number;
116
+ readonly minLength?: number;
111
117
  readonly required?: boolean;
112
118
  readonly searchable?: boolean;
113
119
  readonly sortable?: boolean;
@@ -129,6 +135,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
129
135
  readonly type: "text";
130
136
  readonly description?: string;
131
137
  readonly maxLength?: number;
138
+ readonly minLength?: number;
132
139
  readonly required?: boolean;
133
140
  readonly searchable?: boolean;
134
141
  readonly sortable?: boolean;
@@ -167,6 +174,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
167
174
  readonly type: "text";
168
175
  readonly description?: string;
169
176
  readonly maxLength?: number;
177
+ readonly minLength?: number;
170
178
  readonly required?: boolean;
171
179
  readonly searchable?: boolean;
172
180
  readonly sortable?: boolean;
@@ -188,6 +196,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
188
196
  readonly type: "text";
189
197
  readonly description?: string;
190
198
  readonly maxLength?: number;
199
+ readonly minLength?: number;
191
200
  readonly required?: boolean;
192
201
  readonly searchable?: boolean;
193
202
  readonly sortable?: boolean;
@@ -209,6 +218,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
209
218
  readonly type: "text";
210
219
  readonly description?: string;
211
220
  readonly maxLength?: number;
221
+ readonly minLength?: number;
212
222
  readonly required?: boolean;
213
223
  readonly searchable?: boolean;
214
224
  readonly sortable?: boolean;
@@ -230,6 +240,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
230
240
  readonly type: "text";
231
241
  readonly description?: string;
232
242
  readonly maxLength?: number;
243
+ readonly minLength?: number;
233
244
  readonly required?: boolean;
234
245
  readonly searchable?: boolean;
235
246
  readonly sortable?: boolean;
@@ -251,6 +262,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
251
262
  readonly type: "text";
252
263
  readonly description?: string;
253
264
  readonly maxLength?: number;
265
+ readonly minLength?: number;
254
266
  readonly required?: boolean;
255
267
  readonly searchable?: boolean;
256
268
  readonly sortable?: boolean;
@@ -272,6 +284,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
272
284
  readonly type: "text";
273
285
  readonly description?: string;
274
286
  readonly maxLength?: number;
287
+ readonly minLength?: number;
275
288
  readonly required?: boolean;
276
289
  readonly searchable?: boolean;
277
290
  readonly sortable?: boolean;
@@ -293,6 +306,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
293
306
  readonly type: "text";
294
307
  readonly description?: string;
295
308
  readonly maxLength?: number;
309
+ readonly minLength?: number;
296
310
  readonly required?: boolean;
297
311
  readonly searchable?: boolean;
298
312
  readonly sortable?: boolean;
@@ -3,6 +3,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
3
3
  readonly type: "text";
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
6
+ readonly minLength?: number;
6
7
  readonly required?: boolean;
7
8
  readonly searchable?: boolean;
8
9
  readonly sortable?: boolean;
@@ -24,6 +25,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
24
25
  readonly type: "text";
25
26
  readonly description?: string;
26
27
  readonly maxLength?: number;
28
+ readonly minLength?: number;
27
29
  readonly required?: boolean;
28
30
  readonly searchable?: boolean;
29
31
  readonly sortable?: boolean;
@@ -102,6 +104,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
102
104
  readonly type: "text";
103
105
  readonly description?: string;
104
106
  readonly maxLength?: number;
107
+ readonly minLength?: number;
105
108
  readonly required?: boolean;
106
109
  readonly searchable?: boolean;
107
110
  readonly sortable?: boolean;
@@ -123,6 +126,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
123
126
  readonly type: "text";
124
127
  readonly description?: string;
125
128
  readonly maxLength?: number;
129
+ readonly minLength?: number;
126
130
  readonly required?: boolean;
127
131
  readonly searchable?: boolean;
128
132
  readonly sortable?: boolean;
@@ -146,6 +150,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
146
150
  readonly type: "text";
147
151
  readonly description?: string;
148
152
  readonly maxLength?: number;
153
+ readonly minLength?: number;
149
154
  readonly required?: boolean;
150
155
  readonly searchable?: boolean;
151
156
  readonly sortable?: boolean;
@@ -167,6 +172,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
167
172
  readonly type: "text";
168
173
  readonly description?: string;
169
174
  readonly maxLength?: number;
175
+ readonly minLength?: number;
170
176
  readonly required?: boolean;
171
177
  readonly searchable?: boolean;
172
178
  readonly sortable?: boolean;
@@ -245,6 +251,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
245
251
  readonly type: "text";
246
252
  readonly description?: string;
247
253
  readonly maxLength?: number;
254
+ readonly minLength?: number;
248
255
  readonly required?: boolean;
249
256
  readonly searchable?: boolean;
250
257
  readonly sortable?: boolean;
@@ -266,6 +273,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
266
273
  readonly type: "text";
267
274
  readonly description?: string;
268
275
  readonly maxLength?: number;
276
+ readonly minLength?: number;
269
277
  readonly required?: boolean;
270
278
  readonly searchable?: boolean;
271
279
  readonly sortable?: boolean;
@@ -17,6 +17,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
17
17
  readonly type: "text";
18
18
  readonly description?: string;
19
19
  readonly maxLength?: number;
20
+ readonly minLength?: number;
20
21
  readonly required?: boolean;
21
22
  readonly searchable?: boolean;
22
23
  readonly sortable?: boolean;
@@ -38,6 +39,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
38
39
  readonly type: "text";
39
40
  readonly description?: string;
40
41
  readonly maxLength?: number;
42
+ readonly minLength?: number;
41
43
  readonly required?: boolean;
42
44
  readonly searchable?: boolean;
43
45
  readonly sortable?: boolean;
@@ -67,13 +69,14 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
67
69
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
68
70
  readonly display?: "radio" | "dropdown";
69
71
  readonly optionTones?: {
70
- readonly done?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
71
- readonly failed?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
72
- readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
73
- readonly running?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
72
+ readonly done?: "bad" | "neutral" | "ok" | "warn" | undefined;
73
+ readonly failed?: "bad" | "neutral" | "ok" | "warn" | undefined;
74
+ readonly pending?: "bad" | "neutral" | "ok" | "warn" | undefined;
75
+ readonly running?: "bad" | "neutral" | "ok" | "warn" | undefined;
74
76
  } | undefined;
75
77
  readonly optionsQuery?: string;
76
78
  readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
79
+ readonly optionsAvailabilityQuery?: string;
77
80
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
78
81
  required: true;
79
82
  };
@@ -126,6 +129,7 @@ export declare const exportJobEntity: import("@cosmicdrift/kumiko-types/fields")
126
129
  readonly type: "text";
127
130
  readonly description?: string;
128
131
  readonly maxLength?: number;
132
+ readonly minLength?: number;
129
133
  readonly required?: boolean;
130
134
  readonly searchable?: boolean;
131
135
  readonly sortable?: boolean;
@@ -192,6 +196,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
192
196
  readonly type: "text";
193
197
  readonly description?: string;
194
198
  readonly maxLength?: number;
199
+ readonly minLength?: number;
195
200
  readonly required?: boolean;
196
201
  readonly searchable?: boolean;
197
202
  readonly sortable?: boolean;
@@ -213,6 +218,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
213
218
  readonly type: "text";
214
219
  readonly description?: string;
215
220
  readonly maxLength?: number;
221
+ readonly minLength?: number;
216
222
  readonly required?: boolean;
217
223
  readonly searchable?: boolean;
218
224
  readonly sortable?: boolean;
@@ -242,13 +248,14 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
242
248
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
243
249
  readonly display?: "radio" | "dropdown";
244
250
  readonly optionTones?: {
245
- readonly done?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
246
- readonly failed?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
247
- readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
248
- readonly running?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
251
+ readonly done?: "bad" | "neutral" | "ok" | "warn" | undefined;
252
+ readonly failed?: "bad" | "neutral" | "ok" | "warn" | undefined;
253
+ readonly pending?: "bad" | "neutral" | "ok" | "warn" | undefined;
254
+ readonly running?: "bad" | "neutral" | "ok" | "warn" | undefined;
249
255
  } | undefined;
250
256
  readonly optionsQuery?: string;
251
257
  readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
258
+ readonly optionsAvailabilityQuery?: string;
252
259
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
253
260
  required: true;
254
261
  };
@@ -301,6 +308,7 @@ export declare const exportJobsTable: import("@cosmicdrift/kumiko-framework/db")
301
308
  readonly type: "text";
302
309
  readonly description?: string;
303
310
  readonly maxLength?: number;
311
+ readonly minLength?: number;
304
312
  readonly required?: boolean;
305
313
  readonly searchable?: boolean;
306
314
  readonly sortable?: boolean;
@@ -1,4 +1,5 @@
1
- import { deliveryAttemptsTable } from "../../delivery/index.js";
1
+ import { appendEventInTenantDb, getStreamVersionInTenantDb, } from "@cosmicdrift/kumiko-framework/event-store";
2
+ import { DELIVERY_ATTEMPT_ADDRESS_ERASED_EVENT, deliveryAttemptsTable, } from "../../delivery/index.js";
2
3
  import { featureMounted } from "./feature-mounted.js";
3
4
  // userData-Hooks for delivery's attempt log (deferred from #797, closed by
4
5
  // #799). deliveryAttempt is an events-only aggregate — the export reads the
@@ -26,9 +27,27 @@ export const deliveryAttemptExportHook = async (ctx) => {
26
27
  })),
27
28
  };
28
29
  };
29
- export const deliveryAttemptDeleteHook = async () => {
30
- // Deliberate no-op: erasure runs via crypto-shredding — the forget pipeline
31
- // erases the recipient's DEK, which makes recipientAddress unreadable in
32
- // BOTH the append-only events and the projected rows (#799). A read-side
33
- // UPDATE here would be wiped on the next projection rebuild anyway.
30
+ // Both strategies erase the address. The DEK shredding of a forget covers KMS deployments; the
31
+ // erase event also covers plaintext mode, and unlike a read-side UPDATE it survives a projection
32
+ // rebuild. Rows without an address are skipped, which makes a second run a no-op.
33
+ export const deliveryAttemptDeleteHook = async (ctx) => {
34
+ // skip: delivery not mounted — its table doesn't exist, nothing to erase.
35
+ if (!featureMounted(ctx, "delivery"))
36
+ return;
37
+ const rows = await ctx.db.selectMany(deliveryAttemptsTable, {
38
+ tenantId: ctx.tenantId,
39
+ recipientId: ctx.userId,
40
+ });
41
+ for (const row of rows) {
42
+ if (row.recipientAddress === null)
43
+ continue;
44
+ await appendEventInTenantDb(ctx.db, {
45
+ aggregateType: "deliveryAttempt",
46
+ aggregateId: row.id,
47
+ expectedVersion: await getStreamVersionInTenantDb(ctx.db, row.id),
48
+ type: DELIVERY_ATTEMPT_ADDRESS_ERASED_EVENT,
49
+ payload: {},
50
+ metadata: { userId: "system" },
51
+ }, { registry: ctx.registry });
52
+ }
34
53
  };
@@ -4,6 +4,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
4
4
  readonly type: "text";
5
5
  readonly description?: string;
6
6
  readonly maxLength?: number;
7
+ readonly minLength?: number;
7
8
  readonly required?: boolean;
8
9
  readonly searchable?: boolean;
9
10
  readonly sortable?: boolean;
@@ -25,6 +26,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
25
26
  readonly type: "text";
26
27
  readonly description?: string;
27
28
  readonly maxLength?: number;
29
+ readonly minLength?: number;
28
30
  readonly required?: boolean;
29
31
  readonly searchable?: boolean;
30
32
  readonly sortable?: boolean;
@@ -46,6 +48,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
46
48
  readonly type: "text";
47
49
  readonly description?: string;
48
50
  readonly maxLength?: number;
51
+ readonly minLength?: number;
49
52
  readonly required?: boolean;
50
53
  readonly searchable?: boolean;
51
54
  readonly sortable?: boolean;
@@ -67,6 +70,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
67
70
  readonly type: "text";
68
71
  readonly description?: string;
69
72
  readonly maxLength?: number;
73
+ readonly minLength?: number;
70
74
  readonly required?: boolean;
71
75
  readonly searchable?: boolean;
72
76
  readonly sortable?: boolean;
@@ -104,6 +108,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
104
108
  readonly type: "text";
105
109
  readonly description?: string;
106
110
  readonly maxLength?: number;
111
+ readonly minLength?: number;
107
112
  readonly required?: boolean;
108
113
  readonly searchable?: boolean;
109
114
  readonly sortable?: boolean;
@@ -133,12 +138,13 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
133
138
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
134
139
  readonly display?: "radio" | "dropdown";
135
140
  readonly optionTones?: {
136
- readonly invited?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
137
- readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
138
- readonly rejected?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
141
+ readonly invited?: "bad" | "neutral" | "ok" | "warn" | undefined;
142
+ readonly pending?: "bad" | "neutral" | "ok" | "warn" | undefined;
143
+ readonly rejected?: "bad" | "neutral" | "ok" | "warn" | undefined;
139
144
  } | undefined;
140
145
  readonly optionsQuery?: string;
141
146
  readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
147
+ readonly optionsAvailabilityQuery?: string;
142
148
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
143
149
  required: true;
144
150
  };
@@ -176,6 +182,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
176
182
  readonly type: "text";
177
183
  readonly description?: string;
178
184
  readonly maxLength?: number;
185
+ readonly minLength?: number;
179
186
  readonly required?: boolean;
180
187
  readonly searchable?: boolean;
181
188
  readonly sortable?: boolean;
@@ -197,6 +204,7 @@ export declare const waitlistEntryEntity: import("@cosmicdrift/kumiko-types/fiel
197
204
  readonly type: "text";
198
205
  readonly description?: string;
199
206
  readonly maxLength?: number;
207
+ readonly minLength?: number;
200
208
  readonly required?: boolean;
201
209
  readonly searchable?: boolean;
202
210
  readonly sortable?: boolean;
@@ -220,6 +228,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
220
228
  readonly type: "text";
221
229
  readonly description?: string;
222
230
  readonly maxLength?: number;
231
+ readonly minLength?: number;
223
232
  readonly required?: boolean;
224
233
  readonly searchable?: boolean;
225
234
  readonly sortable?: boolean;
@@ -241,6 +250,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
241
250
  readonly type: "text";
242
251
  readonly description?: string;
243
252
  readonly maxLength?: number;
253
+ readonly minLength?: number;
244
254
  readonly required?: boolean;
245
255
  readonly searchable?: boolean;
246
256
  readonly sortable?: boolean;
@@ -262,6 +272,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
262
272
  readonly type: "text";
263
273
  readonly description?: string;
264
274
  readonly maxLength?: number;
275
+ readonly minLength?: number;
265
276
  readonly required?: boolean;
266
277
  readonly searchable?: boolean;
267
278
  readonly sortable?: boolean;
@@ -283,6 +294,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
283
294
  readonly type: "text";
284
295
  readonly description?: string;
285
296
  readonly maxLength?: number;
297
+ readonly minLength?: number;
286
298
  readonly required?: boolean;
287
299
  readonly searchable?: boolean;
288
300
  readonly sortable?: boolean;
@@ -320,6 +332,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
320
332
  readonly type: "text";
321
333
  readonly description?: string;
322
334
  readonly maxLength?: number;
335
+ readonly minLength?: number;
323
336
  readonly required?: boolean;
324
337
  readonly searchable?: boolean;
325
338
  readonly sortable?: boolean;
@@ -349,12 +362,13 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
349
362
  readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
350
363
  readonly display?: "radio" | "dropdown";
351
364
  readonly optionTones?: {
352
- readonly invited?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
353
- readonly pending?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
354
- readonly rejected?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
365
+ readonly invited?: "bad" | "neutral" | "ok" | "warn" | undefined;
366
+ readonly pending?: "bad" | "neutral" | "ok" | "warn" | undefined;
367
+ readonly rejected?: "bad" | "neutral" | "ok" | "warn" | undefined;
355
368
  } | undefined;
356
369
  readonly optionsQuery?: string;
357
370
  readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
371
+ readonly optionsAvailabilityQuery?: string;
358
372
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
359
373
  required: true;
360
374
  };
@@ -392,6 +406,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
392
406
  readonly type: "text";
393
407
  readonly description?: string;
394
408
  readonly maxLength?: number;
409
+ readonly minLength?: number;
395
410
  readonly required?: boolean;
396
411
  readonly searchable?: boolean;
397
412
  readonly sortable?: boolean;
@@ -413,6 +428,7 @@ export declare const waitlistEntryTable: import("@cosmicdrift/kumiko-framework/d
413
428
  readonly type: "text";
414
429
  readonly description?: string;
415
430
  readonly maxLength?: number;
431
+ readonly minLength?: number;
416
432
  readonly required?: boolean;
417
433
  readonly searchable?: boolean;
418
434
  readonly sortable?: boolean;
@@ -12,7 +12,7 @@ import { describeWorkflowStepError, WORKFLOW_AGGREGATE_TYPE, WORKFLOW_RUN_FAILED
12
12
  import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
13
13
  import { workflowRunAggregateId } from "./aggregate-id.js";
14
14
  import { registerEventWakeup } from "./event-subscriber.js";
15
- import { startAndRunWorkflow } from "./runner.js";
15
+ import { startAndRunWorkflow, WorkflowSuspensionUnsupportedError, } from "./runner.js";
16
16
  import { registerWorkflow } from "./workflow-registry.js";
17
17
  const log = createFallbackLogger("workflow-runner");
18
18
  export function registerEventTrigger(r, workflow) {
@@ -83,15 +83,18 @@ export function registerEventTrigger(r, workflow) {
83
83
  });
84
84
  }
85
85
  catch (error) {
86
+ // Only the suspension error knows its step; a throw inside a step
87
+ // carries no index, so it still reports 0.
88
+ const stepIndex = error instanceof WorkflowSuspensionUnsupportedError ? error.stepIndex : 0;
86
89
  log.warn("workflow run failed", {
87
90
  runId,
88
91
  workflowName: workflow.name,
89
- stepIndex: 0,
92
+ stepIndex,
90
93
  error: String(error),
91
94
  });
92
95
  const failedPayload = {
93
96
  workflowName: workflow.name,
94
- stepIndex: 0,
97
+ stepIndex,
95
98
  error: describeWorkflowStepError(error),
96
99
  };
97
100
  await ctx.unsafeAppendEvent({
@@ -52,6 +52,9 @@ async function appendRunFailed(ctx, runId, failedPayload) {
52
52
  }
53
53
  function checkQ7Fingerprint(workflow, workflowName, runId, stepIndex, storedFingerprint) {
54
54
  const currentFingerprint = computeDefinitionFingerprint(workflow);
55
+ if (storedFingerprint === null) {
56
+ log.warn(`Run ${runId} of workflow "${workflowName}" has no stored definition fingerprint — resuming against the current definition unchecked.`);
57
+ }
55
58
  const fingerprintChanged = storedFingerprint !== null && currentFingerprint !== storedFingerprint;
56
59
  if (!fingerprintChanged) {
57
60
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-bundled-features",
3
- "version": "0.351.0",
3
+ "version": "0.353.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>",
@@ -503,12 +503,12 @@
503
503
  }
504
504
  },
505
505
  "dependencies": {
506
- "@cosmicdrift/kumiko-dispatcher-live": "0.351.0",
507
- "@cosmicdrift/kumiko-framework": "0.351.0",
508
- "@cosmicdrift/kumiko-headless": "0.351.0",
509
- "@cosmicdrift/kumiko-renderer": "0.351.0",
510
- "@cosmicdrift/kumiko-renderer-web": "0.351.0",
511
- "@cosmicdrift/kumiko-types": "0.351.0",
506
+ "@cosmicdrift/kumiko-dispatcher-live": "0.353.0",
507
+ "@cosmicdrift/kumiko-framework": "0.353.0",
508
+ "@cosmicdrift/kumiko-headless": "0.353.0",
509
+ "@cosmicdrift/kumiko-renderer": "0.353.0",
510
+ "@cosmicdrift/kumiko-renderer-web": "0.353.0",
511
+ "@cosmicdrift/kumiko-types": "0.353.0",
512
512
  "@mollie/api-client": "^4.5.0",
513
513
  "@node-rs/argon2": "^2.0.2",
514
514
  "@types/mailparser": "^3.4.6",
@@ -524,7 +524,7 @@
524
524
  "nodemailer": "^10.0.13",
525
525
  "qrcode": "^1.5.4",
526
526
  "react": "^19.2.6",
527
- "sharp": "^0.35.4",
527
+ "sharp": "^0.35.5",
528
528
  "stripe": "^22.6.2",
529
529
  "tailwind-merge": "^3.6.0",
530
530
  "temporal-polyfill": "^0.3.2",
@@ -1025,8 +1025,8 @@
1025
1025
  ],
1026
1026
  "devDependencies": {
1027
1027
  "@testing-library/user-event": "^14.6.1",
1028
- "@cosmicdrift/kumiko-locale-de": "0.351.0",
1029
- "@cosmicdrift/kumiko-locale-es": "0.351.0",
1028
+ "@cosmicdrift/kumiko-locale-de": "0.353.0",
1029
+ "@cosmicdrift/kumiko-locale-es": "0.353.0",
1030
1030
  "jsqr": "^1.4.0"
1031
1031
  }
1032
1032
  }
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "version": "0.353.0",
4
+ "type": "fix",
5
+ "title": "buildToolCatalog throws when the manifest was built with denyQns the catalog options lack",
6
+ "migration": "Pass the same denyQns list to buildAgentManifest and buildToolCatalog."
7
+ },
8
+ {
9
+ "version": "0.353.0",
10
+ "type": "fix",
11
+ "title": "Agent manifest screen titles resolve per feature instead of by mount order",
12
+ "detail": "Agent manifest screen titles no longer depend on feature mount order\nTwo features with a screen of the same short id used to get the title of whichever feature was mounted first. The manifest now looks up the screen's own feature-prefixed title key first and falls back to the unprefixed key."
13
+ },
2
14
  {
3
15
  "version": "0.338.0",
4
16
  "type": "improvement",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.353.0",
4
+ "type": "fix",
5
+ "title": "Audit list paging no longer repeats rows with ascending sort",
6
+ "detail": "Audit list pages forward without repeats when sorted ascending\n`audit:query:list` with `sortDirection: \"asc\"` returned the same rows again on the next page because the cursor always meant \"older than\". The cursor now follows the sort direction, and ties are broken by event id. Sorting by `type` returns a single page without `nextCursor`, since an event id cannot resume a type-ordered listing."
7
+ },
2
8
  {
3
9
  "version": "0.346.0",
4
10
  "type": "improvement",
@@ -1,4 +1,32 @@
1
1
  [
2
+ {
3
+ "version": "0.352.0",
4
+ "type": "breaking",
5
+ "title": "Calendar cap reservations are stored in the new store_cap_reservations table",
6
+ "detail": "Capped writes now insert and delete rows in store_cap_reservations, so they fail until the table exists.",
7
+ "migration": "Generate and apply a migration with `kumiko-schema generate` — capped writes fail without the new store_cap_reservations table"
8
+ },
9
+ {
10
+ "version": "0.352.0",
11
+ "type": "improvement",
12
+ "title": "Reservations expire after 60 minutes and are swept before the next reserve of the same cap"
13
+ },
14
+ {
15
+ "version": "0.352.0",
16
+ "type": "fix",
17
+ "title": "withCapEnforcement keeps the wrapped handler's settings (rateLimit, additionalRateLimits) and composes with an inner reserveBeforeTransaction"
18
+ },
19
+ {
20
+ "version": "0.352.0",
21
+ "type": "improvement",
22
+ "title": "withRollingCapEnforcement reserves before the handler transaction and releases through the new rolling-released event, so rejected or failed writes no longer consume rolling cap"
23
+ },
24
+ {
25
+ "version": "0.352.0",
26
+ "type": "improvement",
27
+ "title": "createValueCapGuard rejects a written number outside the min and max of the tenant's tier",
28
+ "detail": "A number written by a handler can be bounded per tier\n`createValueCapGuard(resolveTierCaps)` returns `checkValueCap` and `withValueCap`. The spec names the payload field, optional `min` and `max` functions over the tier caps (`undefined` means unbounded), an error code and an i18n key. The value is read from the payload or, for entity updates, from `changes`; an absent or non-numeric value passes. A value below the minimum or above the maximum is rejected with `UnprocessableError` and `details: { field, value, min, max }`. `withValueCap` spreads the wrapped handler, so it composes with `withCapEnforcement`."
29
+ },
2
30
  {
3
31
  "version": "0.348.0",
4
32
  "type": "fix",
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "version": "0.352.0",
4
+ "type": "breaking",
5
+ "title": "Delivery attempt log stores masked recipient addresses; attempts older than 90 days are pruned",
6
+ "detail": "The log query, the export and the stored events show masked addresses, and the feature registers the daily attempt-log-retention job.",
7
+ "migration": "Read recipients from your own data, not from the attempt log, because it only shows masked addresses now. Set `attemptLogRetentionDays` on createDeliveryFeature to another number of days, or to `false` to keep the log, if 90 days does not fit. Schedule nothing extra, the feature registers the cron job itself. Existing full-address entries are removed by the retention job once they are older than the window, or erased when their user is forgotten."
8
+ },
9
+ {
10
+ "version": "0.352.0",
11
+ "type": "improvement",
12
+ "title": "Forgetting a user erases the recipient address of their delivery attempts in plaintext mode too, through an event that survives projection rebuilds"
13
+ },
2
14
  {
3
15
  "version": "0.343.0",
4
16
  "type": "improvement",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.352.0",
4
+ "type": "fix",
5
+ "title": "sharp is bumped to 0.35.5 to pick up the librsvg security fix",
6
+ "detail": "Bump sharp to 0.35.5 (librsvg advisory GHSA-WQ5F-XC86-PV6W)"
7
+ },
2
8
  {
3
9
  "version": "0.335.0",
4
10
  "type": "fix",
@@ -1 +1,7 @@
1
- []
1
+ [
2
+ {
3
+ "version": "0.353.0",
4
+ "type": "fix",
5
+ "title": "The stale-draft cleanup keeps sweeping when a whole batch was re-saved in the meantime"
6
+ }
7
+ ]
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.352.0",
4
+ "type": "fix",
5
+ "title": "The legal-pages README imprint example uses a fictional demo identity",
6
+ "detail": "The legal-pages README seeds its imprint example with a fictional demo identity and address instead of a real person's details."
7
+ },
2
8
  {
3
9
  "version": "0.344.0",
4
10
  "type": "improvement",
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.353.0",
4
+ "type": "fix",
5
+ "title": "A rate-limited page request answers 429 with Retry-After instead of 503 or an unbranded page",
6
+ "detail": "Managed pages and sitemap answer 429 when rate limited, agent catalog checks the deny list, draft cleanup continues past skipped rows\nA rate-limited managed-page request now answers 429 with `Retry-After` instead of 503 or an unbranded page, and `sitemap.xml` and `llms.txt` answer 429 instead of silently dropping the managed-page entries. `buildToolCatalog` throws when its manifest was built with `denyQns` that the catalog options lack. The form-draft cleanup no longer stops when a whole batch was re-saved by users in the meantime."
7
+ },
2
8
  {
3
9
  "version": "0.335.0",
4
10
  "type": "fix",