@ttt-productions/ttt-core 0.79.89 → 0.79.91

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.
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The custom claims an admin account carries (value `true`). The claim is a fast check only: every
3
+ * server-side admin decision — a Cloud Function and the Firestore and Storage rules alike — also
4
+ * requires the account on the live admin roster (`_systemData/adminList`), so a removed admin loses
5
+ * access at once.
6
+ */
7
+ export declare const ADMIN_CLAIM = "isAdmin";
8
+ /**
9
+ * The custom claim a junior admin account carries (value `true`), synced from the live admin
10
+ * roster's junior admin list. No rules file reads it, and the backend grants it nothing while junior
11
+ * admin is switched off there.
12
+ */
13
+ export declare const JR_ADMIN_CLAIM = "isJrAdmin";
14
+ //# sourceMappingURL=admin-claims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-claims.d.ts","sourceRoot":"","sources":["../../src/constants/admin-claims.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The custom claims an admin account carries (value `true`). The claim is a fast check only: every
3
+ * server-side admin decision — a Cloud Function and the Firestore and Storage rules alike — also
4
+ * requires the account on the live admin roster (`_systemData/adminList`), so a removed admin loses
5
+ * access at once.
6
+ */
7
+ export const ADMIN_CLAIM = 'isAdmin';
8
+ /**
9
+ * The custom claim a junior admin account carries (value `true`), synced from the live admin
10
+ * roster's junior admin list. No rules file reads it, and the backend grants it nothing while junior
11
+ * admin is switched off there.
12
+ */
13
+ export const JR_ADMIN_CLAIM = 'isJrAdmin';
14
+ //# sourceMappingURL=admin-claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-claims.js","sourceRoot":"","sources":["../../src/constants/admin-claims.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC","sourcesContent":["/**\n * The custom claims an admin account carries (value `true`). The claim is a fast check only: every\n * server-side admin decision — a Cloud Function and the Firestore and Storage rules alike — also\n * requires the account on the live admin roster (`_systemData/adminList`), so a removed admin loses\n * access at once.\n */\nexport const ADMIN_CLAIM = 'isAdmin';\n\n/**\n * The custom claim a junior admin account carries (value `true`), synced from the live admin\n * roster's junior admin list. No rules file reads it, and the backend grants it nothing while junior\n * admin is switched off there.\n */\nexport const JR_ADMIN_CLAIM = 'isJrAdmin';\n"]}
@@ -11,6 +11,7 @@ export * from './craft-skill-statements.js';
11
11
  export * from './publish-attestations.js';
12
12
  export * from './pledge-and-bouquet-copy.js';
13
13
  export * from './public-documents.js';
14
+ export * from './admin-claims.js';
14
15
  export * from './legal-review-notice-state.js';
15
16
  export * from './legal-review-notice.js';
16
17
  export * from './safety-confirmation-phrases.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
@@ -11,6 +11,7 @@ export * from './craft-skill-statements.js';
11
11
  export * from './publish-attestations.js';
12
12
  export * from './pledge-and-bouquet-copy.js';
13
13
  export * from './public-documents.js';
14
+ export * from './admin-claims.js';
14
15
  export * from './legal-review-notice-state.js';
15
16
  export * from './legal-review-notice.js';
16
17
  export * from './safety-confirmation-phrases.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC","sourcesContent":["export * from './analytics.js';\nexport * from './app-mode.js';\nexport * from './business.js';\nexport * from './text-fields.js';\nexport * from './chat.js';\nexport * from './conversation-files.js';\nexport * from './moderation.js';\nexport * from './options.js';\nexport * from './admin-labels.js';\nexport * from './craft-skill-statements.js';\nexport * from './publish-attestations.js';\nexport * from './pledge-and-bouquet-copy.js';\nexport * from './public-documents.js';\nexport * from './legal-review-notice-state.js';\nexport * from './legal-review-notice.js';\nexport * from './safety-confirmation-phrases.js';\nexport * from './safety-telemetry-patterns.js';\nexport * from './safety-active-statuses.js';\nexport * from './telemetry-content-policy.js';\nexport * from './pagination.js';\nexport * from './release-flags.js';\nexport * from './retention.js';\nexport * from './scheduled-jobs.js';\nexport * from './media-download.js';\nexport * from './media-processing.js';\nexport * from './storage-keys.js';\nexport * from './company-mascots.js';\nexport * from './center-stage-rooms.js';\nexport * from './audition-deadlines.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC","sourcesContent":["export * from './analytics.js';\nexport * from './app-mode.js';\nexport * from './business.js';\nexport * from './text-fields.js';\nexport * from './chat.js';\nexport * from './conversation-files.js';\nexport * from './moderation.js';\nexport * from './options.js';\nexport * from './admin-labels.js';\nexport * from './craft-skill-statements.js';\nexport * from './publish-attestations.js';\nexport * from './pledge-and-bouquet-copy.js';\nexport * from './public-documents.js';\nexport * from './admin-claims.js';\nexport * from './legal-review-notice-state.js';\nexport * from './legal-review-notice.js';\nexport * from './safety-confirmation-phrases.js';\nexport * from './safety-telemetry-patterns.js';\nexport * from './safety-active-statuses.js';\nexport * from './telemetry-content-policy.js';\nexport * from './pagination.js';\nexport * from './release-flags.js';\nexport * from './retention.js';\nexport * from './scheduled-jobs.js';\nexport * from './media-download.js';\nexport * from './media-processing.js';\nexport * from './storage-keys.js';\nexport * from './company-mascots.js';\nexport * from './center-stage-rooms.js';\nexport * from './audition-deadlines.js';\n"]}
@@ -7682,8 +7682,8 @@ export type RegisteredCollectionPath = keyof typeof COLLECTION_SCHEMAS;
7682
7682
  * never persisted — the write callables store the body via `Omit<…, '<field>'>`. The bound
7683
7683
  * schema models the (correct) consumer/read shape, where the field is required, so a raw
7684
7684
  * stored doc is "missing" it. The drift-check injects `{ [field]: doc.id, ...data }` before
7685
- * validating, generalizing the one-off `AdminTaskDocSchema` stored-shape workaround into a
7686
- * single mechanism so real-callable drift-checks don't false-flag every doc-id collection.
7685
+ * validating, one mechanism for every doc-id collection, so a drift-check of real data does not
7686
+ * flag every such document as missing its id field.
7687
7687
  * The schema-doc generator ignores this map. Keys are compiler-checked against the registry.
7688
7688
  */
7689
7689
  export declare const COLLECTION_DOC_ID_FIELDS: {
@@ -7706,17 +7706,13 @@ export declare const COLLECTION_DOC_ID_FIELDS: {
7706
7706
  };
7707
7707
  /**
7708
7708
  * Collections that exist (in COLLECTIONS / *_SUBCOLLECTIONS or firestore.rules) but are
7709
- * intentionally NOT bound to a schema, each with a reason. Listed EXPLICITLY so completeness is
7710
- * enforced and nothing is silently uncovered; the registry test fails if a NEW unlisted collection
7711
- * appears. These are the only remaining gaps after the schema-registry binding pass:
7712
- *
7713
- * - userMetadata: `userProfiles/{uid}/userMetadata/notificationSettings` — a firestore.rules
7714
- * match and `PATH_BUILDERS.userMetadata` exist, but there is no live reader/writer and no
7715
- * notification-settings type anywhere yet. Bind once that shape is implemented.
7716
- * - feedbackDenylist: `_serverData/feedbackLists/feedbackDenylist/{deniedWord}` — Console-managed
7717
- * (no callable writes it) and submitFeedback reads it via `.exists` only, so there is no field
7718
- * contract to author a schema from. The doc id is the denied word; the body is unused.
7719
- * - ncmecSubmissionAttempts: see the inline reason below.
7709
+ * intentionally NOT bound to a schema, each by name with its path and the reason beside it. Listed
7710
+ * EXPLICITLY so completeness is enforced and nothing is silently uncovered; the registry test fails
7711
+ * if a NEW unlisted collection appears.
7720
7712
  */
7713
+ export declare const PENDING_COLLECTION_PATHS: {
7714
+ readonly feedbackDenylist: "_serverData/feedbackLists/feedbackDenylist/{deniedWord}";
7715
+ };
7716
+ /** The pending collections' names, derived from their paths. */
7721
7717
  export declare const PENDING_COLLECTIONS: readonly string[];
7722
7718
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiN7B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqQkB,CAAC;AAElD,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAEvE;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;CAmBiC,CAAC;AAEvE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAOvC,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/doc-schemas/registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiN7B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoQkB,CAAC;AAElD,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAEvE;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;CAmBiC,CAAC;AAEvE;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;CAK3B,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAA0C,CAAC"}
@@ -32,10 +32,10 @@ import { MediaAssetSchema } from './media-assets.js';
32
32
  import { MediaActivationJobSchema } from './media-activation-jobs.js';
33
33
  import { MediaCopyIntentSchema } from './media-copy-intents.js';
34
34
  import { ReservedDisplayNameSchema, ReservedRealmNameSchema, StakeShareAuditEventSchema, ShortLinkSchema, FeedbackAliasSchema, UserSuggestionSchema, StatusReconcileQueueEntrySchema, } from './operational.js';
35
- // ===== Trust & Safety — report spine (§A1) =====
35
+ // ===== Trust & Safety — report spine =====
36
36
  import { ProtectedReportRootV1Schema, ReportPublicProjectionV1Schema, ReportGroupV1Schema, ReportGroupCountedReportSchema, ReportTargetSnapshotV1Schema, NarrativeRecordV1Schema, } from './safety/report.js';
37
37
  import { SafetyCaseAlertV1Schema } from './safety/case-alert.js';
38
- // ===== Trust & Safety — child-safety case spine (§A1b, §A2) =====
38
+ // ===== Trust & Safety — child-safety case spine =====
39
39
  import { ChildSafetyCaseListV1Schema, ChildSafetyCaseV1Schema, ChildSafetySourceSignalV1Schema, ChildSafetyDecisionV1Schema, ChildSafetyDecisionViewV1Schema, ChildSafetyCaseAccountV1Schema, ChildSafetyCaseAccountHistoryV1Schema, ChildSafetyCrossoverItemV1Schema, ChildSafetyNcmecSubmissionV1Schema, ChildSafetyNcmecSubmissionFileV1Schema, ChildSafetyLegalProcessEventV1Schema, } from './safety/case.js';
40
40
  import { ChildSafetyOwningAliasV1Schema, } from './safety/case-aliases.js';
41
41
  import { SafetyHoldRefV1Schema, SafetyHoldResourceV1Schema, SafetyResourceCommandV1Schema, SafetyResourceCommandAuthorizedRequestV1Schema, SafetyResourceCommandBypassRefV1Schema, } from './safety/holds.js';
@@ -44,7 +44,7 @@ import { EventProvenanceV1Schema } from './safety/provenance.js';
44
44
  import { QuarantineSagaJobV1Schema, QuarantineSagaRelatedAssetV1Schema, NcmecSubmissionJobV1Schema, AccountActionCommandV1Schema, } from './safety/sagas.js';
45
45
  import { SafetySlaMonitorV1Schema, SafetyMonitorHeartbeatV1Schema, } from './safety/monitors.js';
46
46
  import { AgeAttestationNonceV1Schema, AgePolicyConfigV1Schema } from './safety/age.js';
47
- // ===== Trust & Safety — NCII / TAKE IT DOWN (§A11) =====
47
+ // ===== Trust & Safety — NCII / TAKE IT DOWN =====
48
48
  import { NciiAllegationV1Schema } from './ncii/allegations.js';
49
49
  import { TakeItDownRequestRootV1Schema, TakeItDownRequesterPrivateV1Schema, TakeItDownSubmissionV1Schema, TakeItDownValidityDecisionV1Schema, TakeItDownValidityRationaleV1Schema, TakeItDownRequestActionV1Schema, TakeItDownEvidenceV1Schema, NciiRetainedEvidenceInventoryV1Schema, } from './ncii/requests.js';
50
50
  import { NciiCaseV1Schema, NciiCaseAllegationLinkV1Schema, NciiCaseRequestLinkV1Schema, NciiCaseRemovalActionV1Schema, NciiBlockedHashV1Schema, NciiCaseClosureEventV1Schema, } from './ncii/cases.js';
@@ -123,7 +123,7 @@ export const COLLECTION_SCHEMAS = {
123
123
  'auditionBoard/{auditionId}': AuditionSchema,
124
124
  'auditionBoard/{auditionId}/auditionEntries/{auditionEntryId}': AuditionEntrySchema,
125
125
  // ===== Moderation / Reports / Admin =====
126
- // The report spine (§A1): the restricted root, its public projection subdoc, and the
126
+ // The report spine: the restricted root, its public projection subdoc, and the
127
127
  // dedup/count group. The root + projection are written by the app's submitReport
128
128
  // callable; the group is maintained by an app-side trigger.
129
129
  'contentReports/{reportId}': ProtectedReportRootV1Schema,
@@ -184,7 +184,7 @@ export const COLLECTION_SCHEMAS = {
184
184
  'publicDocuments/{documentId}/publicDocumentVersions/{versionId}': PublicDocumentVersionSchema,
185
185
  'publicDocumentDrafts/{documentId}': PublicDocumentDraftSchema,
186
186
  'publicDocumentReleases/{releaseId}': PublicDocumentReleaseSchema,
187
- // ===== Trust & Safety — child-safety case spine (§A1b, §A2) =====
187
+ // ===== Trust & Safety — child-safety case spine =====
188
188
  'childSafetyCaseList/{caseId}': ChildSafetyCaseListV1Schema,
189
189
  'activeSafetyCaseAlerts/{caseId}': SafetyCaseAlertV1Schema,
190
190
  'childSafetyCases/{caseId}': ChildSafetyCaseV1Schema,
@@ -196,7 +196,7 @@ export const COLLECTION_SCHEMAS = {
196
196
  'childSafetyCases/{caseId}/childSafetyCaseCrossoverItems/{mediaAssetId}': ChildSafetyCrossoverItemV1Schema,
197
197
  'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}': ChildSafetyNcmecSubmissionV1Schema,
198
198
  'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}/ncmecSubmissionFiles/{fileId}': ChildSafetyNcmecSubmissionFileV1Schema,
199
- // [H-05] the submission's single immutable completion-proof record (fixed doc id). Backend-only,
199
+ // The submission's single immutable completion-proof record (fixed doc id). Backend-only,
200
200
  // so its shape lives in doc-schemas/backend-state.ts alongside the portal artifacts.
201
201
  'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}/ncmecCompletionProof/record': NcmecCompletionProofRecordV1Schema,
202
202
  'childSafetyCases/{caseId}/legalProcess/{eventId}': ChildSafetyLegalProcessEventV1Schema,
@@ -205,14 +205,14 @@ export const COLLECTION_SCHEMAS = {
205
205
  'childSafetyCases/{caseId}/portalReceiptArtifacts/{artifactId}': NcmecPortalReceiptArtifactV1Schema,
206
206
  'childSafetyCases/{caseId}/ncmecPortalCorrections/{correctionId}': NcmecPortalCorrectionRecordV1Schema,
207
207
  'childSafetyOwningAliases/{aliasId}': ChildSafetyOwningAliasV1Schema,
208
- // ===== Trust & Safety — holds + resource commands (§A3) =====
208
+ // ===== Trust & Safety — holds + resource commands =====
209
209
  'safetyHoldRefs/{holdRefId}': SafetyHoldRefV1Schema,
210
210
  'safetyHoldResources/{resourceKeyHash}': SafetyHoldResourceV1Schema,
211
211
  'safetyResourceCommands/{commandDocId}': SafetyResourceCommandV1Schema,
212
212
  'safetyResourceCommands/{commandDocId}/authorizedRequests/{requestId}': SafetyResourceCommandAuthorizedRequestV1Schema,
213
213
  'safetyResourceCommands/{commandDocId}/bypassRefs/{refId}': SafetyResourceCommandBypassRefV1Schema,
214
- // ===== Trust & Safety — evidence + provenance (§A4, §A6) =====
215
- // SafetyEvidenceManifestV1Schema is a refined ZodObject (superRefine for the H5
214
+ // ===== Trust & Safety — evidence + provenance =====
215
+ // SafetyEvidenceManifestV1Schema is a refined ZodObject (superRefine for the
216
216
  // sourceKind invariant); the schema-doc generator unwraps the effect to introspect
217
217
  // its shape, so binding the refined schema here is correct.
218
218
  'safetyEvidenceManifests/{manifestId}': SafetyEvidenceManifestV1Schema,
@@ -220,22 +220,22 @@ export const COLLECTION_SCHEMAS = {
220
220
  'safetyEvidenceJobs/{jobId}/safetyEvidenceJobItems/{itemId}': SafetyEvidenceJobItemDocV1Schema,
221
221
  'safetyEvidenceJobs/{jobId}/safetyEvidenceJobDisposition/{locationId}': SafetyEvidenceDispositionV1Schema,
222
222
  'eventProvenance/{eventId}': EventProvenanceV1Schema,
223
- // ===== Trust & Safety — sagas + closure (§A5) =====
223
+ // ===== Trust & Safety — sagas + closure =====
224
224
  'quarantineSagaJobs/{caseId}': QuarantineSagaJobV1Schema,
225
225
  'quarantineSagaJobs/{caseId}/relatedAssets/{assetId}': QuarantineSagaRelatedAssetV1Schema,
226
226
  'ncmecSubmissionJobs/{ncmecJobId}': NcmecSubmissionJobV1Schema,
227
227
  'accountActionCommands/{accountActionCommandId}': AccountActionCommandV1Schema,
228
- // ===== Trust & Safety — SLA monitors + heartbeat (§A8) =====
228
+ // ===== Trust & Safety — SLA monitors + heartbeat =====
229
229
  'safetySlaMonitors/{monitorId}': SafetySlaMonitorV1Schema,
230
230
  'safetyMonitorHeartbeat/global': SafetyMonitorHeartbeatV1Schema,
231
- // ===== Trust & Safety — age attestation nonces (§A7) =====
231
+ // ===== Trust & Safety — age attestation nonces =====
232
232
  'ageAttestationNonces/{nonceHash}': AgeAttestationNonceV1Schema,
233
233
  // ===== Trust & Safety — operator step-up + reconciler cursors (backend-only) =====
234
234
  // Cloud-Functions-only readers/writers; client access denied in firestore.rules.
235
235
  'operatorStepUp/{uid}': OperatorStepUpSchema,
236
236
  // ===== Scheduled user sweeps — durable cadence/cursor state (backend-only) =====
237
237
  'sweepState/{sweepName}': SweepStateSchema,
238
- // ===== Trust & Safety — NCII / TAKE IT DOWN (§A11) =====
238
+ // ===== Trust & Safety — NCII / TAKE IT DOWN =====
239
239
  'nciiAllegations/{allegationId}': NciiAllegationV1Schema,
240
240
  'takeItDownRequests/{requestId}': TakeItDownRequestRootV1Schema,
241
241
  'takeItDownRequests/{requestId}/privateDetails/requester': TakeItDownRequesterPrivateV1Schema,
@@ -254,7 +254,7 @@ export const COLLECTION_SCHEMAS = {
254
254
  'nciiCases/{caseId}/blockedHashes/{hashId}': NciiBlockedHashV1Schema,
255
255
  'nciiCases/{caseId}/closureEvents/{eventId}': NciiCaseClosureEventV1Schema,
256
256
  'nciiRetainedEvidenceInventory/{inventoryId}': NciiRetainedEvidenceInventoryV1Schema,
257
- // [H-01] dead-letter sink for inventory rows that could not be written to the primary
257
+ // The dead-letter sink for inventory rows that could not be written to the primary
258
258
  // nciiRetainedEvidenceInventory collection. Stores the same document shape.
259
259
  'nciiInventoryDeadLetter/{inventoryId}': NciiRetainedEvidenceInventoryV1Schema,
260
260
  'nciiTemporaryHolds/{holdId}': NciiTemporaryHoldV1Schema,
@@ -275,10 +275,9 @@ export const COLLECTION_SCHEMAS = {
275
275
  '_serverData/agePolicy': AgePolicyConfigV1Schema,
276
276
  '_serverData/nciiPolicy': NciiPolicyConfigV1Schema,
277
277
  '_serverData/privilegedReviewerSecurity': PrivilegedReviewerSecurityProfileV1Schema,
278
- // The submitFeedback alias map — moved off the anonymously-readable top-level
279
- // `feedbackAliases` collection into the server-only bucket (BACKEND-108). The sibling
280
- // `feedbackDenylist` subcollection has no field contract (`.exists`-only) — see
281
- // PENDING_COLLECTIONS.
278
+ // The submitFeedback alias map, in the server-only bucket so no client can read it
279
+ // (BACKEND-108). The sibling `feedbackDenylist` subcollection has no field contract
280
+ // (`.exists`-only) — see PENDING_COLLECTION_PATHS.
282
281
  '_serverData/feedbackLists/feedbackAliases/{aliasId}': FeedbackAliasSchema,
283
282
  // The scheduled sweeps' scan cursors — each read only by the function that owns it.
284
283
  // ===== _systemData singletons (signed-in readers, BACKEND-108) =====
@@ -295,8 +294,8 @@ export const COLLECTION_SCHEMAS = {
295
294
  * never persisted — the write callables store the body via `Omit<…, '<field>'>`. The bound
296
295
  * schema models the (correct) consumer/read shape, where the field is required, so a raw
297
296
  * stored doc is "missing" it. The drift-check injects `{ [field]: doc.id, ...data }` before
298
- * validating, generalizing the one-off `AdminTaskDocSchema` stored-shape workaround into a
299
- * single mechanism so real-callable drift-checks don't false-flag every doc-id collection.
297
+ * validating, one mechanism for every doc-id collection, so a drift-check of real data does not
298
+ * flag every such document as missing its id field.
300
299
  * The schema-doc generator ignores this map. Keys are compiler-checked against the registry.
301
300
  */
302
301
  export const COLLECTION_DOC_ID_FIELDS = {
@@ -321,24 +320,16 @@ export const COLLECTION_DOC_ID_FIELDS = {
321
320
  };
322
321
  /**
323
322
  * Collections that exist (in COLLECTIONS / *_SUBCOLLECTIONS or firestore.rules) but are
324
- * intentionally NOT bound to a schema, each with a reason. Listed EXPLICITLY so completeness is
325
- * enforced and nothing is silently uncovered; the registry test fails if a NEW unlisted collection
326
- * appears. These are the only remaining gaps after the schema-registry binding pass:
327
- *
328
- * - userMetadata: `userProfiles/{uid}/userMetadata/notificationSettings` — a firestore.rules
329
- * match and `PATH_BUILDERS.userMetadata` exist, but there is no live reader/writer and no
330
- * notification-settings type anywhere yet. Bind once that shape is implemented.
331
- * - feedbackDenylist: `_serverData/feedbackLists/feedbackDenylist/{deniedWord}` — Console-managed
332
- * (no callable writes it) and submitFeedback reads it via `.exists` only, so there is no field
333
- * contract to author a schema from. The doc id is the denied word; the body is unused.
334
- * - ncmecSubmissionAttempts: see the inline reason below.
323
+ * intentionally NOT bound to a schema, each by name with its path and the reason beside it. Listed
324
+ * EXPLICITLY so completeness is enforced and nothing is silently uncovered; the registry test fails
325
+ * if a NEW unlisted collection appears.
335
326
  */
336
- export const PENDING_COLLECTIONS = [
337
- 'userMetadata',
338
- 'feedbackDenylist',
339
- // Per-submission NCMEC transmission attempts. The segment exists only in firestore.rules
340
- // today and has no writer or reader yet; the constant is registered so the name has one
341
- // owner. Bind once the attempt-record shape is implemented.
342
- 'ncmecSubmissionAttempts',
343
- ];
327
+ export const PENDING_COLLECTION_PATHS = {
328
+ // Console-managed (no callable writes it), and submitFeedback reads it with `.exists` only, so
329
+ // there is no field contract to author a schema from: the doc id is the denied word and the body
330
+ // is unused.
331
+ feedbackDenylist: '_serverData/feedbackLists/feedbackDenylist/{deniedWord}',
332
+ };
333
+ /** The pending collections' names, derived from their paths. */
334
+ export const PENDING_COLLECTIONS = Object.keys(PENDING_COLLECTION_PATHS);
344
335
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/doc-schemas/registry.ts"],"names":[],"mappings":"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","sourcesContent":["// Firestore collection registry — the single, authoritative binding from each Firestore\n// collection/subcollection path template to its document Zod schema. This is the input to\n// the schema-doc generator and the drift-check, and its completeness is CI-enforced\n// (registry.test.ts) against the COLLECTIONS / *_SUBCOLLECTIONS name constants, so a new\n// collection cannot be added without either a schema or an explicit PENDING entry.\n//\n// Path templates reuse the segment names from ../paths/collections.ts (and the shapes the\n// path-builders produce). `{placeholder}` segments are document/parent IDs.\n\nimport type { z } from 'zod';\nimport {\n FullUserSchema,\n UserPrivateDataSchema,\n CraftSkillSchema,\n CraftSkillReferenceSchema,\n} from './user.js';\nimport { PublicUserSchema } from './publicUser.js';\nimport { AccountDeletionRequestV1Schema } from './account-deletion.js';\nimport {\n FullWorkProjectSchema,\n PublicWorkProjectSchema,\n WorkFileFolderSchema,\n WorkFileSchema,\n WorkRealmSchema,\n RealmFileFolderSchema,\n GuildmateUserSchema,\n PublicGuildmateUserSchema,\n} from './work-project.js';\nimport {\n FullTaleSchema,\n FullChapterSchema,\n FullTuneSchema,\n FullTuneTrackSchema,\n FullTelevisionSchema,\n FullTelevisionEpisodeSchema,\n ThresholdItemSchema,\n HallSubmissionReservationSchema,\n PublishedHallItemSchema,\n PublishedChapterSchema,\n PublishedTuneTrackSchema,\n PublishedTelevisionEpisodeSchema,\n HallContentChangeRequestSchema,\n HallLibraryPreferencesSchema,\n} from './content.js';\nimport {\n SquareStreetzPostSchema,\n MentionHistoryDocumentSchema,\n FollowEdgeSchema,\n FollowCounterSchema,\n SquareStreetzLikeSchema,\n TrendingPostsSchema,\n} from './social.js';\nimport {\n PledgePaymentSchema,\n PledgePaymentProviderRefSchema,\n ProcessedStripeEventSchema,\n PledgePaymentLedgerEventSchema,\n PaymentWebhookQuarantineSchema,\n PledgePaymentTotalsDocSchema,\n PledgeRefundRequestSchema,\n} from './payments.js';\nimport {\n FullCommissionListingSchema,\n CommissionProposalSchema,\n AuditionSchema,\n AuditionEntrySchema,\n UserAuditionVoteSchema,\n} from './commissions.js';\nimport {\n GuildChatChannelSchema,\n GuildInviteConversationSchema,\n AdminDispatchSchema,\n ChatMessageV1Schema,\n ConversationFileSchema,\n} from './messaging.js';\nimport {\n PublicDocumentVersionSchema,\n PublicDocumentDraftSchema,\n PublicDocumentReleaseSchema,\n PUBLIC_DOCUMENT_PROJECTIONS,\n} from './public-documents.js';\nimport { AppConfigSchema, AdminListSchema, ProfanityListSchema, ReservedUsernamesSchema, BlockedFranchiseNamesSchema, AppModeMarkerSchema } from './system.js';\nimport { SystemUidSlotsDocumentSchema, SystemVideoSlotsDocumentSchema } from './system-slots.js';\nimport {\n ContentViolationSchema,\n ModerationCascadeManifestSchema,\n ModerationCascadeChangedDocSchema,\n} from './moderation.js';\nimport {\n AdminTaskDocSchema,\n} from './report-docs.js';\nimport { TTTAuditEventSchema } from './audit.js';\nimport {\n NotificationDocSchema,\n NotificationHistoryDocSchema,\n PendingNotificationSchema,\n} from './notifications.js';\nimport {\n NotificationDeliverySchema,\n NotificationFanoutJobSchema,\n} from './notification-ledger.js';\nimport { NotificationArchiveAllJobSchema } from './notification-archive-all-jobs.js';\nimport { AdminDispatchReadMarkerSchema } from './admin-dispatch-read-markers.js';\nimport {\n ChatChannelAuthProjectionSchema,\n ChatScopeDegradedSchema,\n ChatScopeDegradedCauseSchema,\n ChatSyncEventSchema,\n ChatSyncFanoutJobSchema,\n ChatMessageOutboxSchema,\n ChatAdminActionCommandSchema,\n ChatHistoryAnonymizationJobSchema,\n ChatHistoryAnonymizationAffectedChunkSchema,\n ChatParkedDeliverySchema,\n} from './chat-sync.js';\nimport { SquareAnnouncementJobSchema } from './square-announcement-jobs.js';\nimport { PendingMediaSchema, ArchivedPendingMediaDocSchema } from '../media/pending-media.js';\nimport { MediaAssetSchema } from './media-assets.js';\nimport { MediaActivationJobSchema } from './media-activation-jobs.js';\nimport { MediaCopyIntentSchema } from './media-copy-intents.js';\nimport {\n ReservedDisplayNameSchema,\n ReservedRealmNameSchema,\n StakeShareAuditEventSchema,\n ShortLinkSchema,\n FeedbackAliasSchema,\n UserSuggestionSchema,\n StatusReconcileQueueEntrySchema,\n} from './operational.js';\n// ===== Trust & Safety — report spine (§A1) =====\nimport {\n ProtectedReportRootV1Schema,\n ReportPublicProjectionV1Schema,\n ReportGroupV1Schema,\n ReportGroupCountedReportSchema,\n ReportTargetSnapshotV1Schema,\n NarrativeRecordV1Schema,\n} from './safety/report.js';\nimport { SafetyCaseAlertV1Schema } from './safety/case-alert.js';\n// ===== Trust & Safety — child-safety case spine (§A1b, §A2) =====\nimport {\n ChildSafetyCaseListV1Schema,\n ChildSafetyCaseV1Schema,\n ChildSafetySourceSignalV1Schema,\n ChildSafetyDecisionV1Schema,\n ChildSafetyDecisionViewV1Schema,\n ChildSafetyCaseAccountV1Schema,\n ChildSafetyCaseAccountHistoryV1Schema,\n ChildSafetyCrossoverItemV1Schema,\n ChildSafetyNcmecSubmissionV1Schema,\n ChildSafetyNcmecSubmissionFileV1Schema,\n ChildSafetyLegalProcessEventV1Schema,\n} from './safety/case.js';\nimport {\n ChildSafetyOwningAliasV1Schema,\n} from './safety/case-aliases.js';\nimport {\n SafetyHoldRefV1Schema,\n SafetyHoldResourceV1Schema,\n SafetyResourceCommandV1Schema,\n SafetyResourceCommandAuthorizedRequestV1Schema,\n SafetyResourceCommandBypassRefV1Schema,\n} from './safety/holds.js';\nimport {\n SafetyEvidenceManifestV1Schema,\n SafetyEvidenceJobV1Schema,\n SafetyEvidenceJobItemDocV1Schema,\n SafetyEvidenceDispositionV1Schema,\n} from './safety/evidence.js';\nimport { EventProvenanceV1Schema } from './safety/provenance.js';\nimport {\n QuarantineSagaJobV1Schema,\n QuarantineSagaRelatedAssetV1Schema,\n NcmecSubmissionJobV1Schema,\n AccountActionCommandV1Schema,\n} from './safety/sagas.js';\nimport {\n SafetySlaMonitorV1Schema,\n SafetyMonitorHeartbeatV1Schema,\n} from './safety/monitors.js';\nimport { AgeAttestationNonceV1Schema, AgePolicyConfigV1Schema } from './safety/age.js';\n// ===== Trust & Safety — NCII / TAKE IT DOWN (§A11) =====\nimport { NciiAllegationV1Schema } from './ncii/allegations.js';\nimport {\n TakeItDownRequestRootV1Schema,\n TakeItDownRequesterPrivateV1Schema,\n TakeItDownSubmissionV1Schema,\n TakeItDownValidityDecisionV1Schema,\n TakeItDownValidityRationaleV1Schema,\n TakeItDownRequestActionV1Schema,\n TakeItDownEvidenceV1Schema,\n NciiRetainedEvidenceInventoryV1Schema,\n} from './ncii/requests.js';\nimport {\n NciiCaseV1Schema,\n NciiCaseAllegationLinkV1Schema,\n NciiCaseRequestLinkV1Schema,\n NciiCaseRemovalActionV1Schema,\n NciiBlockedHashV1Schema,\n NciiCaseClosureEventV1Schema,\n} from './ncii/cases.js';\nimport { NciiTemporaryHoldV1Schema } from './ncii/holds.js';\nimport {\n NciiRemovalJobV1Schema,\n NciiRemovalTargetV1Schema,\n} from './ncii/removal.js';\nimport {\n NciiPolicyConfigV1Schema,\n PrivilegedReviewerSecurityProfileV1Schema,\n} from './ncii/config.js';\nimport {\n NcmecCompletionProofRecordV1Schema,\n NcmecPortalCorrectionRecordV1Schema,\n NcmecPortalReceiptArtifactV1Schema,\n OperatorStepUpSchema,\n SweepStateSchema,\n} from './backend-state.js';\n\nexport const COLLECTION_SCHEMAS = {\n // ===== Users =====\n 'userProfiles/{userId}': FullUserSchema,\n 'userProfiles/{userId}/privateData/{userId}': UserPrivateDataSchema,\n 'userProfiles/{userId}/privateData/hallLibraryPreferences': HallLibraryPreferencesSchema,\n 'userProfiles/{userId}/profileCraftSkills/{craftSkillId}': CraftSkillSchema,\n 'userProfiles/{userId}/auditionVotes/{auditionId}': UserAuditionVoteSchema,\n 'userProfiles/{userId}/mentionHistory/{docId}': MentionHistoryDocumentSchema,\n 'userProfiles/{userId}/notificationHistory/{notificationId}': NotificationHistoryDocSchema,\n 'userProfiles/{userId}/userLikes/likeHistory/squareStreetzLikes/{postId}': SquareStreetzLikeSchema,\n 'publicUsers/{uid}': PublicUserSchema,\n\n // ===== Work / Realm / Guild =====\n 'allWorkProjects/{workProjectId}': FullWorkProjectSchema,\n 'allWorkProjects/{workProjectId}/guildmateUsers/{uid}': GuildmateUserSchema,\n 'allWorkProjects/{workProjectId}/publicGuildmateUsers/{uid}': PublicGuildmateUserSchema,\n 'allWorkProjects/{workProjectId}/workFileFolders/{workFileFolderId}': WorkFileFolderSchema,\n 'allWorkProjects/{workProjectId}/workFileFolders/{workFileFolderId}/workFiles/{workFileId}': WorkFileSchema,\n 'allWorkProjects/{workProjectId}/hallSubmissionReservation/reservation': HallSubmissionReservationSchema,\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}': FullTaleSchema,\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}/taleChapters/{chapterId}': FullChapterSchema,\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}': FullTuneSchema,\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}/tuneTracks/{trackId}': FullTuneTrackSchema,\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}': FullTelevisionSchema,\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}/televisionEpisodes/{episodeId}': FullTelevisionEpisodeSchema,\n 'allWorkProjects/{workProjectId}/guildChatChannels/{guildChatChannelId}': GuildChatChannelSchema,\n // Guild channel + invite messages are REALTIME-ONLY (chat Worker DO) — no Firestore schema.\n 'publicWorkProjects/{workProjectId}': PublicWorkProjectSchema,\n 'workRealms/{workRealmId}': WorkRealmSchema,\n // Realm shared-file folders — steward-owned containers; callable-written, client-read denied\n // (the gallery projection returns them alongside the files).\n 'workRealms/{workRealmId}/realmFileFolders/{realmFileFolderId}': RealmFileFolderSchema,\n 'guildInviteConversations/{guildInviteId}': GuildInviteConversationSchema,\n // Conversation Files — the flat per-conversation file list. Backend-only writes;\n // client-readable only while the caller holds conversation read access.\n 'guildInviteConversations/{guildInviteId}/conversationFiles/{conversationFileId}': ConversationFileSchema,\n\n // ===== Square / Social =====\n // SquareStreetzPostSchema is a refined ZodObject (superRefine for the MEDIA-101\n // mediaAssetId↔mediaType pair invariant); the schema-doc generator and the\n // drift-check both unwrap the effect to introspect its shape, so binding the\n // refined schema here is correct.\n 'squareStreetzFeed/activePosts/socialPosts/{postId}': SquareStreetzPostSchema,\n 'squareStreetzFeed/trendingPosts': TrendingPostsSchema,\n 'followEdges/{followEdgeId}': FollowEdgeSchema,\n 'followCounters/{followCounterId}': FollowCounterSchema,\n // Durable Square announcement outbox (Admin-SDK-only; deterministic job ids).\n 'squareAnnouncementJobs/{jobId}': SquareAnnouncementJobSchema,\n\n // ===== Payments / pledge ledger =====\n 'pledgePayments/{pledgePaymentId}': PledgePaymentSchema,\n 'pledgePaymentProviderRefs/{pledgePaymentId}': PledgePaymentProviderRefSchema,\n 'processedStripeEvents/{stripeEventId}': ProcessedStripeEventSchema,\n 'pledgePaymentLedgerEvents/{ledgerId}': PledgePaymentLedgerEventSchema,\n 'paymentWebhookQuarantine/{stripeEventId}': PaymentWebhookQuarantineSchema,\n 'pledgePaymentTotals/summary': PledgePaymentTotalsDocSchema,\n 'pledgeRefundRequests/{requestId}': PledgeRefundRequestSchema,\n\n // ===== Threshold / Hall =====\n 'thresholdItems/{thresholdItemId}': ThresholdItemSchema,\n 'hallItems/{hallItemId}': PublishedHallItemSchema,\n // Published hall sub-item projections — the chapter/track/episode docs copied out of\n // the Work at publish time (runPublishApprovedHallLibraryItem). Segment names are the\n // HALL_ITEM_SUBCOLLECTIONS constants — fixed compound names, NOT derived from\n // WorkProjectType.\n 'hallItems/{hallItemId}/hallItemTales/{itemId}': PublishedChapterSchema,\n 'hallItems/{hallItemId}/hallItemTunes/{itemId}': PublishedTuneTrackSchema,\n 'hallItems/{hallItemId}/hallItemTelevision/{itemId}': PublishedTelevisionEpisodeSchema,\n 'hallContentChangeRequests/{changeRequestId}': HallContentChangeRequestSchema,\n\n // ===== Commission / Audition =====\n 'commissionListings/{commissionListingId}': FullCommissionListingSchema,\n 'commissionListings/{commissionListingId}/commissionProposals/{commissionProposalId}': CommissionProposalSchema,\n 'auditionBoard/{auditionId}': AuditionSchema,\n 'auditionBoard/{auditionId}/auditionEntries/{auditionEntryId}': AuditionEntrySchema,\n\n // ===== Moderation / Reports / Admin =====\n // The report spine (§A1): the restricted root, its public projection subdoc, and the\n // dedup/count group. The root + projection are written by the app's submitReport\n // callable; the group is maintained by an app-side trigger.\n 'contentReports/{reportId}': ProtectedReportRootV1Schema,\n 'contentReports/{reportId}/publicProjection/{reportId}': ReportPublicProjectionV1Schema,\n 'contentReports/{reportId}/privateDetails/snapshot': ReportTargetSnapshotV1Schema,\n 'contentReports/{reportId}/privateDetails/narrative': NarrativeRecordV1Schema,\n // The escalation narrative is byte-identical to the original — ONE shape, ONE definition\n // (ENG-002): the same NarrativeRecordV1Schema binds both docs, never a duplicate schema.\n 'contentReports/{reportId}/privateDetails/narrativeEscalation': NarrativeRecordV1Schema,\n 'activeReportGroups/{groupKey}': ReportGroupV1Schema,\n 'activeReportGroups/{groupKey}/reportGroupCountedReports/{reportId}': ReportGroupCountedReportSchema,\n 'adminTasks/{taskId}': AdminTaskDocSchema,\n 'contentViolations/{violationId}': ContentViolationSchema,\n 'moderationCascadeManifests/{cascadeId}': ModerationCascadeManifestSchema,\n 'moderationCascadeManifests/{cascadeId}/changedDocs/{changedDocId}': ModerationCascadeChangedDocSchema,\n 'auditEvents/{eventId}': TTTAuditEventSchema,\n 'stakeShareAuditEvents/{eventId}': StakeShareAuditEventSchema,\n 'pendingAdminDispatches/{adminDispatchId}': AdminDispatchSchema,\n 'pendingAdminDispatches/{adminDispatchId}/conversationMessages/{adminDispatchMessageId}': ChatMessageV1Schema,\n 'pendingAdminDispatches/{adminDispatchId}/conversationFiles/{conversationFileId}': ConversationFileSchema,\n 'pendingAdminDispatches/{adminDispatchId}/dispatchReadMarkers/{uid}': AdminDispatchReadMarkerSchema,\n\n // ===== Media pipeline =====\n 'pendingMedia/{pendingMediaId}': PendingMediaSchema,\n 'pendingMediaArchive/{pendingMediaId}': ArchivedPendingMediaDocSchema,\n 'mediaAssets/{mediaAssetId}': MediaAssetSchema,\n 'mediaActivationJobs/{jobId}': MediaActivationJobSchema,\n 'mediaCopyIntents/{newAssetId}': MediaCopyIntentSchema,\n\n // ===== Notifications =====\n 'activeUserNotifications/{notificationId}': NotificationDocSchema,\n 'activeAdminNotifications/{notificationId}': NotificationDocSchema,\n 'adminNotificationHistory/{notificationId}': NotificationHistoryDocSchema,\n 'pendingNotifications/{notificationId}': PendingNotificationSchema,\n\n // ===== Notification redesign — delivery ledger + fanout engine =====\n 'notificationDeliveries/{deliveryId}': NotificationDeliverySchema,\n 'notificationFanoutJobs/{jobId}': NotificationFanoutJobSchema,\n 'notificationArchiveAllJobs/{jobId}': NotificationArchiveAllJobSchema,\n\n // ===== Chat realtime sync / projection / commands =====\n 'chatChannelAuthProjections/{authPairKey}': ChatChannelAuthProjectionSchema,\n 'chatScopeDegraded/{scopeKey}': ChatScopeDegradedSchema,\n 'chatScopeDegraded/{scopeKey}/chatScopeDegradedCauses/{causeId}': ChatScopeDegradedCauseSchema,\n 'chatSyncEvents/{eventId}': ChatSyncEventSchema,\n 'chatSyncFanoutJobs/{jobId}': ChatSyncFanoutJobSchema,\n 'chatMessageOutbox/{commandId}': ChatMessageOutboxSchema,\n 'chatAdminActionCommands/{requestId}': ChatAdminActionCommandSchema,\n 'chatHistoryAnonymizationJobs/{jobId}': ChatHistoryAnonymizationJobSchema,\n 'chatHistoryAnonymizationJobs/{jobId}/affectedChunks/{chunkOrdinal}': ChatHistoryAnonymizationAffectedChunkSchema,\n 'chatParkedDeliveries/{deliveryId}': ChatParkedDeliverySchema,\n\n // ===== Craft skills index =====\n 'craftSkillsByTag/{tag}/taggedCraftSkills/{compositeId}': CraftSkillReferenceSchema,\n\n // ===== Operational / utility =====\n 'reservedDisplayNames/{displayNameUppercase}': ReservedDisplayNameSchema,\n 'reservedRealmNames/{workingTitleUppercase}': ReservedRealmNameSchema,\n 'accountDeletionRequests/{uid}': AccountDeletionRequestV1Schema,\n 'shortLinks/{shortId}': ShortLinkSchema,\n 'feedbackSubmissions/{feedbackType}/userSuggestions/{suggestionId}': UserSuggestionSchema,\n 'statusReconcileQueue/{uid}': StatusReconcileQueueEntrySchema,\n\n // ===== Versioned public documents (backend-written; never public — the public reads the _appConfig projections) =====\n 'publicDocuments/{documentId}/publicDocumentVersions/{versionId}': PublicDocumentVersionSchema,\n 'publicDocumentDrafts/{documentId}': PublicDocumentDraftSchema,\n 'publicDocumentReleases/{releaseId}': PublicDocumentReleaseSchema,\n\n // ===== Trust & Safety — child-safety case spine (§A1b, §A2) =====\n 'childSafetyCaseList/{caseId}': ChildSafetyCaseListV1Schema,\n 'activeSafetyCaseAlerts/{caseId}': SafetyCaseAlertV1Schema,\n 'childSafetyCases/{caseId}': ChildSafetyCaseV1Schema,\n 'childSafetyCases/{caseId}/sourceSignals/{signalId}': ChildSafetySourceSignalV1Schema,\n 'childSafetyCases/{caseId}/childSafetyDecisions/{decisionId}': ChildSafetyDecisionV1Schema,\n 'childSafetyCases/{caseId}/childSafetyDecisions/{decisionId}/childSafetyDecisionViews/{viewId}': ChildSafetyDecisionViewV1Schema,\n 'childSafetyCases/{caseId}/childSafetyCaseAccounts/{uid}': ChildSafetyCaseAccountV1Schema,\n 'childSafetyCases/{caseId}/childSafetyCaseAccounts/{uid}/childSafetyCaseAccountHistory/{historyId}': ChildSafetyCaseAccountHistoryV1Schema,\n 'childSafetyCases/{caseId}/childSafetyCaseCrossoverItems/{mediaAssetId}': ChildSafetyCrossoverItemV1Schema,\n 'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}': ChildSafetyNcmecSubmissionV1Schema,\n 'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}/ncmecSubmissionFiles/{fileId}': ChildSafetyNcmecSubmissionFileV1Schema,\n // [H-05] the submission's single immutable completion-proof record (fixed doc id). Backend-only,\n // so its shape lives in doc-schemas/backend-state.ts alongside the portal artifacts.\n 'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}/ncmecCompletionProof/record': NcmecCompletionProofRecordV1Schema,\n 'childSafetyCases/{caseId}/legalProcess/{eventId}': ChildSafetyLegalProcessEventV1Schema,\n // Portal-filed NCMEC artifacts recorded by the two step-up-gated operator callables. Both\n // are backend-only (no client reader), so their shapes live in doc-schemas/backend-state.ts.\n 'childSafetyCases/{caseId}/portalReceiptArtifacts/{artifactId}': NcmecPortalReceiptArtifactV1Schema,\n 'childSafetyCases/{caseId}/ncmecPortalCorrections/{correctionId}': NcmecPortalCorrectionRecordV1Schema,\n 'childSafetyOwningAliases/{aliasId}': ChildSafetyOwningAliasV1Schema,\n\n // ===== Trust & Safety — holds + resource commands (§A3) =====\n 'safetyHoldRefs/{holdRefId}': SafetyHoldRefV1Schema,\n 'safetyHoldResources/{resourceKeyHash}': SafetyHoldResourceV1Schema,\n 'safetyResourceCommands/{commandDocId}': SafetyResourceCommandV1Schema,\n 'safetyResourceCommands/{commandDocId}/authorizedRequests/{requestId}': SafetyResourceCommandAuthorizedRequestV1Schema,\n 'safetyResourceCommands/{commandDocId}/bypassRefs/{refId}': SafetyResourceCommandBypassRefV1Schema,\n\n // ===== Trust & Safety — evidence + provenance (§A4, §A6) =====\n // SafetyEvidenceManifestV1Schema is a refined ZodObject (superRefine for the H5\n // sourceKind invariant); the schema-doc generator unwraps the effect to introspect\n // its shape, so binding the refined schema here is correct.\n 'safetyEvidenceManifests/{manifestId}': SafetyEvidenceManifestV1Schema,\n 'safetyEvidenceJobs/{jobId}': SafetyEvidenceJobV1Schema,\n 'safetyEvidenceJobs/{jobId}/safetyEvidenceJobItems/{itemId}': SafetyEvidenceJobItemDocV1Schema,\n 'safetyEvidenceJobs/{jobId}/safetyEvidenceJobDisposition/{locationId}': SafetyEvidenceDispositionV1Schema,\n 'eventProvenance/{eventId}': EventProvenanceV1Schema,\n\n // ===== Trust & Safety — sagas + closure (§A5) =====\n 'quarantineSagaJobs/{caseId}': QuarantineSagaJobV1Schema,\n 'quarantineSagaJobs/{caseId}/relatedAssets/{assetId}': QuarantineSagaRelatedAssetV1Schema,\n 'ncmecSubmissionJobs/{ncmecJobId}': NcmecSubmissionJobV1Schema,\n 'accountActionCommands/{accountActionCommandId}': AccountActionCommandV1Schema,\n\n // ===== Trust & Safety — SLA monitors + heartbeat (§A8) =====\n 'safetySlaMonitors/{monitorId}': SafetySlaMonitorV1Schema,\n 'safetyMonitorHeartbeat/global': SafetyMonitorHeartbeatV1Schema,\n\n // ===== Trust & Safety — age attestation nonces (§A7) =====\n 'ageAttestationNonces/{nonceHash}': AgeAttestationNonceV1Schema,\n\n // ===== Trust & Safety — operator step-up + reconciler cursors (backend-only) =====\n // Cloud-Functions-only readers/writers; client access denied in firestore.rules.\n 'operatorStepUp/{uid}': OperatorStepUpSchema,\n\n // ===== Scheduled user sweeps — durable cadence/cursor state (backend-only) =====\n 'sweepState/{sweepName}': SweepStateSchema,\n\n // ===== Trust & Safety — NCII / TAKE IT DOWN (§A11) =====\n 'nciiAllegations/{allegationId}': NciiAllegationV1Schema,\n 'takeItDownRequests/{requestId}': TakeItDownRequestRootV1Schema,\n 'takeItDownRequests/{requestId}/privateDetails/requester': TakeItDownRequesterPrivateV1Schema,\n 'takeItDownRequests/{requestId}/takeItDownSubmissions/{submissionId}': TakeItDownSubmissionV1Schema,\n 'takeItDownRequests/{requestId}/validityDecisions/{decisionId}': TakeItDownValidityDecisionV1Schema,\n 'takeItDownRequests/{requestId}/validityDecisions/{decisionId}/takeItDownValidityRationale/record': TakeItDownValidityRationaleV1Schema,\n 'takeItDownRequests/{requestId}/takeItDownActions/{actionId}': TakeItDownRequestActionV1Schema,\n // Deletion-verification record per evidence object — see SafetyEvidenceDispositionV1Schema for what\n // `result: 'gone'` means in THIS bucket (absent from the live bucket, not permanent destruction).\n 'takeItDownRequests/{requestId}/takeItDownEvidenceDisposition/{evidenceId}': SafetyEvidenceDispositionV1Schema,\n 'takeItDownRequests/{requestId}/takeItDownEvidence/{evidenceId}': TakeItDownEvidenceV1Schema,\n 'nciiCases/{caseId}': NciiCaseV1Schema,\n 'nciiCases/{caseId}/allegationLinks/{allegationId}': NciiCaseAllegationLinkV1Schema,\n 'nciiCases/{caseId}/requestLinks/{requestId}': NciiCaseRequestLinkV1Schema,\n 'nciiCases/{caseId}/removalActions/{actionId}': NciiCaseRemovalActionV1Schema,\n 'nciiCases/{caseId}/blockedHashes/{hashId}': NciiBlockedHashV1Schema,\n 'nciiCases/{caseId}/closureEvents/{eventId}': NciiCaseClosureEventV1Schema,\n 'nciiRetainedEvidenceInventory/{inventoryId}': NciiRetainedEvidenceInventoryV1Schema,\n // [H-01] dead-letter sink for inventory rows that could not be written to the primary\n // nciiRetainedEvidenceInventory collection. Stores the same document shape.\n 'nciiInventoryDeadLetter/{inventoryId}': NciiRetainedEvidenceInventoryV1Schema,\n 'nciiTemporaryHolds/{holdId}': NciiTemporaryHoldV1Schema,\n 'nciiRemovalJobs/{jobId}': NciiRemovalJobV1Schema,\n 'nciiRemovalJobs/{jobId}/nciiRemovalTargets/{targetKeyHash}': NciiRemovalTargetV1Schema,\n\n // ===== _appConfig singletons (public) =====\n '_appConfig/app': AppConfigSchema,\n // The public documents' current projections. Every one is a public page; take-it-down is a\n // NO-LOGIN page, so its copy doc must be publicly readable.\n '_appConfig/futurePlans': PUBLIC_DOCUMENT_PROJECTIONS.futurePlans.schema,\n '_appConfig/rulesAndAgreements': PUBLIC_DOCUMENT_PROJECTIONS.rulesAndAgreements.schema,\n '_appConfig/termsOfService': PUBLIC_DOCUMENT_PROJECTIONS.termsOfService.schema,\n '_appConfig/privacyPolicy': PUBLIC_DOCUMENT_PROJECTIONS.privacyPolicy.schema,\n '_appConfig/takeItDownPageCopy': PUBLIC_DOCUMENT_PROJECTIONS.takeItDownPageCopy.schema,\n '_appConfig/dmcaPolicy': PUBLIC_DOCUMENT_PROJECTIONS.dmcaPolicy.schema,\n '_appConfig/systemUidSlots': SystemUidSlotsDocumentSchema,\n\n // ===== _serverData singletons (server-only — Cloud-Functions-only readers, BACKEND-108) =====\n '_serverData/agePolicy': AgePolicyConfigV1Schema,\n '_serverData/nciiPolicy': NciiPolicyConfigV1Schema,\n '_serverData/privilegedReviewerSecurity': PrivilegedReviewerSecurityProfileV1Schema,\n // The submitFeedback alias map — moved off the anonymously-readable top-level\n // `feedbackAliases` collection into the server-only bucket (BACKEND-108). The sibling\n // `feedbackDenylist` subcollection has no field contract (`.exists`-only) — see\n // PENDING_COLLECTIONS.\n '_serverData/feedbackLists/feedbackAliases/{aliasId}': FeedbackAliasSchema,\n // The scheduled sweeps' scan cursors — each read only by the function that owns it.\n\n // ===== _systemData singletons (signed-in readers, BACKEND-108) =====\n '_systemData/adminList': AdminListSchema,\n '_systemData/profanityList': ProfanityListSchema,\n '_systemData/reservedUsernames': ReservedUsernamesSchema,\n '_systemData/blockedFranchiseNames': BlockedFranchiseNamesSchema,\n '_systemData/appMode': AppModeMarkerSchema,\n '_systemData/systemVideoSlots': SystemVideoSlotsDocumentSchema,\n} as const satisfies Record<string, z.ZodTypeAny>;\n\nexport type RegisteredCollectionPath = keyof typeof COLLECTION_SCHEMAS;\n\n/**\n * Doc-id field annotation: for the listed bindings, the named body field equals the\n * Firestore document id and is injected at READ time (`{ ...doc.data(), <field>: doc.id }`),\n * never persisted — the write callables store the body via `Omit<…, '<field>'>`. The bound\n * schema models the (correct) consumer/read shape, where the field is required, so a raw\n * stored doc is \"missing\" it. The drift-check injects `{ [field]: doc.id, ...data }` before\n * validating, generalizing the one-off `AdminTaskDocSchema` stored-shape workaround into a\n * single mechanism so real-callable drift-checks don't false-flag every doc-id collection.\n * The schema-doc generator ignores this map. Keys are compiler-checked against the registry.\n */\nexport const COLLECTION_DOC_ID_FIELDS = {\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}/taleChapters/{chapterId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}/tuneTracks/{trackId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}/televisionEpisodes/{episodeId}': 'uid',\n 'allWorkProjects/{workProjectId}/guildChatChannels/{guildChatChannelId}': 'guildChatChannelId',\n // Published hall sub-items: the doc id IS the live sub-item's id; `uid` is injected at\n // read (the publish writer spreads the live doc's stored body, which has no `uid`).\n 'hallItems/{hallItemId}/hallItemTales/{itemId}': 'uid',\n 'hallItems/{hallItemId}/hallItemTunes/{itemId}': 'uid',\n 'hallItems/{hallItemId}/hallItemTelevision/{itemId}': 'uid',\n 'activeUserNotifications/{notificationId}': 'id',\n 'activeAdminNotifications/{notificationId}': 'id',\n 'adminNotificationHistory/{notificationId}': 'archiveOccurrenceId',\n 'userProfiles/{userId}/notificationHistory/{notificationId}': 'archiveOccurrenceId',\n 'pendingNotifications/{notificationId}': 'id',\n 'statusReconcileQueue/{uid}': 'uid',\n} as const satisfies Partial<Record<RegisteredCollectionPath, string>>;\n\n/**\n * Collections that exist (in COLLECTIONS / *_SUBCOLLECTIONS or firestore.rules) but are\n * intentionally NOT bound to a schema, each with a reason. Listed EXPLICITLY so completeness is\n * enforced and nothing is silently uncovered; the registry test fails if a NEW unlisted collection\n * appears. These are the only remaining gaps after the schema-registry binding pass:\n *\n * - userMetadata: `userProfiles/{uid}/userMetadata/notificationSettings` — a firestore.rules\n * match and `PATH_BUILDERS.userMetadata` exist, but there is no live reader/writer and no\n * notification-settings type anywhere yet. Bind once that shape is implemented.\n * - feedbackDenylist: `_serverData/feedbackLists/feedbackDenylist/{deniedWord}` — Console-managed\n * (no callable writes it) and submitFeedback reads it via `.exists` only, so there is no field\n * contract to author a schema from. The doc id is the denied word; the body is unused.\n * - ncmecSubmissionAttempts: see the inline reason below.\n */\nexport const PENDING_COLLECTIONS: readonly string[] = [\n 'userMetadata',\n 'feedbackDenylist',\n // Per-submission NCMEC transmission attempts. The segment exists only in firestore.rules\n // today and has no writer or reader yet; the constant is registered so the name has one\n // owner. Bind once the attempt-record shape is implemented.\n 'ncmecSubmissionAttempts',\n] as const;\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/doc-schemas/registry.ts"],"names":[],"mappings":"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","sourcesContent":["// Firestore collection registry — the single, authoritative binding from each Firestore\n// collection/subcollection path template to its document Zod schema. This is the input to\n// the schema-doc generator and the drift-check, and its completeness is CI-enforced\n// (registry.test.ts) against the COLLECTIONS / *_SUBCOLLECTIONS name constants, so a new\n// collection cannot be added without either a schema or an explicit PENDING entry.\n//\n// Path templates reuse the segment names from ../paths/collections.ts (and the shapes the\n// path-builders produce). `{placeholder}` segments are document/parent IDs.\n\nimport type { z } from 'zod';\nimport {\n FullUserSchema,\n UserPrivateDataSchema,\n CraftSkillSchema,\n CraftSkillReferenceSchema,\n} from './user.js';\nimport { PublicUserSchema } from './publicUser.js';\nimport { AccountDeletionRequestV1Schema } from './account-deletion.js';\nimport {\n FullWorkProjectSchema,\n PublicWorkProjectSchema,\n WorkFileFolderSchema,\n WorkFileSchema,\n WorkRealmSchema,\n RealmFileFolderSchema,\n GuildmateUserSchema,\n PublicGuildmateUserSchema,\n} from './work-project.js';\nimport {\n FullTaleSchema,\n FullChapterSchema,\n FullTuneSchema,\n FullTuneTrackSchema,\n FullTelevisionSchema,\n FullTelevisionEpisodeSchema,\n ThresholdItemSchema,\n HallSubmissionReservationSchema,\n PublishedHallItemSchema,\n PublishedChapterSchema,\n PublishedTuneTrackSchema,\n PublishedTelevisionEpisodeSchema,\n HallContentChangeRequestSchema,\n HallLibraryPreferencesSchema,\n} from './content.js';\nimport {\n SquareStreetzPostSchema,\n MentionHistoryDocumentSchema,\n FollowEdgeSchema,\n FollowCounterSchema,\n SquareStreetzLikeSchema,\n TrendingPostsSchema,\n} from './social.js';\nimport {\n PledgePaymentSchema,\n PledgePaymentProviderRefSchema,\n ProcessedStripeEventSchema,\n PledgePaymentLedgerEventSchema,\n PaymentWebhookQuarantineSchema,\n PledgePaymentTotalsDocSchema,\n PledgeRefundRequestSchema,\n} from './payments.js';\nimport {\n FullCommissionListingSchema,\n CommissionProposalSchema,\n AuditionSchema,\n AuditionEntrySchema,\n UserAuditionVoteSchema,\n} from './commissions.js';\nimport {\n GuildChatChannelSchema,\n GuildInviteConversationSchema,\n AdminDispatchSchema,\n ChatMessageV1Schema,\n ConversationFileSchema,\n} from './messaging.js';\nimport {\n PublicDocumentVersionSchema,\n PublicDocumentDraftSchema,\n PublicDocumentReleaseSchema,\n PUBLIC_DOCUMENT_PROJECTIONS,\n} from './public-documents.js';\nimport { AppConfigSchema, AdminListSchema, ProfanityListSchema, ReservedUsernamesSchema, BlockedFranchiseNamesSchema, AppModeMarkerSchema } from './system.js';\nimport { SystemUidSlotsDocumentSchema, SystemVideoSlotsDocumentSchema } from './system-slots.js';\nimport {\n ContentViolationSchema,\n ModerationCascadeManifestSchema,\n ModerationCascadeChangedDocSchema,\n} from './moderation.js';\nimport {\n AdminTaskDocSchema,\n} from './report-docs.js';\nimport { TTTAuditEventSchema } from './audit.js';\nimport {\n NotificationDocSchema,\n NotificationHistoryDocSchema,\n PendingNotificationSchema,\n} from './notifications.js';\nimport {\n NotificationDeliverySchema,\n NotificationFanoutJobSchema,\n} from './notification-ledger.js';\nimport { NotificationArchiveAllJobSchema } from './notification-archive-all-jobs.js';\nimport { AdminDispatchReadMarkerSchema } from './admin-dispatch-read-markers.js';\nimport {\n ChatChannelAuthProjectionSchema,\n ChatScopeDegradedSchema,\n ChatScopeDegradedCauseSchema,\n ChatSyncEventSchema,\n ChatSyncFanoutJobSchema,\n ChatMessageOutboxSchema,\n ChatAdminActionCommandSchema,\n ChatHistoryAnonymizationJobSchema,\n ChatHistoryAnonymizationAffectedChunkSchema,\n ChatParkedDeliverySchema,\n} from './chat-sync.js';\nimport { SquareAnnouncementJobSchema } from './square-announcement-jobs.js';\nimport { PendingMediaSchema, ArchivedPendingMediaDocSchema } from '../media/pending-media.js';\nimport { MediaAssetSchema } from './media-assets.js';\nimport { MediaActivationJobSchema } from './media-activation-jobs.js';\nimport { MediaCopyIntentSchema } from './media-copy-intents.js';\nimport {\n ReservedDisplayNameSchema,\n ReservedRealmNameSchema,\n StakeShareAuditEventSchema,\n ShortLinkSchema,\n FeedbackAliasSchema,\n UserSuggestionSchema,\n StatusReconcileQueueEntrySchema,\n} from './operational.js';\n// ===== Trust & Safety — report spine =====\nimport {\n ProtectedReportRootV1Schema,\n ReportPublicProjectionV1Schema,\n ReportGroupV1Schema,\n ReportGroupCountedReportSchema,\n ReportTargetSnapshotV1Schema,\n NarrativeRecordV1Schema,\n} from './safety/report.js';\nimport { SafetyCaseAlertV1Schema } from './safety/case-alert.js';\n// ===== Trust & Safety — child-safety case spine =====\nimport {\n ChildSafetyCaseListV1Schema,\n ChildSafetyCaseV1Schema,\n ChildSafetySourceSignalV1Schema,\n ChildSafetyDecisionV1Schema,\n ChildSafetyDecisionViewV1Schema,\n ChildSafetyCaseAccountV1Schema,\n ChildSafetyCaseAccountHistoryV1Schema,\n ChildSafetyCrossoverItemV1Schema,\n ChildSafetyNcmecSubmissionV1Schema,\n ChildSafetyNcmecSubmissionFileV1Schema,\n ChildSafetyLegalProcessEventV1Schema,\n} from './safety/case.js';\nimport {\n ChildSafetyOwningAliasV1Schema,\n} from './safety/case-aliases.js';\nimport {\n SafetyHoldRefV1Schema,\n SafetyHoldResourceV1Schema,\n SafetyResourceCommandV1Schema,\n SafetyResourceCommandAuthorizedRequestV1Schema,\n SafetyResourceCommandBypassRefV1Schema,\n} from './safety/holds.js';\nimport {\n SafetyEvidenceManifestV1Schema,\n SafetyEvidenceJobV1Schema,\n SafetyEvidenceJobItemDocV1Schema,\n SafetyEvidenceDispositionV1Schema,\n} from './safety/evidence.js';\nimport { EventProvenanceV1Schema } from './safety/provenance.js';\nimport {\n QuarantineSagaJobV1Schema,\n QuarantineSagaRelatedAssetV1Schema,\n NcmecSubmissionJobV1Schema,\n AccountActionCommandV1Schema,\n} from './safety/sagas.js';\nimport {\n SafetySlaMonitorV1Schema,\n SafetyMonitorHeartbeatV1Schema,\n} from './safety/monitors.js';\nimport { AgeAttestationNonceV1Schema, AgePolicyConfigV1Schema } from './safety/age.js';\n// ===== Trust & Safety — NCII / TAKE IT DOWN =====\nimport { NciiAllegationV1Schema } from './ncii/allegations.js';\nimport {\n TakeItDownRequestRootV1Schema,\n TakeItDownRequesterPrivateV1Schema,\n TakeItDownSubmissionV1Schema,\n TakeItDownValidityDecisionV1Schema,\n TakeItDownValidityRationaleV1Schema,\n TakeItDownRequestActionV1Schema,\n TakeItDownEvidenceV1Schema,\n NciiRetainedEvidenceInventoryV1Schema,\n} from './ncii/requests.js';\nimport {\n NciiCaseV1Schema,\n NciiCaseAllegationLinkV1Schema,\n NciiCaseRequestLinkV1Schema,\n NciiCaseRemovalActionV1Schema,\n NciiBlockedHashV1Schema,\n NciiCaseClosureEventV1Schema,\n} from './ncii/cases.js';\nimport { NciiTemporaryHoldV1Schema } from './ncii/holds.js';\nimport {\n NciiRemovalJobV1Schema,\n NciiRemovalTargetV1Schema,\n} from './ncii/removal.js';\nimport {\n NciiPolicyConfigV1Schema,\n PrivilegedReviewerSecurityProfileV1Schema,\n} from './ncii/config.js';\nimport {\n NcmecCompletionProofRecordV1Schema,\n NcmecPortalCorrectionRecordV1Schema,\n NcmecPortalReceiptArtifactV1Schema,\n OperatorStepUpSchema,\n SweepStateSchema,\n} from './backend-state.js';\n\nexport const COLLECTION_SCHEMAS = {\n // ===== Users =====\n 'userProfiles/{userId}': FullUserSchema,\n 'userProfiles/{userId}/privateData/{userId}': UserPrivateDataSchema,\n 'userProfiles/{userId}/privateData/hallLibraryPreferences': HallLibraryPreferencesSchema,\n 'userProfiles/{userId}/profileCraftSkills/{craftSkillId}': CraftSkillSchema,\n 'userProfiles/{userId}/auditionVotes/{auditionId}': UserAuditionVoteSchema,\n 'userProfiles/{userId}/mentionHistory/{docId}': MentionHistoryDocumentSchema,\n 'userProfiles/{userId}/notificationHistory/{notificationId}': NotificationHistoryDocSchema,\n 'userProfiles/{userId}/userLikes/likeHistory/squareStreetzLikes/{postId}': SquareStreetzLikeSchema,\n 'publicUsers/{uid}': PublicUserSchema,\n\n // ===== Work / Realm / Guild =====\n 'allWorkProjects/{workProjectId}': FullWorkProjectSchema,\n 'allWorkProjects/{workProjectId}/guildmateUsers/{uid}': GuildmateUserSchema,\n 'allWorkProjects/{workProjectId}/publicGuildmateUsers/{uid}': PublicGuildmateUserSchema,\n 'allWorkProjects/{workProjectId}/workFileFolders/{workFileFolderId}': WorkFileFolderSchema,\n 'allWorkProjects/{workProjectId}/workFileFolders/{workFileFolderId}/workFiles/{workFileId}': WorkFileSchema,\n 'allWorkProjects/{workProjectId}/hallSubmissionReservation/reservation': HallSubmissionReservationSchema,\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}': FullTaleSchema,\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}/taleChapters/{chapterId}': FullChapterSchema,\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}': FullTuneSchema,\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}/tuneTracks/{trackId}': FullTuneTrackSchema,\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}': FullTelevisionSchema,\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}/televisionEpisodes/{episodeId}': FullTelevisionEpisodeSchema,\n 'allWorkProjects/{workProjectId}/guildChatChannels/{guildChatChannelId}': GuildChatChannelSchema,\n // Guild channel + invite messages are REALTIME-ONLY (chat Worker DO) — no Firestore schema.\n 'publicWorkProjects/{workProjectId}': PublicWorkProjectSchema,\n 'workRealms/{workRealmId}': WorkRealmSchema,\n // Realm shared-file folders — steward-owned containers; callable-written, client-read denied\n // (the gallery projection returns them alongside the files).\n 'workRealms/{workRealmId}/realmFileFolders/{realmFileFolderId}': RealmFileFolderSchema,\n 'guildInviteConversations/{guildInviteId}': GuildInviteConversationSchema,\n // Conversation Files — the flat per-conversation file list. Backend-only writes;\n // client-readable only while the caller holds conversation read access.\n 'guildInviteConversations/{guildInviteId}/conversationFiles/{conversationFileId}': ConversationFileSchema,\n\n // ===== Square / Social =====\n // SquareStreetzPostSchema is a refined ZodObject (superRefine for the MEDIA-101\n // mediaAssetId↔mediaType pair invariant); the schema-doc generator and the\n // drift-check both unwrap the effect to introspect its shape, so binding the\n // refined schema here is correct.\n 'squareStreetzFeed/activePosts/socialPosts/{postId}': SquareStreetzPostSchema,\n 'squareStreetzFeed/trendingPosts': TrendingPostsSchema,\n 'followEdges/{followEdgeId}': FollowEdgeSchema,\n 'followCounters/{followCounterId}': FollowCounterSchema,\n // Durable Square announcement outbox (Admin-SDK-only; deterministic job ids).\n 'squareAnnouncementJobs/{jobId}': SquareAnnouncementJobSchema,\n\n // ===== Payments / pledge ledger =====\n 'pledgePayments/{pledgePaymentId}': PledgePaymentSchema,\n 'pledgePaymentProviderRefs/{pledgePaymentId}': PledgePaymentProviderRefSchema,\n 'processedStripeEvents/{stripeEventId}': ProcessedStripeEventSchema,\n 'pledgePaymentLedgerEvents/{ledgerId}': PledgePaymentLedgerEventSchema,\n 'paymentWebhookQuarantine/{stripeEventId}': PaymentWebhookQuarantineSchema,\n 'pledgePaymentTotals/summary': PledgePaymentTotalsDocSchema,\n 'pledgeRefundRequests/{requestId}': PledgeRefundRequestSchema,\n\n // ===== Threshold / Hall =====\n 'thresholdItems/{thresholdItemId}': ThresholdItemSchema,\n 'hallItems/{hallItemId}': PublishedHallItemSchema,\n // Published hall sub-item projections — the chapter/track/episode docs copied out of\n // the Work at publish time (runPublishApprovedHallLibraryItem). Segment names are the\n // HALL_ITEM_SUBCOLLECTIONS constants — fixed compound names, NOT derived from\n // WorkProjectType.\n 'hallItems/{hallItemId}/hallItemTales/{itemId}': PublishedChapterSchema,\n 'hallItems/{hallItemId}/hallItemTunes/{itemId}': PublishedTuneTrackSchema,\n 'hallItems/{hallItemId}/hallItemTelevision/{itemId}': PublishedTelevisionEpisodeSchema,\n 'hallContentChangeRequests/{changeRequestId}': HallContentChangeRequestSchema,\n\n // ===== Commission / Audition =====\n 'commissionListings/{commissionListingId}': FullCommissionListingSchema,\n 'commissionListings/{commissionListingId}/commissionProposals/{commissionProposalId}': CommissionProposalSchema,\n 'auditionBoard/{auditionId}': AuditionSchema,\n 'auditionBoard/{auditionId}/auditionEntries/{auditionEntryId}': AuditionEntrySchema,\n\n // ===== Moderation / Reports / Admin =====\n // The report spine: the restricted root, its public projection subdoc, and the\n // dedup/count group. The root + projection are written by the app's submitReport\n // callable; the group is maintained by an app-side trigger.\n 'contentReports/{reportId}': ProtectedReportRootV1Schema,\n 'contentReports/{reportId}/publicProjection/{reportId}': ReportPublicProjectionV1Schema,\n 'contentReports/{reportId}/privateDetails/snapshot': ReportTargetSnapshotV1Schema,\n 'contentReports/{reportId}/privateDetails/narrative': NarrativeRecordV1Schema,\n // The escalation narrative is byte-identical to the original — ONE shape, ONE definition\n // (ENG-002): the same NarrativeRecordV1Schema binds both docs, never a duplicate schema.\n 'contentReports/{reportId}/privateDetails/narrativeEscalation': NarrativeRecordV1Schema,\n 'activeReportGroups/{groupKey}': ReportGroupV1Schema,\n 'activeReportGroups/{groupKey}/reportGroupCountedReports/{reportId}': ReportGroupCountedReportSchema,\n 'adminTasks/{taskId}': AdminTaskDocSchema,\n 'contentViolations/{violationId}': ContentViolationSchema,\n 'moderationCascadeManifests/{cascadeId}': ModerationCascadeManifestSchema,\n 'moderationCascadeManifests/{cascadeId}/changedDocs/{changedDocId}': ModerationCascadeChangedDocSchema,\n 'auditEvents/{eventId}': TTTAuditEventSchema,\n 'stakeShareAuditEvents/{eventId}': StakeShareAuditEventSchema,\n 'pendingAdminDispatches/{adminDispatchId}': AdminDispatchSchema,\n 'pendingAdminDispatches/{adminDispatchId}/conversationMessages/{adminDispatchMessageId}': ChatMessageV1Schema,\n 'pendingAdminDispatches/{adminDispatchId}/conversationFiles/{conversationFileId}': ConversationFileSchema,\n 'pendingAdminDispatches/{adminDispatchId}/dispatchReadMarkers/{uid}': AdminDispatchReadMarkerSchema,\n\n // ===== Media pipeline =====\n 'pendingMedia/{pendingMediaId}': PendingMediaSchema,\n 'pendingMediaArchive/{pendingMediaId}': ArchivedPendingMediaDocSchema,\n 'mediaAssets/{mediaAssetId}': MediaAssetSchema,\n 'mediaActivationJobs/{jobId}': MediaActivationJobSchema,\n 'mediaCopyIntents/{newAssetId}': MediaCopyIntentSchema,\n\n // ===== Notifications =====\n 'activeUserNotifications/{notificationId}': NotificationDocSchema,\n 'activeAdminNotifications/{notificationId}': NotificationDocSchema,\n 'adminNotificationHistory/{notificationId}': NotificationHistoryDocSchema,\n 'pendingNotifications/{notificationId}': PendingNotificationSchema,\n\n // ===== Notification redesign — delivery ledger + fanout engine =====\n 'notificationDeliveries/{deliveryId}': NotificationDeliverySchema,\n 'notificationFanoutJobs/{jobId}': NotificationFanoutJobSchema,\n 'notificationArchiveAllJobs/{jobId}': NotificationArchiveAllJobSchema,\n\n // ===== Chat realtime sync / projection / commands =====\n 'chatChannelAuthProjections/{authPairKey}': ChatChannelAuthProjectionSchema,\n 'chatScopeDegraded/{scopeKey}': ChatScopeDegradedSchema,\n 'chatScopeDegraded/{scopeKey}/chatScopeDegradedCauses/{causeId}': ChatScopeDegradedCauseSchema,\n 'chatSyncEvents/{eventId}': ChatSyncEventSchema,\n 'chatSyncFanoutJobs/{jobId}': ChatSyncFanoutJobSchema,\n 'chatMessageOutbox/{commandId}': ChatMessageOutboxSchema,\n 'chatAdminActionCommands/{requestId}': ChatAdminActionCommandSchema,\n 'chatHistoryAnonymizationJobs/{jobId}': ChatHistoryAnonymizationJobSchema,\n 'chatHistoryAnonymizationJobs/{jobId}/affectedChunks/{chunkOrdinal}': ChatHistoryAnonymizationAffectedChunkSchema,\n 'chatParkedDeliveries/{deliveryId}': ChatParkedDeliverySchema,\n\n // ===== Craft skills index =====\n 'craftSkillsByTag/{tag}/taggedCraftSkills/{compositeId}': CraftSkillReferenceSchema,\n\n // ===== Operational / utility =====\n 'reservedDisplayNames/{displayNameUppercase}': ReservedDisplayNameSchema,\n 'reservedRealmNames/{workingTitleUppercase}': ReservedRealmNameSchema,\n 'accountDeletionRequests/{uid}': AccountDeletionRequestV1Schema,\n 'shortLinks/{shortId}': ShortLinkSchema,\n 'feedbackSubmissions/{feedbackType}/userSuggestions/{suggestionId}': UserSuggestionSchema,\n 'statusReconcileQueue/{uid}': StatusReconcileQueueEntrySchema,\n\n // ===== Versioned public documents (backend-written; never public — the public reads the _appConfig projections) =====\n 'publicDocuments/{documentId}/publicDocumentVersions/{versionId}': PublicDocumentVersionSchema,\n 'publicDocumentDrafts/{documentId}': PublicDocumentDraftSchema,\n 'publicDocumentReleases/{releaseId}': PublicDocumentReleaseSchema,\n\n // ===== Trust & Safety — child-safety case spine =====\n 'childSafetyCaseList/{caseId}': ChildSafetyCaseListV1Schema,\n 'activeSafetyCaseAlerts/{caseId}': SafetyCaseAlertV1Schema,\n 'childSafetyCases/{caseId}': ChildSafetyCaseV1Schema,\n 'childSafetyCases/{caseId}/sourceSignals/{signalId}': ChildSafetySourceSignalV1Schema,\n 'childSafetyCases/{caseId}/childSafetyDecisions/{decisionId}': ChildSafetyDecisionV1Schema,\n 'childSafetyCases/{caseId}/childSafetyDecisions/{decisionId}/childSafetyDecisionViews/{viewId}': ChildSafetyDecisionViewV1Schema,\n 'childSafetyCases/{caseId}/childSafetyCaseAccounts/{uid}': ChildSafetyCaseAccountV1Schema,\n 'childSafetyCases/{caseId}/childSafetyCaseAccounts/{uid}/childSafetyCaseAccountHistory/{historyId}': ChildSafetyCaseAccountHistoryV1Schema,\n 'childSafetyCases/{caseId}/childSafetyCaseCrossoverItems/{mediaAssetId}': ChildSafetyCrossoverItemV1Schema,\n 'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}': ChildSafetyNcmecSubmissionV1Schema,\n 'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}/ncmecSubmissionFiles/{fileId}': ChildSafetyNcmecSubmissionFileV1Schema,\n // The submission's single immutable completion-proof record (fixed doc id). Backend-only,\n // so its shape lives in doc-schemas/backend-state.ts alongside the portal artifacts.\n 'childSafetyCases/{caseId}/ncmecSubmissions/{submissionId}/ncmecCompletionProof/record': NcmecCompletionProofRecordV1Schema,\n 'childSafetyCases/{caseId}/legalProcess/{eventId}': ChildSafetyLegalProcessEventV1Schema,\n // Portal-filed NCMEC artifacts recorded by the two step-up-gated operator callables. Both\n // are backend-only (no client reader), so their shapes live in doc-schemas/backend-state.ts.\n 'childSafetyCases/{caseId}/portalReceiptArtifacts/{artifactId}': NcmecPortalReceiptArtifactV1Schema,\n 'childSafetyCases/{caseId}/ncmecPortalCorrections/{correctionId}': NcmecPortalCorrectionRecordV1Schema,\n 'childSafetyOwningAliases/{aliasId}': ChildSafetyOwningAliasV1Schema,\n\n // ===== Trust & Safety — holds + resource commands =====\n 'safetyHoldRefs/{holdRefId}': SafetyHoldRefV1Schema,\n 'safetyHoldResources/{resourceKeyHash}': SafetyHoldResourceV1Schema,\n 'safetyResourceCommands/{commandDocId}': SafetyResourceCommandV1Schema,\n 'safetyResourceCommands/{commandDocId}/authorizedRequests/{requestId}': SafetyResourceCommandAuthorizedRequestV1Schema,\n 'safetyResourceCommands/{commandDocId}/bypassRefs/{refId}': SafetyResourceCommandBypassRefV1Schema,\n\n // ===== Trust & Safety — evidence + provenance =====\n // SafetyEvidenceManifestV1Schema is a refined ZodObject (superRefine for the\n // sourceKind invariant); the schema-doc generator unwraps the effect to introspect\n // its shape, so binding the refined schema here is correct.\n 'safetyEvidenceManifests/{manifestId}': SafetyEvidenceManifestV1Schema,\n 'safetyEvidenceJobs/{jobId}': SafetyEvidenceJobV1Schema,\n 'safetyEvidenceJobs/{jobId}/safetyEvidenceJobItems/{itemId}': SafetyEvidenceJobItemDocV1Schema,\n 'safetyEvidenceJobs/{jobId}/safetyEvidenceJobDisposition/{locationId}': SafetyEvidenceDispositionV1Schema,\n 'eventProvenance/{eventId}': EventProvenanceV1Schema,\n\n // ===== Trust & Safety — sagas + closure =====\n 'quarantineSagaJobs/{caseId}': QuarantineSagaJobV1Schema,\n 'quarantineSagaJobs/{caseId}/relatedAssets/{assetId}': QuarantineSagaRelatedAssetV1Schema,\n 'ncmecSubmissionJobs/{ncmecJobId}': NcmecSubmissionJobV1Schema,\n 'accountActionCommands/{accountActionCommandId}': AccountActionCommandV1Schema,\n\n // ===== Trust & Safety — SLA monitors + heartbeat =====\n 'safetySlaMonitors/{monitorId}': SafetySlaMonitorV1Schema,\n 'safetyMonitorHeartbeat/global': SafetyMonitorHeartbeatV1Schema,\n\n // ===== Trust & Safety — age attestation nonces =====\n 'ageAttestationNonces/{nonceHash}': AgeAttestationNonceV1Schema,\n\n // ===== Trust & Safety — operator step-up + reconciler cursors (backend-only) =====\n // Cloud-Functions-only readers/writers; client access denied in firestore.rules.\n 'operatorStepUp/{uid}': OperatorStepUpSchema,\n\n // ===== Scheduled user sweeps — durable cadence/cursor state (backend-only) =====\n 'sweepState/{sweepName}': SweepStateSchema,\n\n // ===== Trust & Safety — NCII / TAKE IT DOWN =====\n 'nciiAllegations/{allegationId}': NciiAllegationV1Schema,\n 'takeItDownRequests/{requestId}': TakeItDownRequestRootV1Schema,\n 'takeItDownRequests/{requestId}/privateDetails/requester': TakeItDownRequesterPrivateV1Schema,\n 'takeItDownRequests/{requestId}/takeItDownSubmissions/{submissionId}': TakeItDownSubmissionV1Schema,\n 'takeItDownRequests/{requestId}/validityDecisions/{decisionId}': TakeItDownValidityDecisionV1Schema,\n 'takeItDownRequests/{requestId}/validityDecisions/{decisionId}/takeItDownValidityRationale/record': TakeItDownValidityRationaleV1Schema,\n 'takeItDownRequests/{requestId}/takeItDownActions/{actionId}': TakeItDownRequestActionV1Schema,\n // Deletion-verification record per evidence object — see SafetyEvidenceDispositionV1Schema for what\n // `result: 'gone'` means in THIS bucket (absent from the live bucket, not permanent destruction).\n 'takeItDownRequests/{requestId}/takeItDownEvidenceDisposition/{evidenceId}': SafetyEvidenceDispositionV1Schema,\n 'takeItDownRequests/{requestId}/takeItDownEvidence/{evidenceId}': TakeItDownEvidenceV1Schema,\n 'nciiCases/{caseId}': NciiCaseV1Schema,\n 'nciiCases/{caseId}/allegationLinks/{allegationId}': NciiCaseAllegationLinkV1Schema,\n 'nciiCases/{caseId}/requestLinks/{requestId}': NciiCaseRequestLinkV1Schema,\n 'nciiCases/{caseId}/removalActions/{actionId}': NciiCaseRemovalActionV1Schema,\n 'nciiCases/{caseId}/blockedHashes/{hashId}': NciiBlockedHashV1Schema,\n 'nciiCases/{caseId}/closureEvents/{eventId}': NciiCaseClosureEventV1Schema,\n 'nciiRetainedEvidenceInventory/{inventoryId}': NciiRetainedEvidenceInventoryV1Schema,\n // The dead-letter sink for inventory rows that could not be written to the primary\n // nciiRetainedEvidenceInventory collection. Stores the same document shape.\n 'nciiInventoryDeadLetter/{inventoryId}': NciiRetainedEvidenceInventoryV1Schema,\n 'nciiTemporaryHolds/{holdId}': NciiTemporaryHoldV1Schema,\n 'nciiRemovalJobs/{jobId}': NciiRemovalJobV1Schema,\n 'nciiRemovalJobs/{jobId}/nciiRemovalTargets/{targetKeyHash}': NciiRemovalTargetV1Schema,\n\n // ===== _appConfig singletons (public) =====\n '_appConfig/app': AppConfigSchema,\n // The public documents' current projections. Every one is a public page; take-it-down is a\n // NO-LOGIN page, so its copy doc must be publicly readable.\n '_appConfig/futurePlans': PUBLIC_DOCUMENT_PROJECTIONS.futurePlans.schema,\n '_appConfig/rulesAndAgreements': PUBLIC_DOCUMENT_PROJECTIONS.rulesAndAgreements.schema,\n '_appConfig/termsOfService': PUBLIC_DOCUMENT_PROJECTIONS.termsOfService.schema,\n '_appConfig/privacyPolicy': PUBLIC_DOCUMENT_PROJECTIONS.privacyPolicy.schema,\n '_appConfig/takeItDownPageCopy': PUBLIC_DOCUMENT_PROJECTIONS.takeItDownPageCopy.schema,\n '_appConfig/dmcaPolicy': PUBLIC_DOCUMENT_PROJECTIONS.dmcaPolicy.schema,\n '_appConfig/systemUidSlots': SystemUidSlotsDocumentSchema,\n\n // ===== _serverData singletons (server-only — Cloud-Functions-only readers, BACKEND-108) =====\n '_serverData/agePolicy': AgePolicyConfigV1Schema,\n '_serverData/nciiPolicy': NciiPolicyConfigV1Schema,\n '_serverData/privilegedReviewerSecurity': PrivilegedReviewerSecurityProfileV1Schema,\n // The submitFeedback alias map, in the server-only bucket so no client can read it\n // (BACKEND-108). The sibling `feedbackDenylist` subcollection has no field contract\n // (`.exists`-only) — see PENDING_COLLECTION_PATHS.\n '_serverData/feedbackLists/feedbackAliases/{aliasId}': FeedbackAliasSchema,\n // The scheduled sweeps' scan cursors — each read only by the function that owns it.\n\n // ===== _systemData singletons (signed-in readers, BACKEND-108) =====\n '_systemData/adminList': AdminListSchema,\n '_systemData/profanityList': ProfanityListSchema,\n '_systemData/reservedUsernames': ReservedUsernamesSchema,\n '_systemData/blockedFranchiseNames': BlockedFranchiseNamesSchema,\n '_systemData/appMode': AppModeMarkerSchema,\n '_systemData/systemVideoSlots': SystemVideoSlotsDocumentSchema,\n} as const satisfies Record<string, z.ZodTypeAny>;\n\nexport type RegisteredCollectionPath = keyof typeof COLLECTION_SCHEMAS;\n\n/**\n * Doc-id field annotation: for the listed bindings, the named body field equals the\n * Firestore document id and is injected at READ time (`{ ...doc.data(), <field>: doc.id }`),\n * never persisted — the write callables store the body via `Omit<…, '<field>'>`. The bound\n * schema models the (correct) consumer/read shape, where the field is required, so a raw\n * stored doc is \"missing\" it. The drift-check injects `{ [field]: doc.id, ...data }` before\n * validating, one mechanism for every doc-id collection, so a drift-check of real data does not\n * flag every such document as missing its id field.\n * The schema-doc generator ignores this map. Keys are compiler-checked against the registry.\n */\nexport const COLLECTION_DOC_ID_FIELDS = {\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTales/{taleId}/taleChapters/{chapterId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTunes/{tuneId}/tuneTracks/{trackId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}': 'uid',\n 'allWorkProjects/{workProjectId}/workProjectTelevision/{televisionId}/televisionEpisodes/{episodeId}': 'uid',\n 'allWorkProjects/{workProjectId}/guildChatChannels/{guildChatChannelId}': 'guildChatChannelId',\n // Published hall sub-items: the doc id IS the live sub-item's id; `uid` is injected at\n // read (the publish writer spreads the live doc's stored body, which has no `uid`).\n 'hallItems/{hallItemId}/hallItemTales/{itemId}': 'uid',\n 'hallItems/{hallItemId}/hallItemTunes/{itemId}': 'uid',\n 'hallItems/{hallItemId}/hallItemTelevision/{itemId}': 'uid',\n 'activeUserNotifications/{notificationId}': 'id',\n 'activeAdminNotifications/{notificationId}': 'id',\n 'adminNotificationHistory/{notificationId}': 'archiveOccurrenceId',\n 'userProfiles/{userId}/notificationHistory/{notificationId}': 'archiveOccurrenceId',\n 'pendingNotifications/{notificationId}': 'id',\n 'statusReconcileQueue/{uid}': 'uid',\n} as const satisfies Partial<Record<RegisteredCollectionPath, string>>;\n\n/**\n * Collections that exist (in COLLECTIONS / *_SUBCOLLECTIONS or firestore.rules) but are\n * intentionally NOT bound to a schema, each by name with its path and the reason beside it. Listed\n * EXPLICITLY so completeness is enforced and nothing is silently uncovered; the registry test fails\n * if a NEW unlisted collection appears.\n */\nexport const PENDING_COLLECTION_PATHS = {\n // Console-managed (no callable writes it), and submitFeedback reads it with `.exists` only, so\n // there is no field contract to author a schema from: the doc id is the denied word and the body\n // is unused.\n feedbackDenylist: '_serverData/feedbackLists/feedbackDenylist/{deniedWord}',\n} as const;\n\n/** The pending collections' names, derived from their paths. */\nexport const PENDING_COLLECTIONS: readonly string[] = Object.keys(PENDING_COLLECTION_PATHS);\n"]}
@@ -16,4 +16,6 @@ export declare const UPLOAD_ROW_DISPLAY_COPY: {
16
16
  readonly other: "File";
17
17
  };
18
18
  };
19
+ /** The most uploads one `markUploadsSeen` call marks seen; a larger unseen set goes in calls of this size. */
20
+ export declare const MAX_UPLOADS_MARKED_SEEN_PER_CALL = 200;
19
21
  //# sourceMappingURL=upload-tray-display.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload-tray-display.d.ts","sourceRoot":"","sources":["../../src/media/upload-tray-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAyBzD,CAAC;AAQF,kGAAkG;AAClG,eAAO,MAAM,kCAAkC,QAAqB,CAAC;AAErE,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB;;mCAEZ,MAAM;+BACV,MAAM;iCACJ,MAAM;4BACX,MAAM,QAAQ,MAAM;;;;;;;CAE3B,CAAC"}
1
+ {"version":3,"file":"upload-tray-display.d.ts","sourceRoot":"","sources":["../../src/media/upload-tray-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAyBzD,CAAC;AAQF,kGAAkG;AAClG,eAAO,MAAM,kCAAkC,QAAqB,CAAC;AAErE,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB;;mCAEZ,MAAM;+BACV,MAAM;iCACJ,MAAM;4BACX,MAAM,QAAQ,MAAM;;;;;;;CAE3B,CAAC;AAMX,8GAA8G;AAC9G,eAAO,MAAM,gCAAgC,MAAM,CAAC"}
@@ -46,4 +46,9 @@ export const UPLOAD_ROW_DISPLAY_COPY = {
46
46
  dateAt: (date, time) => `${date}, ${time}`,
47
47
  fileType: { image: 'Image', video: 'Video', audio: 'Audio', other: 'File' },
48
48
  };
49
+ // =============================================================================
50
+ // Marking rows seen
51
+ // =============================================================================
52
+ /** The most uploads one `markUploadsSeen` call marks seen; a larger unseen set goes in calls of this size. */
53
+ export const MAX_UPLOADS_MARKED_SEEN_PER_CALL = 200;
49
54
  //# sourceMappingURL=upload-tray-display.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload-tray-display.js","sourceRoot":"","sources":["../../src/media/upload-tray-display.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,oCAAoC;AACpC,gFAAgF;AAChF,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AAEnE,MAAM,CAAC,MAAM,kBAAkB,GAA+B;IAC5D,iBAAiB,EAAE,iBAAiB;IACpC,mBAAmB,EAAE,OAAO;IAC5B,eAAe,EAAE,aAAa;IAC9B,oBAAoB,EAAE,oBAAoB;IAC1C,qBAAqB,EAAE,qBAAqB;IAC5C,iBAAiB,EAAE,UAAU;IAC7B,gFAAgF;IAChF,iFAAiF;IACjF,6DAA6D;IAC7D,uBAAuB,EAAE,gBAAgB;IACzC,gBAAgB,EAAE,gBAAgB;IAClC,0BAA0B,EAAE,YAAY;IACxC,0BAA0B,EAAE,YAAY;IACxC,6BAA6B,EAAE,YAAY;IAC3C,aAAa,EAAE,aAAa;IAC5B,eAAe,EAAE,eAAe;IAChC,kBAAkB,EAAE,aAAa;IACjC,kBAAkB,EAAE,aAAa;IACjC,0BAA0B,EAAE,eAAe;IAC3C,0BAA0B,EAAE,eAAe;IAC3C,YAAY,EAAE,YAAY;IAC1B,mBAAmB,EAAE,mBAAmB;IACxC,gBAAgB,EAAE,cAAc;IAChC,eAAe,EAAE,uBAAuB;CACzC,CAAC;AAEF,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAChF,EAAE;AACF,kFAAkF;AAElF,kGAAkG;AAClG,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,OAAO,OAAO;IAClD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO;IAC5C,WAAW,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE;IAClD,MAAM,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE;IAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;CACnE,CAAC","sourcesContent":["import type { FileOrigin } from './file-origin.js';\n\n// =============================================================================\n// User-facing labels per fileOrigin\n// =============================================================================\n//\n// Generic labels for upload tray rows. Same regardless of platform (web,\n// iOS, Android, smart TV) since they describe TTT domain entities.\n\nexport const fileOriginRowLabel: Record<FileOrigin, string> = {\n 'profile-picture': 'Profile picture',\n 'craft-skill-media': 'Craft',\n 'squareStreetz': 'Square post',\n 'commission-posting': 'Commission posting',\n 'commission-proposal': 'Commission proposal',\n 'audition-prompt': 'Audition',\n // Neutral on purpose: this origin creates BOTH Platform and Sponsored auditions\n // (AdminAuditionPromptTargetInfoSchema.type), so it cannot borrow either settled\n // AUDITION_TYPES label without lying about half its uploads.\n 'admin-audition-prompt': 'Admin audition',\n 'audition-entry': 'Audition entry',\n 'hallLibrary-cover-square': 'Work cover',\n 'hallLibrary-cover-poster': 'Work cover',\n 'hallLibrary-cover-cinematic': 'Work cover',\n 'realm-cover': 'Realm cover',\n 'chapter-photo': 'Chapter photo',\n 'tune-track-photo': 'Track photo',\n 'tune-track-audio': 'Track audio',\n 'television-episode-photo': 'Episode photo',\n 'television-episode-video': 'Episode video',\n 'work-asset': 'Work asset',\n 'conversation-file': 'Conversation file',\n 'system-content': 'System video',\n 'ncii-evidence': 'Take-it-down evidence',\n};\n\n// =============================================================================\n// Row time and file kind\n// =============================================================================\n//\n// The words and cutoff the app hands upload-ui's `createUploadDisplayFormatters`.\n\n/** How long an upload row's time reads as relative (\"5m ago\") before it reads as a clock time. */\nexport const UPLOAD_ROW_RELATIVE_TIME_CUTOFF_MS = 6 * 60 * 60 * 1000;\n\n/** An upload row's words for its time and its file's kind. */\nexport const UPLOAD_ROW_DISPLAY_COPY = {\n justNow: 'just now',\n minutesAgo: (minutes: number) => `${minutes}m ago`,\n hoursAgo: (hours: number) => `${hours}h ago`,\n yesterdayAt: (time: string) => `Yesterday ${time}`,\n dateAt: (date: string, time: string) => `${date}, ${time}`,\n fileType: { image: 'Image', video: 'Video', audio: 'Audio', other: 'File' },\n} as const;\n"]}
1
+ {"version":3,"file":"upload-tray-display.js","sourceRoot":"","sources":["../../src/media/upload-tray-display.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,oCAAoC;AACpC,gFAAgF;AAChF,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AAEnE,MAAM,CAAC,MAAM,kBAAkB,GAA+B;IAC5D,iBAAiB,EAAE,iBAAiB;IACpC,mBAAmB,EAAE,OAAO;IAC5B,eAAe,EAAE,aAAa;IAC9B,oBAAoB,EAAE,oBAAoB;IAC1C,qBAAqB,EAAE,qBAAqB;IAC5C,iBAAiB,EAAE,UAAU;IAC7B,gFAAgF;IAChF,iFAAiF;IACjF,6DAA6D;IAC7D,uBAAuB,EAAE,gBAAgB;IACzC,gBAAgB,EAAE,gBAAgB;IAClC,0BAA0B,EAAE,YAAY;IACxC,0BAA0B,EAAE,YAAY;IACxC,6BAA6B,EAAE,YAAY;IAC3C,aAAa,EAAE,aAAa;IAC5B,eAAe,EAAE,eAAe;IAChC,kBAAkB,EAAE,aAAa;IACjC,kBAAkB,EAAE,aAAa;IACjC,0BAA0B,EAAE,eAAe;IAC3C,0BAA0B,EAAE,eAAe;IAC3C,YAAY,EAAE,YAAY;IAC1B,mBAAmB,EAAE,mBAAmB;IACxC,gBAAgB,EAAE,cAAc;IAChC,eAAe,EAAE,uBAAuB;CACzC,CAAC;AAEF,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAChF,EAAE;AACF,kFAAkF;AAElF,kGAAkG;AAClG,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,OAAO,OAAO;IAClD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO;IAC5C,WAAW,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE;IAClD,MAAM,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE;IAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;CACnE,CAAC;AAEX,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,8GAA8G;AAC9G,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,CAAC","sourcesContent":["import type { FileOrigin } from './file-origin.js';\n\n// =============================================================================\n// User-facing labels per fileOrigin\n// =============================================================================\n//\n// Generic labels for upload tray rows. Same regardless of platform (web,\n// iOS, Android, smart TV) since they describe TTT domain entities.\n\nexport const fileOriginRowLabel: Record<FileOrigin, string> = {\n 'profile-picture': 'Profile picture',\n 'craft-skill-media': 'Craft',\n 'squareStreetz': 'Square post',\n 'commission-posting': 'Commission posting',\n 'commission-proposal': 'Commission proposal',\n 'audition-prompt': 'Audition',\n // Neutral on purpose: this origin creates BOTH Platform and Sponsored auditions\n // (AdminAuditionPromptTargetInfoSchema.type), so it cannot borrow either settled\n // AUDITION_TYPES label without lying about half its uploads.\n 'admin-audition-prompt': 'Admin audition',\n 'audition-entry': 'Audition entry',\n 'hallLibrary-cover-square': 'Work cover',\n 'hallLibrary-cover-poster': 'Work cover',\n 'hallLibrary-cover-cinematic': 'Work cover',\n 'realm-cover': 'Realm cover',\n 'chapter-photo': 'Chapter photo',\n 'tune-track-photo': 'Track photo',\n 'tune-track-audio': 'Track audio',\n 'television-episode-photo': 'Episode photo',\n 'television-episode-video': 'Episode video',\n 'work-asset': 'Work asset',\n 'conversation-file': 'Conversation file',\n 'system-content': 'System video',\n 'ncii-evidence': 'Take-it-down evidence',\n};\n\n// =============================================================================\n// Row time and file kind\n// =============================================================================\n//\n// The words and cutoff the app hands upload-ui's `createUploadDisplayFormatters`.\n\n/** How long an upload row's time reads as relative (\"5m ago\") before it reads as a clock time. */\nexport const UPLOAD_ROW_RELATIVE_TIME_CUTOFF_MS = 6 * 60 * 60 * 1000;\n\n/** An upload row's words for its time and its file's kind. */\nexport const UPLOAD_ROW_DISPLAY_COPY = {\n justNow: 'just now',\n minutesAgo: (minutes: number) => `${minutes}m ago`,\n hoursAgo: (hours: number) => `${hours}h ago`,\n yesterdayAt: (time: string) => `Yesterday ${time}`,\n dateAt: (date: string, time: string) => `${date}, ${time}`,\n fileType: { image: 'Image', video: 'Video', audio: 'Audio', other: 'File' },\n} as const;\n\n// =============================================================================\n// Marking rows seen\n// =============================================================================\n\n/** The most uploads one `markUploadsSeen` call marks seen; a larger unseen set goes in calls of this size. */\nexport const MAX_UPLOADS_MARKED_SEEN_PER_CALL = 200;\n"]}