@ttt-productions/ttt-core 0.14.1 → 0.14.3

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 (73) hide show
  1. package/dist/doc-schemas/chat-sync.d.ts +173 -0
  2. package/dist/doc-schemas/chat-sync.d.ts.map +1 -0
  3. package/dist/doc-schemas/chat-sync.js +130 -0
  4. package/dist/doc-schemas/chat-sync.js.map +1 -0
  5. package/dist/doc-schemas/commissions.js +1 -1
  6. package/dist/doc-schemas/commissions.js.map +1 -1
  7. package/dist/doc-schemas/content.js +1 -1
  8. package/dist/doc-schemas/content.js.map +1 -1
  9. package/dist/doc-schemas/firestore-primitives.d.ts +11 -0
  10. package/dist/doc-schemas/firestore-primitives.d.ts.map +1 -0
  11. package/dist/doc-schemas/firestore-primitives.js +27 -0
  12. package/dist/doc-schemas/firestore-primitives.js.map +1 -0
  13. package/dist/doc-schemas/index.d.ts +4 -0
  14. package/dist/doc-schemas/index.d.ts.map +1 -1
  15. package/dist/doc-schemas/index.js +4 -0
  16. package/dist/doc-schemas/index.js.map +1 -1
  17. package/dist/doc-schemas/media-activation-jobs.d.ts +120 -0
  18. package/dist/doc-schemas/media-activation-jobs.d.ts.map +1 -0
  19. package/dist/doc-schemas/media-activation-jobs.js +53 -0
  20. package/dist/doc-schemas/media-activation-jobs.js.map +1 -0
  21. package/dist/doc-schemas/media-assets.d.ts +136 -0
  22. package/dist/doc-schemas/media-assets.d.ts.map +1 -1
  23. package/dist/doc-schemas/media-assets.js +76 -0
  24. package/dist/doc-schemas/media-assets.js.map +1 -1
  25. package/dist/doc-schemas/moderation.d.ts +7 -0
  26. package/dist/doc-schemas/moderation.d.ts.map +1 -1
  27. package/dist/doc-schemas/notification-ledger.d.ts +78 -0
  28. package/dist/doc-schemas/notification-ledger.d.ts.map +1 -0
  29. package/dist/doc-schemas/notification-ledger.js +63 -0
  30. package/dist/doc-schemas/notification-ledger.js.map +1 -0
  31. package/dist/doc-schemas/notifications.d.ts +4 -0
  32. package/dist/doc-schemas/notifications.d.ts.map +1 -1
  33. package/dist/doc-schemas/notifications.js +5 -0
  34. package/dist/doc-schemas/notifications.js.map +1 -1
  35. package/dist/doc-schemas/registry.d.ts +444 -0
  36. package/dist/doc-schemas/registry.d.ts.map +1 -1
  37. package/dist/doc-schemas/registry.js +15 -0
  38. package/dist/doc-schemas/registry.js.map +1 -1
  39. package/dist/doc-schemas/social.js +5 -5
  40. package/dist/doc-schemas/social.js.map +1 -1
  41. package/dist/doc-schemas/user.d.ts +6 -0
  42. package/dist/doc-schemas/user.d.ts.map +1 -1
  43. package/dist/doc-schemas/user.js +8 -1
  44. package/dist/doc-schemas/user.js.map +1 -1
  45. package/dist/doc-schemas/work-project.d.ts +1 -0
  46. package/dist/doc-schemas/work-project.d.ts.map +1 -1
  47. package/dist/doc-schemas/work-project.js +9 -0
  48. package/dist/doc-schemas/work-project.js.map +1 -1
  49. package/dist/ids/chat-ids.d.ts +67 -0
  50. package/dist/ids/chat-ids.d.ts.map +1 -0
  51. package/dist/ids/chat-ids.js +119 -0
  52. package/dist/ids/chat-ids.js.map +1 -0
  53. package/dist/ids/index.d.ts +2 -0
  54. package/dist/ids/index.d.ts.map +1 -0
  55. package/dist/ids/index.js +2 -0
  56. package/dist/ids/index.js.map +1 -0
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +1 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/media/pending-media.d.ts +112 -0
  62. package/dist/media/pending-media.d.ts.map +1 -1
  63. package/dist/paths/collections.d.ts +10 -0
  64. package/dist/paths/collections.d.ts.map +1 -1
  65. package/dist/paths/collections.js +13 -0
  66. package/dist/paths/collections.js.map +1 -1
  67. package/dist/paths/path-builders.d.ts +10 -0
  68. package/dist/paths/path-builders.d.ts.map +1 -1
  69. package/dist/paths/path-builders.js +13 -0
  70. package/dist/paths/path-builders.js.map +1 -1
  71. package/dist/types/audit.d.ts +1 -1
  72. package/dist/types/audit.d.ts.map +1 -1
  73. package/package.json +3 -2
@@ -0,0 +1,53 @@
1
+ // mediaActivationJobs/{jobId} — the durable job that drives the three-stage
2
+ // finalize (prepare → activate → publish) and its crash recovery. Created in the
3
+ // SAME private prepare transaction as mediaAssets/{assetId}; attempted
4
+ // immediately and re-driven by a scheduled recovery worker. Server-only
5
+ // (`allow read, write: if false`); NO client access.
6
+ //
7
+ // See MEDIA_AUTHORITY_DO_DESIGN.md §9 (job), §10 (three-stage finalize),
8
+ // §11 (publication adapters), §17 (reconcile).
9
+ //
10
+ // jobId = hash('media-activation', assetId, authorityVersion) (edge-protocol-core
11
+ // canonical hash family; collision-safe per the frozen ID rules).
12
+ import { z } from 'zod';
13
+ import { StructuredErrorSchema } from '@ttt-productions/edge-protocol-core';
14
+ import { FileOriginSchema } from '../media/file-origin.js';
15
+ import { FirestoreTimestampSchema } from './firestore-primitives.js';
16
+ import { MediaPublicationKindSchema, MediaServingAuthorityRecordSchema, } from './media-assets.js';
17
+ export const MediaActivationJobStatusSchema = z.enum([
18
+ 'pending', // call the signed activation endpoint, verify the ack, CAS → authorityApplied
19
+ 'authorityApplied', // call the typed publication adapter, on success CAS → complete
20
+ 'complete', // owner published; TTL eligible
21
+ 'deadLetter', // retries exhausted — retained for operator replay; user sees publication-failed
22
+ ]);
23
+ export const MediaActivationJobSchema = z
24
+ .object({
25
+ jobId: z.string().min(1),
26
+ schemaVersion: z.number().int().positive(),
27
+ assetId: z.string().min(1),
28
+ pendingMediaId: z.string().min(1),
29
+ fileOrigin: FileOriginSchema,
30
+ // The exact serving record this job activates — the DO must ack this exact
31
+ // version + payloadHash before publication may proceed.
32
+ authorityVersion: z.number().int().nonnegative(),
33
+ payloadHash: z.string().min(1),
34
+ authorityPayload: MediaServingAuthorityRecordSchema,
35
+ // Typed publication adapter. `publicationArgs` is forward-validated by the
36
+ // per-kind adapter registry (§11, built in M2) — NEVER arbitrary Firestore
37
+ // writes; the job carries typed data, not serialized writes.
38
+ publicationKind: MediaPublicationKindSchema,
39
+ publicationArgs: z.unknown(),
40
+ status: MediaActivationJobStatusSchema,
41
+ attemptCount: z.number().int().nonnegative(),
42
+ nextAttemptAt: FirestoreTimestampSchema,
43
+ lastError: StructuredErrorSchema.optional(),
44
+ createdAt: FirestoreTimestampSchema,
45
+ authorityAppliedAt: FirestoreTimestampSchema.optional(),
46
+ completedAt: FirestoreTimestampSchema.optional(),
47
+ deadLetteredAt: FirestoreTimestampSchema.optional(),
48
+ // TTL set ONLY at `complete`; NEVER on pending/authorityApplied/deadLetter.
49
+ // Replay clears terminal/TTL fields (frozen matrix rule).
50
+ expireAt: FirestoreTimestampSchema.optional(),
51
+ })
52
+ .strict();
53
+ //# sourceMappingURL=media-activation-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-activation-jobs.js","sourceRoot":"","sources":["../../src/doc-schemas/media-activation-jobs.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,iFAAiF;AACjF,uEAAuE;AACvE,wEAAwE;AACxE,qDAAqD;AACrD,EAAE;AACF,yEAAyE;AACzE,+CAA+C;AAC/C,EAAE;AACF,mFAAmF;AACnF,kEAAkE;AAElE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,GAClC,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,IAAI,CAAC;IACnD,SAAS,EAAE,8EAA8E;IACzF,kBAAkB,EAAE,gEAAgE;IACpF,UAAU,EAAE,gCAAgC;IAC5C,YAAY,EAAE,iFAAiF;CAChG,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAE1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,UAAU,EAAE,gBAAgB;IAE5B,2EAA2E;IAC3E,wDAAwD;IACxD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,gBAAgB,EAAE,iCAAiC;IAEnD,2EAA2E;IAC3E,2EAA2E;IAC3E,6DAA6D;IAC7D,eAAe,EAAE,0BAA0B;IAC3C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;IAE5B,MAAM,EAAE,8BAA8B;IACtC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC5C,aAAa,EAAE,wBAAwB;IACvC,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAE3C,SAAS,EAAE,wBAAwB;IACnC,kBAAkB,EAAE,wBAAwB,CAAC,QAAQ,EAAE;IACvD,WAAW,EAAE,wBAAwB,CAAC,QAAQ,EAAE;IAChD,cAAc,EAAE,wBAAwB,CAAC,QAAQ,EAAE;IACnD,4EAA4E;IAC5E,0DAA0D;IAC1D,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,EAAE;CAC9C,CAAC;KACD,MAAM,EAAE,CAAC"}
@@ -56,6 +56,113 @@ export declare const RealmPromotionStatusSchema: z.ZodEnum<{
56
56
  promoted: "promoted";
57
57
  }>;
58
58
  export type RealmPromotionStatus = z.infer<typeof RealmPromotionStatusSchema>;
59
+ /** Whether the canonical serving record has been applied to the DO authority. */
60
+ export declare const MediaAuthoritySyncStateSchema: z.ZodEnum<{
61
+ pending: "pending";
62
+ deadLetter: "deadLetter";
63
+ applied: "applied";
64
+ }>;
65
+ export type MediaAuthoritySyncState = z.infer<typeof MediaAuthoritySyncStateSchema>;
66
+ /** Whether the asset is referenced by a visible owner doc. Orthogonal to the
67
+ * upload's processing outcome (`pendingMedia.status`) and to `servingStatus`. */
68
+ export declare const MediaAssetPublicationStateSchema: z.ZodEnum<{
69
+ unpublished: "unpublished";
70
+ published: "published";
71
+ retired: "retired";
72
+ }>;
73
+ export type MediaAssetPublicationState = z.infer<typeof MediaAssetPublicationStateSchema>;
74
+ /**
75
+ * Typed immutable serving scope for scoped-tier assets. Guild-chat attachments
76
+ * carry an EXACT channel/invite scope — NEVER a bare matchable `workProjectId`
77
+ * (a whole-Work `{w}` grant must not match a restricted channel's attachment).
78
+ * Frozen in chat-realtime-system.md Contract E ("Chat attachment authorization").
79
+ * `null` scope = no scope match required beyond the access tier (e.g. broad).
80
+ */
81
+ export declare const MediaServingScopeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
82
+ kind: z.ZodLiteral<"guildChannel">;
83
+ workProjectId: z.ZodString;
84
+ guildChatChannelId: z.ZodString;
85
+ }, z.core.$strict>, z.ZodObject<{
86
+ kind: z.ZodLiteral<"guildInvite">;
87
+ guildInviteId: z.ZodString;
88
+ }, z.core.$strict>], "kind">;
89
+ export type MediaServingScope = z.infer<typeof MediaServingScopeSchema>;
90
+ /**
91
+ * The typed owner adapter a publication goes through (§11). The activation job
92
+ * carries this kind; a server-side registry validates per-kind `publicationArgs`
93
+ * and performs the idempotent owner write. Chat is the non-Firestore-owner
94
+ * adapter (publishes via its durable attachmentFlip ack, not an owner txn).
95
+ */
96
+ export declare const MediaPublicationKindSchema: z.ZodEnum<{
97
+ profilePicture: "profilePicture";
98
+ squarePostMedia: "squarePostMedia";
99
+ workAsset: "workAsset";
100
+ hallCover: "hallCover";
101
+ auditionMedia: "auditionMedia";
102
+ commissionListingMedia: "commissionListingMedia";
103
+ commissionProposalMedia: "commissionProposalMedia";
104
+ craftSkillMedia: "craftSkillMedia";
105
+ chatAttachment: "chatAttachment";
106
+ }>;
107
+ export type MediaPublicationKind = z.infer<typeof MediaPublicationKindSchema>;
108
+ /**
109
+ * The normalized serving record (§7) — the SAME contract used to generate both
110
+ * the DO authority row and the KV cache payload (one function, so they can't
111
+ * drift). The R2 object key stays deterministic (`mediaAssets/{assetId}/{key}`)
112
+ * and is NOT persisted here. `payloadHash` is computed over the canonical
113
+ * payload EXCLUDING the hash itself (see edge-protocol-core `hashPayload`).
114
+ */
115
+ export declare const MediaServingAuthorityRecordSchema: z.ZodObject<{
116
+ schemaVersion: z.ZodNumber;
117
+ assetId: z.ZodString;
118
+ authorityVersion: z.ZodNumber;
119
+ operationId: z.ZodString;
120
+ payloadHash: z.ZodString;
121
+ servingStatus: z.ZodEnum<{
122
+ hidden: "hidden";
123
+ servable: "servable";
124
+ quarantined: "quarantined";
125
+ deleted: "deleted";
126
+ }>;
127
+ accessTier: z.ZodEnum<{
128
+ broad: "broad";
129
+ scoped: "scoped";
130
+ artisan: "artisan";
131
+ adminOnly: "adminOnly";
132
+ }>;
133
+ ownerType: z.ZodEnum<{
134
+ workProject: "workProject";
135
+ audition: "audition";
136
+ craftSkill: "craftSkill";
137
+ hallItem: "hallItem";
138
+ userProfile: "userProfile";
139
+ squareStreetzPost: "squareStreetzPost";
140
+ workContent: "workContent";
141
+ commissionListing: "commissionListing";
142
+ commissionProposal: "commissionProposal";
143
+ auditionEntry: "auditionEntry";
144
+ guildChatAttachment: "guildChatAttachment";
145
+ realmFile: "realmFile";
146
+ }>;
147
+ ownerId: z.ZodString;
148
+ scope: z.ZodNullable<z.ZodDiscriminatedUnion<[z.ZodObject<{
149
+ kind: z.ZodLiteral<"guildChannel">;
150
+ workProjectId: z.ZodString;
151
+ guildChatChannelId: z.ZodString;
152
+ }, z.core.$strict>, z.ZodObject<{
153
+ kind: z.ZodLiteral<"guildInvite">;
154
+ guildInviteId: z.ZodString;
155
+ }, z.core.$strict>], "kind">>;
156
+ variants: z.ZodRecord<z.ZodString, z.ZodObject<{
157
+ contentType: z.ZodString;
158
+ sizeBytes: z.ZodNumber;
159
+ width: z.ZodOptional<z.ZodNumber>;
160
+ height: z.ZodOptional<z.ZodNumber>;
161
+ durationSec: z.ZodOptional<z.ZodNumber>;
162
+ }, z.core.$strict>>;
163
+ updatedAtMs: z.ZodNumber;
164
+ }, z.core.$strict>;
165
+ export type MediaServingAuthorityRecord = z.infer<typeof MediaServingAuthorityRecordSchema>;
59
166
  export declare const MediaAssetSchema: z.ZodObject<{
60
167
  mediaAssetId: z.ZodString;
61
168
  mediaKind: z.ZodEnum<{
@@ -141,6 +248,35 @@ export declare const MediaAssetSchema: z.ZodObject<{
141
248
  realmPromotionNote: z.ZodOptional<z.ZodString>;
142
249
  realmPromotionRequestedByUid: z.ZodOptional<z.ZodString>;
143
250
  realmPromotionRequestedAt: z.ZodOptional<z.ZodNumber>;
251
+ authorityVersion: z.ZodOptional<z.ZodNumber>;
252
+ authorityPayloadHash: z.ZodOptional<z.ZodString>;
253
+ authoritySyncState: z.ZodOptional<z.ZodEnum<{
254
+ pending: "pending";
255
+ deadLetter: "deadLetter";
256
+ applied: "applied";
257
+ }>>;
258
+ publicationState: z.ZodOptional<z.ZodEnum<{
259
+ unpublished: "unpublished";
260
+ published: "published";
261
+ retired: "retired";
262
+ }>>;
263
+ scope: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
264
+ kind: z.ZodLiteral<"guildChannel">;
265
+ workProjectId: z.ZodString;
266
+ guildChatChannelId: z.ZodString;
267
+ }, z.core.$strict>, z.ZodObject<{
268
+ kind: z.ZodLiteral<"guildInvite">;
269
+ guildInviteId: z.ZodString;
270
+ }, z.core.$strict>], "kind">>;
271
+ authorityAppliedAt: z.ZodOptional<z.ZodNumber>;
272
+ publishedAt: z.ZodOptional<z.ZodNumber>;
273
+ lastAuthorityError: z.ZodOptional<z.ZodObject<{
274
+ code: z.ZodString;
275
+ message: z.ZodString;
276
+ retryable: z.ZodOptional<z.ZodBoolean>;
277
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
278
+ at: z.ZodOptional<z.ZodNumber>;
279
+ }, z.core.$strict>>;
144
280
  createdAt: z.ZodNumber;
145
281
  updatedAt: z.ZodNumber;
146
282
  }, z.core.$strict>;
@@ -1 +1 @@
1
- {"version":3,"file":"media-assets.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/media-assets.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB;;;;;EAAsD,CAAC;AACzF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;4DAC4D;AAC5D,eAAO,MAAM,wBAAwB;;;;;EAA2D,CAAC;AACjG,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;uCAEuC;AACvC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;EAapC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,uBAAuB;;;;;;kBAMzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,0BAA0B;;;;EAIrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmClB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"media-assets.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/media-assets.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB;;;;;EAAsD,CAAC;AACzF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;4DAC4D;AAC5D,eAAO,MAAM,wBAAwB;;;;;EAA2D,CAAC;AACjG,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;uCAEuC;AACvC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;EAapC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,uBAAuB;;;;;;kBAMzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,0BAA0B;;;;EAIrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAK9E,iFAAiF;AACjF,eAAO,MAAM,6BAA6B;;;;EAA+C,CAAC;AAC1F,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF;iFACiF;AACjF,eAAO,MAAM,gCAAgC;;;;EAAkD,CAAC;AAChG,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;;;4BAUlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;EAUrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAiBnC,CAAC;AACZ,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAgDlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -5,6 +5,7 @@
5
5
  // truth the edge records derive from. NO client reads, NO client writes.
6
6
  // See ttt-prod docs/design/media-assets-and-protected-serving.md.
7
7
  import { z } from 'zod';
8
+ import { StructuredErrorSchema } from '@ttt-productions/edge-protocol-core';
8
9
  import { FileOriginSchema } from '../media/file-origin.js';
9
10
  /** Who may be served the bytes (the Worker's tier check). */
10
11
  export const MediaAccessTierSchema = z.enum(['broad', 'scoped', 'artisan', 'adminOnly']);
@@ -43,6 +44,69 @@ export const MediaRetentionPolicySchema = z.enum([
43
44
  export const RealmPromotionStatusSchema = z.enum([
44
45
  'none', 'candidate', 'pendingReview', 'promoted', 'rejected',
45
46
  ]);
47
+ // ===== Serving authority (Durable Object) + publication gating =====
48
+ // See MEDIA_AUTHORITY_DO_DESIGN.md §6–§9/§13 and media-assets-and-protected-serving.md.
49
+ /** Whether the canonical serving record has been applied to the DO authority. */
50
+ export const MediaAuthoritySyncStateSchema = z.enum(['pending', 'applied', 'deadLetter']);
51
+ /** Whether the asset is referenced by a visible owner doc. Orthogonal to the
52
+ * upload's processing outcome (`pendingMedia.status`) and to `servingStatus`. */
53
+ export const MediaAssetPublicationStateSchema = z.enum(['unpublished', 'published', 'retired']);
54
+ /**
55
+ * Typed immutable serving scope for scoped-tier assets. Guild-chat attachments
56
+ * carry an EXACT channel/invite scope — NEVER a bare matchable `workProjectId`
57
+ * (a whole-Work `{w}` grant must not match a restricted channel's attachment).
58
+ * Frozen in chat-realtime-system.md Contract E ("Chat attachment authorization").
59
+ * `null` scope = no scope match required beyond the access tier (e.g. broad).
60
+ */
61
+ export const MediaServingScopeSchema = z.discriminatedUnion('kind', [
62
+ z.object({
63
+ kind: z.literal('guildChannel'),
64
+ workProjectId: z.string().min(1),
65
+ guildChatChannelId: z.string().min(1),
66
+ }).strict(),
67
+ z.object({
68
+ kind: z.literal('guildInvite'),
69
+ guildInviteId: z.string().min(1),
70
+ }).strict(),
71
+ ]);
72
+ /**
73
+ * The typed owner adapter a publication goes through (§11). The activation job
74
+ * carries this kind; a server-side registry validates per-kind `publicationArgs`
75
+ * and performs the idempotent owner write. Chat is the non-Firestore-owner
76
+ * adapter (publishes via its durable attachmentFlip ack, not an owner txn).
77
+ */
78
+ export const MediaPublicationKindSchema = z.enum([
79
+ 'profilePicture',
80
+ 'squarePostMedia',
81
+ 'workAsset',
82
+ 'hallCover',
83
+ 'auditionMedia',
84
+ 'commissionListingMedia',
85
+ 'commissionProposalMedia',
86
+ 'craftSkillMedia',
87
+ 'chatAttachment',
88
+ ]);
89
+ /**
90
+ * The normalized serving record (§7) — the SAME contract used to generate both
91
+ * the DO authority row and the KV cache payload (one function, so they can't
92
+ * drift). The R2 object key stays deterministic (`mediaAssets/{assetId}/{key}`)
93
+ * and is NOT persisted here. `payloadHash` is computed over the canonical
94
+ * payload EXCLUDING the hash itself (see edge-protocol-core `hashPayload`).
95
+ */
96
+ export const MediaServingAuthorityRecordSchema = z.object({
97
+ schemaVersion: z.number().int().positive(),
98
+ assetId: z.string().min(1),
99
+ authorityVersion: z.number().int().nonnegative(),
100
+ operationId: z.string().min(1),
101
+ payloadHash: z.string().min(1),
102
+ servingStatus: MediaServingStatusSchema,
103
+ accessTier: MediaAccessTierSchema,
104
+ ownerType: MediaAssetOwnerTypeSchema,
105
+ ownerId: z.string().min(1),
106
+ scope: MediaServingScopeSchema.nullable(),
107
+ variants: z.record(z.string(), MediaAssetVariantSchema),
108
+ updatedAtMs: z.number(),
109
+ }).strict();
46
110
  export const MediaAssetSchema = z.object({
47
111
  mediaAssetId: z.string().min(1),
48
112
  mediaKind: z.enum(['image', 'video', 'audio']),
@@ -70,6 +134,18 @@ export const MediaAssetSchema = z.object({
70
134
  realmPromotionNote: z.string().max(2000).optional(),
71
135
  realmPromotionRequestedByUid: z.string().optional(),
72
136
  realmPromotionRequestedAt: z.number().optional(),
137
+ // Serving authority + publication gating (§13). Additive/optional so assets
138
+ // written before the authority build still parse: absent authorityVersion ⇒
139
+ // 0/never-applied, absent publicationState ⇒ 'unpublished'. Every
140
+ // serving-record mutation increments authorityVersion in an authoritative txn.
141
+ authorityVersion: z.number().int().nonnegative().optional(),
142
+ authorityPayloadHash: z.string().optional(),
143
+ authoritySyncState: MediaAuthoritySyncStateSchema.optional(),
144
+ publicationState: MediaAssetPublicationStateSchema.optional(),
145
+ scope: MediaServingScopeSchema.optional(),
146
+ authorityAppliedAt: z.number().optional(),
147
+ publishedAt: z.number().optional(),
148
+ lastAuthorityError: StructuredErrorSchema.optional(),
73
149
  createdAt: z.number(),
74
150
  updatedAt: z.number(),
75
151
  }).strict();
@@ -1 +1 @@
1
- {"version":3,"file":"media-assets.js","sourceRoot":"","sources":["../../src/doc-schemas/media-assets.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,2EAA2E;AAC3E,yEAAyE;AACzE,4EAA4E;AAC5E,yEAAyE;AACzE,kEAAkE;AAElE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAGzF;4DAC4D;AAC5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAGjG;;uCAEuC;AACvC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC9C,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,aAAa,EAAE,qEAAqE;IACpF,UAAU;IACV,mBAAmB;IACnB,oBAAoB;IACpB,UAAU;IACV,eAAe;IACf,qBAAqB;IACrB,WAAW,EAAE,qDAAqD;CACnE,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/C,UAAU,EAAE,sDAAsD;IAClE,2BAA2B;IAC3B,WAAW;CACZ,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;CAC7D,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,UAAU,EAAE,gBAAgB;IAE5B,uEAAuE;IACvE,qEAAqE;IACrE,SAAS,EAAE,yBAAyB;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/B,gEAAgE;IAChE,UAAU,EAAE,qBAAqB;IACjC,aAAa,EAAE,wBAAwB;IAEvC,sEAAsE;IACtE,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC;IAEvD,gCAAgC;IAChC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACrD,eAAe,EAAE,0BAA0B;IAC3C,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAExC,sDAAsD;IACtD,oBAAoB,EAAE,0BAA0B;IAChD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACnD,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnD,yBAAyB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEhD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"media-assets.js","sourceRoot":"","sources":["../../src/doc-schemas/media-assets.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,13 @@ export declare const ContentViolationSchema: z.ZodObject<{
58
58
  surface: z.ZodString;
59
59
  targetIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
60
60
  }, z.core.$strict>>;
61
+ publicationState: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
62
+ notStarted: "notStarted";
63
+ activating: "activating";
64
+ publishing: "publishing";
65
+ live: "live";
66
+ publicationFailed: "publicationFailed";
67
+ }>>>;
61
68
  createdAt: z.ZodOptional<z.ZodNumber>;
62
69
  updatedAt: z.ZodOptional<z.ZodNumber>;
63
70
  processingStartedAt: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
@@ -1 +1 @@
1
- {"version":3,"file":"moderation.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/moderation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,6BAA6B;;;;;EAAmE,CAAC;AAC9G,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,6BAA6B;;;;EAA4C,CAAC;AACvF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,wCAAwC;;;;;EAKnD,CAAC;AACH,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wCAAwC,CAAC,CAAC;AAI1G,eAAO,MAAM,yCAAyC;;;EAAuC,CAAC;AAC9F,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yCAAyC,CAAC,CAAC;AAE5G,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;iBAU1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;iBAQ5C,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC"}
1
+ {"version":3,"file":"moderation.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/moderation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,6BAA6B;;;;;EAAmE,CAAC;AAC9G,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,6BAA6B;;;;EAA4C,CAAC;AACvF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,wCAAwC;;;;;EAKnD,CAAC;AACH,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wCAAwC,CAAC,CAAC;AAI1G,eAAO,MAAM,yCAAyC;;;EAAuC,CAAC;AAC9F,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yCAAyC,CAAC,CAAC;AAE5G,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;iBAU1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;iBAQ5C,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ /** The materialization payload carried on every delivery row. */
3
+ export declare const NotificationDeliveryPayloadSchema: z.ZodObject<{
4
+ actorId: z.ZodString;
5
+ metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
6
+ occurrenceAt: z.ZodNumber;
7
+ }, z.core.$strip>;
8
+ export declare const NotificationDeliverySchema: z.ZodObject<{
9
+ deliveryId: z.ZodString;
10
+ state: z.ZodEnum<{
11
+ deadLetter: "deadLetter";
12
+ queued: "queued";
13
+ materialized: "materialized";
14
+ }>;
15
+ notificationType: z.ZodString;
16
+ eventId: z.ZodString;
17
+ recipientUid: z.ZodNullable<z.ZodString>;
18
+ aggregationKey: z.ZodString;
19
+ strategy: z.ZodEnum<{
20
+ increment: "increment";
21
+ staticRelight: "staticRelight";
22
+ }>;
23
+ payload: z.ZodObject<{
24
+ actorId: z.ZodString;
25
+ metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
26
+ occurrenceAt: z.ZodNumber;
27
+ }, z.core.$strip>;
28
+ payloadVersion: z.ZodNumber;
29
+ materializationClass: z.ZodEnum<{
30
+ directQueued: "directQueued";
31
+ realtimeFallback: "realtimeFallback";
32
+ fanoutOrphan: "fanoutOrphan";
33
+ retry: "retry";
34
+ }>;
35
+ createdAt: z.ZodNumber;
36
+ attemptCount: z.ZodNumber;
37
+ nextAttemptAt: z.ZodNumber;
38
+ lastError: z.ZodNullable<z.ZodString>;
39
+ materializedAt: z.ZodNullable<z.ZodNumber>;
40
+ deadLetteredAt: z.ZodNullable<z.ZodNumber>;
41
+ expireAt: z.ZodOptional<z.ZodUnknown>;
42
+ }, z.core.$strip>;
43
+ export type NotificationDelivery = z.infer<typeof NotificationDeliverySchema>;
44
+ export declare const NotificationFanoutPhaseSchema: z.ZodObject<{
45
+ selector: z.ZodRecord<z.ZodString, z.ZodUnknown>;
46
+ cursor: z.ZodNullable<z.ZodUnknown>;
47
+ done: z.ZodBoolean;
48
+ }, z.core.$strip>;
49
+ export declare const NotificationFanoutJobSchema: z.ZodObject<{
50
+ jobId: z.ZodString;
51
+ schemaVersion: z.ZodNumber;
52
+ notificationType: z.ZodString;
53
+ eventId: z.ZodString;
54
+ priority: z.ZodUnion<readonly [z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>]>;
55
+ payload: z.ZodRecord<z.ZodString, z.ZodUnknown>;
56
+ phases: z.ZodArray<z.ZodObject<{
57
+ selector: z.ZodRecord<z.ZodString, z.ZodUnknown>;
58
+ cursor: z.ZodNullable<z.ZodUnknown>;
59
+ done: z.ZodBoolean;
60
+ }, z.core.$strip>>;
61
+ phaseIndex: z.ZodNumber;
62
+ revision: z.ZodNumber;
63
+ status: z.ZodEnum<{
64
+ pending: "pending";
65
+ complete: "complete";
66
+ deadLetter: "deadLetter";
67
+ }>;
68
+ attemptCount: z.ZodNumber;
69
+ nextAttemptAt: z.ZodNumber;
70
+ lastError: z.ZodNullable<z.ZodString>;
71
+ createdAt: z.ZodNumber;
72
+ updatedAt: z.ZodNumber;
73
+ completedAt: z.ZodNullable<z.ZodNumber>;
74
+ deadLetteredAt: z.ZodNullable<z.ZodNumber>;
75
+ expireAt: z.ZodOptional<z.ZodUnknown>;
76
+ }, z.core.$strip>;
77
+ export type NotificationFanoutJob = z.infer<typeof NotificationFanoutJobSchema>;
78
+ //# sourceMappingURL=notification-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-ledger.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/notification-ledger.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,iEAAiE;AACjE,eAAO,MAAM,iCAAiC;;;;iBAI5C,CAAC;AAKH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI9E,eAAO,MAAM,6BAA6B;;;;iBAIxC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
@@ -0,0 +1,63 @@
1
+ // Notification redesign ledger Firestore schemas (chat-edge-rebuild P1).
2
+ // Frozen field lists from IMPLEMENTATION_MATRIX.md "Notifications". Admin-SDK-only.
3
+ // `expireAt` is the only Firestore `Timestamp` field (native TTL); every other
4
+ // time field is epoch-ms `number`.
5
+ import { z } from 'zod';
6
+ /** Native-TTL Timestamp (set only at the resolved-success terminal). */
7
+ const expireAtField = z.unknown().optional();
8
+ /** The materialization payload carried on every delivery row. */
9
+ export const NotificationDeliveryPayloadSchema = z.object({
10
+ actorId: z.string(),
11
+ metadata: z.record(z.string(), z.unknown()),
12
+ occurrenceAt: z.number(),
13
+ });
14
+ // ── notificationDeliveries/{deliveryId} ─────────────────────────────────────
15
+ // BOTH the recipient ledger AND the occurrence ledger. Shared-admin rows set
16
+ // recipientUid=null (the deliveryId hash uses the literal 'shared').
17
+ export const NotificationDeliverySchema = z.object({
18
+ deliveryId: z.string(),
19
+ state: z.enum(['queued', 'materialized', 'deadLetter']),
20
+ notificationType: z.string(),
21
+ eventId: z.string(),
22
+ recipientUid: z.string().nullable(),
23
+ aggregationKey: z.string(),
24
+ strategy: z.enum(['increment', 'staticRelight']),
25
+ payload: NotificationDeliveryPayloadSchema,
26
+ payloadVersion: z.number(),
27
+ materializationClass: z.enum(['directQueued', 'realtimeFallback', 'fanoutOrphan', 'retry']),
28
+ createdAt: z.number(),
29
+ attemptCount: z.number(),
30
+ nextAttemptAt: z.number(),
31
+ lastError: z.string().nullable(),
32
+ materializedAt: z.number().nullable(),
33
+ deadLetteredAt: z.number().nullable(),
34
+ expireAt: expireAtField,
35
+ });
36
+ // ── notificationFanoutJobs/{jobId} ──────────────────────────────────────────
37
+ // jobId = `${eventId}:${notificationType}`. No `running` state (no leases).
38
+ export const NotificationFanoutPhaseSchema = z.object({
39
+ selector: z.record(z.string(), z.unknown()),
40
+ cursor: z.unknown().nullable(),
41
+ done: z.boolean(),
42
+ });
43
+ export const NotificationFanoutJobSchema = z.object({
44
+ jobId: z.string(),
45
+ schemaVersion: z.number(),
46
+ notificationType: z.string(),
47
+ eventId: z.string(),
48
+ priority: z.union([z.literal(0), z.literal(1), z.literal(2)]),
49
+ payload: z.record(z.string(), z.unknown()),
50
+ phases: z.array(NotificationFanoutPhaseSchema),
51
+ phaseIndex: z.number(),
52
+ revision: z.number(),
53
+ status: z.enum(['pending', 'complete', 'deadLetter']),
54
+ attemptCount: z.number(),
55
+ nextAttemptAt: z.number(),
56
+ lastError: z.string().nullable(),
57
+ createdAt: z.number(),
58
+ updatedAt: z.number(),
59
+ completedAt: z.number().nullable(),
60
+ deadLetteredAt: z.number().nullable(),
61
+ expireAt: expireAtField,
62
+ });
63
+ //# sourceMappingURL=notification-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-ledger.js","sourceRoot":"","sources":["../../src/doc-schemas/notification-ledger.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ export declare const NotificationDocSchema: z.ZodObject<{
12
12
  targetPath: z.ZodString;
13
13
  metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
14
14
  seenAt: z.ZodNumber;
15
+ activityGeneration: z.ZodOptional<z.ZodString>;
16
+ seenAtGeneration: z.ZodOptional<z.ZodString>;
15
17
  createdAt: z.ZodNumber;
16
18
  updatedAt: z.ZodNumber;
17
19
  }, z.core.$strip>;
@@ -32,6 +34,8 @@ export declare const NotificationHistoryDocSchema: z.ZodObject<{
32
34
  targetPath: z.ZodString;
33
35
  metadata: z.ZodRecord<z.ZodString, z.ZodUnknown>;
34
36
  seenAt: z.ZodNumber;
37
+ activityGeneration: z.ZodOptional<z.ZodString>;
38
+ seenAtGeneration: z.ZodOptional<z.ZodString>;
35
39
  createdAt: z.ZodNumber;
36
40
  updatedAt: z.ZodNumber;
37
41
  archival: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/notifications.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;iBAehC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;iBAIvC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;iBAQpC,CAAC;AAKH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAenC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAK1E,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAazC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/notifications.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;iBAoBhC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;iBAIvC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;iBAQpC,CAAC;AAKH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAenC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAK1E,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAazC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
@@ -19,6 +19,11 @@ export const NotificationDocSchema = z.object({
19
19
  targetPath: z.string(),
20
20
  metadata: z.record(z.string(), z.unknown()),
21
21
  seenAt: z.number(),
22
+ // Opaque per-generation token rotated on create / material re-light; the
23
+ // SEEN/ARCHIVE precondition (notification redesign). Optional on the legacy
24
+ // doc shape; the ledger materializer always sets it.
25
+ activityGeneration: z.string().optional(),
26
+ seenAtGeneration: z.string().optional(),
22
27
  createdAt: z.number(),
23
28
  updatedAt: z.number(),
24
29
  });
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/doc-schemas/notifications.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/doc-schemas/notifications.ts"],"names":[],"mappings":"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"}