@cosmicdrift/kumiko-bundled-features 0.371.0 → 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
@@ -275,7 +275,9 @@ function pageLocale(locale) {
275
275
  }
276
276
  /** The result page the unsubscribe routes answer with, for apps serving their own
277
277
  * (e.g. legacy) unsubscribe links. Texts come from the mail translations of `locale`;
278
- * `chrome` (the mail renderer's readMailChrome) adds the tenant's brand row and footer.
278
+ * `chrome` adds the tenant's brand row and footer: read it with
279
+ * createUnsubscribePageChromeReader for a tenant the server resolved itself (e.g. by
280
+ * Host), never for a tenantId taken from the query string or body.
279
281
  * Served under runProdApp's default CSP the style block and the same-origin font pass;
280
282
  * an https logo additionally needs its origin, e.g.
281
283
  * `securityHeaders: { csp: { extend: { "img-src": [logoOrigin] } } }`. A hand-written CSP
@@ -317,6 +319,12 @@ async function readPageChrome(deps, tenantId, locale) {
317
319
  return null;
318
320
  }
319
321
  }
322
+ /** Reads the chrome for renderUnsubscribeResultPage in an app route without
323
+ * public access: build it once in the `wire` hook from its dispatchSystemQuery.
324
+ * Null without a mail renderer or when the read fails. */
325
+ export function createUnsubscribePageChromeReader(deps) {
326
+ return (tenantId, locale) => readPageChrome(deps, tenantId, pageLocale(locale));
327
+ }
320
328
  // no-referrer on every page: the GET page carries the token in its URL, and the
321
329
  // tenant logo and site link would otherwise receive it in the Referer header.
322
330
  const PAGE_HEADERS = {
@@ -10,7 +10,7 @@ export type DocumentExtractMeta = {
10
10
  readonly totalPages: number;
11
11
  };
12
12
  export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
13
- fileRefId: {
13
+ readonly fileRefId: {
14
14
  readonly type: "text";
15
15
  readonly description?: string;
16
16
  readonly maxLength?: number;
@@ -33,7 +33,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
33
33
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
34
34
  required: true;
35
35
  };
36
- storageKey: {
36
+ readonly storageKey: {
37
37
  readonly type: "text";
38
38
  readonly description?: string;
39
39
  readonly maxLength?: number;
@@ -56,7 +56,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
56
56
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
57
57
  required: true;
58
58
  };
59
- pages: {
59
+ readonly pages: {
60
60
  readonly type: "longText";
61
61
  readonly description?: string;
62
62
  readonly maxLength?: number;
@@ -72,10 +72,10 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
72
72
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
73
73
  required: false;
74
74
  };
75
- meta: import("@cosmicdrift/kumiko-types/fields").JsonbFieldDef;
75
+ readonly meta: import("@cosmicdrift/kumiko-types/fields").JsonbFieldDef;
76
76
  }, "tenant">;
77
77
  export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framework/db").EntityTable<import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
78
- fileRefId: {
78
+ readonly fileRefId: {
79
79
  readonly type: "text";
80
80
  readonly description?: string;
81
81
  readonly maxLength?: number;
@@ -98,7 +98,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
98
98
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
99
99
  required: true;
100
100
  };
101
- storageKey: {
101
+ readonly storageKey: {
102
102
  readonly type: "text";
103
103
  readonly description?: string;
104
104
  readonly maxLength?: number;
@@ -121,7 +121,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
121
121
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
122
122
  required: true;
123
123
  };
124
- pages: {
124
+ readonly pages: {
125
125
  readonly type: "longText";
126
126
  readonly description?: string;
127
127
  readonly maxLength?: number;
@@ -137,5 +137,5 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
137
137
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
138
138
  required: false;
139
139
  };
140
- meta: import("@cosmicdrift/kumiko-types/fields").JsonbFieldDef;
140
+ readonly meta: import("@cosmicdrift/kumiko-types/fields").JsonbFieldDef;
141
141
  }, "tenant">>;
@@ -1 +1,16 @@
1
- export declare const documentExtractExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor;
1
+ export declare const documentExtractExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor<{
2
+ readonly id: string;
3
+ readonly tenantId: string;
4
+ readonly version: number;
5
+ readonly insertedAt: Temporal.Instant;
6
+ readonly modifiedAt: Temporal.Instant | null;
7
+ readonly insertedById: string | null;
8
+ readonly modifiedById: string | null;
9
+ readonly isDeleted?: boolean | undefined;
10
+ readonly deletedAt?: Temporal.Instant | null | undefined;
11
+ readonly deletedById?: string | null | undefined;
12
+ readonly fileRefId: string;
13
+ readonly meta: unknown;
14
+ readonly pages: string | null;
15
+ readonly storageKey: string;
16
+ }>;
@@ -1,6 +1,6 @@
1
1
  import { selectMany } from "@cosmicdrift/kumiko-framework/db";
2
2
  import { isUuid } from "@cosmicdrift/kumiko-framework/engine";
3
- import { createFileContext, fileRefsTable, } from "@cosmicdrift/kumiko-framework/files";
3
+ import { createTenantFileContext, fileRefsTable, } from "@cosmicdrift/kumiko-framework/files";
4
4
  // Tenant-bound on purpose: without a resolver `ctx.files` only reaches the storage of the
5
5
  // context's own tenant (`contextTenantId`), so a request for another tenant's files is
6
6
  // undefined instead of silently reading through the wrong tenant's storage.
@@ -13,7 +13,7 @@ export function fileContextForTenant(ctx, contextTenantId, tenantId) {
13
13
  export function fileContextFromResolver(resolver, tenantId) {
14
14
  // @cast-boundary engine-payload — tenantId comes from a trusted job payload or session
15
15
  const brandedTenantId = tenantId;
16
- return createFileContext(() => resolver(brandedTenantId), tenantId);
16
+ return createTenantFileContext(resolver, brandedTenantId);
17
17
  }
18
18
  export class FileRefTooLargeError extends Error {
19
19
  size;
@@ -1,6 +1,6 @@
1
1
  import { type EntityDefinition } from "@cosmicdrift/kumiko-framework/engine";
2
2
  export declare const folderEntity: EntityDefinition<{
3
- name: {
3
+ readonly name: {
4
4
  readonly type: "text";
5
5
  readonly description?: string;
6
6
  readonly maxLength?: number;
@@ -23,7 +23,7 @@ export declare const folderEntity: EntityDefinition<{
23
23
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
24
24
  required: true;
25
25
  };
26
- parentId: {
26
+ readonly parentId: {
27
27
  readonly type: "text";
28
28
  readonly description?: string;
29
29
  readonly maxLength?: number;
@@ -48,7 +48,7 @@ export declare const folderEntity: EntityDefinition<{
48
48
  };
49
49
  }, "tenant">;
50
50
  export declare function createFolderAssignmentEntity(access?: EntityDefinition["access"], parents?: readonly string[]): EntityDefinition<{
51
- folderId: {
51
+ readonly folderId: {
52
52
  readonly type: "text";
53
53
  readonly description?: string;
54
54
  readonly maxLength?: number;
@@ -71,7 +71,7 @@ export declare function createFolderAssignmentEntity(access?: EntityDefinition["
71
71
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
72
72
  required: true;
73
73
  };
74
- entityType: {
74
+ readonly entityType: {
75
75
  readonly type: "text";
76
76
  readonly description?: string;
77
77
  readonly maxLength?: number;
@@ -94,7 +94,7 @@ export declare function createFolderAssignmentEntity(access?: EntityDefinition["
94
94
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
95
95
  required: true;
96
96
  };
97
- entityId: {
97
+ readonly entityId: {
98
98
  readonly type: "text";
99
99
  readonly description?: string;
100
100
  readonly maxLength?: number;
@@ -119,7 +119,7 @@ export declare function createFolderAssignmentEntity(access?: EntityDefinition["
119
119
  };
120
120
  }, "tenant">;
121
121
  export declare const folderAssignmentEntity: EntityDefinition<{
122
- folderId: {
122
+ readonly folderId: {
123
123
  readonly type: "text";
124
124
  readonly description?: string;
125
125
  readonly maxLength?: number;
@@ -142,7 +142,7 @@ export declare const folderAssignmentEntity: EntityDefinition<{
142
142
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
143
143
  required: true;
144
144
  };
145
- entityType: {
145
+ readonly entityType: {
146
146
  readonly type: "text";
147
147
  readonly description?: string;
148
148
  readonly maxLength?: number;
@@ -165,7 +165,7 @@ export declare const folderAssignmentEntity: EntityDefinition<{
165
165
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
166
166
  required: true;
167
167
  };
168
- entityId: {
168
+ readonly entityId: {
169
169
  readonly type: "text";
170
170
  readonly description?: string;
171
171
  readonly maxLength?: number;
@@ -1,2 +1,29 @@
1
- export declare const folderExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor;
2
- export declare const folderAssignmentExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor;
1
+ export declare const folderExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor<{
2
+ readonly id: string;
3
+ readonly tenantId: string;
4
+ readonly version: number;
5
+ readonly insertedAt: Temporal.Instant;
6
+ readonly modifiedAt: Temporal.Instant | null;
7
+ readonly insertedById: string | null;
8
+ readonly modifiedById: string | null;
9
+ readonly isDeleted?: boolean | undefined;
10
+ readonly deletedAt?: Temporal.Instant | null | undefined;
11
+ readonly deletedById?: string | null | undefined;
12
+ readonly name: string;
13
+ readonly parentId: string | null;
14
+ }>;
15
+ export declare const folderAssignmentExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor<{
16
+ readonly id: string;
17
+ readonly tenantId: string;
18
+ readonly version: number;
19
+ readonly insertedAt: Temporal.Instant;
20
+ readonly modifiedAt: Temporal.Instant | null;
21
+ readonly insertedById: string | null;
22
+ readonly modifiedById: string | null;
23
+ readonly isDeleted?: boolean | undefined;
24
+ readonly deletedAt?: Temporal.Instant | null | undefined;
25
+ readonly deletedById?: string | null | undefined;
26
+ readonly entityId: string;
27
+ readonly entityType: string;
28
+ readonly folderId: string;
29
+ }>;
@@ -1,5 +1,5 @@
1
1
  export declare const formDraftEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
2
- ownerId: {
2
+ readonly ownerId: {
3
3
  readonly type: "text";
4
4
  readonly description?: string;
5
5
  readonly maxLength?: number;
@@ -22,7 +22,7 @@ export declare const formDraftEntity: import("@cosmicdrift/kumiko-types/fields")
22
22
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
23
23
  required: true;
24
24
  };
25
- draftKey: {
25
+ readonly draftKey: {
26
26
  readonly type: "text";
27
27
  readonly description?: string;
28
28
  readonly maxLength?: number;
@@ -45,5 +45,5 @@ export declare const formDraftEntity: import("@cosmicdrift/kumiko-types/fields")
45
45
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
46
46
  required: true;
47
47
  };
48
- draft: import("@cosmicdrift/kumiko-types/fields").JsonbFieldDef;
48
+ readonly draft: import("@cosmicdrift/kumiko-types/fields").JsonbFieldDef;
49
49
  }, "tenant">;
@@ -1 +1,15 @@
1
- export declare const formDraftExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor, formDraftTable: import("@cosmicdrift/kumiko-framework/db").EntityTable;
1
+ export declare const formDraftExecutor: import("@cosmicdrift/kumiko-types/event-store-executor-types").EventStoreExecutor<{
2
+ readonly id: string;
3
+ readonly tenantId: string;
4
+ readonly version: number;
5
+ readonly insertedAt: Temporal.Instant;
6
+ readonly modifiedAt: Temporal.Instant | null;
7
+ readonly insertedById: string | null;
8
+ readonly modifiedById: string | null;
9
+ readonly isDeleted?: boolean | undefined;
10
+ readonly deletedAt?: Temporal.Instant | null | undefined;
11
+ readonly deletedById?: string | null | undefined;
12
+ readonly draft: unknown;
13
+ readonly draftKey: string;
14
+ readonly ownerId: string;
15
+ }>, formDraftTable: import("@cosmicdrift/kumiko-framework/db").EntityTable;
@@ -1,7 +1,7 @@
1
1
  /** Ein verbundenes Postfach. Eine Row pro Account, PK = aggregateId
2
2
  * (= accountId, random uuid beim connect). */
3
3
  export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
4
- provider: {
4
+ readonly provider: {
5
5
  readonly type: "text";
6
6
  readonly description?: string;
7
7
  readonly maxLength?: number;
@@ -24,7 +24,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
24
24
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
25
25
  required: true;
26
26
  };
27
- authMethod: {
27
+ readonly authMethod: {
28
28
  readonly type: "text";
29
29
  readonly description?: string;
30
30
  readonly maxLength?: number;
@@ -47,7 +47,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
47
47
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
48
48
  required: true;
49
49
  };
50
- ownerUserId: {
50
+ readonly ownerUserId: {
51
51
  readonly type: "text";
52
52
  readonly description?: string;
53
53
  readonly maxLength?: number;
@@ -70,7 +70,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
70
70
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
71
71
  required: false;
72
72
  };
73
- displayName: {
73
+ readonly displayName: {
74
74
  readonly type: "text";
75
75
  readonly description?: string;
76
76
  readonly maxLength?: number;
@@ -93,7 +93,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
93
93
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
94
94
  required: false;
95
95
  };
96
- address: {
96
+ readonly address: {
97
97
  readonly type: "text";
98
98
  readonly description?: string;
99
99
  readonly maxLength?: number;
@@ -116,7 +116,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
116
116
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
117
117
  required: true;
118
118
  };
119
- status: {
119
+ readonly status: {
120
120
  readonly type: "text";
121
121
  readonly description?: string;
122
122
  readonly maxLength?: number;
@@ -139,7 +139,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
139
139
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
140
140
  required: true;
141
141
  };
142
- watchState: {
142
+ readonly watchState: {
143
143
  readonly type: "text";
144
144
  readonly description?: string;
145
145
  readonly maxLength?: number;
@@ -162,7 +162,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
162
162
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
163
163
  required: false;
164
164
  };
165
- connectedAt: {
165
+ readonly connectedAt: {
166
166
  readonly type: "timestamp";
167
167
  readonly description?: string;
168
168
  readonly required?: boolean;
@@ -182,7 +182,7 @@ export declare const mailAccountEntity: import("@cosmicdrift/kumiko-types/fields
182
182
  * zeigt auf file-foundation). PK = aggregateId =
183
183
  * inboundMessageAggregateId(accountId, providerMessageId). */
184
184
  export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
185
- accountId: {
185
+ readonly accountId: {
186
186
  readonly type: "text";
187
187
  readonly description?: string;
188
188
  readonly maxLength?: number;
@@ -205,7 +205,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
205
205
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
206
206
  required: true;
207
207
  };
208
- ownerUserId: {
208
+ readonly ownerUserId: {
209
209
  readonly type: "text";
210
210
  readonly description?: string;
211
211
  readonly maxLength?: number;
@@ -228,7 +228,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
228
228
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
229
229
  required: false;
230
230
  };
231
- messageIdHeader: {
231
+ readonly messageIdHeader: {
232
232
  readonly type: "text";
233
233
  readonly description?: string;
234
234
  readonly maxLength?: number;
@@ -251,7 +251,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
251
251
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
252
252
  required: true;
253
253
  };
254
- threadKey: {
254
+ readonly threadKey: {
255
255
  readonly type: "text";
256
256
  readonly description?: string;
257
257
  readonly maxLength?: number;
@@ -274,7 +274,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
274
274
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
275
275
  required: true;
276
276
  };
277
- from: {
277
+ readonly from: {
278
278
  readonly type: "text";
279
279
  readonly description?: string;
280
280
  readonly maxLength?: number;
@@ -297,7 +297,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
297
297
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
298
298
  required: true;
299
299
  };
300
- to: {
300
+ readonly to: {
301
301
  readonly type: "text";
302
302
  readonly description?: string;
303
303
  readonly maxLength?: number;
@@ -320,7 +320,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
320
320
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
321
321
  required: false;
322
322
  };
323
- cc: {
323
+ readonly cc: {
324
324
  readonly type: "text";
325
325
  readonly description?: string;
326
326
  readonly maxLength?: number;
@@ -343,7 +343,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
343
343
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
344
344
  required: false;
345
345
  };
346
- subject: {
346
+ readonly subject: {
347
347
  readonly type: "text";
348
348
  readonly description?: string;
349
349
  readonly maxLength?: number;
@@ -366,7 +366,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
366
366
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
367
367
  required: false;
368
368
  };
369
- snippet: {
369
+ readonly snippet: {
370
370
  readonly type: "text";
371
371
  readonly description?: string;
372
372
  readonly maxLength?: number;
@@ -389,7 +389,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
389
389
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
390
390
  required: false;
391
391
  };
392
- receivedAt: {
392
+ readonly receivedAt: {
393
393
  readonly type: "timestamp";
394
394
  readonly description?: string;
395
395
  readonly required?: boolean;
@@ -404,7 +404,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
404
404
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
405
405
  required: true;
406
406
  };
407
- bodyRef: {
407
+ readonly bodyRef: {
408
408
  readonly type: "text";
409
409
  readonly description?: string;
410
410
  readonly maxLength?: number;
@@ -427,7 +427,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
427
427
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
428
428
  required: false;
429
429
  };
430
- scope: {
430
+ readonly scope: {
431
431
  readonly type: "text";
432
432
  readonly description?: string;
433
433
  readonly maxLength?: number;
@@ -454,7 +454,7 @@ export declare const inboundMessageEntity: import("@cosmicdrift/kumiko-types/fie
454
454
  /** Thread-Rollup. PK = aggregateId = mailThreadAggregateId(tenantId,
455
455
  * threadKey). */
456
456
  export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
457
- threadKey: {
457
+ readonly threadKey: {
458
458
  readonly type: "text";
459
459
  readonly description?: string;
460
460
  readonly maxLength?: number;
@@ -477,7 +477,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
477
477
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
478
478
  required: true;
479
479
  };
480
- subject: {
480
+ readonly subject: {
481
481
  readonly type: "text";
482
482
  readonly description?: string;
483
483
  readonly maxLength?: number;
@@ -500,7 +500,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
500
500
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
501
501
  required: false;
502
502
  };
503
- lastMessageAt: {
503
+ readonly lastMessageAt: {
504
504
  readonly type: "timestamp";
505
505
  readonly description?: string;
506
506
  readonly required?: boolean;
@@ -515,7 +515,7 @@ export declare const mailThreadEntity: import("@cosmicdrift/kumiko-types/fields"
515
515
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
516
516
  required: true;
517
517
  };
518
- messageCount: {
518
+ readonly messageCount: {
519
519
  readonly type: "number";
520
520
  readonly description?: string;
521
521
  readonly required?: boolean;
@@ -543,7 +543,7 @@ export declare const MAIL_THREAD_PII_FIELDS: readonly string[];
543
543
  * Write-locked auf privileged — nur Foundation-Handler/Supervisor
544
544
  * schreiben, kein Tenant-Request. */
545
545
  export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
546
- accountId: {
546
+ readonly accountId: {
547
547
  readonly type: "text";
548
548
  readonly description?: string;
549
549
  readonly maxLength?: number;
@@ -566,7 +566,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
566
566
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
567
567
  required: true;
568
568
  };
569
- scope: {
569
+ readonly scope: {
570
570
  readonly type: "text";
571
571
  readonly description?: string;
572
572
  readonly maxLength?: number;
@@ -589,7 +589,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
589
589
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
590
590
  required: true;
591
591
  };
592
- cursor: {
592
+ readonly cursor: {
593
593
  readonly type: "text";
594
594
  readonly description?: string;
595
595
  readonly maxLength?: number;
@@ -612,7 +612,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
612
612
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
613
613
  required: true;
614
614
  };
615
- updatedAt: {
615
+ readonly updatedAt: {
616
616
  readonly type: "timestamp";
617
617
  readonly description?: string;
618
618
  readonly required?: boolean;
@@ -633,7 +633,7 @@ export declare const syncCursorEntity: import("@cosmicdrift/kumiko-types/fields"
633
633
  * ingest-handler prüft zuerst hier (cheap), der Stream-Scan bleibt
634
634
  * Defense-in-depth. */
635
635
  export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields").EntityDefinition<{
636
- accountId: {
636
+ readonly accountId: {
637
637
  readonly type: "text";
638
638
  readonly description?: string;
639
639
  readonly maxLength?: number;
@@ -656,7 +656,7 @@ export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields
656
656
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
657
657
  required: true;
658
658
  };
659
- providerMessageId: {
659
+ readonly providerMessageId: {
660
660
  readonly type: "text";
661
661
  readonly description?: string;
662
662
  readonly maxLength?: number;
@@ -679,7 +679,7 @@ export declare const seenMessageEntity: import("@cosmicdrift/kumiko-types/fields
679
679
  } & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
680
680
  required: true;
681
681
  };
682
- seenAt: {
682
+ readonly seenAt: {
683
683
  readonly type: "timestamp";
684
684
  readonly description?: string;
685
685
  readonly required?: boolean;