@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.
- package/dist/agent-tools/agent-manifest.js +8 -2
- package/dist/agent-tools/manifest-deny-qns.d.ts +3 -0
- package/dist/agent-tools/manifest-deny-qns.js +17 -0
- package/dist/agent-tools/tool-catalog.d.ts +2 -1
- package/dist/agent-tools/tool-catalog.js +4 -1
- package/dist/audit/handlers/list.query.js +13 -8
- package/dist/auth-email-password/handlers/signup-confirm.write.js +2 -3
- package/dist/auth-mfa/schema/user-mfa.d.ts +6 -0
- package/dist/auth-mfa/screens.js +2 -2
- package/dist/billing-foundation/checkout-core.d.ts +7 -0
- package/dist/billing-foundation/checkout-core.js +7 -2
- package/dist/billing-foundation/entities.d.ts +8 -0
- package/dist/billing-foundation/handlers/start-plan-checkout.write.js +7 -1
- package/dist/billing-foundation/projection.d.ts +8 -0
- package/dist/cap-counter/book-cap-usage.d.ts +5 -1
- package/dist/cap-counter/book-cap-usage.js +65 -44
- package/dist/cap-counter/cap-reservation.d.ts +12 -0
- package/dist/cap-counter/cap-reservation.js +135 -0
- package/dist/cap-counter/constants.d.ts +3 -0
- package/dist/cap-counter/constants.js +6 -0
- package/dist/cap-counter/entity.d.ts +1 -0
- package/dist/cap-counter/feature.js +7 -2
- package/dist/cap-counter/handlers/increment-rolling.write.d.ts +5 -0
- package/dist/cap-counter/handlers/increment-rolling.write.js +4 -0
- package/dist/cap-counter/index.d.ts +4 -2
- package/dist/cap-counter/index.js +3 -1
- package/dist/cap-counter/payload-field.d.ts +1 -0
- package/dist/cap-counter/payload-field.js +11 -0
- package/dist/cap-counter/reservation-chain.d.ts +2 -0
- package/dist/cap-counter/reservation-chain.js +44 -0
- package/dist/cap-counter/stock-cap-guard.d.ts +3 -0
- package/dist/cap-counter/tables.d.ts +3 -0
- package/dist/cap-counter/tables.js +36 -0
- package/dist/cap-counter/value-cap-guard.d.ts +18 -0
- package/dist/cap-counter/value-cap-guard.js +33 -0
- package/dist/cap-counter/with-cap-enforcement.d.ts +5 -7
- package/dist/cap-counter/with-cap-enforcement.js +35 -51
- package/dist/cap-overview/access.js +2 -9
- package/dist/cap-overview/handlers/tenant-caps-list.query.js +2 -2
- package/dist/cap-overview/handlers/tenant-options.query.js +4 -5
- package/dist/channel-discord/feature.js +1 -0
- package/dist/channel-slack/feature.js +1 -0
- package/dist/channel-teams/feature.js +1 -0
- package/dist/compliance-profiles/schema/profile-selection.d.ts +10 -8
- package/dist/compliance-profiles-ops/handlers/tenants-missing-profile.query.js +2 -4
- package/dist/config/handlers/values.query.d.ts +3 -1
- package/dist/config/handlers/values.query.js +7 -2
- package/dist/config/table.d.ts +6 -0
- package/dist/custom-fields/entity.d.ts +4 -0
- package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -0
- package/dist/delivery/attempt-log-retention.d.ts +9 -0
- package/dist/delivery/attempt-log-retention.js +23 -0
- package/dist/delivery/attempt-log.d.ts +1 -1
- package/dist/delivery/attempt-log.js +21 -2
- package/dist/delivery/constants.d.ts +1 -1
- package/dist/delivery/constants.js +1 -1
- package/dist/delivery/events.d.ts +1 -0
- package/dist/delivery/events.js +2 -0
- package/dist/delivery/feature.d.ts +1 -0
- package/dist/delivery/feature.js +39 -3
- package/dist/delivery/index.d.ts +2 -1
- package/dist/delivery/index.js +2 -1
- package/dist/delivery/mask-recipient-address.d.ts +1 -0
- package/dist/delivery/mask-recipient-address.js +41 -0
- package/dist/delivery/public-names.d.ts +2 -0
- package/dist/delivery/public-names.js +4 -1
- package/dist/delivery/tables.d.ts +6 -0
- package/dist/delivery/types.d.ts +1 -0
- package/dist/delivery/types.js +6 -2
- package/dist/document-ingest-foundation/entity.d.ts +4 -0
- package/dist/files-tenant-data/hooks.js +3 -2
- package/dist/folders/entity.d.ts +8 -0
- package/dist/folders/feature.js +2 -10
- package/dist/form-draft/db/queries/cleanup.d.ts +1 -1
- package/dist/form-draft/db/queries/cleanup.js +4 -3
- package/dist/form-draft/entity.d.ts +2 -0
- package/dist/form-draft/handlers/cleanup.job.d.ts +5 -1
- package/dist/form-draft/handlers/cleanup.job.js +11 -5
- package/dist/inbound-mail-foundation/entities.d.ts +25 -0
- package/dist/inbound-mail-foundation/projection.d.ts +20 -0
- package/dist/jobs/handlers/list.query.d.ts +2 -1
- package/dist/jobs/handlers/list.query.js +39 -14
- package/dist/jobs/i18n.js +1 -0
- package/dist/jobs/job-run-table.d.ts +6 -0
- package/dist/ledger/entity.d.ts +24 -8
- package/dist/ledger/entity.js +4 -0
- package/dist/ledger/schemas.js +8 -2
- package/dist/managed-pages/feature.js +28 -10
- package/dist/managed-pages/table.d.ts +12 -0
- package/dist/notes-history/entity.d.ts +12 -0
- package/dist/notes-history/feature.js +2 -10
- package/dist/personal-access-tokens/schema/api-token.d.ts +6 -0
- package/dist/personal-access-tokens/screens.js +14 -3
- package/dist/renderer-foundation/types.d.ts +1 -0
- package/dist/renderer-simple/feature.js +4 -6
- package/dist/renderer-simple/index.d.ts +1 -0
- package/dist/renderer-simple/mail-blocks.d.ts +21 -0
- package/dist/renderer-simple/mail-blocks.js +107 -0
- package/dist/renderer-simple/simple-renderer.js +21 -3
- package/dist/secrets/table.d.ts +1 -0
- package/dist/seo/feature.js +28 -6
- package/dist/sessions/schema/user-session.d.ts +4 -0
- package/dist/shared/assert-no-where-rule-in-ownership-write.d.ts +2 -0
- package/dist/shared/assert-no-where-rule-in-ownership-write.js +18 -0
- package/dist/shared/index.d.ts +2 -1
- package/dist/shared/index.js +2 -1
- package/dist/shared/rate-limited-text-response.d.ts +2 -0
- package/dist/shared/rate-limited-text-response.js +9 -0
- package/dist/tags/entity.d.ts +9 -0
- package/dist/tags/feature.js +2 -10
- package/dist/template-resolver/table.d.ts +48 -30
- package/dist/template-resolver/user-content-table.d.ts +34 -20
- package/dist/tenant/decrypt-tenant-names.d.ts +3 -0
- package/dist/tenant/decrypt-tenant-names.js +10 -0
- package/dist/tenant/handlers/me.query.js +5 -1
- package/dist/tenant/handlers/memberships.query.js +3 -2
- package/dist/tenant/handlers/tenant-directory.query.js +9 -3
- package/dist/tenant/index.d.ts +1 -0
- package/dist/tenant/index.js +1 -0
- package/dist/tenant/invitation-table.d.ts +16 -8
- package/dist/tenant/membership-table.d.ts +4 -0
- package/dist/tenant/schema/tenant.d.ts +18 -10
- package/dist/tenant/schema/tenant.js +4 -6
- package/dist/tenant/screens.js +1 -1
- package/dist/tenant-handover/move-entity-graph.js +11 -18
- package/dist/tenant-lifecycle/feature.js +1 -0
- package/dist/tenant-lifecycle/run-tenant-destroy.d.ts +3 -0
- package/dist/tenant-lifecycle/run-tenant-destroy.js +2 -0
- package/dist/tenant-lifecycle/stages.d.ts +2 -0
- package/dist/tenant-lifecycle/stages.js +7 -1
- package/dist/tier-engine/entity.d.ts +2 -0
- package/dist/tier-engine/index.d.ts +1 -0
- package/dist/tier-engine/index.js +1 -0
- package/dist/tier-engine/tier-option-gate.d.ts +32 -0
- package/dist/tier-engine/tier-option-gate.js +62 -0
- package/dist/tier-engine/tier-resolver.d.ts +2 -0
- package/dist/user/handlers/list.query.js +2 -2
- package/dist/user/schema/user.d.ts +22 -8
- package/dist/user-data-rights/boot-checks.js +5 -0
- package/dist/user-data-rights/handlers/confirm-deletion-by-token.write.js +2 -2
- package/dist/user-data-rights/schema/download-attempt.d.ts +14 -0
- package/dist/user-data-rights/schema/download-token.d.ts +8 -0
- package/dist/user-data-rights/schema/export-job.d.ts +16 -8
- package/dist/user-data-rights-defaults/hooks/delivery-attempt.userdata-hook.js +25 -6
- package/dist/waitlist/entity.d.ts +22 -6
- package/dist/workflow-runner/event-trigger.js +6 -3
- package/dist/workflow-runner/handlers/resume-run.write.js +3 -0
- package/package.json +10 -10
- package/src/agent-tools/changes.json +12 -0
- package/src/audit/changes.json +6 -0
- package/src/cap-counter/changes.json +28 -0
- package/src/delivery/changes.json +12 -0
- package/src/derivatives-sharp/changes.json +6 -0
- package/src/form-draft/changes.json +7 -1
- package/src/legal-pages/changes.json +6 -0
- package/src/managed-pages/changes.json +6 -0
- package/src/renderer-simple/changes.json +6 -0
- package/src/seo/changes.json +5 -0
- package/src/tenant/changes.json +7 -0
- package/src/tenant-handover/changes.json +6 -0
- package/src/tier-engine/changes.json +6 -0
- package/src/workflow-runner/changes.json +5 -0
- package/dist/shared/has-where-rule.d.ts +0 -2
- 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?:
|
|
71
|
-
readonly failed?:
|
|
72
|
-
readonly pending?:
|
|
73
|
-
readonly running?:
|
|
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?:
|
|
246
|
-
readonly failed?:
|
|
247
|
-
readonly pending?:
|
|
248
|
-
readonly running?:
|
|
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 {
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
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?:
|
|
137
|
-
readonly pending?:
|
|
138
|
-
readonly rejected?:
|
|
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?:
|
|
353
|
-
readonly pending?:
|
|
354
|
-
readonly rejected?:
|
|
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
|
|
92
|
+
stepIndex,
|
|
90
93
|
error: String(error),
|
|
91
94
|
});
|
|
92
95
|
const failedPayload = {
|
|
93
96
|
workflowName: workflow.name,
|
|
94
|
-
stepIndex
|
|
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.
|
|
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.
|
|
507
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
508
|
-
"@cosmicdrift/kumiko-headless": "0.
|
|
509
|
-
"@cosmicdrift/kumiko-renderer": "0.
|
|
510
|
-
"@cosmicdrift/kumiko-renderer-web": "0.
|
|
511
|
-
"@cosmicdrift/kumiko-types": "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.
|
|
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.
|
|
1029
|
-
"@cosmicdrift/kumiko-locale-es": "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",
|
package/src/audit/changes.json
CHANGED
|
@@ -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": "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",
|