@ttt-productions/ttt-core 0.78.21 → 0.78.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/admin-labels.d.ts +1 -1
- package/dist/constants/admin-labels.js +2 -2
- package/dist/constants/admin-labels.js.map +1 -1
- package/dist/constants/center-stage-rooms.js +1 -1
- package/dist/constants/center-stage-rooms.js.map +1 -1
- package/dist/constants/company-mascots.js +1 -1
- package/dist/constants/company-mascots.js.map +1 -1
- package/dist/constants/publish-attestations.js +1 -1
- package/dist/constants/publish-attestations.js.map +1 -1
- package/dist/constants/safety-confirmation-phrases.js +1 -1
- package/dist/constants/safety-confirmation-phrases.js.map +1 -1
- package/dist/doc-schemas/account-deletion.js +1 -1
- package/dist/doc-schemas/account-deletion.js.map +1 -1
- package/dist/doc-schemas/registry.js +1 -1
- package/dist/doc-schemas/registry.js.map +1 -1
- package/dist/doc-schemas/safety/age.js +1 -1
- package/dist/doc-schemas/safety/age.js.map +1 -1
- package/dist/doc-schemas/safety/evidence.js +1 -1
- package/dist/doc-schemas/safety/evidence.js.map +1 -1
- package/dist/doc-schemas/safety/foundation.d.ts +3 -3
- package/dist/doc-schemas/safety/foundation.d.ts.map +1 -1
- package/dist/doc-schemas/safety/foundation.js +3 -3
- package/dist/doc-schemas/safety/foundation.js.map +1 -1
- package/dist/doc-schemas/square-announcement-jobs.d.ts +1 -1
- package/dist/doc-schemas/square-announcement-jobs.js +2 -2
- package/dist/doc-schemas/square-announcement-jobs.js.map +1 -1
- package/dist/media/target-info.js +1 -1
- package/dist/media/target-info.js.map +1 -1
- package/dist/paths/collections.js +2 -2
- package/dist/paths/collections.js.map +1 -1
- package/dist/paths/path-builders.js +1 -1
- package/dist/paths/path-builders.js.map +1 -1
- package/dist/paths/related-ids.js +1 -1
- package/dist/paths/related-ids.js.map +1 -1
- package/dist/safety/active-safety-case-alert.js +1 -1
- package/dist/safety/active-safety-case-alert.js.map +1 -1
- package/dist/safety/ncii-intake-derivations.js +1 -1
- package/dist/safety/ncii-intake-derivations.js.map +1 -1
- package/dist/safety/resource-keys.js +1 -1
- package/dist/safety/resource-keys.js.map +1 -1
- package/dist/schemas/chat.js +1 -1
- package/dist/schemas/chat.js.map +1 -1
- package/dist/schemas/craft-skills.js +1 -1
- package/dist/schemas/craft-skills.js.map +1 -1
- package/dist/schemas/hall-library.js +1 -1
- package/dist/schemas/hall-library.js.map +1 -1
- package/dist/schemas/notification.js +1 -1
- package/dist/schemas/notification.js.map +1 -1
- package/dist/schemas/safety.d.ts +1 -1
- package/dist/schemas/safety.js +1 -1
- package/dist/schemas/safety.js.map +1 -1
- package/dist/types/admin-ops.d.ts +1 -1
- package/dist/types/admin-ops.d.ts.map +1 -1
- package/dist/types/admin-ops.js +1 -1
- package/dist/types/admin-ops.js.map +1 -1
- package/dist/types/admin-users.js +1 -1
- package/dist/types/admin-users.js.map +1 -1
- package/dist/types/social.d.ts +1 -1
- package/dist/types/social.js.map +1 -1
- package/dist/upload-variables/create-admin-audition-variables.js +1 -1
- package/dist/upload-variables/create-admin-audition-variables.js.map +1 -1
- package/dist/upload-variables/create-work-project-audition-variables.js +1 -1
- package/dist/upload-variables/create-work-project-audition-variables.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/schemas/notification.ts"],"names":[],"mappings":"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","sourcesContent":["// TTT notification contracts.\n//\n// `@ttt-productions/notification-core` is generic — at its package boundary a\n// notification's `metadata` is `Record<string, unknown>`. All TTT notification\n// policy lives here: the canonical type catalog (category / delivery / default\n// channels), the per-type typed `metadata` discriminated union, the broadcast\n// audience selector, and the callable input schemas. `runSendNotification`\n// (ttt-prod) validates `metadata` against the per-type schema before any write.\n//\n// The two notification audit-event payload shapes live here too (the\n// `AuditEventType` union members `notification.broadcastSent` /\n// `notification.adminArchived` are added in ../types/audit.ts; their actor is\n// always an admin mode — `adminReview` / `adminOverride`).\n\nimport { z } from 'zod';\nimport {\n userIdSchema,\n workProjectIdSchema,\n guildInviteIdSchema,\n adminDispatchIdSchema,\n hallItemIdSchema,\n thresholdItemIdSchema,\n changeRequestIdSchema,\n workProjectTypeSchema,\n notificationFanoutJobIdSchema,\n titleSchema,\n reportGroupIdSchema,\n} from './atoms.js';\nimport {\n MAX_THRESHOLD_REVIEW_NOTES_LENGTH,\n MAX_HALL_CHANGE_REQUEST_REASON_LENGTH,\n MAX_NOTIFICATION_MESSAGE_LENGTH,\n MAX_BROADCAST_EXPLICIT_UIDS,\n} from '../constants/business.js';\nimport { HallSubItemTypeSchema } from '../doc-schemas/content.js';\nimport { ReportableItemTypeSchema } from '../doc-schemas/safety/foundation.js';\n\n// String shape atoms specific to notifications.\nconst notificationMessageSchema = z.string().min(1).max(MAX_NOTIFICATION_MESSAGE_LENGTH);\n// The canonical reportable-item enum — never an open string (Rule 36).\nconst reportedItemTypeSchema = ReportableItemTypeSchema;\nconst reportedItemIdSchema = z.string().min(1).max(128);\nconst reportIdSchema = z.string().min(1);\nconst appealIdSchema = z.string().min(1);\nconst workRealmIdSchema = z.string().min(1);\n\n// ============================================================================\n// TYPE + CHANNEL CATALOG\n// ============================================================================\n\nexport const NOTIFICATION_TYPE_VALUES = [\n 'content_report',\n 'guild_invite',\n 'admin_dispatch_reply',\n 'threshold_library_submission',\n // Author feedback for a Threshold Library review decision (only needs_revision is\n // delivered today — an approval reaches the author via the publish member fanout).\n 'threshold_library_reviewed',\n // Proposer feedback for a PUBLISHED change-request decision (approve/deny).\n 'hall_content_change_request_resolved',\n 'admin_announcement',\n 'followed_content_published',\n // chat-edge-rebuild P7 — the two new fanout triggers (NOTIFICATIONS_REDESIGN \"Triggers\").\n // `member_content_published`: the Hall-publish MEMBER job (\"your work was published!\") — same\n // `thresholdItemId` eventId as the follower job, different type so `deliveryId` stays distinct.\n // `followed_craft_skill_published`: craft-skill publish → the artisan's followers\n // (`staticRelight` strategy — count 1 forever, static copy, no count shown).\n 'member_content_published',\n 'followed_craft_skill_published',\n // Reporter feedback (DJ ruling 2026-07-06): when a report a user submitted is\n // closed as a REAL case WITH action (ordinary report root flips to `actioned`),\n // the reporter gets one light informational card. Never sent on dismissals.\n // Generic copy only — the card must not reveal the reported user, reason, or\n // remedy (a bad-faith reporter must not be able to probe moderation outcomes).\n 'report_action_taken',\n // Appellant feedback for a content-appeal decision (DJ ruling 2026-07-10 —\n // gap found by the hosted E2E build: reviewContentAppeal decided appeals with\n // NO channel reporting the outcome to the appellant). Fired on BOTH approve\n // and deny. It is the appellant's OWN appeal, so unlike report_action_taken\n // there is no privacy ceiling: the card states the outcome plainly and\n // targets My Uploads, where the resulting upload state lives.\n 'content_appeal_reviewed',\n] as const;\n\nexport const NotificationTypeSchema = z.enum(NOTIFICATION_TYPE_VALUES);\nexport type NotificationType = z.infer<typeof NotificationTypeSchema>;\n\n/** Delivery channels. Only `inApp` is implemented at launch; `email`/`push`\n * are future channel handlers dispatched from the `runSendNotification`\n * chokepoint. */\nexport const NOTIFICATION_CHANNEL_VALUES = ['inApp', 'email', 'push'] as const;\nexport const NotificationChannelSchema = z.enum(NOTIFICATION_CHANNEL_VALUES);\nexport type NotificationChannel = z.infer<typeof NotificationChannelSchema>;\n\nexport type NotificationCategory = 'user' | 'admin';\nexport const NotificationCategorySchema = z.enum(['user', 'admin']);\n\nexport interface NotificationTypeCatalogEntry {\n /** Which active collection / audience this type writes to. */\n category: NotificationCategory;\n /** `realtime` writes straight to active; `queued` goes through the batch processor. */\n delivery: 'realtime' | 'queued';\n /** Default channel list applied when a send omits `channels`. All `['inApp']` at launch. */\n defaultChannels: NotificationChannel[];\n}\n\n/**\n * The canonical TTT notification type catalog. `runSendNotification` resolves a\n * type's category/delivery here and carries `defaultChannels` through when a\n * send omits `channels`.\n */\nexport const NOTIFICATION_TYPE_CATALOG: Record<NotificationType, NotificationTypeCatalogEntry> = {\n content_report: { category: 'admin', delivery: 'realtime', defaultChannels: ['inApp'] },\n guild_invite: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n admin_dispatch_reply: { category: 'user', delivery: 'realtime', defaultChannels: ['inApp'] },\n threshold_library_submission: { category: 'admin', delivery: 'queued', defaultChannels: ['inApp'] },\n threshold_library_reviewed: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n hall_content_change_request_resolved: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n admin_announcement: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n followed_content_published: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n member_content_published: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n followed_craft_skill_published: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n report_action_taken: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n content_appeal_reviewed: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n};\n\n// ============================================================================\n// PER-TYPE METADATA (discriminated union, keyed by `type`)\n// ============================================================================\n\n/**\n * Typed `metadata` payload for each notification type. The generic package\n * boundary takes `Record<string, unknown>`; the app validates against this\n * before sending so each type's payload is checked like every other callable\n * schema.\n */\nexport const NotificationMetadataByTypeSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('content_report'),\n reportGroupId: reportGroupIdSchema,\n reportedItemType: reportedItemTypeSchema,\n reportedItemId: reportedItemIdSchema,\n }).strict(),\n z.object({\n type: z.literal('guild_invite'),\n workProjectId: workProjectIdSchema,\n guildInviteId: guildInviteIdSchema,\n workTitle: titleSchema,\n }).strict(),\n z.object({\n type: z.literal('admin_dispatch_reply'),\n adminDispatchId: adminDispatchIdSchema,\n // Party-generic dispatch: present on workProject-party threads so the card routes\n // to the Work's correspondence surface. Absent on user-party threads (legacy shape).\n partyKind: z.enum(['user', 'workProject']).optional(),\n workProjectId: workProjectIdSchema.optional(),\n }).strict(),\n z.object({\n type: z.literal('threshold_library_submission'),\n thresholdItemId: thresholdItemIdSchema,\n hallItemId: hallItemIdSchema,\n workProjectId: workProjectIdSchema,\n }).strict(),\n // Author feedback for a review decision. Mirrors what runReviewThresholdItem\n // (ttt-prod) sends: only `needs_revision` is delivered today; `adminNotes` is\n // the reviewer's note, sent as null when the reviewer left none.\n z.object({\n type: z.literal('threshold_library_reviewed'),\n thresholdItemId: thresholdItemIdSchema,\n hallItemId: hallItemIdSchema,\n workProjectId: workProjectIdSchema,\n workProjectType: workProjectTypeSchema,\n itemId: z.string().min(1),\n decision: z.literal('needs_revision'),\n adminNotes: z.string().max(MAX_THRESHOLD_REVIEW_NOTES_LENGTH).nullable(),\n }).strict(),\n // Proposer feedback for a published change-request decision. Mirrors what\n // runReviewHallContentChangeRequest (ttt-prod) sends: `resolutionReason` is\n // required on a deny, optional on an approve — null when absent. The realm\n // grain (R1) sends `workRealmId` with `hallItemId` null; hall grains the\n // reverse.\n z.object({\n type: z.literal('hall_content_change_request_resolved'),\n changeRequestId: changeRequestIdSchema,\n hallItemId: hallItemIdSchema.nullable(),\n workRealmId: z.string().min(1).nullish(),\n workProjectId: workProjectIdSchema,\n decision: z.enum(['approved', 'denied']),\n resolutionReason: z.string().max(MAX_HALL_CHANGE_REQUEST_REASON_LENGTH).nullable(),\n }).strict(),\n z.object({\n type: z.literal('admin_announcement'),\n title: titleSchema,\n message: notificationMessageSchema,\n }).strict(),\n z.object({\n type: z.literal('followed_content_published'),\n workProjectId: workProjectIdSchema,\n workTitle: titleSchema,\n hallItemId: hallItemIdSchema,\n hallItemTitle: titleSchema,\n hallSubItemType: HallSubItemTypeSchema,\n }).strict(),\n // P7 Hall-publish MEMBER job — same Hall-publication fields as the follower type (it describes\n // the SAME publication to the work's members; the work route + \"your work was published!\" copy\n // are set by the emitter via targetPath/title, not metadata).\n z.object({\n type: z.literal('member_content_published'),\n workProjectId: workProjectIdSchema,\n workTitle: titleSchema,\n hallItemId: hallItemIdSchema,\n hallItemTitle: titleSchema,\n hallSubItemType: HallSubItemTypeSchema,\n }).strict(),\n // P7 craft-skill publish — points at the artisan whose skills updated. The actor name\n // (\"X uploaded new craft skills\") + the profile/skills route resolve from `artisanUid` at\n // render time (Display Identity Invariant); `staticRelight` shows no count.\n z.object({\n type: z.literal('followed_craft_skill_published'),\n artisanUid: userIdSchema,\n }).strict(),\n // Reporter feedback — metadata is deliberately minimal: `reportId` is the\n // reporter's OWN report-root doc id (deterministic per reporterUid + target,\n // see writeOrdinaryReport), used only as the dedup/aggregation key so a\n // reporter gets at most one card per report they filed. NO fields that\n // identify the reported user/content/remedy may ever be added here.\n z.object({\n type: z.literal('report_action_taken'),\n reportId: reportIdSchema,\n }).strict(),\n // Appellant feedback for a content-appeal decision. `appealId` is the\n // appellant's OWN appeal doc id (the dedup/aggregation key — one card per\n // appeal, a re-decision coalesces); `decision` drives the card copy.\n z.object({\n type: z.literal('content_appeal_reviewed'),\n appealId: appealIdSchema,\n decision: z.enum(['approved', 'denied']),\n }).strict(),\n]);\nexport type NotificationMetadataByType = z.infer<typeof NotificationMetadataByTypeSchema>;\n\n// ============================================================================\n// BROADCAST AUDIENCE SELECTOR\n// ============================================================================\n\n/**\n * Admin broadcast audience selector. Stored on a broadcast job; the scheduled\n * fan-out worker resolves a page of it into uids (domain-aware queries live in\n * ttt-prod — the package only ever receives uids).\n */\nexport const BroadcastAudienceSelectorSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('allActiveUsers') }).strict(),\n z.object({\n kind: z.literal('explicitUids'),\n // The selector's documented audience cap (dedup + serialized-byte enforcement\n // for work/realm snapshots is app-side). Derives from the ONE named constant.\n uids: z.array(userIdSchema).min(1).max(MAX_BROADCAST_EXPLICIT_UIDS),\n }).strict(),\n z.object({\n kind: z.literal('workMembers'),\n workProjectId: workProjectIdSchema,\n }).strict(),\n z.object({\n kind: z.literal('realmMembers'),\n workRealmId: workRealmIdSchema,\n }).strict(),\n z.object({ kind: z.literal('allArtisans') }).strict(),\n]);\nexport type BroadcastAudienceSelector = z.infer<typeof BroadcastAudienceSelectorSchema>;\n\n// ============================================================================\n// CALLABLE INPUT SCHEMAS\n// ============================================================================\n\nexport const CreateNotificationBroadcastInputSchema = z.object({\n // Client-generated idempotency key — the app derives the broadcast eventId\n // deterministically from (actorUid, requestId) so a lost-ack retry is idempotent.\n requestId: z.string().min(1),\n selector: BroadcastAudienceSelectorSchema,\n title: titleSchema,\n message: notificationMessageSchema,\n}).strict();\nexport type CreateNotificationBroadcastInput = z.infer<typeof CreateNotificationBroadcastInputSchema>;\n\n/** Archive scope: a single notification, or the caller's whole category. */\nexport const ArchiveNotificationScopeSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('single'), notificationId: z.string().min(1) }).strict(),\n z.object({ kind: z.literal('all') }).strict(),\n]);\nexport type ArchiveNotificationScope = z.infer<typeof ArchiveNotificationScopeSchema>;\n\n// No `device` field on the archive input — archive metadata is server-derived (A1).\nexport const ArchiveNotificationInputSchema = z.object({\n category: NotificationCategorySchema,\n scope: ArchiveNotificationScopeSchema,\n}).strict();\nexport type ArchiveNotificationInput = z.infer<typeof ArchiveNotificationInputSchema>;\n\n// Shared admin notifications have no per-admin seen state, so only the personal\n// `user` category can be marked seen.\nexport const MarkNotificationsSeenInputSchema = z.object({\n category: z.literal('user'),\n}).strict();\nexport type MarkNotificationsSeenInput = z.infer<typeof MarkNotificationsSeenInputSchema>;\n\n// ============================================================================\n// OBSERVED-GENERATION CALLABLE INPUT SCHEMAS (P6 tray)\n//\n// These are for the NEW observed-generation callables the P6 notification tray\n// will invoke. The LEGACY schemas above (MarkNotificationsSeenInputSchema /\n// ArchiveNotificationInputSchema) remain intact — the legacy callables still use\n// them.\n// ============================================================================\n\n// Max items per mark-seen call matches a sane notification tray page size.\nconst MARK_SEEN_MAX_ITEMS = 50;\n\n/**\n * A single rendered notification row and the generation the UI observed.\n * `activeId` is the Firestore active-notification document id;\n * `observedActivityGeneration` is the opaque token from that document.\n */\nconst SeenItemSchema = z.object({\n activeId: z.string().min(1),\n observedActivityGeneration: z.string().min(1),\n}).strict();\n\n/**\n * Input for the new observed-generation mark-seen callable (P6 tray).\n *\n * The UI sends only the rows it actually rendered plus their observed\n * `activityGeneration` tokens. The server sets `seenAt = now` ONLY when the\n * card's current `activityGeneration` matches `observedActivityGeneration`;\n * otherwise it is a no-op for that row (activity arrived after render, or a\n * delete+recreate rotated the token).\n *\n * category is always `'user'` — shared admin notifications have no per-admin\n * seen state.\n */\nexport const MarkNotificationsSeenObservedInputSchema = z.object({\n category: z.literal('user'),\n items: z.array(SeenItemSchema).min(1).max(MARK_SEEN_MAX_ITEMS),\n}).strict();\nexport type MarkNotificationsSeenObservedInput = z.infer<typeof MarkNotificationsSeenObservedInputSchema>;\n\n/**\n * Archive scope for the observed-generation callable.\n *\n * `single` — archive one notification card. Carries `notificationId` (the\n * active-card doc id) and `observedActivityGeneration` (the precondition:\n * the server archives only if the card's current generation matches).\n *\n * `all` — archive every card in the category. The per-card generation\n * precondition is applied server-side per card during bounded-page sweeps;\n * the caller supplies no single generation token here because there is no\n * single observed generation for the whole category. (Design choice: archive-all\n * carries no observedActivityGeneration at the top level; the server reads each\n * card's current generation as its own precondition. This is consistent with the\n * NOTIFICATIONS_REDESIGN \"mark-all/archive-all run bounded pages with stable\n * cursors until exhausted\" protocol and the archive-history identity formula\n * which keys each occurrence on requestId independently.)\n */\nexport const ArchiveNotificationObservedScopeSchema = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('single'),\n notificationId: z.string().min(1),\n observedActivityGeneration: z.string().min(1),\n }).strict(),\n z.object({\n kind: z.literal('all'),\n }).strict(),\n]);\nexport type ArchiveNotificationObservedScope = z.infer<typeof ArchiveNotificationObservedScopeSchema>;\n\n/**\n * Input for the observed-generation archive callable (P6 tray).\n *\n * `requestId` is a per-call nonce — the tray mints a fresh uuid on every archive /\n * clear-all click, so it is NOT a replay-stability token (R39). Idempotency is provided\n * by ACTIVE-DOC DELETION: a replay finds the card already gone and no-ops, so an archive\n * never double-applies. The server combines `requestId` with the card's `activeId` to\n * form the deterministic history doc id (`hash('notification-archive', category,\n * audienceScope, requestId:activeId)`), so a single archive can never collide on another\n * card's history doc (R35).\n *\n * `category` scopes which active-notification collection is archived\n * (`activeUserNotifications` vs `activeAdminNotifications`) and forms part of\n * the history doc path.\n */\nexport const ArchiveNotificationObservedInputSchema = z.object({\n requestId: z.string().min(1),\n category: NotificationCategorySchema,\n scope: ArchiveNotificationObservedScopeSchema,\n}).strict();\nexport type ArchiveNotificationObservedInput = z.infer<typeof ArchiveNotificationObservedInputSchema>;\n\n// ============================================================================\n// SERVER-OWNED ARCHIVE-ALL JOB (replaces the browser clear-all loop)\n//\n// `enqueueArchiveAll` enqueues ONE durable archive-all job scoped to the tab's\n// category (idempotent per user+category+requestId) and returns { jobId }; the\n// bounded server worker drains that category's active cards each in its own\n// atomic archive+audit txn (per-card observed-generation precondition preserved).\n// `getArchiveAllStatus` is polled by the thin client hook. Per-tab scoping is\n// REQUIRED — a job only ever archives its own category, never all tabs.\n// ============================================================================\n\nexport const EnqueueArchiveAllInputSchema = z.object({\n requestId: z.string().min(1),\n category: NotificationCategorySchema,\n}).strict();\nexport type EnqueueArchiveAllInput = z.infer<typeof EnqueueArchiveAllInputSchema>;\n\nexport const GetArchiveAllStatusInputSchema = z.object({\n jobId: z.string().min(1),\n}).strict();\nexport type GetArchiveAllStatusInput = z.infer<typeof GetArchiveAllStatusInputSchema>;\n\n// Wire contract for the `resumeFanoutJob` callable — the admin console re-arms a\n// dead-lettered notification fanout job by id. Admin console-invoked, but still a\n// wire contract, so it lives here (callable-validation convention) rather than as a\n// local schema in the functions repo.\nexport const ResumeFanoutJobInputSchema = z.object({\n jobId: notificationFanoutJobIdSchema,\n}).strict();\nexport type ResumeFanoutJobInput = z.infer<typeof ResumeFanoutJobInputSchema>;\n\n// ============================================================================\n// AUDIT EVENT PAYLOADS (admin-only)\n// ============================================================================\n\n/**\n * Payload of a `notification.broadcastSent` audit event — written when an admin\n * enqueues a broadcast. Actor mode is `adminReview` / `adminOverride`. Records\n * the selector (never a pre-resolved uid list) + the job it created.\n */\nexport interface NotificationBroadcastSentAuditMetadata {\n jobId: string;\n selector: BroadcastAudienceSelector;\n title: string;\n}\n\n/**\n * Payload of a `notification.adminArchived` audit event — written when an admin\n * clears a shared admin notification (the `handledBy` action). Actor mode is\n * `adminReview` / `adminOverride`.\n */\nexport interface NotificationAdminArchivedAuditMetadata {\n scope: 'single' | 'all';\n /** Present for single-archive; absent for a category-wide `all` archive. */\n notificationId?: string;\n handledBy: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/schemas/notification.ts"],"names":[],"mappings":"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","sourcesContent":["// TTT notification contracts.\n//\n// `@ttt-productions/notification-core` is generic — at its package boundary a\n// notification's `metadata` is `Record<string, unknown>`. All TTT notification\n// policy lives here: the canonical type catalog (category / delivery / default\n// channels), the per-type typed `metadata` discriminated union, the broadcast\n// audience selector, and the callable input schemas. `runSendNotification`\n// (ttt-prod) validates `metadata` against the per-type schema before any write.\n//\n// The two notification audit-event payload shapes live here too (the\n// `AuditEventType` union members `notification.broadcastSent` /\n// `notification.adminArchived` are added in ../types/audit.ts; their actor is\n// always an admin mode — `adminReview` / `adminOverride`).\n\nimport { z } from 'zod';\nimport {\n userIdSchema,\n workProjectIdSchema,\n guildInviteIdSchema,\n adminDispatchIdSchema,\n hallItemIdSchema,\n thresholdItemIdSchema,\n changeRequestIdSchema,\n workProjectTypeSchema,\n notificationFanoutJobIdSchema,\n titleSchema,\n reportGroupIdSchema,\n} from './atoms.js';\nimport {\n MAX_THRESHOLD_REVIEW_NOTES_LENGTH,\n MAX_HALL_CHANGE_REQUEST_REASON_LENGTH,\n MAX_NOTIFICATION_MESSAGE_LENGTH,\n MAX_BROADCAST_EXPLICIT_UIDS,\n} from '../constants/business.js';\nimport { HallSubItemTypeSchema } from '../doc-schemas/content.js';\nimport { ReportableItemTypeSchema } from '../doc-schemas/safety/foundation.js';\n\n// String shape atoms specific to notifications.\nconst notificationMessageSchema = z.string().min(1).max(MAX_NOTIFICATION_MESSAGE_LENGTH);\n// The canonical reportable-item enum — never an open string (ARCH-102).\nconst reportedItemTypeSchema = ReportableItemTypeSchema;\nconst reportedItemIdSchema = z.string().min(1).max(128);\nconst reportIdSchema = z.string().min(1);\nconst appealIdSchema = z.string().min(1);\nconst workRealmIdSchema = z.string().min(1);\n\n// ============================================================================\n// TYPE + CHANNEL CATALOG\n// ============================================================================\n\nexport const NOTIFICATION_TYPE_VALUES = [\n 'content_report',\n 'guild_invite',\n 'admin_dispatch_reply',\n 'threshold_library_submission',\n // Author feedback for a Threshold Library review decision (only needs_revision is\n // delivered today — an approval reaches the author via the publish member fanout).\n 'threshold_library_reviewed',\n // Proposer feedback for a PUBLISHED change-request decision (approve/deny).\n 'hall_content_change_request_resolved',\n 'admin_announcement',\n 'followed_content_published',\n // chat-edge-rebuild P7 — the two new fanout triggers (NOTIFICATIONS_REDESIGN \"Triggers\").\n // `member_content_published`: the Hall-publish MEMBER job (\"your work was published!\") — same\n // `thresholdItemId` eventId as the follower job, different type so `deliveryId` stays distinct.\n // `followed_craft_skill_published`: craft-skill publish → the artisan's followers\n // (`staticRelight` strategy — count 1 forever, static copy, no count shown).\n 'member_content_published',\n 'followed_craft_skill_published',\n // Reporter feedback (DJ ruling 2026-07-06): when a report a user submitted is\n // closed as a REAL case WITH action (ordinary report root flips to `actioned`),\n // the reporter gets one light informational card. Never sent on dismissals.\n // Generic copy only — the card must not reveal the reported user, reason, or\n // remedy (a bad-faith reporter must not be able to probe moderation outcomes).\n 'report_action_taken',\n // Appellant feedback for a content-appeal decision (DJ ruling 2026-07-10 —\n // gap found by the hosted E2E build: reviewContentAppeal decided appeals with\n // NO channel reporting the outcome to the appellant). Fired on BOTH approve\n // and deny. It is the appellant's OWN appeal, so unlike report_action_taken\n // there is no privacy ceiling: the card states the outcome plainly and\n // targets My Uploads, where the resulting upload state lives.\n 'content_appeal_reviewed',\n] as const;\n\nexport const NotificationTypeSchema = z.enum(NOTIFICATION_TYPE_VALUES);\nexport type NotificationType = z.infer<typeof NotificationTypeSchema>;\n\n/** Delivery channels. Only `inApp` is implemented at launch; `email`/`push`\n * are future channel handlers dispatched from the `runSendNotification`\n * chokepoint. */\nexport const NOTIFICATION_CHANNEL_VALUES = ['inApp', 'email', 'push'] as const;\nexport const NotificationChannelSchema = z.enum(NOTIFICATION_CHANNEL_VALUES);\nexport type NotificationChannel = z.infer<typeof NotificationChannelSchema>;\n\nexport type NotificationCategory = 'user' | 'admin';\nexport const NotificationCategorySchema = z.enum(['user', 'admin']);\n\nexport interface NotificationTypeCatalogEntry {\n /** Which active collection / audience this type writes to. */\n category: NotificationCategory;\n /** `realtime` writes straight to active; `queued` goes through the batch processor. */\n delivery: 'realtime' | 'queued';\n /** Default channel list applied when a send omits `channels`. All `['inApp']` at launch. */\n defaultChannels: NotificationChannel[];\n}\n\n/**\n * The canonical TTT notification type catalog. `runSendNotification` resolves a\n * type's category/delivery here and carries `defaultChannels` through when a\n * send omits `channels`.\n */\nexport const NOTIFICATION_TYPE_CATALOG: Record<NotificationType, NotificationTypeCatalogEntry> = {\n content_report: { category: 'admin', delivery: 'realtime', defaultChannels: ['inApp'] },\n guild_invite: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n admin_dispatch_reply: { category: 'user', delivery: 'realtime', defaultChannels: ['inApp'] },\n threshold_library_submission: { category: 'admin', delivery: 'queued', defaultChannels: ['inApp'] },\n threshold_library_reviewed: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n hall_content_change_request_resolved: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n admin_announcement: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n followed_content_published: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n member_content_published: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n followed_craft_skill_published: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n report_action_taken: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n content_appeal_reviewed: { category: 'user', delivery: 'queued', defaultChannels: ['inApp'] },\n};\n\n// ============================================================================\n// PER-TYPE METADATA (discriminated union, keyed by `type`)\n// ============================================================================\n\n/**\n * Typed `metadata` payload for each notification type. The generic package\n * boundary takes `Record<string, unknown>`; the app validates against this\n * before sending so each type's payload is checked like every other callable\n * schema.\n */\nexport const NotificationMetadataByTypeSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('content_report'),\n reportGroupId: reportGroupIdSchema,\n reportedItemType: reportedItemTypeSchema,\n reportedItemId: reportedItemIdSchema,\n }).strict(),\n z.object({\n type: z.literal('guild_invite'),\n workProjectId: workProjectIdSchema,\n guildInviteId: guildInviteIdSchema,\n workTitle: titleSchema,\n }).strict(),\n z.object({\n type: z.literal('admin_dispatch_reply'),\n adminDispatchId: adminDispatchIdSchema,\n // Party-generic dispatch: present on workProject-party threads so the card routes\n // to the Work's correspondence surface. Absent on user-party threads (legacy shape).\n partyKind: z.enum(['user', 'workProject']).optional(),\n workProjectId: workProjectIdSchema.optional(),\n }).strict(),\n z.object({\n type: z.literal('threshold_library_submission'),\n thresholdItemId: thresholdItemIdSchema,\n hallItemId: hallItemIdSchema,\n workProjectId: workProjectIdSchema,\n }).strict(),\n // Author feedback for a review decision. Mirrors what runReviewThresholdItem\n // (ttt-prod) sends: only `needs_revision` is delivered today; `adminNotes` is\n // the reviewer's note, sent as null when the reviewer left none.\n z.object({\n type: z.literal('threshold_library_reviewed'),\n thresholdItemId: thresholdItemIdSchema,\n hallItemId: hallItemIdSchema,\n workProjectId: workProjectIdSchema,\n workProjectType: workProjectTypeSchema,\n itemId: z.string().min(1),\n decision: z.literal('needs_revision'),\n adminNotes: z.string().max(MAX_THRESHOLD_REVIEW_NOTES_LENGTH).nullable(),\n }).strict(),\n // Proposer feedback for a published change-request decision. Mirrors what\n // runReviewHallContentChangeRequest (ttt-prod) sends: `resolutionReason` is\n // required on a deny, optional on an approve — null when absent. The realm\n // grain (R1) sends `workRealmId` with `hallItemId` null; hall grains the\n // reverse.\n z.object({\n type: z.literal('hall_content_change_request_resolved'),\n changeRequestId: changeRequestIdSchema,\n hallItemId: hallItemIdSchema.nullable(),\n workRealmId: z.string().min(1).nullish(),\n workProjectId: workProjectIdSchema,\n decision: z.enum(['approved', 'denied']),\n resolutionReason: z.string().max(MAX_HALL_CHANGE_REQUEST_REASON_LENGTH).nullable(),\n }).strict(),\n z.object({\n type: z.literal('admin_announcement'),\n title: titleSchema,\n message: notificationMessageSchema,\n }).strict(),\n z.object({\n type: z.literal('followed_content_published'),\n workProjectId: workProjectIdSchema,\n workTitle: titleSchema,\n hallItemId: hallItemIdSchema,\n hallItemTitle: titleSchema,\n hallSubItemType: HallSubItemTypeSchema,\n }).strict(),\n // P7 Hall-publish MEMBER job — same Hall-publication fields as the follower type (it describes\n // the SAME publication to the work's members; the work route + \"your work was published!\" copy\n // are set by the emitter via targetPath/title, not metadata).\n z.object({\n type: z.literal('member_content_published'),\n workProjectId: workProjectIdSchema,\n workTitle: titleSchema,\n hallItemId: hallItemIdSchema,\n hallItemTitle: titleSchema,\n hallSubItemType: HallSubItemTypeSchema,\n }).strict(),\n // P7 craft-skill publish — points at the artisan whose skills updated. The actor name\n // (\"X uploaded new craft skills\") + the profile/skills route resolve from `artisanUid` at\n // render time (Display Identity Invariant); `staticRelight` shows no count.\n z.object({\n type: z.literal('followed_craft_skill_published'),\n artisanUid: userIdSchema,\n }).strict(),\n // Reporter feedback — metadata is deliberately minimal: `reportId` is the\n // reporter's OWN report-root doc id (deterministic per reporterUid + target,\n // see writeOrdinaryReport), used only as the dedup/aggregation key so a\n // reporter gets at most one card per report they filed. NO fields that\n // identify the reported user/content/remedy may ever be added here.\n z.object({\n type: z.literal('report_action_taken'),\n reportId: reportIdSchema,\n }).strict(),\n // Appellant feedback for a content-appeal decision. `appealId` is the\n // appellant's OWN appeal doc id (the dedup/aggregation key — one card per\n // appeal, a re-decision coalesces); `decision` drives the card copy.\n z.object({\n type: z.literal('content_appeal_reviewed'),\n appealId: appealIdSchema,\n decision: z.enum(['approved', 'denied']),\n }).strict(),\n]);\nexport type NotificationMetadataByType = z.infer<typeof NotificationMetadataByTypeSchema>;\n\n// ============================================================================\n// BROADCAST AUDIENCE SELECTOR\n// ============================================================================\n\n/**\n * Admin broadcast audience selector. Stored on a broadcast job; the scheduled\n * fan-out worker resolves a page of it into uids (domain-aware queries live in\n * ttt-prod — the package only ever receives uids).\n */\nexport const BroadcastAudienceSelectorSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('allActiveUsers') }).strict(),\n z.object({\n kind: z.literal('explicitUids'),\n // The selector's documented audience cap (dedup + serialized-byte enforcement\n // for work/realm snapshots is app-side). Derives from the ONE named constant.\n uids: z.array(userIdSchema).min(1).max(MAX_BROADCAST_EXPLICIT_UIDS),\n }).strict(),\n z.object({\n kind: z.literal('workMembers'),\n workProjectId: workProjectIdSchema,\n }).strict(),\n z.object({\n kind: z.literal('realmMembers'),\n workRealmId: workRealmIdSchema,\n }).strict(),\n z.object({ kind: z.literal('allArtisans') }).strict(),\n]);\nexport type BroadcastAudienceSelector = z.infer<typeof BroadcastAudienceSelectorSchema>;\n\n// ============================================================================\n// CALLABLE INPUT SCHEMAS\n// ============================================================================\n\nexport const CreateNotificationBroadcastInputSchema = z.object({\n // Client-generated idempotency key — the app derives the broadcast eventId\n // deterministically from (actorUid, requestId) so a lost-ack retry is idempotent.\n requestId: z.string().min(1),\n selector: BroadcastAudienceSelectorSchema,\n title: titleSchema,\n message: notificationMessageSchema,\n}).strict();\nexport type CreateNotificationBroadcastInput = z.infer<typeof CreateNotificationBroadcastInputSchema>;\n\n/** Archive scope: a single notification, or the caller's whole category. */\nexport const ArchiveNotificationScopeSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('single'), notificationId: z.string().min(1) }).strict(),\n z.object({ kind: z.literal('all') }).strict(),\n]);\nexport type ArchiveNotificationScope = z.infer<typeof ArchiveNotificationScopeSchema>;\n\n// No `device` field on the archive input — archive metadata is server-derived (A1).\nexport const ArchiveNotificationInputSchema = z.object({\n category: NotificationCategorySchema,\n scope: ArchiveNotificationScopeSchema,\n}).strict();\nexport type ArchiveNotificationInput = z.infer<typeof ArchiveNotificationInputSchema>;\n\n// Shared admin notifications have no per-admin seen state, so only the personal\n// `user` category can be marked seen.\nexport const MarkNotificationsSeenInputSchema = z.object({\n category: z.literal('user'),\n}).strict();\nexport type MarkNotificationsSeenInput = z.infer<typeof MarkNotificationsSeenInputSchema>;\n\n// ============================================================================\n// OBSERVED-GENERATION CALLABLE INPUT SCHEMAS (P6 tray)\n//\n// These are for the NEW observed-generation callables the P6 notification tray\n// will invoke. The LEGACY schemas above (MarkNotificationsSeenInputSchema /\n// ArchiveNotificationInputSchema) remain intact — the legacy callables still use\n// them.\n// ============================================================================\n\n// Max items per mark-seen call matches a sane notification tray page size.\nconst MARK_SEEN_MAX_ITEMS = 50;\n\n/**\n * A single rendered notification row and the generation the UI observed.\n * `activeId` is the Firestore active-notification document id;\n * `observedActivityGeneration` is the opaque token from that document.\n */\nconst SeenItemSchema = z.object({\n activeId: z.string().min(1),\n observedActivityGeneration: z.string().min(1),\n}).strict();\n\n/**\n * Input for the new observed-generation mark-seen callable (P6 tray).\n *\n * The UI sends only the rows it actually rendered plus their observed\n * `activityGeneration` tokens. The server sets `seenAt = now` ONLY when the\n * card's current `activityGeneration` matches `observedActivityGeneration`;\n * otherwise it is a no-op for that row (activity arrived after render, or a\n * delete+recreate rotated the token).\n *\n * category is always `'user'` — shared admin notifications have no per-admin\n * seen state.\n */\nexport const MarkNotificationsSeenObservedInputSchema = z.object({\n category: z.literal('user'),\n items: z.array(SeenItemSchema).min(1).max(MARK_SEEN_MAX_ITEMS),\n}).strict();\nexport type MarkNotificationsSeenObservedInput = z.infer<typeof MarkNotificationsSeenObservedInputSchema>;\n\n/**\n * Archive scope for the observed-generation callable.\n *\n * `single` — archive one notification card. Carries `notificationId` (the\n * active-card doc id) and `observedActivityGeneration` (the precondition:\n * the server archives only if the card's current generation matches).\n *\n * `all` — archive every card in the category. The per-card generation\n * precondition is applied server-side per card during bounded-page sweeps;\n * the caller supplies no single generation token here because there is no\n * single observed generation for the whole category. (Design choice: archive-all\n * carries no observedActivityGeneration at the top level; the server reads each\n * card's current generation as its own precondition. This is consistent with the\n * NOTIFICATIONS_REDESIGN \"mark-all/archive-all run bounded pages with stable\n * cursors until exhausted\" protocol and the archive-history identity formula\n * which keys each occurrence on requestId independently.)\n */\nexport const ArchiveNotificationObservedScopeSchema = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('single'),\n notificationId: z.string().min(1),\n observedActivityGeneration: z.string().min(1),\n }).strict(),\n z.object({\n kind: z.literal('all'),\n }).strict(),\n]);\nexport type ArchiveNotificationObservedScope = z.infer<typeof ArchiveNotificationObservedScopeSchema>;\n\n/**\n * Input for the observed-generation archive callable (P6 tray).\n *\n * `requestId` is a per-call nonce — the tray mints a fresh uuid on every archive /\n * clear-all click, so it is NOT a replay-stability token (R39). Idempotency is provided\n * by ACTIVE-DOC DELETION: a replay finds the card already gone and no-ops, so an archive\n * never double-applies. The server combines `requestId` with the card's `activeId` to\n * form the deterministic history doc id (`hash('notification-archive', category,\n * audienceScope, requestId:activeId)`), so a single archive can never collide on another\n * card's history doc (R35).\n *\n * `category` scopes which active-notification collection is archived\n * (`activeUserNotifications` vs `activeAdminNotifications`) and forms part of\n * the history doc path.\n */\nexport const ArchiveNotificationObservedInputSchema = z.object({\n requestId: z.string().min(1),\n category: NotificationCategorySchema,\n scope: ArchiveNotificationObservedScopeSchema,\n}).strict();\nexport type ArchiveNotificationObservedInput = z.infer<typeof ArchiveNotificationObservedInputSchema>;\n\n// ============================================================================\n// SERVER-OWNED ARCHIVE-ALL JOB (replaces the browser clear-all loop)\n//\n// `enqueueArchiveAll` enqueues ONE durable archive-all job scoped to the tab's\n// category (idempotent per user+category+requestId) and returns { jobId }; the\n// bounded server worker drains that category's active cards each in its own\n// atomic archive+audit txn (per-card observed-generation precondition preserved).\n// `getArchiveAllStatus` is polled by the thin client hook. Per-tab scoping is\n// REQUIRED — a job only ever archives its own category, never all tabs.\n// ============================================================================\n\nexport const EnqueueArchiveAllInputSchema = z.object({\n requestId: z.string().min(1),\n category: NotificationCategorySchema,\n}).strict();\nexport type EnqueueArchiveAllInput = z.infer<typeof EnqueueArchiveAllInputSchema>;\n\nexport const GetArchiveAllStatusInputSchema = z.object({\n jobId: z.string().min(1),\n}).strict();\nexport type GetArchiveAllStatusInput = z.infer<typeof GetArchiveAllStatusInputSchema>;\n\n// Wire contract for the `resumeFanoutJob` callable — the admin console re-arms a\n// dead-lettered notification fanout job by id. Admin console-invoked, but still a\n// wire contract, so it lives here (callable-validation convention) rather than as a\n// local schema in the functions repo.\nexport const ResumeFanoutJobInputSchema = z.object({\n jobId: notificationFanoutJobIdSchema,\n}).strict();\nexport type ResumeFanoutJobInput = z.infer<typeof ResumeFanoutJobInputSchema>;\n\n// ============================================================================\n// AUDIT EVENT PAYLOADS (admin-only)\n// ============================================================================\n\n/**\n * Payload of a `notification.broadcastSent` audit event — written when an admin\n * enqueues a broadcast. Actor mode is `adminReview` / `adminOverride`. Records\n * the selector (never a pre-resolved uid list) + the job it created.\n */\nexport interface NotificationBroadcastSentAuditMetadata {\n jobId: string;\n selector: BroadcastAudienceSelector;\n title: string;\n}\n\n/**\n * Payload of a `notification.adminArchived` audit event — written when an admin\n * clears a shared admin notification (the `handledBy` action). Actor mode is\n * `adminReview` / `adminOverride`.\n */\nexport interface NotificationAdminArchivedAuditMetadata {\n scope: 'single' | 'all';\n /** Present for single-archive; absent for a category-wide `all` archive. */\n notificationId?: string;\n handledBy: string;\n}\n"]}
|
package/dist/schemas/safety.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
/**
|
|
3
3
|
* The per-account safety action the operator command applies — an ALIAS of the ONE
|
|
4
4
|
* canonical `AccountActionSchema` (../doc-schemas/safety/sagas.ts), re-exported under
|
|
5
|
-
* the callable-input name. Never a re-declared literal (
|
|
5
|
+
* the callable-input name. Never a re-declared literal (ARCH-102).
|
|
6
6
|
*/
|
|
7
7
|
export declare const CommandAccountActionSchema: z.ZodEnum<{
|
|
8
8
|
none: "none";
|
package/dist/schemas/safety.js
CHANGED
|
@@ -23,7 +23,7 @@ import { SafetyEvidenceExternalFactKindSchema } from '../doc-schemas/safety/evid
|
|
|
23
23
|
/**
|
|
24
24
|
* The per-account safety action the operator command applies — an ALIAS of the ONE
|
|
25
25
|
* canonical `AccountActionSchema` (../doc-schemas/safety/sagas.ts), re-exported under
|
|
26
|
-
* the callable-input name. Never a re-declared literal (
|
|
26
|
+
* the callable-input name. Never a re-declared literal (ARCH-102).
|
|
27
27
|
*/
|
|
28
28
|
export const CommandAccountActionSchema = AccountActionSchema;
|
|
29
29
|
export const CommandAccountActionInputSchema = z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/schemas/safety.ts"],"names":[],"mappings":"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","sourcesContent":["// TTT safety-domain callable input schemas.\n//\n// The Trust & Safety operator surface (safety case console, evidence reveal, NCMEC\n// manual-portal completion, per-account safety actions, operator TOTP step-up, retained-\n// evidence inventory, party panel, TAKE IT DOWN request detail, protected-context re-fetch)\n// crosses the backend↔frontend boundary, so its callable input contracts live here — the\n// single source of truth — instead of being redefined locally in `functions/src/safety/`.\n//\n// Every object schema is `.strict()` so an unknown field on a privileged operator/admin\n// action is REJECTED rather than silently accepted (defense-in-depth on the highest-risk\n// callables). `caseId` / `targetUid` / `requestId` / `submissionId` and similar identifiers\n// are plain `z.string().min(1)` — matching the shapes the callables accept today; do not\n// broaden or weaken them.\n\nimport { z } from 'zod';\nimport {\n MAX_INTERNAL_REASON_LENGTH,\n MAX_USER_FACING_REASON_LENGTH,\n MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH,\n MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH,\n} from '../constants/business.js';\nimport {\n SAFETY_ACCOUNT_ACTION_CONFIRMATION,\n NCMEC_PORTAL_RECEIPT_CONFIRMATION,\n NCMEC_MANUAL_PORTAL_FILED_CONFIRMATION,\n REVEAL_CASE_EVIDENCE_CONFIRMATION,\n NCMEC_PORTAL_CORRECTION_CONFIRMATION,\n} from '../constants/safety-confirmation-phrases.js';\nimport { AccountActionSchema } from '../doc-schemas/safety/sagas.js';\nimport {\n ChildSafetyAccountRoleSchema,\n ChildSafetyAccountSubjectDispositionSchema,\n} from '../doc-schemas/safety/case.js';\nimport { SafetyEvidenceExternalFactKindSchema } from '../doc-schemas/safety/evidence.js';\n\n// ---------------------------------------------------------------------------\n// commandAccountAction — apply a per-account safety action on a child-safety case.\n// ---------------------------------------------------------------------------\n\n/**\n * The per-account safety action the operator command applies — an ALIAS of the ONE\n * canonical `AccountActionSchema` (../doc-schemas/safety/sagas.ts), re-exported under\n * the callable-input name. Never a re-declared literal (Rule 36).\n */\nexport const CommandAccountActionSchema = AccountActionSchema;\nexport type CommandAccountActionValue = z.infer<typeof CommandAccountActionSchema>;\n\nexport const CommandAccountActionInputSchema = z\n .object({\n caseId: z.string().min(1),\n targetUid: z.string().min(1),\n action: CommandAccountActionSchema,\n /** Operator-facing internal rationale (LE-loggable). */\n reasonInternal: z.string().min(4, 'An internal reason is required.').max(MAX_INTERNAL_REASON_LENGTH),\n /** The generic owner-readable reason (no detail leaks). */\n reasonUserFacing: z.string().min(1).max(MAX_USER_FACING_REASON_LENGTH),\n /** Per-account case role (A1b) — the canonical case enums, never re-declared. */\n role: ChildSafetyAccountRoleSchema,\n subjectDisposition: ChildSafetyAccountSubjectDispositionSchema,\n confirmation: z.literal(SAFETY_ACCOUNT_ACTION_CONFIRMATION),\n })\n .strict();\nexport type CommandAccountActionInput = z.infer<typeof CommandAccountActionInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getSafetyCaseConsole — paginated read of the active safety-case console.\n// ---------------------------------------------------------------------------\n\n/** Cursor for the next page of a paginated console source — the last row's `(orderField value, docId)`. */\nexport const SafetyCaseConsoleCursorSchema = z\n .object({ v: z.number(), id: z.string().min(1) })\n .strict();\nexport type SafetyCaseConsoleCursor = z.infer<typeof SafetyCaseConsoleCursorSchema>;\n\nconst SAFETY_CONSOLE_MAX_PAGE_SIZE = 200;\n\nexport const GetSafetyCaseConsoleInputSchema = z\n .object({\n pageSize: z.number().int().min(1).max(SAFETY_CONSOLE_MAX_PAGE_SIZE).optional(),\n childSafetyCursor: SafetyCaseConsoleCursorSchema.nullish(),\n nciiCursor: SafetyCaseConsoleCursorSchema.nullish(),\n takeItDownCursor: SafetyCaseConsoleCursorSchema.nullish(),\n })\n .strict()\n .nullish();\nexport type GetSafetyCaseConsoleInput = z.infer<typeof GetSafetyCaseConsoleInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getSafetyCaseById — full-admin read of a terminal safety case by id.\n// ---------------------------------------------------------------------------\n\nexport const GetSafetyCaseByIdInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1).max(200),\n })\n .strict();\nexport type GetSafetyCaseByIdInput = z.infer<typeof GetSafetyCaseByIdInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getSafetyCaseParties — server-resolved party panel for a safety case.\n// ---------------------------------------------------------------------------\n\nexport const GetSafetyCasePartiesInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1),\n })\n .strict();\nexport type GetSafetyCasePartiesInput = z.infer<typeof GetSafetyCasePartiesInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getTakeItDownRequestDetail — operator detail read for one public TAKE IT DOWN request.\n// ---------------------------------------------------------------------------\n\nexport const GetTakeItDownRequestDetailInputSchema = z\n .object({\n requestId: z.string().min(1),\n })\n .strict();\nexport type GetTakeItDownRequestDetailInput = z.infer<typeof GetTakeItDownRequestDetailInputSchema>;\n\n// ---------------------------------------------------------------------------\n// listRetainedEvidenceInventory — paginated retained-evidence inventory read.\n// ---------------------------------------------------------------------------\n\n/** Cursor for the retained-evidence inventory — the last row's `(createdAt, docId)`. */\nexport const RetainedEvidenceInventoryCursorSchema = z\n .object({ createdAt: z.number(), id: z.string().min(1) })\n .strict();\nexport type RetainedEvidenceInventoryCursor = z.infer<typeof RetainedEvidenceInventoryCursorSchema>;\n\nconst RETAINED_EVIDENCE_MAX_PAGE_SIZE = 200;\n\nexport const ListRetainedEvidenceInventoryInputSchema = z\n .object({\n pageSize: z.number().int().min(1).max(RETAINED_EVIDENCE_MAX_PAGE_SIZE).optional(),\n cursor: RetainedEvidenceInventoryCursorSchema.nullish(),\n /** Exact inventoryId lookup — returns just that row (or none), ignoring the cursor. */\n exactId: z.string().min(1).optional(),\n })\n .strict()\n .nullish();\nexport type ListRetainedEvidenceInventoryInput = z.infer<typeof ListRetainedEvidenceInventoryInputSchema>;\n\n// ---------------------------------------------------------------------------\n// ncmecOperatorCommands — NCMEC manual-portal completion path.\n// ---------------------------------------------------------------------------\n\nexport const RecordNcmecPortalReceiptArtifactInputSchema = z\n .object({\n caseId: z.string().min(1),\n submissionId: z.string().min(1),\n /** The key of an object already in the restricted evidence vault (verified via statObject). */\n evidenceVaultKey: z.string().min(1, 'An evidence vault object key is required.'),\n /** Optional operator description of what the artifact is (e.g. \"NCMEC portal screenshot\"). */\n description: z.string().min(1).max(MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH).optional(),\n /** Explicit typed confirmation (interim control until the passkey profile lands). */\n confirmation: z.literal(NCMEC_PORTAL_RECEIPT_CONFIRMATION),\n })\n .strict();\nexport type RecordNcmecPortalReceiptArtifactInput = z.infer<\n typeof RecordNcmecPortalReceiptArtifactInputSchema\n>;\n\nexport const MarkNcmecPortalCompleteInputSchema = z\n .object({\n caseId: z.string().min(1),\n submissionId: z.string().min(1),\n /** [Q13/H-06] The ID of an existing NcmecPortalReceiptArtifactV1 record bound to this (caseId, submissionId). */\n artifactId: z.string().min(1, 'A valid portal-receipt artifact id is required.'),\n /** [Q13/H-06] The object generation recorded on the artifact at registration time (immutable-object peg). */\n artifactObjectGeneration: z.string().min(1, 'The artifact object generation is required.'),\n /** [Q13/H-06] The sha256 hex digest recorded on the artifact at registration time (content-integrity check). */\n artifactSha256: z.string().regex(/^[0-9a-f]{64}$/, 'artifactSha256 must be a 64-character hex string.'),\n /** Optional operator free-text note describing the portal confirmation. */\n proofText: z.string().min(1).max(MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH).optional(),\n /** The NCMEC-assigned report id — REQUIRED (it IS the proof; no \"filed, number pending\" grace). */\n ncmecReportId: z.string().min(1, 'The NCMEC report id is required to mark the report complete.'),\n /** Explicit typed confirmation (interim control until the passkey profile lands). */\n confirmation: z.literal(NCMEC_MANUAL_PORTAL_FILED_CONFIRMATION),\n })\n .strict();\nexport type MarkNcmecPortalCompleteInput = z.infer<typeof MarkNcmecPortalCompleteInputSchema>;\n\n// ---------------------------------------------------------------------------\n// operatorStepUp — app-level TOTP step-up (confirm / verify a 6-digit code).\n// ---------------------------------------------------------------------------\n\nexport const OperatorStepUpCodeInputSchema = z\n .object({\n code: z.string().trim().regex(/^\\d{6}$/u, 'Enter the 6-digit code.'),\n })\n .strict();\nexport type OperatorStepUpCodeInput = z.infer<typeof OperatorStepUpCodeInputSchema>;\n\n// ---------------------------------------------------------------------------\n// revealCaseEvidence — metadata→evidence reveal under reauth.\n// ---------------------------------------------------------------------------\n\nexport const RevealCaseEvidenceInputSchema = z\n .object({\n caseId: z.string().min(1),\n /** Explicit typed confirmation (interim control until the passkey profile lands). */\n confirmation: z.literal(REVEAL_CASE_EVIDENCE_CONFIRMATION),\n /** The operator's child-safety warning acknowledgement, carried so the backend can persist it\n * in the reveal audit trail. This schema serves ONLY the safety-console reveal-under-reauth\n * flow (its sibling `confirmation` literal gates the same surface), so the acknowledgement is a\n * required `true` — consistent with the existing explicit-confirmation style. Server-side\n * enforcement + audit persistence land app-side. */\n warningAcknowledged: z.literal(true),\n })\n .strict();\nexport type RevealCaseEvidenceInput = z.infer<typeof RevealCaseEvidenceInputSchema>;\n\n// ---------------------------------------------------------------------------\n// refetchProtectedCaseContext — operator manual re-fetch of protected chat context.\n// ---------------------------------------------------------------------------\n\nexport const RefetchProtectedCaseContextInputSchema = z\n .object({\n caseId: z.string().min(1),\n lane: z.enum(['csam', 'ncii']),\n })\n .strict();\nexport type RefetchProtectedCaseContextInput = z.infer<typeof RefetchProtectedCaseContextInputSchema>;\n\n// ---------------------------------------------------------------------------\n// preserveAsEvidence — general-purpose ADMIN \"Preserve as Evidence\" callable.\n// ---------------------------------------------------------------------------\n\n/**\n * A target to preserve, discriminated by surface. Non-strict members are carried faithfully\n * from the source callable. The id / path / ref bounds are opaque structural caps (not user\n * text), and the augmentation `factKind` REUSES the canonical evidence external-fact enum\n * (`SafetyEvidenceExternalFactKindSchema`) rather than re-declaring its members.\n */\nexport const PreserveTargetSchema = z.discriminatedUnion('targetKind', [\n z.object({\n targetKind: z.literal('media'),\n mediaAssetId: z.string().min(1).max(256),\n }),\n z.object({\n targetKind: z.literal('post'),\n postDocPath: z.string().min(1).max(1024),\n revision: z.number().int().nonnegative().optional(),\n }),\n z.object({\n targetKind: z.literal('profile'),\n uid: z.string().min(1).max(256),\n revision: z.number().int().nonnegative().optional(),\n }),\n z.object({\n targetKind: z.literal('chat'),\n channelId: z.string().min(1).max(256),\n messageSeqStart: z.number().int().nonnegative(),\n messageSeqEnd: z.number().int().nonnegative(),\n transcriptObjectRef: z.string().min(1).max(1024),\n attachmentItemIds: z.array(z.string().min(1)).max(256).optional(),\n }),\n]);\nexport type PreserveTarget = z.infer<typeof PreserveTargetSchema>;\n\nexport const PreserveAsEvidenceInputSchema = z\n .object({\n /** Attach to an existing case; absent → open a standalone preservation case. */\n caseId: z.string().min(1).max(256).optional(),\n target: PreserveTargetSchema,\n /** Operator note recorded on the case (internal). */\n reasonInternal: z.string().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n /** Optional admin AUGMENTATION — extra externalFact refs preserved alongside the baseline. */\n augmentations: z\n .array(\n z.object({\n factKind: SafetyEvidenceExternalFactKindSchema,\n narrativeRef: z.string().min(1).max(1024),\n }),\n )\n .max(32)\n .optional(),\n })\n .strict();\nexport type PreserveAsEvidenceInput = z.infer<typeof PreserveAsEvidenceInputSchema>;\n\n// ---------------------------------------------------------------------------\n// recordNcmecPortalCorrection — record an operator's NCMEC manual-portal correction filing.\n// ---------------------------------------------------------------------------\n\nexport const RecordNcmecPortalCorrectionInputSchema = z\n .object({\n caseId: z.string().min(1),\n ncmecReportId: z.string().min(1),\n correctionFiledAt: z.number(),\n reason: z.string().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n confirmation: z.literal(NCMEC_PORTAL_CORRECTION_CONFIRMATION),\n })\n .strict();\nexport type RecordNcmecPortalCorrectionInput = z.infer<typeof RecordNcmecPortalCorrectionInputSchema>;\n"]}
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/schemas/safety.ts"],"names":[],"mappings":"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","sourcesContent":["// TTT safety-domain callable input schemas.\n//\n// The Trust & Safety operator surface (safety case console, evidence reveal, NCMEC\n// manual-portal completion, per-account safety actions, operator TOTP step-up, retained-\n// evidence inventory, party panel, TAKE IT DOWN request detail, protected-context re-fetch)\n// crosses the backend↔frontend boundary, so its callable input contracts live here — the\n// single source of truth — instead of being redefined locally in `functions/src/safety/`.\n//\n// Every object schema is `.strict()` so an unknown field on a privileged operator/admin\n// action is REJECTED rather than silently accepted (defense-in-depth on the highest-risk\n// callables). `caseId` / `targetUid` / `requestId` / `submissionId` and similar identifiers\n// are plain `z.string().min(1)` — matching the shapes the callables accept today; do not\n// broaden or weaken them.\n\nimport { z } from 'zod';\nimport {\n MAX_INTERNAL_REASON_LENGTH,\n MAX_USER_FACING_REASON_LENGTH,\n MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH,\n MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH,\n} from '../constants/business.js';\nimport {\n SAFETY_ACCOUNT_ACTION_CONFIRMATION,\n NCMEC_PORTAL_RECEIPT_CONFIRMATION,\n NCMEC_MANUAL_PORTAL_FILED_CONFIRMATION,\n REVEAL_CASE_EVIDENCE_CONFIRMATION,\n NCMEC_PORTAL_CORRECTION_CONFIRMATION,\n} from '../constants/safety-confirmation-phrases.js';\nimport { AccountActionSchema } from '../doc-schemas/safety/sagas.js';\nimport {\n ChildSafetyAccountRoleSchema,\n ChildSafetyAccountSubjectDispositionSchema,\n} from '../doc-schemas/safety/case.js';\nimport { SafetyEvidenceExternalFactKindSchema } from '../doc-schemas/safety/evidence.js';\n\n// ---------------------------------------------------------------------------\n// commandAccountAction — apply a per-account safety action on a child-safety case.\n// ---------------------------------------------------------------------------\n\n/**\n * The per-account safety action the operator command applies — an ALIAS of the ONE\n * canonical `AccountActionSchema` (../doc-schemas/safety/sagas.ts), re-exported under\n * the callable-input name. Never a re-declared literal (ARCH-102).\n */\nexport const CommandAccountActionSchema = AccountActionSchema;\nexport type CommandAccountActionValue = z.infer<typeof CommandAccountActionSchema>;\n\nexport const CommandAccountActionInputSchema = z\n .object({\n caseId: z.string().min(1),\n targetUid: z.string().min(1),\n action: CommandAccountActionSchema,\n /** Operator-facing internal rationale (LE-loggable). */\n reasonInternal: z.string().min(4, 'An internal reason is required.').max(MAX_INTERNAL_REASON_LENGTH),\n /** The generic owner-readable reason (no detail leaks). */\n reasonUserFacing: z.string().min(1).max(MAX_USER_FACING_REASON_LENGTH),\n /** Per-account case role (A1b) — the canonical case enums, never re-declared. */\n role: ChildSafetyAccountRoleSchema,\n subjectDisposition: ChildSafetyAccountSubjectDispositionSchema,\n confirmation: z.literal(SAFETY_ACCOUNT_ACTION_CONFIRMATION),\n })\n .strict();\nexport type CommandAccountActionInput = z.infer<typeof CommandAccountActionInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getSafetyCaseConsole — paginated read of the active safety-case console.\n// ---------------------------------------------------------------------------\n\n/** Cursor for the next page of a paginated console source — the last row's `(orderField value, docId)`. */\nexport const SafetyCaseConsoleCursorSchema = z\n .object({ v: z.number(), id: z.string().min(1) })\n .strict();\nexport type SafetyCaseConsoleCursor = z.infer<typeof SafetyCaseConsoleCursorSchema>;\n\nconst SAFETY_CONSOLE_MAX_PAGE_SIZE = 200;\n\nexport const GetSafetyCaseConsoleInputSchema = z\n .object({\n pageSize: z.number().int().min(1).max(SAFETY_CONSOLE_MAX_PAGE_SIZE).optional(),\n childSafetyCursor: SafetyCaseConsoleCursorSchema.nullish(),\n nciiCursor: SafetyCaseConsoleCursorSchema.nullish(),\n takeItDownCursor: SafetyCaseConsoleCursorSchema.nullish(),\n })\n .strict()\n .nullish();\nexport type GetSafetyCaseConsoleInput = z.infer<typeof GetSafetyCaseConsoleInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getSafetyCaseById — full-admin read of a terminal safety case by id.\n// ---------------------------------------------------------------------------\n\nexport const GetSafetyCaseByIdInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1).max(200),\n })\n .strict();\nexport type GetSafetyCaseByIdInput = z.infer<typeof GetSafetyCaseByIdInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getSafetyCaseParties — server-resolved party panel for a safety case.\n// ---------------------------------------------------------------------------\n\nexport const GetSafetyCasePartiesInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1),\n })\n .strict();\nexport type GetSafetyCasePartiesInput = z.infer<typeof GetSafetyCasePartiesInputSchema>;\n\n// ---------------------------------------------------------------------------\n// getTakeItDownRequestDetail — operator detail read for one public TAKE IT DOWN request.\n// ---------------------------------------------------------------------------\n\nexport const GetTakeItDownRequestDetailInputSchema = z\n .object({\n requestId: z.string().min(1),\n })\n .strict();\nexport type GetTakeItDownRequestDetailInput = z.infer<typeof GetTakeItDownRequestDetailInputSchema>;\n\n// ---------------------------------------------------------------------------\n// listRetainedEvidenceInventory — paginated retained-evidence inventory read.\n// ---------------------------------------------------------------------------\n\n/** Cursor for the retained-evidence inventory — the last row's `(createdAt, docId)`. */\nexport const RetainedEvidenceInventoryCursorSchema = z\n .object({ createdAt: z.number(), id: z.string().min(1) })\n .strict();\nexport type RetainedEvidenceInventoryCursor = z.infer<typeof RetainedEvidenceInventoryCursorSchema>;\n\nconst RETAINED_EVIDENCE_MAX_PAGE_SIZE = 200;\n\nexport const ListRetainedEvidenceInventoryInputSchema = z\n .object({\n pageSize: z.number().int().min(1).max(RETAINED_EVIDENCE_MAX_PAGE_SIZE).optional(),\n cursor: RetainedEvidenceInventoryCursorSchema.nullish(),\n /** Exact inventoryId lookup — returns just that row (or none), ignoring the cursor. */\n exactId: z.string().min(1).optional(),\n })\n .strict()\n .nullish();\nexport type ListRetainedEvidenceInventoryInput = z.infer<typeof ListRetainedEvidenceInventoryInputSchema>;\n\n// ---------------------------------------------------------------------------\n// ncmecOperatorCommands — NCMEC manual-portal completion path.\n// ---------------------------------------------------------------------------\n\nexport const RecordNcmecPortalReceiptArtifactInputSchema = z\n .object({\n caseId: z.string().min(1),\n submissionId: z.string().min(1),\n /** The key of an object already in the restricted evidence vault (verified via statObject). */\n evidenceVaultKey: z.string().min(1, 'An evidence vault object key is required.'),\n /** Optional operator description of what the artifact is (e.g. \"NCMEC portal screenshot\"). */\n description: z.string().min(1).max(MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH).optional(),\n /** Explicit typed confirmation (interim control until the passkey profile lands). */\n confirmation: z.literal(NCMEC_PORTAL_RECEIPT_CONFIRMATION),\n })\n .strict();\nexport type RecordNcmecPortalReceiptArtifactInput = z.infer<\n typeof RecordNcmecPortalReceiptArtifactInputSchema\n>;\n\nexport const MarkNcmecPortalCompleteInputSchema = z\n .object({\n caseId: z.string().min(1),\n submissionId: z.string().min(1),\n /** [Q13/H-06] The ID of an existing NcmecPortalReceiptArtifactV1 record bound to this (caseId, submissionId). */\n artifactId: z.string().min(1, 'A valid portal-receipt artifact id is required.'),\n /** [Q13/H-06] The object generation recorded on the artifact at registration time (immutable-object peg). */\n artifactObjectGeneration: z.string().min(1, 'The artifact object generation is required.'),\n /** [Q13/H-06] The sha256 hex digest recorded on the artifact at registration time (content-integrity check). */\n artifactSha256: z.string().regex(/^[0-9a-f]{64}$/, 'artifactSha256 must be a 64-character hex string.'),\n /** Optional operator free-text note describing the portal confirmation. */\n proofText: z.string().min(1).max(MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH).optional(),\n /** The NCMEC-assigned report id — REQUIRED (it IS the proof; no \"filed, number pending\" grace). */\n ncmecReportId: z.string().min(1, 'The NCMEC report id is required to mark the report complete.'),\n /** Explicit typed confirmation (interim control until the passkey profile lands). */\n confirmation: z.literal(NCMEC_MANUAL_PORTAL_FILED_CONFIRMATION),\n })\n .strict();\nexport type MarkNcmecPortalCompleteInput = z.infer<typeof MarkNcmecPortalCompleteInputSchema>;\n\n// ---------------------------------------------------------------------------\n// operatorStepUp — app-level TOTP step-up (confirm / verify a 6-digit code).\n// ---------------------------------------------------------------------------\n\nexport const OperatorStepUpCodeInputSchema = z\n .object({\n code: z.string().trim().regex(/^\\d{6}$/u, 'Enter the 6-digit code.'),\n })\n .strict();\nexport type OperatorStepUpCodeInput = z.infer<typeof OperatorStepUpCodeInputSchema>;\n\n// ---------------------------------------------------------------------------\n// revealCaseEvidence — metadata→evidence reveal under reauth.\n// ---------------------------------------------------------------------------\n\nexport const RevealCaseEvidenceInputSchema = z\n .object({\n caseId: z.string().min(1),\n /** Explicit typed confirmation (interim control until the passkey profile lands). */\n confirmation: z.literal(REVEAL_CASE_EVIDENCE_CONFIRMATION),\n /** The operator's child-safety warning acknowledgement, carried so the backend can persist it\n * in the reveal audit trail. This schema serves ONLY the safety-console reveal-under-reauth\n * flow (its sibling `confirmation` literal gates the same surface), so the acknowledgement is a\n * required `true` — consistent with the existing explicit-confirmation style. Server-side\n * enforcement + audit persistence land app-side. */\n warningAcknowledged: z.literal(true),\n })\n .strict();\nexport type RevealCaseEvidenceInput = z.infer<typeof RevealCaseEvidenceInputSchema>;\n\n// ---------------------------------------------------------------------------\n// refetchProtectedCaseContext — operator manual re-fetch of protected chat context.\n// ---------------------------------------------------------------------------\n\nexport const RefetchProtectedCaseContextInputSchema = z\n .object({\n caseId: z.string().min(1),\n lane: z.enum(['csam', 'ncii']),\n })\n .strict();\nexport type RefetchProtectedCaseContextInput = z.infer<typeof RefetchProtectedCaseContextInputSchema>;\n\n// ---------------------------------------------------------------------------\n// preserveAsEvidence — general-purpose ADMIN \"Preserve as Evidence\" callable.\n// ---------------------------------------------------------------------------\n\n/**\n * A target to preserve, discriminated by surface. Non-strict members are carried faithfully\n * from the source callable. The id / path / ref bounds are opaque structural caps (not user\n * text), and the augmentation `factKind` REUSES the canonical evidence external-fact enum\n * (`SafetyEvidenceExternalFactKindSchema`) rather than re-declaring its members.\n */\nexport const PreserveTargetSchema = z.discriminatedUnion('targetKind', [\n z.object({\n targetKind: z.literal('media'),\n mediaAssetId: z.string().min(1).max(256),\n }),\n z.object({\n targetKind: z.literal('post'),\n postDocPath: z.string().min(1).max(1024),\n revision: z.number().int().nonnegative().optional(),\n }),\n z.object({\n targetKind: z.literal('profile'),\n uid: z.string().min(1).max(256),\n revision: z.number().int().nonnegative().optional(),\n }),\n z.object({\n targetKind: z.literal('chat'),\n channelId: z.string().min(1).max(256),\n messageSeqStart: z.number().int().nonnegative(),\n messageSeqEnd: z.number().int().nonnegative(),\n transcriptObjectRef: z.string().min(1).max(1024),\n attachmentItemIds: z.array(z.string().min(1)).max(256).optional(),\n }),\n]);\nexport type PreserveTarget = z.infer<typeof PreserveTargetSchema>;\n\nexport const PreserveAsEvidenceInputSchema = z\n .object({\n /** Attach to an existing case; absent → open a standalone preservation case. */\n caseId: z.string().min(1).max(256).optional(),\n target: PreserveTargetSchema,\n /** Operator note recorded on the case (internal). */\n reasonInternal: z.string().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n /** Optional admin AUGMENTATION — extra externalFact refs preserved alongside the baseline. */\n augmentations: z\n .array(\n z.object({\n factKind: SafetyEvidenceExternalFactKindSchema,\n narrativeRef: z.string().min(1).max(1024),\n }),\n )\n .max(32)\n .optional(),\n })\n .strict();\nexport type PreserveAsEvidenceInput = z.infer<typeof PreserveAsEvidenceInputSchema>;\n\n// ---------------------------------------------------------------------------\n// recordNcmecPortalCorrection — record an operator's NCMEC manual-portal correction filing.\n// ---------------------------------------------------------------------------\n\nexport const RecordNcmecPortalCorrectionInputSchema = z\n .object({\n caseId: z.string().min(1),\n ncmecReportId: z.string().min(1),\n correctionFiledAt: z.number(),\n reason: z.string().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n confirmation: z.literal(NCMEC_PORTAL_CORRECTION_CONFIRMATION),\n })\n .strict();\nexport type RecordNcmecPortalCorrectionInput = z.infer<typeof RecordNcmecPortalCorrectionInputSchema>;\n"]}
|
|
@@ -38,7 +38,7 @@ export interface OpsBrokenMachinery {
|
|
|
38
38
|
/** `safetyMonitorHeartbeat/global.lastRunAt` (epoch ms) of the scheduled monitor sweep.
|
|
39
39
|
* Absent if the heartbeat has never stamped. Display only — do NOT judge staleness from this
|
|
40
40
|
* client-side: use `safetyMonitorHeartbeatStale`, which the backend derives from the SAME
|
|
41
|
-
* threshold its dead-man checker alarms on (
|
|
41
|
+
* threshold its dead-man checker alarms on (ARCH-102: one declaration, enforcement derives). */
|
|
42
42
|
safetyMonitorHeartbeatLastRunAt?: number;
|
|
43
43
|
/** True when the sweep's heartbeat is older than the backend's own dead-man threshold — i.e. the
|
|
44
44
|
* scheduled safety monitors may not be running. Derived server-side so the operator chip and the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-ops.d.ts","sourceRoot":"","sources":["../../src/types/admin-ops.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;;;qBAIqB;AACrB,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,aAAa,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,wBAAwB,EAAE,MAAM,CAAC;IACjC,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;sBACkB;IAClB,6BAA6B,CAAC,EAAE,MAAM,CAAC;CACxC;AAED;+FAC+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;
|
|
1
|
+
{"version":3,"file":"admin-ops.d.ts","sourceRoot":"","sources":["../../src/types/admin-ops.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;;;qBAIqB;AACrB,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,aAAa,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,wBAAwB,EAAE,MAAM,CAAC;IACjC,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;sBACkB;IAClB,6BAA6B,CAAC,EAAE,MAAM,CAAC;CACxC;AAED;+FAC+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;qGAGiG;IACjG,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC;;2FAEuF;IACvF,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,2EAA2E;AAC3E,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D;;;sEAGkE;IAClE,UAAU,EAAE;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,yFAAyF;QACzF,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,8DAA8D;QAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,qBAAqB,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sFAAsF;IACtF,MAAM,EAAE,mBAAmB,CAAC;IAC5B;wDACoD;IACpD,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,iFAAiF;IACjF,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED;;+CAE+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,oBAAoB,CAAC;IACjC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,gFAAgF;IAChF,SAAS,EAAE,OAAO,CAAC;CACpB"}
|
package/dist/types/admin-ops.js
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
// builds them, frontend renders them), so they live HERE per the Cross-Boundary
|
|
3
3
|
// Type Invariant. Consolidated 2026-07-13 from the former "intentional LOCAL DTO"
|
|
4
4
|
// in functions/src/admin/getOpsStatus.ts + its structurally-matching frontend
|
|
5
|
-
// re-declaration (publish-avoidance rationale — auto-reject;
|
|
5
|
+
// re-declaration (publish-avoidance rationale — auto-reject; ARCH-102 extended).
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=admin-ops.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-ops.js","sourceRoot":"","sources":["../../src/types/admin-ops.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,kFAAkF;AAClF,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"admin-ops.js","sourceRoot":"","sources":["../../src/types/admin-ops.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,kFAAkF;AAClF,8EAA8E;AAC9E,iFAAiF","sourcesContent":["// Admin ops-dashboard callable return shapes — cross-boundary contracts (backend\n// builds them, frontend renders them), so they live HERE per the Cross-Boundary\n// Type Invariant. Consolidated 2026-07-13 from the former \"intentional LOCAL DTO\"\n// in functions/src/admin/getOpsStatus.ts + its structurally-matching frontend\n// re-declaration (publish-avoidance rationale — auto-reject; ARCH-102 extended).\n\nimport type { PledgePaymentTotals } from './payments.js';\nimport type { DeadLetterCollection } from '../schemas/admin.js';\n\n/** Trust & Safety SLA-clock + active-case snapshot for the Mission Control landing (§A8).\n * Counts are point-in-time; the per-lane earliest-deadline epochs (ms) are handed over raw so\n * the countdown ticks CLIENT-side — the server holds no live timer. All fields optional so an\n * older client still type-checks; the earliest-* epochs are additionally absent when a lane has\n * no armed clock. */\nexport interface OpsSafetyClocks {\n /** `safetySlaMonitors` rows with status == 'armed' (an obligation clock still running). */\n armedMonitors: number;\n /** `safetySlaMonitors` rows with status == 'overdue' (a breached SLA obligation). */\n overdueMonitors: number;\n /** Open CSAM (childSafety) cases. */\n activeChildSafetyCases: number;\n /** Open NCII cases. */\n activeNciiCases: number;\n /** Open statutory TAKE IT DOWN requests (`takeItDownRequests`). */\n activeTakeItDownRequests: number;\n /** Earliest armed `reviewDue` monitor deadline across all lanes (epoch ms). */\n earliestReviewDueAt?: number;\n /** Earliest armed CSAM `photoDnaContract` (72h match-reporting) deadline (epoch ms). */\n earliestPhotoDnaContractAt?: number;\n /** Earliest armed NCII / TAKE IT DOWN `nciiRemovalDeadline` (48h statutory removal) deadline\n * (epoch ms). */\n earliestNciiRemovalDeadlineAt?: number;\n}\n\n/** Backend-machinery health for the Mission Control landing: dead-letter depth, stuck async\n * lanes, failed media, and the global safety-sweep dead-man heartbeat. Numbers/epochs only. */\nexport interface OpsBrokenMachinery {\n /** Total parked dead-letter rows across every ledger (see `getDeadLetters`). */\n deadLetterTotal: number;\n /** Dead-lettered chat-sync fanout jobs (`chatSyncFanoutJobs`). */\n deadLetteredFanoutJobs: number;\n /** Stuck hall-sub-item edge-sync rows (`hallSubItemEdgeSync`). */\n stuckEdgeSyncCount: number;\n /** Uncleared failed pendingMedia (mirrors `media.failed`, surfaced in the machinery lane). */\n failedMediaCount: number;\n /** `safetyMonitorHeartbeat/global.lastRunAt` (epoch ms) of the scheduled monitor sweep.\n * Absent if the heartbeat has never stamped. Display only — do NOT judge staleness from this\n * client-side: use `safetyMonitorHeartbeatStale`, which the backend derives from the SAME\n * threshold its dead-man checker alarms on (ARCH-102: one declaration, enforcement derives). */\n safetyMonitorHeartbeatLastRunAt?: number;\n /** True when the sweep's heartbeat is older than the backend's own dead-man threshold — i.e. the\n * scheduled safety monitors may not be running. Derived server-side so the operator chip and the\n * real alarm can never disagree. Absent when an older backend does not project it. */\n safetyMonitorHeartbeatStale?: boolean;\n}\n\n/** The `getOpsStatus` callable's return shape (read-only ops snapshot). */\nexport interface OpsStatus {\n generatedAt: number;\n /** pendingMedia processing pipeline depth + uncleared failures. */\n media: { pending: number; processing: number; failed: number };\n /** Open admin work-queue tasks by type (status == 'pending'). `opsAnomalies` is the\n * combined stake-share + pledge-ledger + pledge-payment-repair integrity lane depth.\n * `refundRequests` and `disputes` are additive (optional) money-ops queue counts — an\n * older backend that does not project them simply omits them. */\n adminQueue: {\n libraryReviews: number;\n reports: number;\n appeals: number;\n dispatches: number;\n opsAnomalies: number;\n /** Pending user-initiated refund requests (the `payment.pledgeRefundRequested` lane). */\n refundRequests?: number;\n /** Open Stripe disputes / chargebacks awaiting resolution. */\n disputes?: number;\n };\n /** userProfiles created in the last 24h. */\n signupsLast24h: number;\n /** auditEvents with result == 'failure' in the last 24h (failed sensitive actions). */\n actionFailuresLast24h: number;\n /** auditEvents of type 'payment.pledgePaymentFailed' in the last 24h. */\n paymentFailuresLast24h: number;\n /** All-time pledge totals (live Firestore aggregation over pledgePayments; cents). */\n pledge: PledgePaymentTotals;\n /** Trust & Safety SLA-clock + active-case snapshot (§A8). Additive — an older backend that\n * does not project it omits the block entirely. */\n safetyClocks?: OpsSafetyClocks;\n /** Backend-machinery health snapshot. Additive — omitted by an older backend. */\n brokenMachinery?: OpsBrokenMachinery;\n}\n\n/** One parked row in the `getDeadLetters` operator view — a normalized projection\n * over the heterogeneous ledger shapes (the callable maps each ledger's own\n * status/error/timestamp fields onto this). */\nexport interface DeadLetterRow {\n collection: DeadLetterCollection;\n /** Flat doc id, or the full nested document path for hallSubItemEdgeSync rows. */\n docId: string;\n deadLetteredAt: number | null;\n lastError: string | null;\n attemptCount: number | null;\n}\n\n/** The `getDeadLetters` callable's return shape. */\nexport interface GetDeadLettersResult {\n generatedAt: number;\n rows: DeadLetterRow[];\n /** True when any ledger hit the row cap — more parked rows exist than shown. */\n truncated: boolean;\n}\n"]}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
// builds them, the admin User Management surface renders them), so they live HERE per the
|
|
3
3
|
// Cross-Boundary Type Invariant (same rationale as admin-ops.ts). The account status tier
|
|
4
4
|
// reuses the ONE canonical UserAccountStatus union (doc-schemas/user.ts) — never a
|
|
5
|
-
// re-declared 'active' | 'suspended' | 'banned' literal (
|
|
5
|
+
// re-declared 'active' | 'suspended' | 'banned' literal (ARCH-102).
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=admin-users.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-users.js","sourceRoot":"","sources":["../../src/types/admin-users.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,0FAA0F;AAC1F,0FAA0F;AAC1F,mFAAmF;AACnF,
|
|
1
|
+
{"version":3,"file":"admin-users.js","sourceRoot":"","sources":["../../src/types/admin-users.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,0FAA0F;AAC1F,0FAA0F;AAC1F,mFAAmF;AACnF,oEAAoE","sourcesContent":["// Admin user-directory callable RESULT shapes — cross-boundary contracts (the backend\n// builds them, the admin User Management surface renders them), so they live HERE per the\n// Cross-Boundary Type Invariant (same rationale as admin-ops.ts). The account status tier\n// reuses the ONE canonical UserAccountStatus union (doc-schemas/user.ts) — never a\n// re-declared 'active' | 'suspended' | 'banned' literal (ARCH-102).\n\nimport type { UserAccountStatus } from '../doc-schemas/user.js';\n\n/** One row of the admin display-name prefix search (`searchPublicUsers`). The status tier is\n * resolved server-side from the authoritative `userProfiles/{uid}` doc — `publicUsers` only\n * mirrors a derived `disabled` boolean, not the active/suspended/banned tier. */\nexport interface PublicUserSearchResult {\n uid: string;\n displayName: string;\n status: UserAccountStatus;\n}\n\n/** The `lookupUserByEmailOrUid` callable's result — an EXACT single-account match a solo full\n * admin resolves by email, uid, or display name. Carries the owner-only email (an admin-gated\n * read of the account's privateData) and the admin-claim flag alongside the status tier. */\nexport interface AdminUserLookupResult {\n uid: string;\n displayName: string;\n email: string;\n status: UserAccountStatus;\n isAdmin?: boolean;\n}\n"]}
|
package/dist/types/social.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import type { WorkProjectType } from './content.js';
|
|
|
9
9
|
/**
|
|
10
10
|
* Serializable subset of SquareStreetz post creation payload.
|
|
11
11
|
* Frontend extends this with `mediaFile?: File` locally.
|
|
12
|
-
* Every union/allowlist field derives from its ONE canonical declaration (
|
|
12
|
+
* Every union/allowlist field derives from its ONE canonical declaration (ARCH-102) —
|
|
13
13
|
* never an inline literal union.
|
|
14
14
|
*/
|
|
15
15
|
export type SquareStreetzPostPayload = {
|
package/dist/types/social.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/types/social.ts"],"names":[],"mappings":"","sourcesContent":["// Social types: SquareStreetz feed, Mentions, Follows. (Pledge-payment types live in\n// ../types/payments.ts.)\nexport type { Mention, MentionType } from '../media/atoms.js';\nimport type { Mention } from '../media/atoms.js';\nimport type { CraftSkillKind, CraftSkillSourceReference } from '../doc-schemas/user.js';\nimport type { ContentMediaKind } from '../doc-schemas/media-assets.js';\nimport type { MediaType, AuditionAnnounceKind } from '../doc-schemas/social.js';\nimport type { HallSubItemType } from '../doc-schemas/content.js';\nimport type { CraftSkillTagId } from '../constants/options.js';\nimport type { WorkProjectType } from './content.js';\n\n// --- SquareStreetz Social Media ---\n\n// SquareStreetz post/mention-history/follow shapes are re-exported from\n// ../doc-schemas/social.ts below (single source of truth).\n\n/**\n * Serializable subset of SquareStreetz post creation payload.\n * Frontend extends this with `mediaFile?: File` locally.\n * Every union/allowlist field derives from its ONE canonical declaration (
|
|
1
|
+
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/types/social.ts"],"names":[],"mappings":"","sourcesContent":["// Social types: SquareStreetz feed, Mentions, Follows. (Pledge-payment types live in\n// ../types/payments.ts.)\nexport type { Mention, MentionType } from '../media/atoms.js';\nimport type { Mention } from '../media/atoms.js';\nimport type { CraftSkillKind, CraftSkillSourceReference } from '../doc-schemas/user.js';\nimport type { ContentMediaKind } from '../doc-schemas/media-assets.js';\nimport type { MediaType, AuditionAnnounceKind } from '../doc-schemas/social.js';\nimport type { HallSubItemType } from '../doc-schemas/content.js';\nimport type { CraftSkillTagId } from '../constants/options.js';\nimport type { WorkProjectType } from './content.js';\n\n// --- SquareStreetz Social Media ---\n\n// SquareStreetz post/mention-history/follow shapes are re-exported from\n// ../doc-schemas/social.ts below (single source of truth).\n\n/**\n * Serializable subset of SquareStreetz post creation payload.\n * Frontend extends this with `mediaFile?: File` locally.\n * Every union/allowlist field derives from its ONE canonical declaration (ARCH-102) —\n * never an inline literal union.\n */\nexport type SquareStreetzPostPayload = {\n userId: string;\n mentions?: Mention[];\n newMediaAssetId?: string;\n // `tags` (canonical discipline-tag ids), `kind` (attestation kind), and `source`\n // (the mimicOnTtt original — a user/workProject reference, rendered as a resolvable\n // mention link) let the NEW_CRAFT_SKILL Streetz announcement describe the craft\n // WITHOUT the client-supplied file name (`name` = originalFileName — never put a\n // file name in public post content).\n craftSkill?: {\n id: string;\n name: string;\n mediaAssetId: string;\n type: ContentMediaKind;\n tags?: CraftSkillTagId[];\n kind?: CraftSkillKind;\n source?: CraftSkillSourceReference;\n };\n craftSkillId?: string;\n workProjectTitle?: string;\n workProjectId?: string;\n workProjectType?: WorkProjectType;\n workProjectDescription?: string;\n workRealmId?: string;\n workRealmTitle?: string;\n hallItemId?: string;\n hallItemTitle?: string;\n hallSubItemType?: HallSubItemType;\n content?: string;\n mediaAssetId?: string;\n mediaType?: MediaType;\n createdAt?: number;\n auditionId?: string;\n commissionListingId?: string;\n auditionAnnounceKind?: AuditionAnnounceKind;\n};\n\nexport type {\n SquareStreetzPostType,\n SquareStreetzPost,\n MentionHistoryItem,\n MentionHistoryDocument,\n FollowEdge,\n FollowCounter,\n} from '../doc-schemas/social.js';\n"]}
|
|
@@ -9,7 +9,7 @@ export const CreateAdminAuditionVariablesSchema = z.object({
|
|
|
9
9
|
openTill: z.string().min(1),
|
|
10
10
|
sponsoredAuditionAmountUSD: z.number().nonnegative().finite().max(MAX_SPONSORED_AUDITION_AMOUNT_USD).optional(),
|
|
11
11
|
// Curated vs open (default 'open' when absent). 'curated' → the admin posts the option videos and
|
|
12
|
-
// users may ONLY vote. Must live on the variables (
|
|
12
|
+
// users may ONLY vote. Must live on the variables (MEDIA-005 strict-parse), not targetInfo.
|
|
13
13
|
mode: z.enum(['open', 'curated']).optional(),
|
|
14
14
|
// Curated only: the fixed number of option videos (2..8) uploaded as one atomic batch. Required by
|
|
15
15
|
// the callable when mode === 'curated'; ignored for open auditions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-admin-audition-variables.js","sourceRoot":"","sources":["../../src/upload-variables/create-admin-audition-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,QAAQ,EAAE;IAC/G,kGAAkG;IAClG,
|
|
1
|
+
{"version":3,"file":"create-admin-audition-variables.js","sourceRoot":"","sources":["../../src/upload-variables/create-admin-audition-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,QAAQ,EAAE;IAC/G,kGAAkG;IAClG,4FAA4F;IAC5F,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5C,mGAAmG;IACnG,oEAAoE;IACpE,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,QAAQ,EAAE;IACpH,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC,MAAM,EAAE,CAAC","sourcesContent":["import { z } from 'zod';\nimport { onProgressSchema } from './on-progress.js';\nimport {\n MAX_AUDITION_TITLE_LENGTH,\n MAX_AUDITION_DESCRIPTION_LENGTH,\n MAX_SPONSORED_AUDITION_AMOUNT_USD,\n MIN_CURATED_AUDITION_OPTIONS,\n MAX_CURATED_AUDITION_OPTIONS,\n} from '../constants/business.js';\n\n\nexport const CreateAdminAuditionVariablesSchema = z.object({\n type: z.enum(['platformAudition', 'sponsoredAudition']),\n title: z.string().min(1).max(MAX_AUDITION_TITLE_LENGTH),\n description: z.string().max(MAX_AUDITION_DESCRIPTION_LENGTH),\n videoFile: z.instanceof(File).or(z.instanceof(Blob)),\n openTill: z.string().min(1),\n sponsoredAuditionAmountUSD: z.number().nonnegative().finite().max(MAX_SPONSORED_AUDITION_AMOUNT_USD).optional(),\n // Curated vs open (default 'open' when absent). 'curated' → the admin posts the option videos and\n // users may ONLY vote. Must live on the variables (MEDIA-005 strict-parse), not targetInfo.\n mode: z.enum(['open', 'curated']).optional(),\n // Curated only: the fixed number of option videos (2..8) uploaded as one atomic batch. Required by\n // the callable when mode === 'curated'; ignored for open auditions.\n expectedOptionCount: z.number().int().min(MIN_CURATED_AUDITION_OPTIONS).max(MAX_CURATED_AUDITION_OPTIONS).optional(),\n onProgress: onProgressSchema,\n signal: z.instanceof(AbortSignal).optional(),\n}).strict();\nexport type CreateAdminAuditionVariables = z.infer<typeof CreateAdminAuditionVariablesSchema>;\n\n"]}
|
|
@@ -10,7 +10,7 @@ export const CreateWorkProjectAuditionVariablesSchema = z.object({
|
|
|
10
10
|
stakeSharesOffered: z.number().int().min(0).max(MAX_WORK_PROJECT_STAKE_SHARES).optional(),
|
|
11
11
|
// Curated vs open (default 'open' when absent). 'curated' → the creating work posts the option
|
|
12
12
|
// videos itself and users may ONLY vote. The strict schema is why this MUST live on the variables
|
|
13
|
-
// (
|
|
13
|
+
// (MEDIA-005: the hook parses variables strictly, so the mode cannot ride in targetInfo).
|
|
14
14
|
mode: z.enum(['open', 'curated']).optional(),
|
|
15
15
|
// Curated only: the fixed number of creator option videos (2..8) being uploaded as one batch, so
|
|
16
16
|
// the server knows when the whole atomic batch has landed. Required by the callable when mode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-work-project-audition-variables.js","sourceRoot":"","sources":["../../src/upload-variables/create-work-project-audition-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,QAAQ,EAAE;IACzF,+FAA+F;IAC/F,kGAAkG;IAClG,
|
|
1
|
+
{"version":3,"file":"create-work-project-audition-variables.js","sourceRoot":"","sources":["../../src/upload-variables/create-work-project-audition-variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,QAAQ,EAAE;IACzF,+FAA+F;IAC/F,kGAAkG;IAClG,0FAA0F;IAC1F,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5C,iGAAiG;IACjG,8FAA8F;IAC9F,6CAA6C;IAC7C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,QAAQ,EAAE;IACpH,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC,MAAM,EAAE,CAAC","sourcesContent":["import { z } from 'zod';\nimport { onProgressSchema } from './on-progress.js';\nimport {\n MAX_AUDITION_TITLE_LENGTH,\n MAX_AUDITION_DESCRIPTION_LENGTH,\n MAX_WORK_PROJECT_STAKE_SHARES,\n MIN_CURATED_AUDITION_OPTIONS,\n MAX_CURATED_AUDITION_OPTIONS,\n} from '../constants/business.js';\n\n\nexport const CreateWorkProjectAuditionVariablesSchema = z.object({\n title: z.string().min(1).max(MAX_AUDITION_TITLE_LENGTH),\n description: z.string().max(MAX_AUDITION_DESCRIPTION_LENGTH),\n videoFile: z.instanceof(File).or(z.instanceof(Blob)),\n openTill: z.string().min(1),\n workProjectId: z.string().min(1),\n stakeSharesOffered: z.number().int().min(0).max(MAX_WORK_PROJECT_STAKE_SHARES).optional(),\n // Curated vs open (default 'open' when absent). 'curated' → the creating work posts the option\n // videos itself and users may ONLY vote. The strict schema is why this MUST live on the variables\n // (MEDIA-005: the hook parses variables strictly, so the mode cannot ride in targetInfo).\n mode: z.enum(['open', 'curated']).optional(),\n // Curated only: the fixed number of creator option videos (2..8) being uploaded as one batch, so\n // the server knows when the whole atomic batch has landed. Required by the callable when mode\n // === 'curated'; ignored for open auditions.\n expectedOptionCount: z.number().int().min(MIN_CURATED_AUDITION_OPTIONS).max(MAX_CURATED_AUDITION_OPTIONS).optional(),\n onProgress: onProgressSchema,\n signal: z.instanceof(AbortSignal).optional(),\n}).strict();\nexport type CreateWorkProjectAuditionVariables = z.infer<typeof CreateWorkProjectAuditionVariablesSchema>;\n\n"]}
|