@cosmicdrift/kumiko-bundled-features 0.371.1 → 0.372.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 (92) hide show
  1. package/dist/auth-mfa/db/queries.d.ts +3 -2
  2. package/dist/auth-mfa/db/queries.js +2 -5
  3. package/dist/auth-mfa/schema/user-mfa.d.ts +10 -10
  4. package/dist/billing-foundation/entities.d.ts +10 -10
  5. package/dist/billing-foundation/projection.d.ts +10 -10
  6. package/dist/cap-counter/entity.d.ts +4 -4
  7. package/dist/cap-overview/web/cap-cards-panel.js +2 -1
  8. package/dist/compliance-profiles/schema/profile-selection.d.ts +4 -4
  9. package/dist/config/table.d.ts +6 -6
  10. package/dist/config/web/index.d.ts +1 -0
  11. package/dist/config/web/index.js +1 -0
  12. package/dist/crypto-shredding/handlers/forget-subject.write.js +55 -30
  13. package/dist/crypto-shredding/resolve-file-bytes-deleter.d.ts +3 -0
  14. package/dist/crypto-shredding/resolve-file-bytes-deleter.js +24 -0
  15. package/dist/custom-fields/entity.d.ts +9 -7
  16. package/dist/custom-fields/executor.d.ts +19 -1
  17. package/dist/data-retention/index.d.ts +1 -0
  18. package/dist/data-retention/index.js +1 -0
  19. package/dist/data-retention/run-retention-cleanup.js +27 -159
  20. package/dist/data-retention/schema/tenant-retention-override.d.ts +6 -6
  21. package/dist/delivery/delivery-service.d.ts +2 -1
  22. package/dist/delivery/delivery-service.js +3 -2
  23. package/dist/delivery/handlers/unsubscribe-page-chrome.query.js +2 -2
  24. package/dist/delivery/index.d.ts +1 -1
  25. package/dist/delivery/index.js +1 -1
  26. package/dist/delivery/jobs.js +21 -7
  27. package/dist/delivery/recipient-address-seal.d.ts +13 -0
  28. package/dist/delivery/recipient-address-seal.js +53 -0
  29. package/dist/delivery/tables.d.ts +8 -7
  30. package/dist/delivery/testing.d.ts +2 -1
  31. package/dist/delivery/testing.js +1 -0
  32. package/dist/delivery/unsubscribe.d.ts +13 -2
  33. package/dist/delivery/unsubscribe.js +9 -1
  34. package/dist/document-ingest-foundation/entity.d.ts +8 -8
  35. package/dist/document-ingest-foundation/executor.d.ts +16 -1
  36. package/dist/file-foundation/read-file-ref-content.js +2 -2
  37. package/dist/folders/entity.d.ts +8 -8
  38. package/dist/folders/executor.d.ts +29 -2
  39. package/dist/form-draft/entity.d.ts +3 -3
  40. package/dist/form-draft/executor.d.ts +15 -1
  41. package/dist/inbound-mail-foundation/entities.d.ts +31 -31
  42. package/dist/inbound-mail-foundation/projection.d.ts +24 -24
  43. package/dist/jobs/job-run-table.d.ts +10 -10
  44. package/dist/ledger/entity.d.ts +21 -21
  45. package/dist/ledger/executor.d.ts +57 -3
  46. package/dist/managed-pages/table.d.ts +16 -14
  47. package/dist/notes-history/entity.d.ts +14 -14
  48. package/dist/notes-history/executor.d.ts +31 -2
  49. package/dist/personal-access-tokens/schema/api-token.d.ts +9 -9
  50. package/dist/personal-access-tokens/screens.js +14 -9
  51. package/dist/secrets/table.d.ts +2 -2
  52. package/dist/sessions/schema/user-session.d.ts +8 -8
  53. package/dist/shared/index.d.ts +2 -0
  54. package/dist/shared/index.js +2 -0
  55. package/dist/shared/purge-files-reaching-subject.d.ts +25 -0
  56. package/dist/shared/purge-files-reaching-subject.js +146 -0
  57. package/dist/shared/purge-row-file-refs.d.ts +33 -0
  58. package/dist/shared/purge-row-file-refs.js +152 -0
  59. package/dist/tags/entity.d.ts +9 -9
  60. package/dist/tags/executor.d.ts +30 -2
  61. package/dist/template-resolver/handlers/shared.d.ts +28 -1
  62. package/dist/template-resolver/table.d.ts +32 -32
  63. package/dist/template-resolver/template-preview.js +13 -4
  64. package/dist/template-resolver/user-content-table.d.ts +16 -16
  65. package/dist/template-resolver/web/client-plugin.js +2 -1
  66. package/dist/template-resolver/web/document-editor-extensions.d.ts +1 -1
  67. package/dist/template-resolver/web/document-editor-extensions.js +2 -5
  68. package/dist/template-resolver/web/placeholder-line-editor.js +2 -2
  69. package/dist/tenant/handlers/list.query.d.ts +21 -1
  70. package/dist/tenant/invitation-table.d.ts +14 -14
  71. package/dist/tenant/membership-table.d.ts +4 -4
  72. package/dist/tenant/schema/tenant.d.ts +20 -18
  73. package/dist/tier-engine/entity.d.ts +2 -2
  74. package/dist/tier-engine/tier-resolver.d.ts +2 -2
  75. package/dist/user/handlers/me.query.d.ts +21 -0
  76. package/dist/user/schema/user.d.ts +24 -22
  77. package/dist/user-data-rights/run-export-jobs.d.ts +20 -1
  78. package/dist/user-data-rights/run-forget-cleanup.js +35 -1
  79. package/dist/user-data-rights/schema/download-attempt.d.ts +16 -16
  80. package/dist/user-data-rights/schema/download-token.d.ts +16 -16
  81. package/dist/user-data-rights/schema/export-job.d.ts +20 -20
  82. package/dist/user-data-rights/web/privacy-center-screen.js +2 -1
  83. package/dist/waitlist/entity.d.ts +24 -24
  84. package/dist/waitlist/lib.d.ts +24 -1
  85. package/package.json +11 -11
  86. package/src/crypto-shredding/changes.json +6 -0
  87. package/src/data-retention/changes.json +6 -0
  88. package/src/delivery/changes.json +13 -0
  89. package/src/files/changes.json +7 -0
  90. package/src/personal-access-tokens/changes.json +12 -0
  91. package/src/template-resolver/changes.json +6 -0
  92. package/src/user-data-rights/changes.json +6 -0
@@ -28,7 +28,7 @@ export declare const USER_DELETED_EMAIL_PREFIX = "deleted";
28
28
  export declare const USER_ANONYMIZED_EMAIL_PREFIX = "anonymized";
29
29
  export declare const USER_ANONYMIZED_EMAIL_DOMAIN = "anonymized.invalid";
30
30
  export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
31
- email: {
31
+ readonly email: {
32
32
  readonly type: "text";
33
33
  readonly description?: string;
34
34
  readonly maxLength?: number;
@@ -51,7 +51,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
51
51
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
52
52
  required: true;
53
53
  };
54
- passwordHash: {
54
+ readonly passwordHash: {
55
55
  readonly type: "text";
56
56
  readonly description?: string;
57
57
  readonly maxLength?: number;
@@ -74,7 +74,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
74
74
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
75
75
  required: false;
76
76
  };
77
- displayName: {
77
+ readonly displayName: {
78
78
  readonly type: "text";
79
79
  readonly description?: string;
80
80
  readonly maxLength?: number;
@@ -97,7 +97,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
97
97
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
98
98
  required: true;
99
99
  };
100
- locale: {
100
+ readonly locale: {
101
101
  readonly type: "text";
102
102
  readonly description?: string;
103
103
  readonly maxLength?: number;
@@ -120,7 +120,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
120
120
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
121
121
  required: false;
122
122
  };
123
- timezone: {
123
+ readonly timezone: {
124
124
  readonly type: "tz";
125
125
  readonly description?: string;
126
126
  readonly required?: boolean;
@@ -129,7 +129,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
129
129
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
130
130
  required: false;
131
131
  };
132
- lastActiveTenantId: {
132
+ readonly lastActiveTenantId: {
133
133
  readonly type: "text";
134
134
  readonly description?: string;
135
135
  readonly maxLength?: number;
@@ -152,11 +152,12 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
152
152
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
153
153
  required: false;
154
154
  };
155
- emailVerified: import("@cosmicdrift/kumiko-types/fields").BooleanFieldDef & {
155
+ readonly emailVerified: import("@cosmicdrift/kumiko-types/fields").BooleanFieldDef & {
156
156
  required: false;
157
+ default: boolean;
157
158
  };
158
- roles: import("@cosmicdrift/kumiko-types/fields").MultiSelectFieldDef<readonly ["SystemAdmin"]>;
159
- status: {
159
+ readonly roles: import("@cosmicdrift/kumiko-types/fields").MultiSelectFieldDef<readonly ["SystemAdmin"]>;
160
+ readonly status: {
160
161
  readonly type: "select";
161
162
  readonly description?: string;
162
163
  readonly options: readonly ["active", "restricted", "deletionRequested", "deleted"];
@@ -180,7 +181,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
180
181
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
181
182
  required: true;
182
183
  };
183
- gracePeriodEnd: {
184
+ readonly gracePeriodEnd: {
184
185
  readonly type: "timestamp";
185
186
  readonly description?: string;
186
187
  readonly required?: boolean;
@@ -195,7 +196,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
195
196
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
196
197
  required: false;
197
198
  };
198
- pendingDeletionRequestId: {
199
+ readonly pendingDeletionRequestId: {
199
200
  readonly type: "text";
200
201
  readonly description?: string;
201
202
  readonly maxLength?: number;
@@ -220,7 +221,7 @@ export declare const userEntity: import("@cosmicdrift/kumiko-types/fields").Enti
220
221
  };
221
222
  }, "global">;
222
223
  export declare const userTable: import("@cosmicdrift/kumiko-framework/db").EntityTable<import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
223
- email: {
224
+ readonly email: {
224
225
  readonly type: "text";
225
226
  readonly description?: string;
226
227
  readonly maxLength?: number;
@@ -243,7 +244,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
243
244
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
244
245
  required: true;
245
246
  };
246
- passwordHash: {
247
+ readonly passwordHash: {
247
248
  readonly type: "text";
248
249
  readonly description?: string;
249
250
  readonly maxLength?: number;
@@ -266,7 +267,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
266
267
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
267
268
  required: false;
268
269
  };
269
- displayName: {
270
+ readonly displayName: {
270
271
  readonly type: "text";
271
272
  readonly description?: string;
272
273
  readonly maxLength?: number;
@@ -289,7 +290,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
289
290
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
290
291
  required: true;
291
292
  };
292
- locale: {
293
+ readonly locale: {
293
294
  readonly type: "text";
294
295
  readonly description?: string;
295
296
  readonly maxLength?: number;
@@ -312,7 +313,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
312
313
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
313
314
  required: false;
314
315
  };
315
- timezone: {
316
+ readonly timezone: {
316
317
  readonly type: "tz";
317
318
  readonly description?: string;
318
319
  readonly required?: boolean;
@@ -321,7 +322,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
321
322
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
322
323
  required: false;
323
324
  };
324
- lastActiveTenantId: {
325
+ readonly lastActiveTenantId: {
325
326
  readonly type: "text";
326
327
  readonly description?: string;
327
328
  readonly maxLength?: number;
@@ -344,11 +345,12 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
344
345
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
345
346
  required: false;
346
347
  };
347
- emailVerified: import("@cosmicdrift/kumiko-types/fields").BooleanFieldDef & {
348
+ readonly emailVerified: import("@cosmicdrift/kumiko-types/fields").BooleanFieldDef & {
348
349
  required: false;
350
+ default: boolean;
349
351
  };
350
- roles: import("@cosmicdrift/kumiko-types/fields").MultiSelectFieldDef<readonly ["SystemAdmin"]>;
351
- status: {
352
+ readonly roles: import("@cosmicdrift/kumiko-types/fields").MultiSelectFieldDef<readonly ["SystemAdmin"]>;
353
+ readonly status: {
352
354
  readonly type: "select";
353
355
  readonly description?: string;
354
356
  readonly options: readonly ["active", "restricted", "deletionRequested", "deleted"];
@@ -372,7 +374,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
372
374
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
373
375
  required: true;
374
376
  };
375
- gracePeriodEnd: {
377
+ readonly gracePeriodEnd: {
376
378
  readonly type: "timestamp";
377
379
  readonly description?: string;
378
380
  readonly required?: boolean;
@@ -387,7 +389,7 @@ export declare const userTable: import("@cosmicdrift/kumiko-framework/db").Entit
387
389
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
388
390
  required: false;
389
391
  };
390
- pendingDeletionRequestId: {
392
+ readonly pendingDeletionRequestId: {
391
393
  readonly type: "text";
392
394
  readonly description?: string;
393
395
  readonly maxLength?: number;
@@ -7,7 +7,26 @@ import type { getTemporal } from "@cosmicdrift/kumiko-framework/time";
7
7
  type Instant = InstanceType<ReturnType<typeof getTemporal>["Instant"]>;
8
8
  export declare const EXPORT_CLEANUP_BACKLOG_AGE_METRIC = "export_cleanup_backlog_age";
9
9
  export declare const EXPORT_CLEANUP_LAST_RUN_TIMESTAMP_METRIC = "export_cleanup_last_run_timestamp";
10
- export declare const tokenCrud: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor;
10
+ export declare const tokenCrud: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor<{
11
+ readonly id: string;
12
+ readonly tenantId: string;
13
+ readonly version: number;
14
+ readonly insertedAt: Temporal.Instant;
15
+ readonly modifiedAt: Temporal.Instant | null;
16
+ readonly insertedById: string | null;
17
+ readonly modifiedById: string | null;
18
+ readonly isDeleted?: boolean | undefined;
19
+ readonly deletedAt?: Temporal.Instant | null | undefined;
20
+ readonly deletedById?: string | null | undefined;
21
+ readonly expiresAt: Temporal.Instant;
22
+ readonly issuedAt: Temporal.Instant;
23
+ readonly jobId: string;
24
+ readonly lastUsedAt: Temporal.Instant | null;
25
+ readonly lastUsedFromIp: string | null;
26
+ readonly lastUsedUserAgent: string | null;
27
+ readonly tokenHash: string;
28
+ readonly useCount: unknown;
29
+ }>;
11
30
  /**
12
31
  * Notification-Callback fuer den done-Pfad. Pattern matched
13
32
  * auth-routes.PasswordResetConfig.sendResetEmail. Plain-Token bleibt
@@ -36,11 +36,12 @@ import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
36
36
  // retried automatisch).
37
37
  import { configuredPiiSubjectKms, subjectIdToKey, } from "@cosmicdrift/kumiko-framework/crypto";
38
38
  import { createTenantDb, entityEventName, executeRawQuery, fetchOne, nullBlindIndexesForSubject, selectMany, WritePurposes, } from "@cosmicdrift/kumiko-framework/db";
39
+ import { deleteStoredFileAndDerivatives } from "@cosmicdrift/kumiko-framework/derivatives";
39
40
  import { EXT_USER_DATA, EXT_USER_DATA_ORDER, extensionUsageEscapeHatchReason, } from "@cosmicdrift/kumiko-framework/engine";
40
41
  import { createEscapeHatchReporter, UNATTRIBUTED_ACTOR, } from "@cosmicdrift/kumiko-framework/pipeline";
41
42
  import { purgeSearchDocumentsForSubject, } from "@cosmicdrift/kumiko-framework/search";
42
43
  import { resolveRetentionPolicyForTenant, resolveTenantRetentionPreset, } from "../data-retention/index.js";
43
- import { decryptStoredPii, runInSubTransaction } from "../shared/index.js";
44
+ import { decryptStoredPii, purgeFilesReachingSubject, runInSubTransaction, } from "../shared/index.js";
44
45
  import { tenantMembershipsTable } from "../tenant/index.js";
45
46
  import { USER_STATUS, userTable } from "../user/index.js";
46
47
  import { selectUsersDueForForgetCleanup } from "./db/queries/forget-cleanup.js";
@@ -218,6 +219,22 @@ async function processUser(args) {
218
219
  const subject = { kind: "user", userId };
219
220
  await purgeSearchDocumentsForSubject(tx, registry.features, args.searchAdapter, subjectIdToKey(subject), subject);
220
221
  }
222
+ // Same ordering rationale: the files are found through the entity rows a
223
+ // hook may hard-delete, and a file whose uploader differs from the owner
224
+ // is never reached by the fileRef hook (it keys on insertedById).
225
+ await purgeFilesReachingSubject({
226
+ registry,
227
+ db: tx,
228
+ subject: { kind: "user", userId },
229
+ subjectKey: subjectIdToKey({ kind: "user", userId }),
230
+ resolveDeleteBytes: resolveForgetFileBytesDeleter(buildStorageProvider),
231
+ missingStorage: {
232
+ mode: "skip",
233
+ warn: (tenantId) =>
234
+ // biome-ignore lint/suspicious/noConsole: misconfiguration visibility, same as the fileRef delete hook
235
+ console.warn(`[user-data-rights:run-forget-cleanup] no file provider resolvable for tenantId=${tenantId} - file binaries of userId=${userId} are NOT deleted (rows kept). Mount file-foundation + a file-provider-* feature so erasure can reach the binaries.`),
236
+ },
237
+ });
221
238
  for (const tenantId of tenantList) {
222
239
  currentTenantId = tenantId;
223
240
  // Refine the app-level model to THIS tenant: "single-user" only if the
@@ -323,6 +340,23 @@ async function processUser(args) {
323
340
  tenantIdsBeforeDelete,
324
341
  };
325
342
  }
343
+ // A resolution failure collapses to "no storage" like in the fileRef delete hook; a failing
344
+ // byte delete throws through the sweep so the per-user sub-tx rolls back and the next run retries.
345
+ function resolveForgetFileBytesDeleter(buildStorageProvider) {
346
+ return async (tenantId) => {
347
+ if (!buildStorageProvider)
348
+ return undefined;
349
+ try {
350
+ const provider = await buildStorageProvider(tenantId);
351
+ return (provider &&
352
+ ((key) => deleteStoredFileAndDerivatives(key, provider, "user-data-rights:forget-cleanup")));
353
+ }
354
+ catch {
355
+ // skip: provider unresolvable (not configured) -> files skipped with a warn, like the hook
356
+ return undefined;
357
+ }
358
+ };
359
+ }
326
360
  // Pseudo-Tenant fuer User ohne aktive Memberships. RFC4122-konforme
327
361
  // Null-UUID. Tenant-scoped Hooks finden hier nichts (no-op),
328
362
  // tenant-agnostische Hooks (z.B. user) operieren auf der globalen
@@ -1,5 +1,5 @@
1
1
  export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
2
- result: {
2
+ readonly result: {
3
3
  readonly type: "text";
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
@@ -22,7 +22,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
22
22
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
23
23
  required: true;
24
24
  };
25
- via: {
25
+ readonly via: {
26
26
  readonly type: "text";
27
27
  readonly description?: string;
28
28
  readonly maxLength?: number;
@@ -45,7 +45,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
45
45
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
46
46
  required: true;
47
47
  };
48
- tokenHash: {
48
+ readonly tokenHash: {
49
49
  readonly type: "text";
50
50
  readonly description?: string;
51
51
  readonly maxLength?: number;
@@ -68,7 +68,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
68
68
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
69
69
  required: false;
70
70
  };
71
- jobId: {
71
+ readonly jobId: {
72
72
  readonly type: "text";
73
73
  readonly description?: string;
74
74
  readonly maxLength?: number;
@@ -91,7 +91,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
91
91
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
92
92
  required: false;
93
93
  };
94
- attemptedByUserId: {
94
+ readonly attemptedByUserId: {
95
95
  readonly type: "text";
96
96
  readonly description?: string;
97
97
  readonly maxLength?: number;
@@ -114,7 +114,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
114
114
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
115
115
  required: false;
116
116
  };
117
- ip: {
117
+ readonly ip: {
118
118
  readonly type: "text";
119
119
  readonly description?: string;
120
120
  readonly maxLength?: number;
@@ -137,7 +137,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
137
137
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
138
138
  required: false;
139
139
  };
140
- userAgent: {
140
+ readonly userAgent: {
141
141
  readonly type: "text";
142
142
  readonly description?: string;
143
143
  readonly maxLength?: number;
@@ -160,7 +160,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
160
160
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
161
161
  required: false;
162
162
  };
163
- attemptedAt: {
163
+ readonly attemptedAt: {
164
164
  readonly type: "timestamp";
165
165
  readonly description?: string;
166
166
  readonly required?: boolean;
@@ -177,7 +177,7 @@ export declare const downloadAttemptEntity: import("@cosmicdrift/kumiko-types/fi
177
177
  };
178
178
  }, "tenant">;
179
179
  export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framework/db").EntityTable<import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
180
- result: {
180
+ readonly result: {
181
181
  readonly type: "text";
182
182
  readonly description?: string;
183
183
  readonly maxLength?: number;
@@ -200,7 +200,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
200
200
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
201
201
  required: true;
202
202
  };
203
- via: {
203
+ readonly via: {
204
204
  readonly type: "text";
205
205
  readonly description?: string;
206
206
  readonly maxLength?: number;
@@ -223,7 +223,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
223
223
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
224
224
  required: true;
225
225
  };
226
- tokenHash: {
226
+ readonly tokenHash: {
227
227
  readonly type: "text";
228
228
  readonly description?: string;
229
229
  readonly maxLength?: number;
@@ -246,7 +246,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
246
246
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
247
247
  required: false;
248
248
  };
249
- jobId: {
249
+ readonly jobId: {
250
250
  readonly type: "text";
251
251
  readonly description?: string;
252
252
  readonly maxLength?: number;
@@ -269,7 +269,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
269
269
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
270
270
  required: false;
271
271
  };
272
- attemptedByUserId: {
272
+ readonly attemptedByUserId: {
273
273
  readonly type: "text";
274
274
  readonly description?: string;
275
275
  readonly maxLength?: number;
@@ -292,7 +292,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
292
292
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
293
293
  required: false;
294
294
  };
295
- ip: {
295
+ readonly ip: {
296
296
  readonly type: "text";
297
297
  readonly description?: string;
298
298
  readonly maxLength?: number;
@@ -315,7 +315,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
315
315
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
316
316
  required: false;
317
317
  };
318
- userAgent: {
318
+ readonly userAgent: {
319
319
  readonly type: "text";
320
320
  readonly description?: string;
321
321
  readonly maxLength?: number;
@@ -338,7 +338,7 @@ export declare const downloadAttemptsTable: import("@cosmicdrift/kumiko-framewor
338
338
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
339
339
  required: false;
340
340
  };
341
- attemptedAt: {
341
+ readonly attemptedAt: {
342
342
  readonly type: "timestamp";
343
343
  readonly description?: string;
344
344
  readonly required?: boolean;
@@ -1,5 +1,5 @@
1
1
  export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
2
- jobId: {
2
+ readonly jobId: {
3
3
  readonly type: "text";
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
@@ -22,7 +22,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
22
22
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
23
23
  required: true;
24
24
  };
25
- tokenHash: {
25
+ readonly tokenHash: {
26
26
  readonly type: "text";
27
27
  readonly description?: string;
28
28
  readonly maxLength?: number;
@@ -45,7 +45,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
45
45
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
46
46
  required: true;
47
47
  };
48
- issuedAt: {
48
+ readonly issuedAt: {
49
49
  readonly type: "timestamp";
50
50
  readonly description?: string;
51
51
  readonly required?: boolean;
@@ -60,7 +60,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
60
60
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
61
61
  required: true;
62
62
  };
63
- expiresAt: {
63
+ readonly expiresAt: {
64
64
  readonly type: "timestamp";
65
65
  readonly description?: string;
66
66
  readonly required?: boolean;
@@ -75,7 +75,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
75
75
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
76
76
  required: true;
77
77
  };
78
- lastUsedAt: {
78
+ readonly lastUsedAt: {
79
79
  readonly type: "timestamp";
80
80
  readonly description?: string;
81
81
  readonly required?: boolean;
@@ -90,7 +90,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
90
90
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
91
91
  required: false;
92
92
  };
93
- useCount: {
93
+ readonly useCount: {
94
94
  readonly type: "bigInt";
95
95
  readonly description?: string;
96
96
  readonly required?: boolean;
@@ -102,7 +102,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
102
102
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
103
103
  required: false;
104
104
  };
105
- lastUsedFromIp: {
105
+ readonly lastUsedFromIp: {
106
106
  readonly type: "text";
107
107
  readonly description?: string;
108
108
  readonly maxLength?: number;
@@ -125,7 +125,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
125
125
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
126
126
  required: false;
127
127
  };
128
- lastUsedUserAgent: {
128
+ readonly lastUsedUserAgent: {
129
129
  readonly type: "text";
130
130
  readonly description?: string;
131
131
  readonly maxLength?: number;
@@ -150,7 +150,7 @@ export declare const exportDownloadTokenEntity: import("@cosmicdrift/kumiko-type
150
150
  };
151
151
  }, "tenant">;
152
152
  export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-framework/db").EntityTable<import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
153
- jobId: {
153
+ readonly jobId: {
154
154
  readonly type: "text";
155
155
  readonly description?: string;
156
156
  readonly maxLength?: number;
@@ -173,7 +173,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
173
173
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
174
174
  required: true;
175
175
  };
176
- tokenHash: {
176
+ readonly tokenHash: {
177
177
  readonly type: "text";
178
178
  readonly description?: string;
179
179
  readonly maxLength?: number;
@@ -196,7 +196,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
196
196
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
197
197
  required: true;
198
198
  };
199
- issuedAt: {
199
+ readonly issuedAt: {
200
200
  readonly type: "timestamp";
201
201
  readonly description?: string;
202
202
  readonly required?: boolean;
@@ -211,7 +211,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
211
211
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
212
212
  required: true;
213
213
  };
214
- expiresAt: {
214
+ readonly expiresAt: {
215
215
  readonly type: "timestamp";
216
216
  readonly description?: string;
217
217
  readonly required?: boolean;
@@ -226,7 +226,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
226
226
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
227
227
  required: true;
228
228
  };
229
- lastUsedAt: {
229
+ readonly lastUsedAt: {
230
230
  readonly type: "timestamp";
231
231
  readonly description?: string;
232
232
  readonly required?: boolean;
@@ -241,7 +241,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
241
241
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
242
242
  required: false;
243
243
  };
244
- useCount: {
244
+ readonly useCount: {
245
245
  readonly type: "bigInt";
246
246
  readonly description?: string;
247
247
  readonly required?: boolean;
@@ -253,7 +253,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
253
253
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
254
254
  required: false;
255
255
  };
256
- lastUsedFromIp: {
256
+ readonly lastUsedFromIp: {
257
257
  readonly type: "text";
258
258
  readonly description?: string;
259
259
  readonly maxLength?: number;
@@ -276,7 +276,7 @@ export declare const exportDownloadTokensTable: import("@cosmicdrift/kumiko-fram
276
276
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
277
277
  required: false;
278
278
  };
279
- lastUsedUserAgent: {
279
+ readonly lastUsedUserAgent: {
280
280
  readonly type: "text";
281
281
  readonly description?: string;
282
282
  readonly maxLength?: number;