@ttt-productions/ttt-core 0.78.15 → 0.78.17
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/center-stage-rooms.d.ts +12 -0
- package/dist/constants/center-stage-rooms.d.ts.map +1 -0
- package/dist/constants/center-stage-rooms.js +32 -0
- package/dist/constants/center-stage-rooms.js.map +1 -0
- package/dist/constants/company-mascots.d.ts +115 -0
- package/dist/constants/company-mascots.d.ts.map +1 -0
- package/dist/constants/company-mascots.js +272 -0
- package/dist/constants/company-mascots.js.map +1 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/storage-keys.d.ts +15 -0
- package/dist/constants/storage-keys.d.ts.map +1 -1
- package/dist/constants/storage-keys.js +18 -0
- package/dist/constants/storage-keys.js.map +1 -1
- package/dist/schemas/admin.d.ts +66 -3
- package/dist/schemas/admin.d.ts.map +1 -1
- package/dist/schemas/admin.js +49 -0
- package/dist/schemas/admin.js.map +1 -1
- package/package.json +9 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type CenterStageRoomKey = 'hall' | 'square' | 'audition';
|
|
2
|
+
export interface CenterStageRoom {
|
|
3
|
+
readonly key: CenterStageRoomKey;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly verb: string;
|
|
6
|
+
readonly href: string;
|
|
7
|
+
/** One-breath description shown on the audience placard (same words the tour uses). */
|
|
8
|
+
readonly description: string;
|
|
9
|
+
}
|
|
10
|
+
/** The three rooms, in revolve order. Index 0 (The Hall) opens in the spotlight. */
|
|
11
|
+
export declare const CENTER_STAGE_ROOMS: readonly CenterStageRoom[];
|
|
12
|
+
//# sourceMappingURL=center-stage-rooms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"center-stage-rooms.d.ts","sourceRoot":"","sources":["../../src/constants/center-stage-rooms.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAyBxD,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// CENTER STAGE ROOMS — the pure, durable definitions of the three revolving
|
|
3
|
+
// landing/registration-tour rooms (Rule 36). Moved here VERBATIM from the app's
|
|
4
|
+
// `center-stage.tsx`. Pure data only: the emblems (`ROOM_EMBLEMS`), React
|
|
5
|
+
// components, engraving, and stage layout stay app-owned. Each room's `href` is
|
|
6
|
+
// the app route the spotlit poster navigates to.
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/** The three rooms, in revolve order. Index 0 (The Hall) opens in the spotlight. */
|
|
9
|
+
export const CENTER_STAGE_ROOMS = [
|
|
10
|
+
{
|
|
11
|
+
key: 'hall',
|
|
12
|
+
name: 'The Hall',
|
|
13
|
+
verb: 'Watch, read & listen',
|
|
14
|
+
href: '/hall-library',
|
|
15
|
+
description: 'Home to the finished works — read original Tales, listen to Tunes, and watch Television, all made by real people and reviewed before it goes up.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: 'square',
|
|
19
|
+
name: 'The Square',
|
|
20
|
+
verb: "See what's happening",
|
|
21
|
+
href: '/square-streetz',
|
|
22
|
+
description: 'The community feed. Post your news, follow artisans you admire, and watch the Town Crier announce what’s happening across TTT Productions.',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: 'audition',
|
|
26
|
+
name: 'The Audition Stage',
|
|
27
|
+
verb: 'Cast your vote',
|
|
28
|
+
href: '/audition-board',
|
|
29
|
+
description: 'Artisans post auditions for their works, and the community votes on the entries. Cast your vote — one per audition, switch it anytime.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
//# sourceMappingURL=center-stage-rooms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"center-stage-rooms.js","sourceRoot":"","sources":["../../src/constants/center-stage-rooms.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAChF,0EAA0E;AAC1E,gFAAgF;AAChF,iDAAiD;AACjD,+EAA+E;AAa/E,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAA+B;IAC5D;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,kJAAkJ;KACrJ;IACD;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,4IAA4I;KAC/I;IACD;QACE,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,wIAAwI;KAC3I;CACF,CAAC","sourcesContent":["// ============================================================================\n// CENTER STAGE ROOMS — the pure, durable definitions of the three revolving\n// landing/registration-tour rooms (Rule 36). Moved here VERBATIM from the app's\n// `center-stage.tsx`. Pure data only: the emblems (`ROOM_EMBLEMS`), React\n// components, engraving, and stage layout stay app-owned. Each room's `href` is\n// the app route the spotlit poster navigates to.\n// ============================================================================\n\nexport type CenterStageRoomKey = 'hall' | 'square' | 'audition';\n\nexport interface CenterStageRoom {\n readonly key: CenterStageRoomKey;\n readonly name: string;\n readonly verb: string;\n readonly href: string;\n /** One-breath description shown on the audience placard (same words the tour uses). */\n readonly description: string;\n}\n\n/** The three rooms, in revolve order. Index 0 (The Hall) opens in the spotlight. */\nexport const CENTER_STAGE_ROOMS: readonly CenterStageRoom[] = [\n {\n key: 'hall',\n name: 'The Hall',\n verb: 'Watch, read & listen',\n href: '/hall-library',\n description:\n 'Home to the finished works — read original Tales, listen to Tunes, and watch Television, all made by real people and reviewed before it goes up.',\n },\n {\n key: 'square',\n name: 'The Square',\n verb: \"See what's happening\",\n href: '/square-streetz',\n description:\n 'The community feed. Post your news, follow artisans you admire, and watch the Town Crier announce what’s happening across TTT Productions.',\n },\n {\n key: 'audition',\n name: 'The Audition Stage',\n verb: 'Cast your vote',\n href: '/audition-board',\n description:\n 'Artisans post auditions for their works, and the community votes on the entries. Cast your vote — one per audition, switch it anytime.',\n },\n];\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/** Every member of the Company, in roster order. */
|
|
2
|
+
export type CompanyCharacterId = 'bill' | 'kit' | 'yorick';
|
|
3
|
+
/** The roster, in billing order (Bill → Kit → Yorick). */
|
|
4
|
+
export declare const COMPANY_CHARACTER_IDS: readonly CompanyCharacterId[];
|
|
5
|
+
/** Billing tiers: the founding Player, permanent Players, and Stand-Ins
|
|
6
|
+
* (Limited Engagement — never selectable as the companion). */
|
|
7
|
+
export type CompanyBillingKind = 'foundingPlayer' | 'player' | 'standIn';
|
|
8
|
+
/** Demoable move intents — keyed by intent from day one so future event
|
|
9
|
+
* performances (page-grabs, standing ovations) land as content, not code. */
|
|
10
|
+
export type CompanyPerformanceIntent = 'bow' | 'hop' | 'wave';
|
|
11
|
+
/** The performance intents, in demo-button order. The app previously
|
|
12
|
+
* hand-mirrored this union in two places; consumers derive from this array. */
|
|
13
|
+
export declare const COMPANY_PERFORMANCE_INTENTS: readonly CompanyPerformanceIntent[];
|
|
14
|
+
/** The characters a user may cast as their dock companion (never a Stand-In). */
|
|
15
|
+
export type SelectableCompanionId = 'bill' | 'kit';
|
|
16
|
+
/** The castable dock companions, in order. */
|
|
17
|
+
export declare const SELECTABLE_COMPANION_IDS: readonly SelectableCompanionId[];
|
|
18
|
+
/** Semantic destinations the copy can link to. Each client maps these to its
|
|
19
|
+
* own route/navigation — the package never carries an href in mascot copy. */
|
|
20
|
+
export type CompanyNavigationTarget = 'greenRoom' | 'futurePlans';
|
|
21
|
+
/** A single run of copy. `link` carries a semantic target, not a URL. */
|
|
22
|
+
export type CompanyCopySegment = {
|
|
23
|
+
readonly kind: 'text';
|
|
24
|
+
readonly text: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly kind: 'emphasis';
|
|
27
|
+
readonly text: string;
|
|
28
|
+
} | {
|
|
29
|
+
readonly kind: 'link';
|
|
30
|
+
readonly label: string;
|
|
31
|
+
readonly target: CompanyNavigationTarget;
|
|
32
|
+
};
|
|
33
|
+
/** A block of copy — a paragraph or a set-aside aside. */
|
|
34
|
+
export type CompanyCopyBlockKind = 'paragraph' | 'aside';
|
|
35
|
+
export interface CompanyCopyBlock {
|
|
36
|
+
readonly kind: CompanyCopyBlockKind;
|
|
37
|
+
readonly segments: readonly CompanyCopySegment[];
|
|
38
|
+
}
|
|
39
|
+
export interface CompanyPerformance {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly label: string;
|
|
42
|
+
readonly intent: CompanyPerformanceIntent;
|
|
43
|
+
/** Community "Choreography by" credit — null until an audition stages it. */
|
|
44
|
+
readonly creditUid: string | null;
|
|
45
|
+
}
|
|
46
|
+
export interface CompanyMascot {
|
|
47
|
+
readonly id: CompanyCharacterId;
|
|
48
|
+
/** Full stage name shown on nameplates + the playbill ("Bill the Understudy"). */
|
|
49
|
+
readonly name: string;
|
|
50
|
+
/** The ironic-understatement epithet (the Company tradition). */
|
|
51
|
+
readonly title: string;
|
|
52
|
+
readonly billingKind: CompanyBillingKind;
|
|
53
|
+
/** Billing line rendered beside the name ("Founding Player"). */
|
|
54
|
+
readonly billingLabel: string;
|
|
55
|
+
/** One-line structural descriptor (not character voice). */
|
|
56
|
+
readonly shortBio: string;
|
|
57
|
+
/** Playbill character study (human-written; the future AI personality source). */
|
|
58
|
+
readonly characterStudy: readonly CompanyCopyBlock[];
|
|
59
|
+
/** "Role originated by" — resolves live via the app when set. */
|
|
60
|
+
readonly originatedByUid: string | null;
|
|
61
|
+
/** Text shown after "Role originated by — " when originatedByUid is null. */
|
|
62
|
+
readonly originatedByFallback: string;
|
|
63
|
+
/** Whether the origination frame invites the reader ("→ your name here?"). */
|
|
64
|
+
readonly invitesOrigination: boolean;
|
|
65
|
+
/** The performances credit caption under the demo buttons. */
|
|
66
|
+
readonly choreographyCaption: string;
|
|
67
|
+
readonly performances: readonly CompanyPerformance[];
|
|
68
|
+
/** Rotating click lines (dock companion bubble + on-stage line pop). Each
|
|
69
|
+
* line is a segment run — most are a single text segment. */
|
|
70
|
+
readonly lines: readonly (readonly CompanyCopySegment[])[];
|
|
71
|
+
/** Dock speech-bubble footer segments. The character's short name is a
|
|
72
|
+
* `greenRoom` link segment; the app renders it as a link when signed in and
|
|
73
|
+
* as plain text when signed out. "one day" always links to `futurePlans`.
|
|
74
|
+
* Absent for Stand-Ins (Yorick — never the dock companion). */
|
|
75
|
+
readonly footer?: readonly CompanyCopySegment[];
|
|
76
|
+
/** False for Stand-Ins (Yorick) — never storable as the dock companion. */
|
|
77
|
+
readonly selectable: boolean;
|
|
78
|
+
}
|
|
79
|
+
/** Companion-switch snark exchange, keyed (in COMPANION_SWITCH_EXCHANGES) by the
|
|
80
|
+
* character switched TO. Outgoing line first (the departing companion), then the
|
|
81
|
+
* incoming retort. Plain strings. */
|
|
82
|
+
export interface CompanionSwitchExchange {
|
|
83
|
+
readonly outgoing: {
|
|
84
|
+
readonly id: SelectableCompanionId;
|
|
85
|
+
readonly line: string;
|
|
86
|
+
};
|
|
87
|
+
readonly incoming: {
|
|
88
|
+
readonly id: SelectableCompanionId;
|
|
89
|
+
readonly line: string;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Onboarding cameo lines — Company members crashing the registration tour. */
|
|
93
|
+
export interface OnboardingCameos {
|
|
94
|
+
/** Kit crashes The Audition Stage step. */
|
|
95
|
+
readonly kitAuditionStage: string;
|
|
96
|
+
/** Yorick cameos on The Hall step. */
|
|
97
|
+
readonly yorickHall: string;
|
|
98
|
+
/** The send-off curtain call — all three bow. */
|
|
99
|
+
readonly curtainCall: Readonly<Record<CompanyCharacterId, string>>;
|
|
100
|
+
}
|
|
101
|
+
export declare const COMPANY_MASCOTS: Readonly<Record<CompanyCharacterId, CompanyMascot>>;
|
|
102
|
+
/** Registry order (Bill → Kit → Yorick), reused from the roster. */
|
|
103
|
+
export declare const COMPANY_MASCOT_ORDER: readonly CompanyCharacterId[];
|
|
104
|
+
/** True when `x` is a canonical Company character id. */
|
|
105
|
+
export declare function isCompanyCharacterId(x: unknown): x is CompanyCharacterId;
|
|
106
|
+
/** True when `id` may be cast as the dock companion — driven by the mascot
|
|
107
|
+
* data's `selectable` field (Yorick is false). */
|
|
108
|
+
export declare function isSelectableCompanion(id: CompanyCharacterId): id is SelectableCompanionId;
|
|
109
|
+
/** The mascot record for a character id. */
|
|
110
|
+
export declare function getCompanyMascot(id: CompanyCharacterId): CompanyMascot;
|
|
111
|
+
export declare const COMPANION_SWITCH_EXCHANGES: Readonly<Record<SelectableCompanionId, readonly CompanionSwitchExchange[]>>;
|
|
112
|
+
export declare const YORICK_BLOCK_LINES: Readonly<Record<SelectableCompanionId, readonly string[]>>;
|
|
113
|
+
export declare const SIGNED_OUT_DOCK_LINES: readonly string[];
|
|
114
|
+
export declare const ONBOARDING_CAMEOS: OnboardingCameos;
|
|
115
|
+
//# sourceMappingURL=company-mascots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company-mascots.d.ts","sourceRoot":"","sources":["../../src/constants/company-mascots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// THE COMPANY — canonical Green Room mascot contract + content (Rule 36).
|
|
3
|
+
//
|
|
4
|
+
// The ONE home for the pure, server-safe Company business truths (id unions,
|
|
5
|
+
// billing kinds, performance intents, selectability, roster order) AND the
|
|
6
|
+
// DJ-approved VERBATIM character content (studies, click lines, footers,
|
|
7
|
+
// companion-switch exchanges, Yorick block lines, signed-out dock lines,
|
|
8
|
+
// onboarding cameos). Moved here losslessly from the app's staging modules
|
|
9
|
+
// (`src/lib/company-contract` + `src/lib/company-mascots.tsx`).
|
|
10
|
+
//
|
|
11
|
+
// This module is pure data: NO React, NO JSX, NO Next links, NO CSS, NO SVG,
|
|
12
|
+
// NO functions inside the data. Rich copy is modelled as discriminated
|
|
13
|
+
// `CompanyCopySegment`s so a web renderer, a phone app, or an AI voice can each
|
|
14
|
+
// present the exact approved words without importing a UI framework. The app
|
|
15
|
+
// owns the puppets, rig, choreography, and the adapter that turns these
|
|
16
|
+
// segments into `<p>`, `<em>`, and route-aware links.
|
|
17
|
+
//
|
|
18
|
+
// Canonical dialogue stays a versioned code constant here (never Firestore):
|
|
19
|
+
// it is the personality source, the safe AI-unavailable fallback, and the
|
|
20
|
+
// voice-regression fixture. Never reword — curly quotes/apostrophes are
|
|
21
|
+
// authored exactly as they render.
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/** The roster, in billing order (Bill → Kit → Yorick). */
|
|
24
|
+
export const COMPANY_CHARACTER_IDS = ['bill', 'kit', 'yorick'];
|
|
25
|
+
/** The performance intents, in demo-button order. The app previously
|
|
26
|
+
* hand-mirrored this union in two places; consumers derive from this array. */
|
|
27
|
+
export const COMPANY_PERFORMANCE_INTENTS = ['bow', 'hop', 'wave'];
|
|
28
|
+
/** The castable dock companions, in order. */
|
|
29
|
+
export const SELECTABLE_COMPANION_IDS = ['bill', 'kit'];
|
|
30
|
+
// ── Segment construction helpers (module-private; output is pure data) ────────
|
|
31
|
+
/** A line/footer that is a single plain-text run. */
|
|
32
|
+
const textRun = (text) => [{ kind: 'text', text }];
|
|
33
|
+
/** A character's dock footer, built from the one verbatim sentence. The name is
|
|
34
|
+
* a `greenRoom` link segment (the app renders it plain when signed out); "one
|
|
35
|
+
* day" always links to `futurePlans`; `tail` is the character-specific close. */
|
|
36
|
+
const dockFooter = (name, tail) => [
|
|
37
|
+
{ kind: 'link', label: name, target: 'greenRoom' },
|
|
38
|
+
{ kind: 'text', text: ' is a basic version for now — ' },
|
|
39
|
+
{ kind: 'link', label: 'one day', target: 'futurePlans' },
|
|
40
|
+
{ kind: 'text', text: ` ${tail}` },
|
|
41
|
+
];
|
|
42
|
+
const SHARED_PERFORMANCES = [
|
|
43
|
+
{ id: 'bow', label: 'Bow', intent: 'bow', creditUid: null },
|
|
44
|
+
{ id: 'hop', label: 'Hop', intent: 'hop', creditUid: null },
|
|
45
|
+
{ id: 'wave', label: 'Wave', intent: 'wave', creditUid: null },
|
|
46
|
+
];
|
|
47
|
+
// The dock-footer close sentences, VERBATIM (the pre-Company Bill wording; Kit's
|
|
48
|
+
// from the settled spec). Curly apostrophes authored exactly as rendered.
|
|
49
|
+
const BILL_FOOTER_TAIL = 'we hope to make him an AI-powered guide who helps you navigate the site. He’ll never make content, just help.';
|
|
50
|
+
const KIT_FOOTER_TAIL = 'we hope to make him an AI-powered guide with this exact attitude. He’ll never make content. He does have opinions about yours.';
|
|
51
|
+
// ── Bill the Understudy — Founding Player ────────────────────────────────────
|
|
52
|
+
// The 14 approved lines are VERBATIM (incl. the italic emphasis in line 11).
|
|
53
|
+
const BILL = {
|
|
54
|
+
id: 'bill',
|
|
55
|
+
name: 'Bill the Understudy',
|
|
56
|
+
title: 'The Understudy',
|
|
57
|
+
billingKind: 'foundingPlayer',
|
|
58
|
+
billingLabel: 'Founding Player',
|
|
59
|
+
shortBio: "TTT's founding player and your first guide.",
|
|
60
|
+
characterStudy: [
|
|
61
|
+
{
|
|
62
|
+
kind: 'paragraph',
|
|
63
|
+
segments: textRun('The most enthusiastic understudy in show business, and TTT Productions’ founding player. Bill has read the whole script of this town — well, skimmed it — and rehearses every day for the role of your guide to everything here. He insists the ‘Bill’ is short for William, and that he once wrote plays in a town called Stratford. We have chosen to let him believe it. Someday he’ll answer anything you ask about this place. Today, he mostly waves.'),
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
originatedByUid: null,
|
|
67
|
+
originatedByFallback: 'To be determined',
|
|
68
|
+
invitesOrigination: true,
|
|
69
|
+
choreographyCaption: 'Choreography by — to be determined',
|
|
70
|
+
performances: SHARED_PERFORMANCES,
|
|
71
|
+
lines: [
|
|
72
|
+
textRun("One day I'll help you find your perfect collaborator. Today, I mostly wave."),
|
|
73
|
+
textRun("I'm just an understudy for now — but someday I'll know every corner of this town."),
|
|
74
|
+
textRun('Rehearsing my big role: your guide to everything TTT. No spoilers.'),
|
|
75
|
+
textRun("They say one day I'll have real personalities. Plural. I'm excited too."),
|
|
76
|
+
textRun("I'll never make the art — that's your job. I'll just help you find your people."),
|
|
77
|
+
textRun("Every great production starts with somebody standing in the wings. That's me. Literally."),
|
|
78
|
+
textRun("Someday you'll ask me anything about this place and I'll actually answer. Bold, I know."),
|
|
79
|
+
textRun('The Town Crier gets to shout. I get to practice my bow. For now.'),
|
|
80
|
+
textRun("I've read the whole script of this town. Well... skimmed. I'm working on it."),
|
|
81
|
+
textRun('Big dreams for a stick figure: guide, helper, friend. In that order.'),
|
|
82
|
+
[
|
|
83
|
+
{ kind: 'text', text: "When the curtain rises on my real role, you'll be the first to know. You " },
|
|
84
|
+
{ kind: 'emphasis', text: 'did' },
|
|
85
|
+
{ kind: 'text', text: ' click me first.' },
|
|
86
|
+
],
|
|
87
|
+
textRun('Until my big debut, consider me the most enthusiastic understudy in show business.'),
|
|
88
|
+
textRun("Even the greatest playwright who ever lived starts over as an understudy in a town this good. That's my story, anyway."),
|
|
89
|
+
textRun('Four hundred years of theatre experience. My résumé? A drawing of myself.'),
|
|
90
|
+
],
|
|
91
|
+
footer: dockFooter('Bill', BILL_FOOTER_TAIL),
|
|
92
|
+
selectable: true,
|
|
93
|
+
};
|
|
94
|
+
// ── Kit the Stand-In — permanent Player #2, Bill's rival ─────────────────────
|
|
95
|
+
const KIT = {
|
|
96
|
+
id: 'kit',
|
|
97
|
+
name: 'Kit the Stand-In',
|
|
98
|
+
title: 'The Stand-In',
|
|
99
|
+
billingKind: 'player',
|
|
100
|
+
billingLabel: 'Player',
|
|
101
|
+
shortBio: "Permanent Player #2, and Bill's rival.",
|
|
102
|
+
characterStudy: [
|
|
103
|
+
{
|
|
104
|
+
kind: 'paragraph',
|
|
105
|
+
segments: textRun('Sharp, quick, and absolutely certain he should have gone first. Kit auditioned for founding mascot, delivered the finest monologue the empty theatre had ever heard, and lost the part to a stick figure with a “trustworthy wave.” He has been gracious about it every single day since — loudly, to anyone in range. Keeps the rejection letter framed. Ask him about it. He’s dying for you to ask.'),
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
kind: 'aside',
|
|
109
|
+
segments: textRun('Loosely nodding to a certain rival playwright — brilliant, theatrical, gone too soon. One day, an AI-powered guide with this exact personality: genuinely helpful, faintly insulted by the request.'),
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
originatedByUid: null,
|
|
113
|
+
originatedByFallback: 'To be determined',
|
|
114
|
+
invitesOrigination: true,
|
|
115
|
+
choreographyCaption: 'Choreography by — to be determined',
|
|
116
|
+
performances: SHARED_PERFORMANCES,
|
|
117
|
+
lines: [
|
|
118
|
+
textRun("Yes, I'm the Stand-In. Permanently. The irony isn't lost on me — it lives with me now."),
|
|
119
|
+
textRun("I was FIRST in line at the founding audition. They went with a stick figure who 'waves well.'"),
|
|
120
|
+
textRun("Bill rehearses roles nobody wrote. I've already memorized them. We are not the same."),
|
|
121
|
+
textRun("One day this whole town will know my name. Today it's 'the other one.' Fine."),
|
|
122
|
+
textRun("I don't do warm-ups. I arrive brilliant."),
|
|
123
|
+
textRun('Founding mascot. FOUNDING. He waved at a login page and they gave him a title.'),
|
|
124
|
+
textRun('My five-year plan is center stage. My five-century plan is also center stage.'),
|
|
125
|
+
textRun('History remembers a playwright who died before his rival got famous. Anyway. No reason.'),
|
|
126
|
+
textRun('Click Bill for encouragement. Click me to hear the truth, beautifully delivered.'),
|
|
127
|
+
textRun('I keep my rejection letter framed. Motivation is motivation.'),
|
|
128
|
+
textRun("You clicked me first today. I rehearsed being gracious about this — give me a moment."),
|
|
129
|
+
textRun("When the curtain finally rises on my lead role, act surprised. I won't."),
|
|
130
|
+
textRun('They say I might have been a spy in a past life. I neither confirm nor deny. Mystique.'),
|
|
131
|
+
textRun('The Understudy and the Stand-In on one stage. Somewhere a playwright is laughing at us both.'),
|
|
132
|
+
],
|
|
133
|
+
footer: dockFooter('Kit', KIT_FOOTER_TAIL),
|
|
134
|
+
selectable: true,
|
|
135
|
+
};
|
|
136
|
+
// ── Yorick the Forgettable — Stand-In · Limited Engagement ───────────────────
|
|
137
|
+
// Never selectable, never the dock companion; his lines are on-stage only.
|
|
138
|
+
const YORICK = {
|
|
139
|
+
id: 'yorick',
|
|
140
|
+
name: 'Yorick the Forgettable',
|
|
141
|
+
title: 'The Forgettable',
|
|
142
|
+
billingKind: 'standIn',
|
|
143
|
+
billingLabel: 'Stand-In · Limited Engagement',
|
|
144
|
+
shortBio: 'A Limited Engagement Stand-In, keeping the light warm.',
|
|
145
|
+
characterStudy: [
|
|
146
|
+
{
|
|
147
|
+
kind: 'paragraph',
|
|
148
|
+
segments: textRun("A fellow of infinite jest, reduced to holding a light he isn't allowed to stand in. Yorick insists he was the funniest jester who ever lived — and unfortunately, everyone who could confirm it is unavailable for comment. He is keeping the stage warm until the role is properly cast, and he'd rather you didn't get attached. You'll forget him anyway. Everyone does. It's in the name."),
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
originatedByUid: null,
|
|
152
|
+
originatedByFallback: 'no one will admit to it',
|
|
153
|
+
invitesOrigination: false,
|
|
154
|
+
choreographyCaption: 'Bow · Hop · Wave — borrowed from Bill, who says he can have them',
|
|
155
|
+
performances: SHARED_PERFORMANCES,
|
|
156
|
+
lines: [
|
|
157
|
+
textRun("Oh! A visitor. Nobody visits the Wings. I'd know — I keep the guestbook. It's empty."),
|
|
158
|
+
textRun("I used to kill at court, you know. Standing ovations. Kings weeping. ...You'll take my word for it."),
|
|
159
|
+
textRun("Don't get attached. I'm told I'm temporary. The skull agrees."),
|
|
160
|
+
textRun('Alas, poor me. I knew me well.'),
|
|
161
|
+
textRun('Infinite jest, they said. INFINITE. And yet here I am, finite-ly employed.'),
|
|
162
|
+
textRun("One day they'll cast this role properly and I'll be forgotten. Ahead of schedule, honestly."),
|
|
163
|
+
],
|
|
164
|
+
selectable: false,
|
|
165
|
+
};
|
|
166
|
+
export const COMPANY_MASCOTS = {
|
|
167
|
+
bill: BILL,
|
|
168
|
+
kit: KIT,
|
|
169
|
+
yorick: YORICK,
|
|
170
|
+
};
|
|
171
|
+
/** Registry order (Bill → Kit → Yorick), reused from the roster. */
|
|
172
|
+
export const COMPANY_MASCOT_ORDER = COMPANY_CHARACTER_IDS;
|
|
173
|
+
// ── Pure helpers ─────────────────────────────────────────────────────────────
|
|
174
|
+
/** True when `x` is a canonical Company character id. */
|
|
175
|
+
export function isCompanyCharacterId(x) {
|
|
176
|
+
return typeof x === 'string' && COMPANY_CHARACTER_IDS.includes(x);
|
|
177
|
+
}
|
|
178
|
+
/** True when `id` may be cast as the dock companion — driven by the mascot
|
|
179
|
+
* data's `selectable` field (Yorick is false). */
|
|
180
|
+
export function isSelectableCompanion(id) {
|
|
181
|
+
return COMPANY_MASCOTS[id].selectable;
|
|
182
|
+
}
|
|
183
|
+
/** The mascot record for a character id. */
|
|
184
|
+
export function getCompanyMascot(id) {
|
|
185
|
+
return COMPANY_MASCOTS[id];
|
|
186
|
+
}
|
|
187
|
+
// ── Companion-switch snark exchanges (VERBATIM) ──────────────────────────────
|
|
188
|
+
// Keyed by the character being switched TO. Outgoing line first (the departing
|
|
189
|
+
// companion), then the incoming retort.
|
|
190
|
+
export const COMPANION_SWITCH_EXCHANGES = {
|
|
191
|
+
// Switching TO Kit — Bill exits, Kit enters.
|
|
192
|
+
kit: [
|
|
193
|
+
{
|
|
194
|
+
outgoing: { id: 'bill', line: "Kit?! ...No, it's fine. It's fine. I'll be in the wings. Rehearsing. Alone." },
|
|
195
|
+
incoming: { id: 'kit', line: 'Finally. Someone with taste.' },
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
outgoing: { id: 'bill', line: 'Take care of them, Kit. They click gently.' },
|
|
199
|
+
incoming: { id: 'kit', line: 'I know how to be adored, Bill.' },
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
outgoing: { id: 'bill', line: 'The understudy yields the stage. Again.' },
|
|
203
|
+
incoming: { id: 'kit', line: 'And yet history will say I earned it. Because I did.' },
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
outgoing: { id: 'bill', line: "You'll come back. They always— they usually come back." },
|
|
207
|
+
incoming: { id: 'kit', line: "Don't wait up." },
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
outgoing: { id: 'bill', line: 'Break a leg, Kit.' },
|
|
211
|
+
incoming: { id: 'kit', line: 'I never break anything but hearts and attendance records.' },
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
// Switching TO Bill — Kit exits, Bill enters.
|
|
215
|
+
bill: [
|
|
216
|
+
{
|
|
217
|
+
outgoing: { id: 'kit', line: 'Unbelievable. UNBELIEVABLE.' },
|
|
218
|
+
incoming: { id: 'bill', line: "It's good to be back! ...He'll be alright." },
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
outgoing: { id: 'kit', line: "Enjoy the waving. That's all he does, you know." },
|
|
222
|
+
incoming: { id: 'bill', line: "I also bow now! I've been practicing." },
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
outgoing: { id: 'kit', line: 'I was BRILLIANT and you choose the stick figure with the cap.' },
|
|
226
|
+
incoming: { id: 'bill', line: "He means 'welcome back.' We're working on it." },
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
outgoing: { id: 'kit', line: 'Fine. FINE. The wings have better lighting anyway.' },
|
|
230
|
+
incoming: { id: 'bill', line: "They really don't. I'd know." },
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
outgoing: { id: 'kit', line: 'This is the founding audition all over again.' },
|
|
234
|
+
incoming: { id: 'bill', line: "You'll get the next one, Kit. ...Probably not. But maybe!" },
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
// ── Yorick block lines (VERBATIM) ────────────────────────────────────────────
|
|
239
|
+
// Spoken by the ACTIVE companion when the user presses Yorick's cast button.
|
|
240
|
+
export const YORICK_BLOCK_LINES = {
|
|
241
|
+
bill: [
|
|
242
|
+
"Soft you now — he's a Stand-In! He's only keeping the light warm. Thou art stuck with me. Nay — blessed with me.",
|
|
243
|
+
"Yorick?! He doesn't even know his blocking. Literally. He asks me where to stand.",
|
|
244
|
+
"You can't cast Yorick — he's on a Limited Engagement. Very limited. He leaves when the real role is cast.",
|
|
245
|
+
'Alas, poor choice — I knew him better than you do. Pick a Player.',
|
|
246
|
+
],
|
|
247
|
+
kit: [
|
|
248
|
+
'The skeleton crew? No. Absolutely not. You have TWO trained professionals right here.',
|
|
249
|
+
"He doesn't even know his blocking. I've watched him bow into the curtain. Twice.",
|
|
250
|
+
"Yorick's not staying. Don't get attached to the help.",
|
|
251
|
+
"You'd pass over ME for the temp? ...I need to sit down. On the couch he's not allowed on.",
|
|
252
|
+
],
|
|
253
|
+
};
|
|
254
|
+
// ── Signed-out dock lines (VERBATIM) ─────────────────────────────────────────
|
|
255
|
+
// Spoken by whichever Player is on the dock when NO user is signed in — the
|
|
256
|
+
// pre-login pitch.
|
|
257
|
+
export const SIGNED_OUT_DOCK_LINES = [
|
|
258
|
+
"The show's inside — and it's free. No ads, just an email.",
|
|
259
|
+
"I'd introduce you to the whole Company, but you'll need a ticket. Tickets are free.",
|
|
260
|
+
'Everything in this town is made by real people. Come see.',
|
|
261
|
+
];
|
|
262
|
+
// ── Onboarding cameo lines (VERBATIM) ────────────────────────────────────────
|
|
263
|
+
export const ONBOARDING_CAMEOS = {
|
|
264
|
+
kitAuditionStage: "The Audition Stage. Where stars are born. I was robbed here once — anyway, you'll love it.",
|
|
265
|
+
yorickHall: 'The Hall — every tale, tune, and show the town keeps. Four hundred years of my material, and not one shelf. Enjoy.',
|
|
266
|
+
curtainCall: {
|
|
267
|
+
bill: 'Break a leg out there.',
|
|
268
|
+
kit: 'Try not to embarrass us.',
|
|
269
|
+
yorick: "You'll forget me. It's fine. Go.",
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=company-mascots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company-mascots.js","sourceRoot":"","sources":["../../src/constants/company-mascots.ts"],"names":[],"mappings":"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","sourcesContent":["// ============================================================================\n// THE COMPANY — canonical Green Room mascot contract + content (Rule 36).\n//\n// The ONE home for the pure, server-safe Company business truths (id unions,\n// billing kinds, performance intents, selectability, roster order) AND the\n// DJ-approved VERBATIM character content (studies, click lines, footers,\n// companion-switch exchanges, Yorick block lines, signed-out dock lines,\n// onboarding cameos). Moved here losslessly from the app's staging modules\n// (`src/lib/company-contract` + `src/lib/company-mascots.tsx`).\n//\n// This module is pure data: NO React, NO JSX, NO Next links, NO CSS, NO SVG,\n// NO functions inside the data. Rich copy is modelled as discriminated\n// `CompanyCopySegment`s so a web renderer, a phone app, or an AI voice can each\n// present the exact approved words without importing a UI framework. The app\n// owns the puppets, rig, choreography, and the adapter that turns these\n// segments into `<p>`, `<em>`, and route-aware links.\n//\n// Canonical dialogue stays a versioned code constant here (never Firestore):\n// it is the personality source, the safe AI-unavailable fallback, and the\n// voice-regression fixture. Never reword — curly quotes/apostrophes are\n// authored exactly as they render.\n// ============================================================================\n\n// ── Contract: id unions, billing, intents, selectability ─────────────────────\n\n/** Every member of the Company, in roster order. */\nexport type CompanyCharacterId = 'bill' | 'kit' | 'yorick';\n\n/** The roster, in billing order (Bill → Kit → Yorick). */\nexport const COMPANY_CHARACTER_IDS: readonly CompanyCharacterId[] = ['bill', 'kit', 'yorick'];\n\n/** Billing tiers: the founding Player, permanent Players, and Stand-Ins\n * (Limited Engagement — never selectable as the companion). */\nexport type CompanyBillingKind = 'foundingPlayer' | 'player' | 'standIn';\n\n/** Demoable move intents — keyed by intent from day one so future event\n * performances (page-grabs, standing ovations) land as content, not code. */\nexport type CompanyPerformanceIntent = 'bow' | 'hop' | 'wave';\n\n/** The performance intents, in demo-button order. The app previously\n * hand-mirrored this union in two places; consumers derive from this array. */\nexport const COMPANY_PERFORMANCE_INTENTS: readonly CompanyPerformanceIntent[] = ['bow', 'hop', 'wave'];\n\n/** The characters a user may cast as their dock companion (never a Stand-In). */\nexport type SelectableCompanionId = 'bill' | 'kit';\n\n/** The castable dock companions, in order. */\nexport const SELECTABLE_COMPANION_IDS: readonly SelectableCompanionId[] = ['bill', 'kit'];\n\n// ── Rich-copy pure-data model ────────────────────────────────────────────────\n\n/** Semantic destinations the copy can link to. Each client maps these to its\n * own route/navigation — the package never carries an href in mascot copy. */\nexport type CompanyNavigationTarget = 'greenRoom' | 'futurePlans';\n\n/** A single run of copy. `link` carries a semantic target, not a URL. */\nexport type CompanyCopySegment =\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'emphasis'; readonly text: string }\n | { readonly kind: 'link'; readonly label: string; readonly target: CompanyNavigationTarget };\n\n/** A block of copy — a paragraph or a set-aside aside. */\nexport type CompanyCopyBlockKind = 'paragraph' | 'aside';\n\nexport interface CompanyCopyBlock {\n readonly kind: CompanyCopyBlockKind;\n readonly segments: readonly CompanyCopySegment[];\n}\n\n// ── Registry shapes ──────────────────────────────────────────────────────────\n\nexport interface CompanyPerformance {\n readonly id: string;\n readonly label: string;\n readonly intent: CompanyPerformanceIntent;\n /** Community \"Choreography by\" credit — null until an audition stages it. */\n readonly creditUid: string | null;\n}\n\nexport interface CompanyMascot {\n readonly id: CompanyCharacterId;\n /** Full stage name shown on nameplates + the playbill (\"Bill the Understudy\"). */\n readonly name: string;\n /** The ironic-understatement epithet (the Company tradition). */\n readonly title: string;\n readonly billingKind: CompanyBillingKind;\n /** Billing line rendered beside the name (\"Founding Player\"). */\n readonly billingLabel: string;\n /** One-line structural descriptor (not character voice). */\n readonly shortBio: string;\n /** Playbill character study (human-written; the future AI personality source). */\n readonly characterStudy: readonly CompanyCopyBlock[];\n /** \"Role originated by\" — resolves live via the app when set. */\n readonly originatedByUid: string | null;\n /** Text shown after \"Role originated by — \" when originatedByUid is null. */\n readonly originatedByFallback: string;\n /** Whether the origination frame invites the reader (\"→ your name here?\"). */\n readonly invitesOrigination: boolean;\n /** The performances credit caption under the demo buttons. */\n readonly choreographyCaption: string;\n readonly performances: readonly CompanyPerformance[];\n /** Rotating click lines (dock companion bubble + on-stage line pop). Each\n * line is a segment run — most are a single text segment. */\n readonly lines: readonly (readonly CompanyCopySegment[])[];\n /** Dock speech-bubble footer segments. The character's short name is a\n * `greenRoom` link segment; the app renders it as a link when signed in and\n * as plain text when signed out. \"one day\" always links to `futurePlans`.\n * Absent for Stand-Ins (Yorick — never the dock companion). */\n readonly footer?: readonly CompanyCopySegment[];\n /** False for Stand-Ins (Yorick) — never storable as the dock companion. */\n readonly selectable: boolean;\n}\n\n/** Companion-switch snark exchange, keyed (in COMPANION_SWITCH_EXCHANGES) by the\n * character switched TO. Outgoing line first (the departing companion), then the\n * incoming retort. Plain strings. */\nexport interface CompanionSwitchExchange {\n readonly outgoing: { readonly id: SelectableCompanionId; readonly line: string };\n readonly incoming: { readonly id: SelectableCompanionId; readonly line: string };\n}\n\n/** Onboarding cameo lines — Company members crashing the registration tour. */\nexport interface OnboardingCameos {\n /** Kit crashes The Audition Stage step. */\n readonly kitAuditionStage: string;\n /** Yorick cameos on The Hall step. */\n readonly yorickHall: string;\n /** The send-off curtain call — all three bow. */\n readonly curtainCall: Readonly<Record<CompanyCharacterId, string>>;\n}\n\n// ── Segment construction helpers (module-private; output is pure data) ────────\n\n/** A line/footer that is a single plain-text run. */\nconst textRun = (text: string): readonly CompanyCopySegment[] => [{ kind: 'text', text }];\n\n/** A character's dock footer, built from the one verbatim sentence. The name is\n * a `greenRoom` link segment (the app renders it plain when signed out); \"one\n * day\" always links to `futurePlans`; `tail` is the character-specific close. */\nconst dockFooter = (name: string, tail: string): readonly CompanyCopySegment[] => [\n { kind: 'link', label: name, target: 'greenRoom' },\n { kind: 'text', text: ' is a basic version for now — ' },\n { kind: 'link', label: 'one day', target: 'futurePlans' },\n { kind: 'text', text: ` ${tail}` },\n];\n\nconst SHARED_PERFORMANCES: readonly CompanyPerformance[] = [\n { id: 'bow', label: 'Bow', intent: 'bow', creditUid: null },\n { id: 'hop', label: 'Hop', intent: 'hop', creditUid: null },\n { id: 'wave', label: 'Wave', intent: 'wave', creditUid: null },\n];\n\n// The dock-footer close sentences, VERBATIM (the pre-Company Bill wording; Kit's\n// from the settled spec). Curly apostrophes authored exactly as rendered.\nconst BILL_FOOTER_TAIL =\n 'we hope to make him an AI-powered guide who helps you navigate the site. He’ll never make content, just help.';\nconst KIT_FOOTER_TAIL =\n 'we hope to make him an AI-powered guide with this exact attitude. He’ll never make content. He does have opinions about yours.';\n\n// ── Bill the Understudy — Founding Player ────────────────────────────────────\n// The 14 approved lines are VERBATIM (incl. the italic emphasis in line 11).\nconst BILL: CompanyMascot = {\n id: 'bill',\n name: 'Bill the Understudy',\n title: 'The Understudy',\n billingKind: 'foundingPlayer',\n billingLabel: 'Founding Player',\n shortBio: \"TTT's founding player and your first guide.\",\n characterStudy: [\n {\n kind: 'paragraph',\n segments: textRun(\n 'The most enthusiastic understudy in show business, and TTT Productions’ founding player. Bill has read the whole script of this town — well, skimmed it — and rehearses every day for the role of your guide to everything here. He insists the ‘Bill’ is short for William, and that he once wrote plays in a town called Stratford. We have chosen to let him believe it. Someday he’ll answer anything you ask about this place. Today, he mostly waves.',\n ),\n },\n ],\n originatedByUid: null,\n originatedByFallback: 'To be determined',\n invitesOrigination: true,\n choreographyCaption: 'Choreography by — to be determined',\n performances: SHARED_PERFORMANCES,\n lines: [\n textRun(\"One day I'll help you find your perfect collaborator. Today, I mostly wave.\"),\n textRun(\"I'm just an understudy for now — but someday I'll know every corner of this town.\"),\n textRun('Rehearsing my big role: your guide to everything TTT. No spoilers.'),\n textRun(\"They say one day I'll have real personalities. Plural. I'm excited too.\"),\n textRun(\"I'll never make the art — that's your job. I'll just help you find your people.\"),\n textRun(\"Every great production starts with somebody standing in the wings. That's me. Literally.\"),\n textRun(\"Someday you'll ask me anything about this place and I'll actually answer. Bold, I know.\"),\n textRun('The Town Crier gets to shout. I get to practice my bow. For now.'),\n textRun(\"I've read the whole script of this town. Well... skimmed. I'm working on it.\"),\n textRun('Big dreams for a stick figure: guide, helper, friend. In that order.'),\n [\n { kind: 'text', text: \"When the curtain rises on my real role, you'll be the first to know. You \" },\n { kind: 'emphasis', text: 'did' },\n { kind: 'text', text: ' click me first.' },\n ],\n textRun('Until my big debut, consider me the most enthusiastic understudy in show business.'),\n textRun(\"Even the greatest playwright who ever lived starts over as an understudy in a town this good. That's my story, anyway.\"),\n textRun('Four hundred years of theatre experience. My résumé? A drawing of myself.'),\n ],\n footer: dockFooter('Bill', BILL_FOOTER_TAIL),\n selectable: true,\n};\n\n// ── Kit the Stand-In — permanent Player #2, Bill's rival ─────────────────────\nconst KIT: CompanyMascot = {\n id: 'kit',\n name: 'Kit the Stand-In',\n title: 'The Stand-In',\n billingKind: 'player',\n billingLabel: 'Player',\n shortBio: \"Permanent Player #2, and Bill's rival.\",\n characterStudy: [\n {\n kind: 'paragraph',\n segments: textRun(\n 'Sharp, quick, and absolutely certain he should have gone first. Kit auditioned for founding mascot, delivered the finest monologue the empty theatre had ever heard, and lost the part to a stick figure with a “trustworthy wave.” He has been gracious about it every single day since — loudly, to anyone in range. Keeps the rejection letter framed. Ask him about it. He’s dying for you to ask.',\n ),\n },\n {\n kind: 'aside',\n segments: textRun(\n 'Loosely nodding to a certain rival playwright — brilliant, theatrical, gone too soon. One day, an AI-powered guide with this exact personality: genuinely helpful, faintly insulted by the request.',\n ),\n },\n ],\n originatedByUid: null,\n originatedByFallback: 'To be determined',\n invitesOrigination: true,\n choreographyCaption: 'Choreography by — to be determined',\n performances: SHARED_PERFORMANCES,\n lines: [\n textRun(\"Yes, I'm the Stand-In. Permanently. The irony isn't lost on me — it lives with me now.\"),\n textRun(\"I was FIRST in line at the founding audition. They went with a stick figure who 'waves well.'\"),\n textRun(\"Bill rehearses roles nobody wrote. I've already memorized them. We are not the same.\"),\n textRun(\"One day this whole town will know my name. Today it's 'the other one.' Fine.\"),\n textRun(\"I don't do warm-ups. I arrive brilliant.\"),\n textRun('Founding mascot. FOUNDING. He waved at a login page and they gave him a title.'),\n textRun('My five-year plan is center stage. My five-century plan is also center stage.'),\n textRun('History remembers a playwright who died before his rival got famous. Anyway. No reason.'),\n textRun('Click Bill for encouragement. Click me to hear the truth, beautifully delivered.'),\n textRun('I keep my rejection letter framed. Motivation is motivation.'),\n textRun(\"You clicked me first today. I rehearsed being gracious about this — give me a moment.\"),\n textRun(\"When the curtain finally rises on my lead role, act surprised. I won't.\"),\n textRun('They say I might have been a spy in a past life. I neither confirm nor deny. Mystique.'),\n textRun('The Understudy and the Stand-In on one stage. Somewhere a playwright is laughing at us both.'),\n ],\n footer: dockFooter('Kit', KIT_FOOTER_TAIL),\n selectable: true,\n};\n\n// ── Yorick the Forgettable — Stand-In · Limited Engagement ───────────────────\n// Never selectable, never the dock companion; his lines are on-stage only.\nconst YORICK: CompanyMascot = {\n id: 'yorick',\n name: 'Yorick the Forgettable',\n title: 'The Forgettable',\n billingKind: 'standIn',\n billingLabel: 'Stand-In · Limited Engagement',\n shortBio: 'A Limited Engagement Stand-In, keeping the light warm.',\n characterStudy: [\n {\n kind: 'paragraph',\n segments: textRun(\n \"A fellow of infinite jest, reduced to holding a light he isn't allowed to stand in. Yorick insists he was the funniest jester who ever lived — and unfortunately, everyone who could confirm it is unavailable for comment. He is keeping the stage warm until the role is properly cast, and he'd rather you didn't get attached. You'll forget him anyway. Everyone does. It's in the name.\",\n ),\n },\n ],\n originatedByUid: null,\n originatedByFallback: 'no one will admit to it',\n invitesOrigination: false,\n choreographyCaption: 'Bow · Hop · Wave — borrowed from Bill, who says he can have them',\n performances: SHARED_PERFORMANCES,\n lines: [\n textRun(\"Oh! A visitor. Nobody visits the Wings. I'd know — I keep the guestbook. It's empty.\"),\n textRun(\"I used to kill at court, you know. Standing ovations. Kings weeping. ...You'll take my word for it.\"),\n textRun(\"Don't get attached. I'm told I'm temporary. The skull agrees.\"),\n textRun('Alas, poor me. I knew me well.'),\n textRun('Infinite jest, they said. INFINITE. And yet here I am, finite-ly employed.'),\n textRun(\"One day they'll cast this role properly and I'll be forgotten. Ahead of schedule, honestly.\"),\n ],\n selectable: false,\n};\n\nexport const COMPANY_MASCOTS: Readonly<Record<CompanyCharacterId, CompanyMascot>> = {\n bill: BILL,\n kit: KIT,\n yorick: YORICK,\n};\n\n/** Registry order (Bill → Kit → Yorick), reused from the roster. */\nexport const COMPANY_MASCOT_ORDER: readonly CompanyCharacterId[] = COMPANY_CHARACTER_IDS;\n\n// ── Pure helpers ─────────────────────────────────────────────────────────────\n\n/** True when `x` is a canonical Company character id. */\nexport function isCompanyCharacterId(x: unknown): x is CompanyCharacterId {\n return typeof x === 'string' && (COMPANY_CHARACTER_IDS as readonly string[]).includes(x);\n}\n\n/** True when `id` may be cast as the dock companion — driven by the mascot\n * data's `selectable` field (Yorick is false). */\nexport function isSelectableCompanion(id: CompanyCharacterId): id is SelectableCompanionId {\n return COMPANY_MASCOTS[id].selectable;\n}\n\n/** The mascot record for a character id. */\nexport function getCompanyMascot(id: CompanyCharacterId): CompanyMascot {\n return COMPANY_MASCOTS[id];\n}\n\n// ── Companion-switch snark exchanges (VERBATIM) ──────────────────────────────\n// Keyed by the character being switched TO. Outgoing line first (the departing\n// companion), then the incoming retort.\nexport const COMPANION_SWITCH_EXCHANGES: Readonly<\n Record<SelectableCompanionId, readonly CompanionSwitchExchange[]>\n> = {\n // Switching TO Kit — Bill exits, Kit enters.\n kit: [\n {\n outgoing: { id: 'bill', line: \"Kit?! ...No, it's fine. It's fine. I'll be in the wings. Rehearsing. Alone.\" },\n incoming: { id: 'kit', line: 'Finally. Someone with taste.' },\n },\n {\n outgoing: { id: 'bill', line: 'Take care of them, Kit. They click gently.' },\n incoming: { id: 'kit', line: 'I know how to be adored, Bill.' },\n },\n {\n outgoing: { id: 'bill', line: 'The understudy yields the stage. Again.' },\n incoming: { id: 'kit', line: 'And yet history will say I earned it. Because I did.' },\n },\n {\n outgoing: { id: 'bill', line: \"You'll come back. They always— they usually come back.\" },\n incoming: { id: 'kit', line: \"Don't wait up.\" },\n },\n {\n outgoing: { id: 'bill', line: 'Break a leg, Kit.' },\n incoming: { id: 'kit', line: 'I never break anything but hearts and attendance records.' },\n },\n ],\n // Switching TO Bill — Kit exits, Bill enters.\n bill: [\n {\n outgoing: { id: 'kit', line: 'Unbelievable. UNBELIEVABLE.' },\n incoming: { id: 'bill', line: \"It's good to be back! ...He'll be alright.\" },\n },\n {\n outgoing: { id: 'kit', line: \"Enjoy the waving. That's all he does, you know.\" },\n incoming: { id: 'bill', line: \"I also bow now! I've been practicing.\" },\n },\n {\n outgoing: { id: 'kit', line: 'I was BRILLIANT and you choose the stick figure with the cap.' },\n incoming: { id: 'bill', line: \"He means 'welcome back.' We're working on it.\" },\n },\n {\n outgoing: { id: 'kit', line: 'Fine. FINE. The wings have better lighting anyway.' },\n incoming: { id: 'bill', line: \"They really don't. I'd know.\" },\n },\n {\n outgoing: { id: 'kit', line: 'This is the founding audition all over again.' },\n incoming: { id: 'bill', line: \"You'll get the next one, Kit. ...Probably not. But maybe!\" },\n },\n ],\n};\n\n// ── Yorick block lines (VERBATIM) ────────────────────────────────────────────\n// Spoken by the ACTIVE companion when the user presses Yorick's cast button.\nexport const YORICK_BLOCK_LINES: Readonly<Record<SelectableCompanionId, readonly string[]>> = {\n bill: [\n \"Soft you now — he's a Stand-In! He's only keeping the light warm. Thou art stuck with me. Nay — blessed with me.\",\n \"Yorick?! He doesn't even know his blocking. Literally. He asks me where to stand.\",\n \"You can't cast Yorick — he's on a Limited Engagement. Very limited. He leaves when the real role is cast.\",\n 'Alas, poor choice — I knew him better than you do. Pick a Player.',\n ],\n kit: [\n 'The skeleton crew? No. Absolutely not. You have TWO trained professionals right here.',\n \"He doesn't even know his blocking. I've watched him bow into the curtain. Twice.\",\n \"Yorick's not staying. Don't get attached to the help.\",\n \"You'd pass over ME for the temp? ...I need to sit down. On the couch he's not allowed on.\",\n ],\n};\n\n// ── Signed-out dock lines (VERBATIM) ─────────────────────────────────────────\n// Spoken by whichever Player is on the dock when NO user is signed in — the\n// pre-login pitch.\nexport const SIGNED_OUT_DOCK_LINES: readonly string[] = [\n \"The show's inside — and it's free. No ads, just an email.\",\n \"I'd introduce you to the whole Company, but you'll need a ticket. Tickets are free.\",\n 'Everything in this town is made by real people. Come see.',\n];\n\n// ── Onboarding cameo lines (VERBATIM) ────────────────────────────────────────\nexport const ONBOARDING_CAMEOS: OnboardingCameos = {\n kitAuditionStage:\n \"The Audition Stage. Where stars are born. I was robbed here once — anyway, you'll love it.\",\n yorickHall:\n 'The Hall — every tale, tune, and show the town keeps. Four hundred years of my material, and not one shelf. Enjoy.',\n curtainCall: {\n bill: 'Break a leg out there.',\n kit: 'Try not to embarrass us.',\n yorick: \"You'll forget me. It's fine. Go.\",\n },\n};\n"]}
|
|
@@ -13,4 +13,6 @@ export * from './release-flags.js';
|
|
|
13
13
|
export * from './retention.js';
|
|
14
14
|
export * from './scheduled-jobs.js';
|
|
15
15
|
export * from './storage-keys.js';
|
|
16
|
+
export * from './company-mascots.js';
|
|
17
|
+
export * from './center-stage-rooms.js';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC"}
|
package/dist/constants/index.js
CHANGED
|
@@ -13,4 +13,6 @@ export * from './release-flags.js';
|
|
|
13
13
|
export * from './retention.js';
|
|
14
14
|
export * from './scheduled-jobs.js';
|
|
15
15
|
export * from './storage-keys.js';
|
|
16
|
+
export * from './company-mascots.js';
|
|
17
|
+
export * from './center-stage-rooms.js';
|
|
16
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from './app-mode.js';\nexport * from './business.js';\nexport * from './chat.js';\nexport * from './moderation.js';\nexport * from './options.js';\nexport * from './admin-labels.js';\nexport * from './craft-skill-statements.js';\nexport * from './publish-attestations.js';\nexport * from './safety-confirmation-phrases.js';\nexport * from './safety-telemetry-patterns.js';\nexport * from './pagination.js';\nexport * from './release-flags.js';\nexport * from './retention.js';\nexport * from './scheduled-jobs.js';\nexport * from './storage-keys.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC","sourcesContent":["export * from './app-mode.js';\nexport * from './business.js';\nexport * from './chat.js';\nexport * from './moderation.js';\nexport * from './options.js';\nexport * from './admin-labels.js';\nexport * from './craft-skill-statements.js';\nexport * from './publish-attestations.js';\nexport * from './safety-confirmation-phrases.js';\nexport * from './safety-telemetry-patterns.js';\nexport * from './pagination.js';\nexport * from './release-flags.js';\nexport * from './retention.js';\nexport * from './scheduled-jobs.js';\nexport * from './storage-keys.js';\nexport * from './company-mascots.js';\nexport * from './center-stage-rooms.js';\n"]}
|
|
@@ -4,4 +4,19 @@ export declare const REDIRECT_PATH_KEY = "redirectPath";
|
|
|
4
4
|
export declare const LS_VERSION_KEY = "ttt-app-version";
|
|
5
5
|
/** sessionStorage key marking that a version-mismatch reload was already attempted. */
|
|
6
6
|
export declare const SS_RELOAD_ATTEMPTED_KEY = "ttt-version-reload-attempted";
|
|
7
|
+
/** localStorage key holding the user's chosen dock companion id ('bill' | 'kit'). */
|
|
8
|
+
export declare const COMPANION_STORAGE_KEY = "ttt-company-companion";
|
|
9
|
+
/** localStorage key: 'true' when the user has hidden the dock companion entirely. */
|
|
10
|
+
export declare const MASCOT_HIDDEN_STORAGE_KEY = "ttt-bill-hidden";
|
|
11
|
+
/** localStorage key holding the last-shown dock-bubble line index (avoids an
|
|
12
|
+
* immediate repeat across visits). */
|
|
13
|
+
export declare const MASCOT_LINE_INDEX_STORAGE_KEY = "ttt-bill-line-index";
|
|
14
|
+
/** Same-tab window event dispatched when MASCOT_HIDDEN_STORAGE_KEY changes
|
|
15
|
+
* (localStorage 'storage' events do not fire in the writing tab). */
|
|
16
|
+
export declare const MASCOT_HIDDEN_CHANGE_EVENT = "ttt-bill-pref-change";
|
|
17
|
+
/** Same-tab window event dispatched when COMPANION_STORAGE_KEY changes. */
|
|
18
|
+
export declare const COMPANION_CHANGE_EVENT = "ttt-company-companion-change";
|
|
19
|
+
/** Same-tab window event dispatched when the transient dock-puppet pose changes
|
|
20
|
+
* (in-memory store; never persisted). */
|
|
21
|
+
export declare const MASCOT_POSE_CHANGE_EVENT = "ttt-bill-pose-change";
|
|
7
22
|
//# sourceMappingURL=storage-keys.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-keys.d.ts","sourceRoot":"","sources":["../../src/constants/storage-keys.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,2FAA2F;AAC3F,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAEhD,uFAAuF;AACvF,eAAO,MAAM,uBAAuB,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage-keys.d.ts","sourceRoot":"","sources":["../../src/constants/storage-keys.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,2FAA2F;AAC3F,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAEhD,uFAAuF;AACvF,eAAO,MAAM,uBAAuB,iCAAiC,CAAC;AAMtE,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AAE3D;uCACuC;AACvC,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;AAEnE;sEACsE;AACtE,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AAEjE,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE;0CAC0C;AAC1C,eAAO,MAAM,wBAAwB,yBAAyB,CAAC"}
|
|
@@ -5,4 +5,22 @@ export const REDIRECT_PATH_KEY = 'redirectPath';
|
|
|
5
5
|
export const LS_VERSION_KEY = 'ttt-app-version';
|
|
6
6
|
/** sessionStorage key marking that a version-mismatch reload was already attempted. */
|
|
7
7
|
export const SS_RELOAD_ATTEMPTED_KEY = 'ttt-version-reload-attempted';
|
|
8
|
+
// --- Company / Green Room dock companion (device-local v1 stores) ---
|
|
9
|
+
// Values are byte-stable for backward compatibility — the historical 'bill'
|
|
10
|
+
// naming predates the Company rename and MUST NOT change.
|
|
11
|
+
/** localStorage key holding the user's chosen dock companion id ('bill' | 'kit'). */
|
|
12
|
+
export const COMPANION_STORAGE_KEY = 'ttt-company-companion';
|
|
13
|
+
/** localStorage key: 'true' when the user has hidden the dock companion entirely. */
|
|
14
|
+
export const MASCOT_HIDDEN_STORAGE_KEY = 'ttt-bill-hidden';
|
|
15
|
+
/** localStorage key holding the last-shown dock-bubble line index (avoids an
|
|
16
|
+
* immediate repeat across visits). */
|
|
17
|
+
export const MASCOT_LINE_INDEX_STORAGE_KEY = 'ttt-bill-line-index';
|
|
18
|
+
/** Same-tab window event dispatched when MASCOT_HIDDEN_STORAGE_KEY changes
|
|
19
|
+
* (localStorage 'storage' events do not fire in the writing tab). */
|
|
20
|
+
export const MASCOT_HIDDEN_CHANGE_EVENT = 'ttt-bill-pref-change';
|
|
21
|
+
/** Same-tab window event dispatched when COMPANION_STORAGE_KEY changes. */
|
|
22
|
+
export const COMPANION_CHANGE_EVENT = 'ttt-company-companion-change';
|
|
23
|
+
/** Same-tab window event dispatched when the transient dock-puppet pose changes
|
|
24
|
+
* (in-memory store; never persisted). */
|
|
25
|
+
export const MASCOT_POSE_CHANGE_EVENT = 'ttt-bill-pose-change';
|
|
8
26
|
//# sourceMappingURL=storage-keys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-keys.js","sourceRoot":"","sources":["../../src/constants/storage-keys.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,2FAA2F;AAC3F,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEhD,uFAAuF;AACvF,MAAM,CAAC,MAAM,uBAAuB,GAAG,8BAA8B,CAAC","sourcesContent":["// Well-known keys used in browser sessionStorage / localStorage.\n\n/** sessionStorage key holding the path the user wanted before being redirected to login. */\nexport const REDIRECT_PATH_KEY = 'redirectPath';\n\n/** localStorage key holding the last-seen app version (used by version-gate component). */\nexport const LS_VERSION_KEY = 'ttt-app-version';\n\n/** sessionStorage key marking that a version-mismatch reload was already attempted. */\nexport const SS_RELOAD_ATTEMPTED_KEY = 'ttt-version-reload-attempted';\n"]}
|
|
1
|
+
{"version":3,"file":"storage-keys.js","sourceRoot":"","sources":["../../src/constants/storage-keys.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,2FAA2F;AAC3F,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEhD,uFAAuF;AACvF,MAAM,CAAC,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAEtE,uEAAuE;AACvE,4EAA4E;AAC5E,0DAA0D;AAE1D,qFAAqF;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAE7D,qFAAqF;AACrF,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAE3D;uCACuC;AACvC,MAAM,CAAC,MAAM,6BAA6B,GAAG,qBAAqB,CAAC;AAEnE;sEACsE;AACtE,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AAEjE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAErE;0CAC0C;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC","sourcesContent":["// Well-known keys used in browser sessionStorage / localStorage.\n\n/** sessionStorage key holding the path the user wanted before being redirected to login. */\nexport const REDIRECT_PATH_KEY = 'redirectPath';\n\n/** localStorage key holding the last-seen app version (used by version-gate component). */\nexport const LS_VERSION_KEY = 'ttt-app-version';\n\n/** sessionStorage key marking that a version-mismatch reload was already attempted. */\nexport const SS_RELOAD_ATTEMPTED_KEY = 'ttt-version-reload-attempted';\n\n// --- Company / Green Room dock companion (device-local v1 stores) ---\n// Values are byte-stable for backward compatibility — the historical 'bill'\n// naming predates the Company rename and MUST NOT change.\n\n/** localStorage key holding the user's chosen dock companion id ('bill' | 'kit'). */\nexport const COMPANION_STORAGE_KEY = 'ttt-company-companion';\n\n/** localStorage key: 'true' when the user has hidden the dock companion entirely. */\nexport const MASCOT_HIDDEN_STORAGE_KEY = 'ttt-bill-hidden';\n\n/** localStorage key holding the last-shown dock-bubble line index (avoids an\n * immediate repeat across visits). */\nexport const MASCOT_LINE_INDEX_STORAGE_KEY = 'ttt-bill-line-index';\n\n/** Same-tab window event dispatched when MASCOT_HIDDEN_STORAGE_KEY changes\n * (localStorage 'storage' events do not fire in the writing tab). */\nexport const MASCOT_HIDDEN_CHANGE_EVENT = 'ttt-bill-pref-change';\n\n/** Same-tab window event dispatched when COMPANION_STORAGE_KEY changes. */\nexport const COMPANION_CHANGE_EVENT = 'ttt-company-companion-change';\n\n/** Same-tab window event dispatched when the transient dock-puppet pose changes\n * (in-memory store; never persisted). */\nexport const MASCOT_POSE_CHANGE_EVENT = 'ttt-bill-pose-change';\n"]}
|
package/dist/schemas/admin.d.ts
CHANGED
|
@@ -161,6 +161,69 @@ export declare const GetReportedContentDetailInputSchema: z.ZodObject<{
|
|
|
161
161
|
reportGroupId: z.ZodString;
|
|
162
162
|
}, z.core.$strict>;
|
|
163
163
|
export type GetReportedContentDetailInput = z.infer<typeof GetReportedContentDetailInputSchema>;
|
|
164
|
+
/** One display-text field of the reported doc, labeled for the review panel. The server returns
|
|
165
|
+
* EVERY configured non-empty text field for the item type (title, description, body, …) in
|
|
166
|
+
* display order — never just the first non-empty one. */
|
|
167
|
+
export declare const ReportedTextFieldSchema: z.ZodObject<{
|
|
168
|
+
field: z.ZodString;
|
|
169
|
+
label: z.ZodString;
|
|
170
|
+
value: z.ZodString;
|
|
171
|
+
}, z.core.$strip>;
|
|
172
|
+
export type ReportedTextField = z.infer<typeof ReportedTextFieldSchema>;
|
|
173
|
+
/** One media asset referenced by the reported content: id + kind + current serving state
|
|
174
|
+
* (for click-to-reveal) + the server-derived variant key the reveal must request. */
|
|
175
|
+
export declare const ReportedMediaAssetSchema: z.ZodObject<{
|
|
176
|
+
mediaAssetId: z.ZodString;
|
|
177
|
+
mediaKind: z.ZodNullable<z.ZodEnum<{
|
|
178
|
+
video: "video";
|
|
179
|
+
image: "image";
|
|
180
|
+
audio: "audio";
|
|
181
|
+
}>>;
|
|
182
|
+
servingStatus: z.ZodNullable<z.ZodEnum<{
|
|
183
|
+
hidden: "hidden";
|
|
184
|
+
servable: "servable";
|
|
185
|
+
quarantined: "quarantined";
|
|
186
|
+
deleted: "deleted";
|
|
187
|
+
}>>;
|
|
188
|
+
displayVariantKey: z.ZodNullable<z.ZodString>;
|
|
189
|
+
label: z.ZodNullable<z.ZodString>;
|
|
190
|
+
}, z.core.$strip>;
|
|
191
|
+
export type ReportedMediaAsset = z.infer<typeof ReportedMediaAssetSchema>;
|
|
192
|
+
export declare const GetReportedContentDetailResultSchema: z.ZodObject<{
|
|
193
|
+
itemType: z.ZodString;
|
|
194
|
+
reportedItemId: z.ZodString;
|
|
195
|
+
textSnapshot: z.ZodNullable<z.ZodString>;
|
|
196
|
+
textFields: z.ZodArray<z.ZodObject<{
|
|
197
|
+
field: z.ZodString;
|
|
198
|
+
label: z.ZodString;
|
|
199
|
+
value: z.ZodString;
|
|
200
|
+
}, z.core.$strip>>;
|
|
201
|
+
mediaAssets: z.ZodArray<z.ZodObject<{
|
|
202
|
+
mediaAssetId: z.ZodString;
|
|
203
|
+
mediaKind: z.ZodNullable<z.ZodEnum<{
|
|
204
|
+
video: "video";
|
|
205
|
+
image: "image";
|
|
206
|
+
audio: "audio";
|
|
207
|
+
}>>;
|
|
208
|
+
servingStatus: z.ZodNullable<z.ZodEnum<{
|
|
209
|
+
hidden: "hidden";
|
|
210
|
+
servable: "servable";
|
|
211
|
+
quarantined: "quarantined";
|
|
212
|
+
deleted: "deleted";
|
|
213
|
+
}>>;
|
|
214
|
+
displayVariantKey: z.ZodNullable<z.ZodString>;
|
|
215
|
+
label: z.ZodNullable<z.ZodString>;
|
|
216
|
+
}, z.core.$strip>>;
|
|
217
|
+
isHidden: z.ZodNullable<z.ZodBoolean>;
|
|
218
|
+
ownerUid: z.ZodNullable<z.ZodString>;
|
|
219
|
+
reportTimeSnapshot: z.ZodNullable<z.ZodObject<{
|
|
220
|
+
capturedText: z.ZodNullable<z.ZodString>;
|
|
221
|
+
capturedMediaAssetIds: z.ZodArray<z.ZodString>;
|
|
222
|
+
revision: z.ZodNullable<z.ZodNumber>;
|
|
223
|
+
capturedAt: z.ZodNullable<z.ZodNumber>;
|
|
224
|
+
}, z.core.$strip>>;
|
|
225
|
+
}, z.core.$strip>;
|
|
226
|
+
export type GetReportedContentDetailResult = z.infer<typeof GetReportedContentDetailResultSchema>;
|
|
164
227
|
export declare const HideHallSubItemInputSchema: z.ZodObject<{
|
|
165
228
|
hallItemId: z.ZodString;
|
|
166
229
|
workProjectType: z.ZodEnum<{
|
|
@@ -545,13 +608,13 @@ export type ReopenSafetyCaseInput = z.infer<typeof ReopenSafetyCaseInputSchema>;
|
|
|
545
608
|
* rows live at a 4-segment nested path, so their docId IS the full document path
|
|
546
609
|
* (the callable splits it); every other lane is the flat [collection, docId] tuple. */
|
|
547
610
|
export declare const DeadLetterCollectionSchema: z.ZodEnum<{
|
|
611
|
+
mediaAssets: "mediaAssets";
|
|
548
612
|
chatSyncEvents: "chatSyncEvents";
|
|
549
613
|
chatAdminActionCommands: "chatAdminActionCommands";
|
|
550
614
|
notificationDeliveries: "notificationDeliveries";
|
|
551
615
|
chatMessageOutbox: "chatMessageOutbox";
|
|
552
616
|
squareAnnouncementJobs: "squareAnnouncementJobs";
|
|
553
617
|
chatSyncFanoutJobs: "chatSyncFanoutJobs";
|
|
554
|
-
mediaAssets: "mediaAssets";
|
|
555
618
|
quarantineSagaJobs: "quarantineSagaJobs";
|
|
556
619
|
nciiRemovalJobs: "nciiRemovalJobs";
|
|
557
620
|
safetyEvidenceJobs: "safetyEvidenceJobs";
|
|
@@ -562,13 +625,13 @@ export declare const DeadLetterCollectionSchema: z.ZodEnum<{
|
|
|
562
625
|
export type DeadLetterCollection = z.infer<typeof DeadLetterCollectionSchema>;
|
|
563
626
|
export declare const AdminReplayDeadLetterInputSchema: z.ZodObject<{
|
|
564
627
|
collection: z.ZodEnum<{
|
|
628
|
+
mediaAssets: "mediaAssets";
|
|
565
629
|
chatSyncEvents: "chatSyncEvents";
|
|
566
630
|
chatAdminActionCommands: "chatAdminActionCommands";
|
|
567
631
|
notificationDeliveries: "notificationDeliveries";
|
|
568
632
|
chatMessageOutbox: "chatMessageOutbox";
|
|
569
633
|
squareAnnouncementJobs: "squareAnnouncementJobs";
|
|
570
634
|
chatSyncFanoutJobs: "chatSyncFanoutJobs";
|
|
571
|
-
mediaAssets: "mediaAssets";
|
|
572
635
|
quarantineSagaJobs: "quarantineSagaJobs";
|
|
573
636
|
nciiRemovalJobs: "nciiRemovalJobs";
|
|
574
637
|
safetyEvidenceJobs: "safetyEvidenceJobs";
|
|
@@ -583,13 +646,13 @@ export declare const AdminReplayDeadLetterInputSchema: z.ZodObject<{
|
|
|
583
646
|
export type AdminReplayDeadLetterInput = z.infer<typeof AdminReplayDeadLetterInputSchema>;
|
|
584
647
|
export declare const GetDeadLettersInputSchema: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
585
648
|
collection: z.ZodOptional<z.ZodEnum<{
|
|
649
|
+
mediaAssets: "mediaAssets";
|
|
586
650
|
chatSyncEvents: "chatSyncEvents";
|
|
587
651
|
chatAdminActionCommands: "chatAdminActionCommands";
|
|
588
652
|
notificationDeliveries: "notificationDeliveries";
|
|
589
653
|
chatMessageOutbox: "chatMessageOutbox";
|
|
590
654
|
squareAnnouncementJobs: "squareAnnouncementJobs";
|
|
591
655
|
chatSyncFanoutJobs: "chatSyncFanoutJobs";
|
|
592
|
-
mediaAssets: "mediaAssets";
|
|
593
656
|
quarantineSagaJobs: "quarantineSagaJobs";
|
|
594
657
|
nciiRemovalJobs: "nciiRemovalJobs";
|
|
595
658
|
safetyEvidenceJobs: "safetyEvidenceJobs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/schemas/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/schemas/admin.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/admin.js
CHANGED
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { violationIdSchema, taskIdSchema, workProjectIdSchema, hallItemIdSchema, workProjectTypeSchema, } from './atoms.js';
|
|
3
3
|
import { ReportDispositionSchema, ReportDispositionReasonCodeSchema, refineReportDispositionReasonCode, refineReportDispositionEvidenceRefs, } from '../doc-schemas/safety/foundation.js';
|
|
4
4
|
import { ChildSafetyAccountRoleSchema, ChildSafetyAccountSubjectDispositionSchema, } from '../doc-schemas/safety/case.js';
|
|
5
|
+
import { ContentMediaKindSchema, MediaServingStatusSchema, } from '../doc-schemas/media-assets.js';
|
|
5
6
|
import { MAX_MANIFEST_NCMEC_RECEIPTS } from '../doc-schemas/safety/evidence.js';
|
|
6
7
|
import { MODERATION_CLEARABLE_TEXT_FIELDS, HALL_CLEARABLE_TEXT_FIELD_NAMES, } from '../constants/business-content.js';
|
|
7
8
|
import { MAX_WORK_PROJECT_TITLE_LENGTH, MAX_ADMIN_DISPATCH_SUBJECT_LENGTH, MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH, MAX_INTERNAL_REASON_LENGTH, MAX_USER_FACING_REASON_LENGTH, MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH, MAX_SAFETY_ADMIN_NOTE_LENGTH, MAX_FUTURE_PLAN_TITLE_LENGTH, MAX_FUTURE_PLAN_DESCRIPTION_LENGTH, MAX_PLATFORM_RULE_TITLE_LENGTH, MAX_PLATFORM_RULE_DESCRIPTION_LENGTH, MAX_AGREEMENT_POINT_LENGTH, MAX_CONTENT_PAGE_HEADING_LENGTH, MAX_CONTENT_PAGE_BODY_LENGTH, MAX_TAKE_IT_DOWN_COPY_LENGTH, MAX_MAINTENANCE_MESSAGE_LENGTH, MAX_APPEAL_REVIEW_NOTES_LENGTH, MAX_REQUIRE_RETITLE_REASON_LENGTH, MAX_USER_FACING_REASON_DETAIL_LENGTH, } from '../constants/business.js';
|
|
@@ -163,6 +164,54 @@ export const CheckTrademarkInputSchema = z.object({
|
|
|
163
164
|
export const GetReportedContentDetailInputSchema = z.object({
|
|
164
165
|
reportGroupId: z.string().min(1),
|
|
165
166
|
}).strict();
|
|
167
|
+
// --- getReportedContentDetail result (cross-boundary: produced by the callable in functions/,
|
|
168
|
+
// consumed by the admin report work-view) ---
|
|
169
|
+
/** One display-text field of the reported doc, labeled for the review panel. The server returns
|
|
170
|
+
* EVERY configured non-empty text field for the item type (title, description, body, …) in
|
|
171
|
+
* display order — never just the first non-empty one. */
|
|
172
|
+
export const ReportedTextFieldSchema = z.object({
|
|
173
|
+
/** Raw doc field name (e.g. 'description', 'workingTitle'). */
|
|
174
|
+
field: z.string().min(1),
|
|
175
|
+
/** Human label the panel renders (e.g. 'Description', 'Title'). */
|
|
176
|
+
label: z.string().min(1),
|
|
177
|
+
/** Current live value, trimmed; empty fields are omitted from the array. */
|
|
178
|
+
value: z.string().min(1),
|
|
179
|
+
});
|
|
180
|
+
/** One media asset referenced by the reported content: id + kind + current serving state
|
|
181
|
+
* (for click-to-reveal) + the server-derived variant key the reveal must request. */
|
|
182
|
+
export const ReportedMediaAssetSchema = z.object({
|
|
183
|
+
mediaAssetId: z.string().min(1),
|
|
184
|
+
mediaKind: ContentMediaKindSchema.nullable(),
|
|
185
|
+
servingStatus: MediaServingStatusSchema.nullable(),
|
|
186
|
+
/** The variant key the reveal must request for its single display render (image origins split
|
|
187
|
+
* between 'full' and 'main'; video/audio are always 'main'). Null when the asset doc is
|
|
188
|
+
* missing/variant-less. */
|
|
189
|
+
displayVariantKey: z.string().nullable(),
|
|
190
|
+
/** Human label of WHAT this asset is on the reported item (e.g. 'Square cover',
|
|
191
|
+
* 'Track photo — <title>'). Null when the server cannot derive one. */
|
|
192
|
+
label: z.string().nullable(),
|
|
193
|
+
});
|
|
194
|
+
export const GetReportedContentDetailResultSchema = z.object({
|
|
195
|
+
itemType: z.string().min(1),
|
|
196
|
+
reportedItemId: z.string().min(1),
|
|
197
|
+
/** First non-empty display-text field (legacy single-field snapshot; textFields is the
|
|
198
|
+
* complete labeled set). */
|
|
199
|
+
textSnapshot: z.string().nullable(),
|
|
200
|
+
textFields: z.array(ReportedTextFieldSchema),
|
|
201
|
+
mediaAssets: z.array(ReportedMediaAssetSchema),
|
|
202
|
+
/** Whether the reported doc is currently hidden (best-effort, doc-flag based). */
|
|
203
|
+
isHidden: z.boolean().nullable(),
|
|
204
|
+
/** The content owner / uploader uid, when derivable. */
|
|
205
|
+
ownerUid: z.string().nullable(),
|
|
206
|
+
/** The FROZEN report-time snapshot (captured at intake), so the operator sees what was
|
|
207
|
+
* reported even if the author edited the live doc to evade. Null for older reports. */
|
|
208
|
+
reportTimeSnapshot: z.object({
|
|
209
|
+
capturedText: z.string().nullable(),
|
|
210
|
+
capturedMediaAssetIds: z.array(z.string()),
|
|
211
|
+
revision: z.number().nullable(),
|
|
212
|
+
capturedAt: z.number().nullable(),
|
|
213
|
+
}).nullable(),
|
|
214
|
+
});
|
|
166
215
|
export const HideHallSubItemInputSchema = z.object({
|
|
167
216
|
hallItemId: hallItemIdSchema,
|
|
168
217
|
workProjectType: workProjectTypeSchema,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/schemas/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,iCAAiC,EACjC,iCAAiC,EACjC,mCAAmC,GAEpC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,4BAA4B,EAC5B,0CAA0C,GAC3C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EACL,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,EACjC,sCAAsC,EACtC,0BAA0B,EAC1B,6BAA6B,EAC7B,oCAAoC,EACpC,4BAA4B,EAC5B,4BAA4B,EAC5B,kCAAkC,EAClC,8BAA8B,EAC9B,oCAAoC,EACpC,0BAA0B,EAC1B,+BAA+B,EAC/B,4BAA4B,EAC5B,4BAA4B,EAC5B,8BAA8B,EAC9B,8BAA8B,EAC9B,iCAAiC,EACjC,oCAAoC,GACrC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,6CAA6C,CAAC;AAErD,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAG1E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,WAAW,EAAE,iBAAiB;CAC/B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,wFAAwF;AACxF,iFAAiF;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;CACrD,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ;0CAC0C;AAC1C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG1E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,WAAW,EAAE,iBAAiB;IAC9B,MAAM,EAAE,YAAY;IACpB,QAAQ,EAAE,2BAA2B;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,8BAA8B,CAAC;CAC3D,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,qFAAqF;AACrF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACxB,WAAW,EAAE,iBAAiB;IAC9B,uEAAuE;IACvE,QAAQ,EAAE,2BAA2B;IACrC;qFACiF;IACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB;6FACyF;IACzF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAGH,mCAAmC;AAEnC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kCAAkC,CAAC;IACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC/C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CAC9C,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,8BAA8B,CAAC;IAC5D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oCAAoC,CAAC;IACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC/C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtG,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,uBAAuB,CAAC,QAAQ,EAAE;IACzC,KAAK,EAAE,uBAAuB,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,uBAAuB,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,wEAAwE;AACxE,qDAAqD;AACrD,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC9C,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAChB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EACnE,EAAE,OAAO,EAAE,2DAA2D,EAAE,CACzE,CAAC;AAGF,oFAAoF;AACpF,0EAA0E;AAC1E,iFAAiF;AACjF,kDAAkD;AAElD,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,wEAAwE;IACxE,2EAA2E;IAC3E,8EAA8E;IAC9E,2EAA2E;IAC3E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACjE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACjE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;CACnG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAChB,CAAC,IAAI,EAAE,EAAE;IACP,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/C,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC;AACpC,CAAC,EACD,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAC/D,CAAC;AAGF,MAAM,oBAAoB,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,oBAAoB;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QAChD,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACvC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,QAAQ,EAAE;QAC7E,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC3C,sEAAsE;QACtE,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACxD,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAChB,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAChC,EAAE,OAAO,EAAE,mCAAmC,EAAE,CACjD;CACF,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,+BAA+B;AAE/B,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IAC3C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IAC1C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;CAC9C,CAAC;KACC,MAAM,EAAE;KACR,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC;IAC3B,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC;IAChC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC;IAC/B,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC;IACpC,CAAC,EACH,EAAE,OAAO,EAAE,sFAAsF,EAAE,CACpG,CAAC;AAIJ,0FAA0F;AAC1F,0FAA0F;AAC1F,+CAA+C;AAC/C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC7C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC7C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC/C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC/C;;gGAE4F;IAC5F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAGH,kFAAkF;AAElF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,6DAA6D;IAC7D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC/D,+EAA+E;IAC/E,+EAA+E;IAC/E,mEAAmE;IACnE,6EAA6E;IAC7E,4EAA4E;IAC5E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,OAAO,EAAE;CACtE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACjC,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,UAAU,EAAE,gBAAgB;IAC5B,eAAe,EAAE,qBAAqB;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,UAAU,EAAE,gBAAgB;IAC5B,eAAe,EAAE,qBAAqB;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,mBAAmB;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,iGAAiG;AACjG,kEAAkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,aAAa,EAAE,mBAAmB;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,wFAAwF;AACxF,qFAAqF;AACrF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC;CACjE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,qGAAqG;AAErG,6FAA6F;AAC7F,iGAAiG;AACjG,MAAM,+BAA+B,GAAG,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;AAG7F,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,aAAa,EAAE,mBAAmB;IAClC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC;CACxE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC;CACxE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,8FAA8F;AAC9F,uEAAuE;AACvE,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;AAGrE,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,UAAU,EAAE,gBAAgB;IAC5B,eAAe,EAAE,qBAAqB;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC;CACxE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,qFAAqF;AAErF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;CACnD,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,mGAAmG;AAEnG,yFAAyF;AACzF,8FAA8F;AAC9F,sCAAsC;AACtC,MAAM,sCAAsC,GAAG;IAC7C,qBAAqB;IACrB,UAAU;IACV,gBAAgB;IAChB,oBAAoB;IACpB,qBAAqB;IACrB,YAAY;IACZ,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;IACb,oBAAoB;CAC4B,CAAC;AAEnD,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CAAC;IACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC;IAC1D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7C,4FAA4F;IAC5F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE;CAC5E,CAAC;KACC,MAAM,EAAE;KACR,WAAW,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACtE,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,iDAAiD;YAC1D,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAGL,gFAAgF;AAEhF,mGAAmG;AACnG,mGAAmG;AACnG,MAAM,2BAA2B,GAAG;IAClC,qBAAqB;IACrB,UAAU;IACV,gBAAgB;IAChB,oBAAoB;IACpB,qBAAqB;IACrB,YAAY;IACZ,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;IACb,uBAAuB;IACvB,yEAAyE;IACzE,0EAA0E;IAC1E,oBAAoB;CAC4B,CAAC;AAEnD,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACvE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC;IAC/C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,oFAAoF;IACpF,+CAA+C;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC;IACxE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,sCAAsC,CAAC;CAC9E,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,kBAAkB,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC;CACjE,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC/I,MAAM,EAAE,CAAC;AAEZ,MAAM,wBAAwB,GAAG,CAAC;KAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC3J,MAAM,EAAE,CAAC;AAEZ,8FAA8F;AAC9F,MAAM,sBAAsB,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACvE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAClD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAClC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,kGAAkG;AAClG,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;QACpC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1H,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACnF,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC1C,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CACxD,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IAC/D,mBAAmB;IACnB,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,wBAAwB;IACxB,sBAAsB;IACtB,mBAAmB;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oCAAoC,CAAC;IACrF,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClE,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,QAAQ,EAAE;IAC9F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,QAAQ,EAAE;CAC1E,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,6BAA6B,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACzC,kFAAkF;IAClF,iFAAiF;IACjF,WAAW,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC;IAC9D,qBAAqB,EAAE,iCAAiC;IACxD,yFAAyF;IACzF,+FAA+F;IAC/F,+FAA+F;IAC/F,6EAA6E;IAC7E,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACzE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CACjD,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAElG,gGAAgG;AAChG,iFAAiF;AACjF,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAE1F,MAAM,yBAAyB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACxE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC7E,IAAI,EAAE,4BAA4B;IAClC,kBAAkB,EAAE,0CAA0C;CAC/D,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,kBAAkB,CAAC,QAAQ,EAAE;IAC5B,6BAA6B;IAC7B,sBAAsB;IACtB,sBAAsB;IACtB,yBAAyB;CAC1B,CAAC;IACF,kGAAkG;IAClG,4FAA4F;IAC5F,yEAAyE;KACxE,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB,EAAE,CAAC;QAC5C,iCAAiC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9C,mCAAmC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC,CAAC,CAAC;AAGL,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oCAAoC,CAAC;IACrF,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,QAAQ,EAAE;IACzE,mGAAmG;IACnG,mGAAmG;IACnG,iGAAiG;IACjG,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC3D,0FAA0F;IAC1F,uFAAuF;IACvF,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC;CACrD,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC;KACzC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACxE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC3D,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC;CACzD,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,8EAA8E;AAC9E,iFAAiF;AACjF,8EAA8E;AAE9E;;uFAEuF;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/C,gBAAgB;IAChB,yBAAyB;IACzB,wBAAwB;IACxB,mBAAmB;IACnB,wBAAwB;IACxB,oBAAoB;IACpB,aAAa;IACb,oBAAoB;IACpB,iBAAiB;IACjB,oBAAoB;IACpB,uBAAuB;IACvB,oBAAoB;IACpB,qBAAqB;CACtB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC;KAC9C,MAAM,CAAC;IACN,UAAU,EAAE,0BAA0B;IACtC,0EAA0E;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACzD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,8DAA8D;IAC9D,UAAU,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IACjD,0EAA0E;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC;KACD,MAAM,EAAE;KACR,OAAO,EAAE,CAAC","sourcesContent":["import { z } from 'zod';\nimport {\n violationIdSchema,\n taskIdSchema,\n workProjectIdSchema,\n hallItemIdSchema,\n workProjectTypeSchema,\n} from './atoms.js';\nimport {\n ReportDispositionSchema,\n ReportDispositionReasonCodeSchema,\n refineReportDispositionReasonCode,\n refineReportDispositionEvidenceRefs,\n type ReportableItemType,\n} from '../doc-schemas/safety/foundation.js';\nimport {\n ChildSafetyAccountRoleSchema,\n ChildSafetyAccountSubjectDispositionSchema,\n} from '../doc-schemas/safety/case.js';\nimport { MAX_MANIFEST_NCMEC_RECEIPTS } from '../doc-schemas/safety/evidence.js';\nimport {\n MODERATION_CLEARABLE_TEXT_FIELDS,\n HALL_CLEARABLE_TEXT_FIELD_NAMES,\n} from '../constants/business-content.js';\nimport {\n MAX_WORK_PROJECT_TITLE_LENGTH,\n MAX_ADMIN_DISPATCH_SUBJECT_LENGTH,\n MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH,\n MAX_INTERNAL_REASON_LENGTH,\n MAX_USER_FACING_REASON_LENGTH,\n MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH,\n MAX_SAFETY_ADMIN_NOTE_LENGTH,\n MAX_FUTURE_PLAN_TITLE_LENGTH,\n MAX_FUTURE_PLAN_DESCRIPTION_LENGTH,\n MAX_PLATFORM_RULE_TITLE_LENGTH,\n MAX_PLATFORM_RULE_DESCRIPTION_LENGTH,\n MAX_AGREEMENT_POINT_LENGTH,\n MAX_CONTENT_PAGE_HEADING_LENGTH,\n MAX_CONTENT_PAGE_BODY_LENGTH,\n MAX_TAKE_IT_DOWN_COPY_LENGTH,\n MAX_MAINTENANCE_MESSAGE_LENGTH,\n MAX_APPEAL_REVIEW_NOTES_LENGTH,\n MAX_REQUIRE_RETITLE_REASON_LENGTH,\n MAX_USER_FACING_REASON_DETAIL_LENGTH,\n} from '../constants/business.js';\nimport {\n SAFETY_ACTIONS_CONFIRMATION,\n SAFETY_CASE_REOPEN_CONFIRMATION,\n} from '../constants/safety-confirmation-phrases.js';\n\nexport const CheckoutNextImportantTaskInputSchema = z.object({}).strict();\nexport type CheckoutNextImportantTaskInput = z.infer<typeof CheckoutNextImportantTaskInputSchema>;\n\nexport const GetContentViolationInputSchema = z.object({\n violationId: violationIdSchema,\n}).strict();\nexport type GetContentViolationInput = z.infer<typeof GetContentViolationInputSchema>;\n\n// `taskType` was removed — the server derives it from the task doc; the client copy was\n// ignored (and forgeable). Callers pass only the task id + the extension window.\nexport const MarkWorkLaterInputSchema = z.object({\n taskId: taskIdSchema,\n extendHours: z.union([z.literal(24), z.literal(48)]),\n}).strict();\nexport type MarkWorkLaterInput = z.infer<typeof MarkWorkLaterInputSchema>;\n\n/** The two appeal-review decisions (ONE canonical declaration — shared by the review\n * input and its authoritative result). */\nexport const ContentAppealDecisionSchema = z.enum(['approved', 'denied']);\nexport type ContentAppealDecision = z.infer<typeof ContentAppealDecisionSchema>;\n\nexport const ReviewContentAppealInputSchema = z.object({\n violationId: violationIdSchema,\n taskId: taskIdSchema,\n decision: ContentAppealDecisionSchema,\n adminNotes: z.string().max(MAX_APPEAL_REVIEW_NOTES_LENGTH),\n}).strict();\nexport type ReviewContentAppealInput = z.infer<typeof ReviewContentAppealInputSchema>;\n\n// Authoritative result of reviewContentAppeal. Non-strict (server → client posture).\nexport const ReviewContentAppealResultSchema = z.object({\n success: z.literal(true),\n violationId: violationIdSchema,\n /** Echo of the requested decision (always known — it is the input). */\n decision: ContentAppealDecisionSchema,\n /** The appealing user's uid ('' on the orphaned-task cleanup path, where the\n * underlying violation was already gone and only the stale task was cleared). */\n userId: z.string(),\n /** Operation-receipt audit id — the `admin.contentAppealReviewed` event written in the same\n * transaction. Optional/additive so an older backend that omits it still type-checks. */\n auditEventId: z.string().min(1).optional(),\n});\nexport type ReviewContentAppealResult = z.infer<typeof ReviewContentAppealResultSchema>;\n\n// --- System-doc admin updates ---\n\nconst FuturePlanItemSchema = z.object({\n id: z.string().min(1).max(128),\n title: z.string().min(1).max(MAX_FUTURE_PLAN_TITLE_LENGTH),\n description: z.string().min(1).max(MAX_FUTURE_PLAN_DESCRIPTION_LENGTH),\n order: z.number().int().min(0),\n videoUrl: z.string().url().max(2048).optional(),\n mediaType: z.enum(['video', 'image', 'audio', 'other']).optional(),\n}).strict();\n\nexport const UpdateFuturePlansInputSchema = z.object({\n plans: z.array(FuturePlanItemSchema).max(200),\n}).strict();\nexport type UpdateFuturePlansInput = z.infer<typeof UpdateFuturePlansInputSchema>;\n\nconst RuleSchema = z.object({\n id: z.string().min(1).max(128),\n title: z.string().min(1).max(MAX_PLATFORM_RULE_TITLE_LENGTH),\n description: z.string().min(1).max(MAX_PLATFORM_RULE_DESCRIPTION_LENGTH),\n videoUrl: z.string().url().max(2048).optional(),\n group: z.enum(['generic', 'workProjectType', 'hallWingType', 'workRealm', 'merchandising']).optional(),\n subgroup: z.enum(['Tales', 'Tunes', 'Television', 'entertainment', 'educational', 'newsPolitical']).optional(),\n order: z.number().int().min(0),\n}).strict();\n\nconst AgreementCategorySchema = z.object({\n points: z.array(z.string().min(1).max(MAX_AGREEMENT_POINT_LENGTH)).max(200),\n videoUrl: z.string().url().max(2048).optional(),\n}).strict();\n\nconst AgreementsSchema = z.object({\n tales: AgreementCategorySchema.optional(),\n tunes: AgreementCategorySchema.optional(),\n television: AgreementCategorySchema.optional(),\n}).strict();\n\n// Partial update — admin UI may send only `rules` or only `agreements`.\n// Server merges. At least one field must be present.\nexport const UpdateRulesAndAgreementsInputSchema = z.object({\n rules: z.array(RuleSchema).max(500).optional(),\n agreements: AgreementsSchema.optional(),\n}).strict().refine(\n (data) => data.rules !== undefined || data.agreements !== undefined,\n { message: 'At least one of `rules` or `agreements` must be provided.' },\n);\nexport type UpdateRulesAndAgreementsInput = z.infer<typeof UpdateRulesAndAgreementsInputSchema>;\n\n// --- Content-pages migration (DJ ruling 2026-07-06): per-page update callables ---\n// One callable per page (never a `kind` discriminator): updateTermsPage /\n// updatePrivacyPage / updateTakeItDownPageCopy. The client NEVER sends `version`\n// — the server bumps it atomically on every save.\n\nconst ContentPageSectionInputSchema = z.object({\n id: z.string().min(1).max(128),\n heading: z.string().min(1).max(MAX_CONTENT_PAGE_HEADING_LENGTH),\n level: z.union([z.literal(1), z.literal(2)]),\n // Empty body is LEGAL: a bare divider heading (e.g. terms \"Part 1 — Our\n // Intention\") is real content. The input schema must accept everything the\n // stored ContentPageSectionSchema accepts, or a faithfully-seeded doc becomes\n // unsaveable in the admin editor (found by adversarial review 2026-07-06).\n body: z.string().max(MAX_CONTENT_PAGE_BODY_LENGTH),\n order: z.number().int().min(0),\n}).strict();\n\nexport const UpdateTermsPageInputSchema = z.object({\n sections: z.array(ContentPageSectionInputSchema).min(1).max(300),\n}).strict();\nexport type UpdateTermsPageInput = z.infer<typeof UpdateTermsPageInputSchema>;\n\nexport const UpdatePrivacyPageInputSchema = z.object({\n sections: z.array(ContentPageSectionInputSchema).min(1).max(300),\n}).strict();\nexport type UpdatePrivacyPageInput = z.infer<typeof UpdatePrivacyPageInputSchema>;\n\nexport const UpdateTakeItDownPageCopyInputSchema = z.object({\n strings: z.record(z.string().min(1).max(128), z.string().min(1).max(MAX_TAKE_IT_DOWN_COPY_LENGTH)),\n}).strict().refine(\n (data) => {\n const count = Object.keys(data.strings).length;\n return count >= 1 && count <= 200;\n },\n { message: 'strings must contain between 1 and 200 entries.' },\n);\nexport type UpdateTakeItDownPageCopyInput = z.infer<typeof UpdateTakeItDownPageCopyInputSchema>;\n\nconst AppConfigDocIdSchema = z.literal('app');\n\nexport const UpdateAppConfigInputSchema = z.object({\n docId: AppConfigDocIdSchema,\n data: z.object({\n appVersion: z.string().min(1).max(64).optional(),\n maintenanceMode: z.boolean().optional(),\n maintenanceMessage: z.string().max(MAX_MAINTENANCE_MESSAGE_LENGTH).optional(),\n registrationEnabled: z.boolean().optional(),\n // Runtime abuse throttle: 0 < m <= 1 (tighten-only; 1 = no throttle).\n rateLimitMultiplier: z.number().gt(0).max(1).optional(),\n }).strict().refine(\n (d) => Object.keys(d).length > 0,\n { message: 'data must have at least one field' },\n ),\n}).strict();\nexport type UpdateAppConfigInput = z.infer<typeof UpdateAppConfigInputSchema>;\n\n// --- Admin list mutations ---\n\nconst uidSchema = z.string().min(1).max(128);\n\n/**\n * Wire input for the `updateAdminList` callable in ttt-prod.\n * Used to grant or revoke admin / jrAdmin status on `_systemData/adminList`.\n *\n * All four fields are optional arrays of UIDs. At least one must be non-empty.\n * The callable's core function rejects conflicting input (e.g. same UID in\n * both addAdmins and removeAdmins) with HttpsError invalid-argument.\n */\nexport const UpdateAdminListInputSchema = z.object({\n addAdmins: z.array(uidSchema).optional(),\n removeAdmins: z.array(uidSchema).optional(),\n addJrAdmins: z.array(uidSchema).optional(),\n removeJrAdmins: z.array(uidSchema).optional(),\n})\n .strict()\n .refine(\n (data) =>\n (data.addAdmins?.length ?? 0) +\n (data.removeAdmins?.length ?? 0) +\n (data.addJrAdmins?.length ?? 0) +\n (data.removeJrAdmins?.length ?? 0) >\n 0,\n { message: 'At least one of addAdmins/removeAdmins/addJrAdmins/removeJrAdmins must be non-empty.' },\n );\n\nexport type UpdateAdminListInput = z.infer<typeof UpdateAdminListInputSchema>;\n\n// Authoritative result of updateAdminList — the grant/revoke delta counts computed inside\n// the roster transaction (uids already in their target state are no-ops and not counted).\n// Non-strict (server → client result posture).\nexport const UpdateAdminListResultSchema = z.object({\n success: z.literal(true),\n adminsGranted: z.number().int().nonnegative(),\n adminsRevoked: z.number().int().nonnegative(),\n jrAdminsGranted: z.number().int().nonnegative(),\n jrAdminsRevoked: z.number().int().nonnegative(),\n /** Operation-receipt audit id — the `admin.systemRoleGranted` / `admin.systemRoleRevoked`\n * event(s) key off the same roster transaction. Optional/additive. (No single domain id: a\n * roster edit spans multiple uids, so only the audit id is a meaningful receipt handle.) */\n auditEventId: z.string().min(1).optional(),\n});\nexport type UpdateAdminListResult = z.infer<typeof UpdateAdminListResultSchema>;\n\n// --- Admin moderation: hide / restore / retitle content + Work/Realm objects ---\n\nexport const CheckTrademarkInputSchema = z.object({\n // Primary: the work project's title (franchise-level check).\n workTitle: z.string().min(1).max(MAX_WORK_PROJECT_TITLE_LENGTH),\n // Optional: the sub-item title (chapter, track, episode). Checked secondarily.\n // `.nullish()` (not `.optional()`): the Firebase callable client serializes an\n // undefined argument as JSON null, and the work-view caller passes\n // `subItemTitle: subItem?.title` which is undefined when the sub-item hasn't\n // loaded — that arrives here as null. A bare `.optional()` would 400 on it.\n subItemTitle: z.string().max(MAX_WORK_PROJECT_TITLE_LENGTH).nullish(),\n}).strict();\nexport type CheckTrademarkInput = z.infer<typeof CheckTrademarkInputSchema>;\n\nexport const GetReportedContentDetailInputSchema = z.object({\n reportGroupId: z.string().min(1),\n}).strict();\nexport type GetReportedContentDetailInput = z.infer<typeof GetReportedContentDetailInputSchema>;\n\nexport const HideHallSubItemInputSchema = z.object({\n hallItemId: hallItemIdSchema,\n workProjectType: workProjectTypeSchema,\n subItemId: z.string().min(1),\n reason: z.string().min(1),\n}).strict();\nexport type HideHallSubItemInput = z.infer<typeof HideHallSubItemInputSchema>;\n\nexport const RestoreHallSubItemInputSchema = z.object({\n hallItemId: hallItemIdSchema,\n workProjectType: workProjectTypeSchema,\n subItemId: z.string().min(1),\n}).strict();\nexport type RestoreHallSubItemInput = z.infer<typeof RestoreHallSubItemInputSchema>;\n\nexport const HideWorkProjectInputSchema = z.object({\n workProjectId: workProjectIdSchema,\n reason: z.string().min(1),\n}).strict();\nexport type HideWorkProjectInput = z.infer<typeof HideWorkProjectInputSchema>;\n\nexport const HideWorkRealmInputSchema = z.object({\n workRealmId: z.string().min(1),\n reason: z.string().min(1),\n}).strict();\nexport type HideWorkRealmInput = z.infer<typeof HideWorkRealmInputSchema>;\n\n// `cascadeId` is OPTIONAL: the app backends derive all active cascades for the target when it is\n// omitted, and restore just that one cascade when it is supplied.\nexport const RestoreWorkProjectInputSchema = z.object({\n workProjectId: workProjectIdSchema,\n cascadeId: z.string().min(1).optional(),\n}).strict();\nexport type RestoreWorkProjectInput = z.infer<typeof RestoreWorkProjectInputSchema>;\n\nexport const RestoreWorkRealmInputSchema = z.object({\n workRealmId: z.string().min(1),\n cascadeId: z.string().min(1).optional(),\n}).strict();\nexport type RestoreWorkRealmInput = z.infer<typeof RestoreWorkRealmInputSchema>;\n\n// The `requireWorkProjectRetitle` / `requireWorkRealmRetitle` callables share this base\n// `{ reason }` shape and each `.extend(...)` it with its own id field at parse time.\nexport const RequireRetitleInputSchema = z.object({\n reason: z.string().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type RequireRetitleInput = z.infer<typeof RequireRetitleInputSchema>;\n\n// --- Page-level \"Clear text (moderation)\" callables (per-field extension of the retitle family) ---\n\n// The clearable SHELL fields (raw doc field names) for the workProject + workRealm contexts.\n// Derived from the canonical clearable-field map — the two shell surfaces share the same fields.\nconst ModerationShellClearFieldSchema = z.enum(MODERATION_CLEARABLE_TEXT_FIELDS.workProject);\nexport type ModerationShellClearField = z.infer<typeof ModerationShellClearFieldSchema>;\n\nexport const ClearWorkProjectTextInputSchema = z.object({\n workProjectId: workProjectIdSchema,\n fields: z.array(ModerationShellClearFieldSchema).min(1),\n reason: z.string().trim().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type ClearWorkProjectTextInput = z.infer<typeof ClearWorkProjectTextInputSchema>;\n\nexport const ClearWorkRealmTextInputSchema = z.object({\n workRealmId: z.string().min(1),\n fields: z.array(ModerationShellClearFieldSchema).min(1),\n reason: z.string().trim().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type ClearWorkRealmTextInput = z.infer<typeof ClearWorkRealmTextInputSchema>;\n\n// The clearable TEXT fields across the whole hall content family — derived from the canonical\n// map (union of every hall surface's fields), never restated literals.\nconst HallClearFieldSchema = z.enum(HALL_CLEARABLE_TEXT_FIELD_NAMES);\nexport type HallClearField = z.infer<typeof HallClearFieldSchema>;\n\nexport const ClearHallContentTextInputSchema = z.object({\n hallItemId: hallItemIdSchema,\n workProjectType: workProjectTypeSchema,\n subItemId: z.string().min(1).optional(),\n fields: z.array(HallClearFieldSchema).min(1),\n reason: z.string().trim().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type ClearHallContentTextInput = z.infer<typeof ClearHallContentTextInputSchema>;\n\n// --- getLatestHideCascade — resolve the latest hide-cascade id for a Work/Realm ---\n\nexport const GetLatestHideCascadeInputSchema = z.object({\n entityId: z.string().min(1),\n targetType: z.enum(['work-project', 'work-realm']),\n}).strict();\nexport type GetLatestHideCascadeInput = z.infer<typeof GetLatestHideCascadeInputSchema>;\n\n// --- moderateReportedContent — hide / restore / soft perma-remove an individual reported item ---\n\n// The single-item content-action target set (SUBSET of ReportableItemType — excludes the\n// close-out-only hall-library-sub-item). `admin-work-message` is allowlisted for this file in\n// the definition-redeclaration guard.\nconst MODERATE_REPORTED_CONTENT_TARGET_TYPES = [\n 'square-streetz-post',\n 'audition',\n 'audition-entry',\n 'commission-listing',\n 'commission-proposal',\n 'work-asset',\n 'profile-picture',\n 'hall-library-item',\n 'craft-skill',\n 'admin-work-message',\n] as const satisfies readonly ReportableItemType[];\n\nexport const ModerateReportedContentInputSchema = z.object({\n reportGroupId: z.string().min(1),\n targetType: z.enum(MODERATE_REPORTED_CONTENT_TARGET_TYPES),\n reportedItemId: z.string().min(1),\n parentItemId: z.string().min(1).optional(),\n action: z.enum(['hide', 'restore', 'remove']),\n // [EUAS-023] A destructive action (hide/remove) MUST carry a reason; restore is a reversal.\n reason: z.string().trim().min(1).max(MAX_INTERNAL_REASON_LENGTH).optional(),\n})\n .strict()\n .superRefine((val, ctx) => {\n if ((val.action === 'hide' || val.action === 'remove') && !val.reason) {\n ctx.addIssue({\n code: 'custom',\n message: 'A reason is required to hide or remove content.',\n path: ['reason'],\n });\n }\n });\nexport type ModerateReportedContentInput = z.infer<typeof ModerateReportedContentInputSchema>;\n\n// --- resolveAdminTask — the ONE guided close-out for EVERY admin case type ---\n\n// [EUAS-005] The content-action target set ALSO accepts hall-library-sub-item (hide/restore only),\n// which routes to the dedicated `runSetHallSubItemHidden` core (not `runModerateReportedContent`).\nconst CONTENT_ACTION_TARGET_TYPES = [\n 'square-streetz-post',\n 'audition',\n 'audition-entry',\n 'commission-listing',\n 'commission-proposal',\n 'work-asset',\n 'profile-picture',\n 'hall-library-item',\n 'craft-skill',\n 'hall-library-sub-item',\n // Work-party admin correspondence message — single-doc `hidden` flip via\n // `runModerateReportedContent` (tombstone rendering in the thread views).\n 'admin-work-message',\n] as const satisfies readonly ReportableItemType[];\n\nconst ContentActionSchema = z\n .object({\n button: z.enum(['hideContent', 'restoreContent', 'permaRemoveContent']),\n targetType: z.enum(CONTENT_ACTION_TARGET_TYPES),\n reportedItemId: z.string().min(1),\n parentItemId: z.string().min(1).optional(),\n })\n .strict();\n\nconst WarnUserSchema = z\n .object({\n button: z.literal('warnUser'),\n userId: z.string().min(1),\n // A warning IS an admin dispatch (resolveAdminTask → runCreateAdminDispatchToUser),\n // so it shares the dispatch subject/body caps.\n subject: z.string().trim().min(1).max(MAX_ADMIN_DISPATCH_SUBJECT_LENGTH),\n message: z.string().trim().min(1).max(MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH),\n })\n .strict();\n\nconst SuspendOrBanSchema = z\n .object({\n button: z.enum(['suspendUser', 'banUser']),\n userId: z.string().min(1),\n reason: z.string().trim().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n })\n .strict();\n\nconst ReinstateUserSchema = z\n .object({ button: z.literal('reinstateUser'), userId: z.string().min(1), reason: z.string().trim().max(MAX_INTERNAL_REASON_LENGTH).optional() })\n .strict();\n\nconst ForceUsernameResetSchema = z\n .object({ button: z.literal('forceUsernameReset'), userId: z.string().min(1), reason: z.string().trim().min(1).max(MAX_INTERNAL_REASON_LENGTH).optional() })\n .strict();\n\n/** Whole-object Work/Realm remedies — `reportedItemId` is the workProjectId / workRealmId. */\nconst WorkObjectActionSchema = z\n .object({\n button: z.enum(['hideWorkObject', 'restoreWorkObject', 'forceRetitle']),\n targetType: z.enum(['work-project', 'work-realm']),\n reportedItemId: z.string().min(1),\n })\n .strict();\n\n/** Chat message tombstone — channel + seq from the report, revision from the live thread-read. */\nconst TombstoneChatSchema = z\n .object({\n button: z.literal('tombstoneChat'),\n channel: z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('channel'), workProjectId: z.string().min(1), guildChatChannelId: z.string().min(1) }).strict(),\n z.object({ kind: z.literal('invite'), guildInviteId: z.string().min(1) }).strict(),\n ]),\n messageSeq: z.number().int().nonnegative(),\n expectedMessageRevision: z.number().int().nonnegative(),\n })\n .strict();\n\nexport const StagedActionSchema = z.discriminatedUnion('button', [\n ContentActionSchema,\n WarnUserSchema,\n SuspendOrBanSchema,\n ReinstateUserSchema,\n ForceUsernameResetSchema,\n WorkObjectActionSchema,\n TombstoneChatSchema,\n]);\nexport type StagedAction = z.infer<typeof StagedActionSchema>;\n\nexport const NormalReportInputSchema = z\n .object({\n caseType: z.literal('normalReport').default('normalReport'),\n taskId: z.string().min(1),\n outcome: z.enum(['founded', 'unfounded']),\n resolutionSummary: z.string().trim().min(1).max(MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH),\n actions: z.array(StagedActionSchema).max(16).default([]),\n userFacingReasonCode: z.string().trim().min(1).max(128).optional(),\n userFacingReasonDetail: z.string().trim().max(MAX_USER_FACING_REASON_DETAIL_LENGTH).optional(),\n adminNote: z.string().trim().max(MAX_SAFETY_ADMIN_NOTE_LENGTH).optional(),\n })\n .strict();\nexport type ResolveAdminTaskInput = z.infer<typeof NormalReportInputSchema>;\n\nconst SafetyDispositionActionSchema = z\n .object({\n button: z.literal('setReportDisposition'),\n // Derived from the ONE canonical disposition enum — 'undetermined' is the initial\n // state, never an operator-settable target, so it is excluded (not re-declared).\n disposition: ReportDispositionSchema.exclude(['undetermined']),\n dispositionReasonCode: ReportDispositionReasonCodeSchema,\n // Derived from the ONE receipts-cap constant (doc-schemas/safety/evidence.ts) — the same\n // bound the callable + the embedded SetReportDispositionInputV1Schema use. No field-level min:\n // the reportRequired⇒non-empty rule lives in the shared cross-field refinement below, so every\n // other disposition may legally stage this action with no evidence revealed.\n evidenceRefs: z.array(z.string().min(1)).max(MAX_MANIFEST_NCMEC_RECEIPTS),\n expectedRevision: z.number().int().nonnegative(),\n })\n .strict();\n\nconst QuarantineActionSchema = z.object({ button: z.literal('quarantinePreserveFile') }).strict();\n\n// [C-01/EUAS-002] No client-supplied requestId — the linked statutory request id(s) are derived\n// SERVER-SIDE from the case's `requestLinks` inside `enqueueNciiRemovalForCase`.\nconst HashRemoveActionSchema = z.object({ button: z.literal('hashRemoveFile') }).strict();\n\nconst SafetyAccountActionSchema = z\n .object({\n button: z.enum(['suspendUser', 'banUser', 'reinstateUser']),\n targetUid: z.string().min(1),\n reasonInternal: z.string().trim().min(4).max(MAX_INTERNAL_REASON_LENGTH),\n reasonUserFacing: z.string().trim().min(1).max(MAX_USER_FACING_REASON_LENGTH),\n role: ChildSafetyAccountRoleSchema,\n subjectDisposition: ChildSafetyAccountSubjectDispositionSchema,\n })\n .strict();\n\nexport const SafetyStagedActionSchema = z\n .discriminatedUnion('button', [\n SafetyDispositionActionSchema,\n QuarantineActionSchema,\n HashRemoveActionSchema,\n SafetyAccountActionSchema,\n ])\n // The setReportDisposition arm reuses the ONE canonical cross-field rules (foundation.ts) via the\n // shared refinements — never re-declaring them here: the disposition↔reason pairing AND the\n // reportRequired⇒evidence-present rule. Other arms carry no such fields.\n .superRefine((value, ctx) => {\n if (value.button === 'setReportDisposition') {\n refineReportDispositionReasonCode(value, ctx);\n refineReportDispositionEvidenceRefs(value, ctx);\n }\n });\nexport type SafetyStagedAction = z.infer<typeof SafetyStagedActionSchema>;\n\nexport const SafetyCaseInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1),\n outcome: z.enum(['founded', 'unfounded']),\n resolutionSummary: z.string().trim().min(1).max(MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH),\n actions: z.array(SafetyStagedActionSchema).max(16).default([]),\n adminNote: z.string().trim().max(MAX_SAFETY_ADMIN_NOTE_LENGTH).optional(),\n // [EUAS-017] Optimistic-concurrency token (`childSafetyCaseList.revision` / `nciiCases.revision`).\n // The close is rejected if the case changed since the operator loaded it — concurrent stale closes\n // can't silently overwrite. Optional for backward compatibility; the console always supplies it.\n expectedRevision: z.number().int().nonnegative().optional(),\n // Interim reauth: a single explicit typed confirmation for the privileged safety actions,\n // standing in for the passkey two-step until [H-17]. The callable is full-admin gated.\n confirmation: z.literal(SAFETY_ACTIONS_CONFIRMATION),\n })\n .strict();\nexport type SafetyCaseInput = z.infer<typeof SafetyCaseInputSchema>;\n\nexport const ReopenSafetyCaseInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1),\n reasonInternal: z.string().trim().min(4).max(MAX_INTERNAL_REASON_LENGTH),\n expectedRevision: z.number().int().nonnegative().optional(),\n confirmation: z.literal(SAFETY_CASE_REOPEN_CONFIRMATION),\n })\n .strict();\nexport type ReopenSafetyCaseInput = z.infer<typeof ReopenSafetyCaseInputSchema>;\n\n// ---------------------------------------------------------------------------\n// Dead-letter operations — adminReplayDeadLetter + getDeadLetters (Ops Repairs).\n// ---------------------------------------------------------------------------\n\n/** Every ledger the dead-letter replay callable supports. `hallSubItemEdgeSync`\n * rows live at a 4-segment nested path, so their docId IS the full document path\n * (the callable splits it); every other lane is the flat [collection, docId] tuple. */\nexport const DeadLetterCollectionSchema = z.enum([\n 'chatSyncEvents',\n 'chatAdminActionCommands',\n 'notificationDeliveries',\n 'chatMessageOutbox',\n 'squareAnnouncementJobs',\n 'chatSyncFanoutJobs',\n 'mediaAssets',\n 'quarantineSagaJobs',\n 'nciiRemovalJobs',\n 'safetyEvidenceJobs',\n 'accountActionCommands',\n 'activeReportGroups',\n 'hallSubItemEdgeSync',\n]);\nexport type DeadLetterCollection = z.infer<typeof DeadLetterCollectionSchema>;\n\nexport const AdminReplayDeadLetterInputSchema = z\n .object({\n collection: DeadLetterCollectionSchema,\n // Structural id bound (hallSubItemEdgeSync docIds are full nested paths).\n docId: z.string().min(1).max(200),\n reason: z.string().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n dryRun: z.boolean().optional(),\n })\n .strict();\nexport type AdminReplayDeadLetterInput = z.infer<typeof AdminReplayDeadLetterInputSchema>;\n\nexport const GetDeadLettersInputSchema = z\n .object({\n /** Restrict to one ledger; absent = all supported ledgers. */\n collection: DeadLetterCollectionSchema.optional(),\n /** Per-ledger row cap (the callable's own ceiling applies regardless). */\n limit: z.number().int().min(1).max(200).optional(),\n })\n .strict()\n .nullish();\nexport type GetDeadLettersInput = z.infer<typeof GetDeadLettersInputSchema>;\n\n\n"]}
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/schemas/admin.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n violationIdSchema,\n taskIdSchema,\n workProjectIdSchema,\n hallItemIdSchema,\n workProjectTypeSchema,\n} from './atoms.js';\nimport {\n ReportDispositionSchema,\n ReportDispositionReasonCodeSchema,\n refineReportDispositionReasonCode,\n refineReportDispositionEvidenceRefs,\n type ReportableItemType,\n} from '../doc-schemas/safety/foundation.js';\nimport {\n ChildSafetyAccountRoleSchema,\n ChildSafetyAccountSubjectDispositionSchema,\n} from '../doc-schemas/safety/case.js';\nimport {\n ContentMediaKindSchema,\n MediaServingStatusSchema,\n} from '../doc-schemas/media-assets.js';\nimport { MAX_MANIFEST_NCMEC_RECEIPTS } from '../doc-schemas/safety/evidence.js';\nimport {\n MODERATION_CLEARABLE_TEXT_FIELDS,\n HALL_CLEARABLE_TEXT_FIELD_NAMES,\n} from '../constants/business-content.js';\nimport {\n MAX_WORK_PROJECT_TITLE_LENGTH,\n MAX_ADMIN_DISPATCH_SUBJECT_LENGTH,\n MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH,\n MAX_INTERNAL_REASON_LENGTH,\n MAX_USER_FACING_REASON_LENGTH,\n MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH,\n MAX_SAFETY_ADMIN_NOTE_LENGTH,\n MAX_FUTURE_PLAN_TITLE_LENGTH,\n MAX_FUTURE_PLAN_DESCRIPTION_LENGTH,\n MAX_PLATFORM_RULE_TITLE_LENGTH,\n MAX_PLATFORM_RULE_DESCRIPTION_LENGTH,\n MAX_AGREEMENT_POINT_LENGTH,\n MAX_CONTENT_PAGE_HEADING_LENGTH,\n MAX_CONTENT_PAGE_BODY_LENGTH,\n MAX_TAKE_IT_DOWN_COPY_LENGTH,\n MAX_MAINTENANCE_MESSAGE_LENGTH,\n MAX_APPEAL_REVIEW_NOTES_LENGTH,\n MAX_REQUIRE_RETITLE_REASON_LENGTH,\n MAX_USER_FACING_REASON_DETAIL_LENGTH,\n} from '../constants/business.js';\nimport {\n SAFETY_ACTIONS_CONFIRMATION,\n SAFETY_CASE_REOPEN_CONFIRMATION,\n} from '../constants/safety-confirmation-phrases.js';\n\nexport const CheckoutNextImportantTaskInputSchema = z.object({}).strict();\nexport type CheckoutNextImportantTaskInput = z.infer<typeof CheckoutNextImportantTaskInputSchema>;\n\nexport const GetContentViolationInputSchema = z.object({\n violationId: violationIdSchema,\n}).strict();\nexport type GetContentViolationInput = z.infer<typeof GetContentViolationInputSchema>;\n\n// `taskType` was removed — the server derives it from the task doc; the client copy was\n// ignored (and forgeable). Callers pass only the task id + the extension window.\nexport const MarkWorkLaterInputSchema = z.object({\n taskId: taskIdSchema,\n extendHours: z.union([z.literal(24), z.literal(48)]),\n}).strict();\nexport type MarkWorkLaterInput = z.infer<typeof MarkWorkLaterInputSchema>;\n\n/** The two appeal-review decisions (ONE canonical declaration — shared by the review\n * input and its authoritative result). */\nexport const ContentAppealDecisionSchema = z.enum(['approved', 'denied']);\nexport type ContentAppealDecision = z.infer<typeof ContentAppealDecisionSchema>;\n\nexport const ReviewContentAppealInputSchema = z.object({\n violationId: violationIdSchema,\n taskId: taskIdSchema,\n decision: ContentAppealDecisionSchema,\n adminNotes: z.string().max(MAX_APPEAL_REVIEW_NOTES_LENGTH),\n}).strict();\nexport type ReviewContentAppealInput = z.infer<typeof ReviewContentAppealInputSchema>;\n\n// Authoritative result of reviewContentAppeal. Non-strict (server → client posture).\nexport const ReviewContentAppealResultSchema = z.object({\n success: z.literal(true),\n violationId: violationIdSchema,\n /** Echo of the requested decision (always known — it is the input). */\n decision: ContentAppealDecisionSchema,\n /** The appealing user's uid ('' on the orphaned-task cleanup path, where the\n * underlying violation was already gone and only the stale task was cleared). */\n userId: z.string(),\n /** Operation-receipt audit id — the `admin.contentAppealReviewed` event written in the same\n * transaction. Optional/additive so an older backend that omits it still type-checks. */\n auditEventId: z.string().min(1).optional(),\n});\nexport type ReviewContentAppealResult = z.infer<typeof ReviewContentAppealResultSchema>;\n\n// --- System-doc admin updates ---\n\nconst FuturePlanItemSchema = z.object({\n id: z.string().min(1).max(128),\n title: z.string().min(1).max(MAX_FUTURE_PLAN_TITLE_LENGTH),\n description: z.string().min(1).max(MAX_FUTURE_PLAN_DESCRIPTION_LENGTH),\n order: z.number().int().min(0),\n videoUrl: z.string().url().max(2048).optional(),\n mediaType: z.enum(['video', 'image', 'audio', 'other']).optional(),\n}).strict();\n\nexport const UpdateFuturePlansInputSchema = z.object({\n plans: z.array(FuturePlanItemSchema).max(200),\n}).strict();\nexport type UpdateFuturePlansInput = z.infer<typeof UpdateFuturePlansInputSchema>;\n\nconst RuleSchema = z.object({\n id: z.string().min(1).max(128),\n title: z.string().min(1).max(MAX_PLATFORM_RULE_TITLE_LENGTH),\n description: z.string().min(1).max(MAX_PLATFORM_RULE_DESCRIPTION_LENGTH),\n videoUrl: z.string().url().max(2048).optional(),\n group: z.enum(['generic', 'workProjectType', 'hallWingType', 'workRealm', 'merchandising']).optional(),\n subgroup: z.enum(['Tales', 'Tunes', 'Television', 'entertainment', 'educational', 'newsPolitical']).optional(),\n order: z.number().int().min(0),\n}).strict();\n\nconst AgreementCategorySchema = z.object({\n points: z.array(z.string().min(1).max(MAX_AGREEMENT_POINT_LENGTH)).max(200),\n videoUrl: z.string().url().max(2048).optional(),\n}).strict();\n\nconst AgreementsSchema = z.object({\n tales: AgreementCategorySchema.optional(),\n tunes: AgreementCategorySchema.optional(),\n television: AgreementCategorySchema.optional(),\n}).strict();\n\n// Partial update — admin UI may send only `rules` or only `agreements`.\n// Server merges. At least one field must be present.\nexport const UpdateRulesAndAgreementsInputSchema = z.object({\n rules: z.array(RuleSchema).max(500).optional(),\n agreements: AgreementsSchema.optional(),\n}).strict().refine(\n (data) => data.rules !== undefined || data.agreements !== undefined,\n { message: 'At least one of `rules` or `agreements` must be provided.' },\n);\nexport type UpdateRulesAndAgreementsInput = z.infer<typeof UpdateRulesAndAgreementsInputSchema>;\n\n// --- Content-pages migration (DJ ruling 2026-07-06): per-page update callables ---\n// One callable per page (never a `kind` discriminator): updateTermsPage /\n// updatePrivacyPage / updateTakeItDownPageCopy. The client NEVER sends `version`\n// — the server bumps it atomically on every save.\n\nconst ContentPageSectionInputSchema = z.object({\n id: z.string().min(1).max(128),\n heading: z.string().min(1).max(MAX_CONTENT_PAGE_HEADING_LENGTH),\n level: z.union([z.literal(1), z.literal(2)]),\n // Empty body is LEGAL: a bare divider heading (e.g. terms \"Part 1 — Our\n // Intention\") is real content. The input schema must accept everything the\n // stored ContentPageSectionSchema accepts, or a faithfully-seeded doc becomes\n // unsaveable in the admin editor (found by adversarial review 2026-07-06).\n body: z.string().max(MAX_CONTENT_PAGE_BODY_LENGTH),\n order: z.number().int().min(0),\n}).strict();\n\nexport const UpdateTermsPageInputSchema = z.object({\n sections: z.array(ContentPageSectionInputSchema).min(1).max(300),\n}).strict();\nexport type UpdateTermsPageInput = z.infer<typeof UpdateTermsPageInputSchema>;\n\nexport const UpdatePrivacyPageInputSchema = z.object({\n sections: z.array(ContentPageSectionInputSchema).min(1).max(300),\n}).strict();\nexport type UpdatePrivacyPageInput = z.infer<typeof UpdatePrivacyPageInputSchema>;\n\nexport const UpdateTakeItDownPageCopyInputSchema = z.object({\n strings: z.record(z.string().min(1).max(128), z.string().min(1).max(MAX_TAKE_IT_DOWN_COPY_LENGTH)),\n}).strict().refine(\n (data) => {\n const count = Object.keys(data.strings).length;\n return count >= 1 && count <= 200;\n },\n { message: 'strings must contain between 1 and 200 entries.' },\n);\nexport type UpdateTakeItDownPageCopyInput = z.infer<typeof UpdateTakeItDownPageCopyInputSchema>;\n\nconst AppConfigDocIdSchema = z.literal('app');\n\nexport const UpdateAppConfigInputSchema = z.object({\n docId: AppConfigDocIdSchema,\n data: z.object({\n appVersion: z.string().min(1).max(64).optional(),\n maintenanceMode: z.boolean().optional(),\n maintenanceMessage: z.string().max(MAX_MAINTENANCE_MESSAGE_LENGTH).optional(),\n registrationEnabled: z.boolean().optional(),\n // Runtime abuse throttle: 0 < m <= 1 (tighten-only; 1 = no throttle).\n rateLimitMultiplier: z.number().gt(0).max(1).optional(),\n }).strict().refine(\n (d) => Object.keys(d).length > 0,\n { message: 'data must have at least one field' },\n ),\n}).strict();\nexport type UpdateAppConfigInput = z.infer<typeof UpdateAppConfigInputSchema>;\n\n// --- Admin list mutations ---\n\nconst uidSchema = z.string().min(1).max(128);\n\n/**\n * Wire input for the `updateAdminList` callable in ttt-prod.\n * Used to grant or revoke admin / jrAdmin status on `_systemData/adminList`.\n *\n * All four fields are optional arrays of UIDs. At least one must be non-empty.\n * The callable's core function rejects conflicting input (e.g. same UID in\n * both addAdmins and removeAdmins) with HttpsError invalid-argument.\n */\nexport const UpdateAdminListInputSchema = z.object({\n addAdmins: z.array(uidSchema).optional(),\n removeAdmins: z.array(uidSchema).optional(),\n addJrAdmins: z.array(uidSchema).optional(),\n removeJrAdmins: z.array(uidSchema).optional(),\n})\n .strict()\n .refine(\n (data) =>\n (data.addAdmins?.length ?? 0) +\n (data.removeAdmins?.length ?? 0) +\n (data.addJrAdmins?.length ?? 0) +\n (data.removeJrAdmins?.length ?? 0) >\n 0,\n { message: 'At least one of addAdmins/removeAdmins/addJrAdmins/removeJrAdmins must be non-empty.' },\n );\n\nexport type UpdateAdminListInput = z.infer<typeof UpdateAdminListInputSchema>;\n\n// Authoritative result of updateAdminList — the grant/revoke delta counts computed inside\n// the roster transaction (uids already in their target state are no-ops and not counted).\n// Non-strict (server → client result posture).\nexport const UpdateAdminListResultSchema = z.object({\n success: z.literal(true),\n adminsGranted: z.number().int().nonnegative(),\n adminsRevoked: z.number().int().nonnegative(),\n jrAdminsGranted: z.number().int().nonnegative(),\n jrAdminsRevoked: z.number().int().nonnegative(),\n /** Operation-receipt audit id — the `admin.systemRoleGranted` / `admin.systemRoleRevoked`\n * event(s) key off the same roster transaction. Optional/additive. (No single domain id: a\n * roster edit spans multiple uids, so only the audit id is a meaningful receipt handle.) */\n auditEventId: z.string().min(1).optional(),\n});\nexport type UpdateAdminListResult = z.infer<typeof UpdateAdminListResultSchema>;\n\n// --- Admin moderation: hide / restore / retitle content + Work/Realm objects ---\n\nexport const CheckTrademarkInputSchema = z.object({\n // Primary: the work project's title (franchise-level check).\n workTitle: z.string().min(1).max(MAX_WORK_PROJECT_TITLE_LENGTH),\n // Optional: the sub-item title (chapter, track, episode). Checked secondarily.\n // `.nullish()` (not `.optional()`): the Firebase callable client serializes an\n // undefined argument as JSON null, and the work-view caller passes\n // `subItemTitle: subItem?.title` which is undefined when the sub-item hasn't\n // loaded — that arrives here as null. A bare `.optional()` would 400 on it.\n subItemTitle: z.string().max(MAX_WORK_PROJECT_TITLE_LENGTH).nullish(),\n}).strict();\nexport type CheckTrademarkInput = z.infer<typeof CheckTrademarkInputSchema>;\n\nexport const GetReportedContentDetailInputSchema = z.object({\n reportGroupId: z.string().min(1),\n}).strict();\nexport type GetReportedContentDetailInput = z.infer<typeof GetReportedContentDetailInputSchema>;\n\n// --- getReportedContentDetail result (cross-boundary: produced by the callable in functions/,\n// consumed by the admin report work-view) ---\n\n/** One display-text field of the reported doc, labeled for the review panel. The server returns\n * EVERY configured non-empty text field for the item type (title, description, body, …) in\n * display order — never just the first non-empty one. */\nexport const ReportedTextFieldSchema = z.object({\n /** Raw doc field name (e.g. 'description', 'workingTitle'). */\n field: z.string().min(1),\n /** Human label the panel renders (e.g. 'Description', 'Title'). */\n label: z.string().min(1),\n /** Current live value, trimmed; empty fields are omitted from the array. */\n value: z.string().min(1),\n});\nexport type ReportedTextField = z.infer<typeof ReportedTextFieldSchema>;\n\n/** One media asset referenced by the reported content: id + kind + current serving state\n * (for click-to-reveal) + the server-derived variant key the reveal must request. */\nexport const ReportedMediaAssetSchema = z.object({\n mediaAssetId: z.string().min(1),\n mediaKind: ContentMediaKindSchema.nullable(),\n servingStatus: MediaServingStatusSchema.nullable(),\n /** The variant key the reveal must request for its single display render (image origins split\n * between 'full' and 'main'; video/audio are always 'main'). Null when the asset doc is\n * missing/variant-less. */\n displayVariantKey: z.string().nullable(),\n /** Human label of WHAT this asset is on the reported item (e.g. 'Square cover',\n * 'Track photo — <title>'). Null when the server cannot derive one. */\n label: z.string().nullable(),\n});\nexport type ReportedMediaAsset = z.infer<typeof ReportedMediaAssetSchema>;\n\nexport const GetReportedContentDetailResultSchema = z.object({\n itemType: z.string().min(1),\n reportedItemId: z.string().min(1),\n /** First non-empty display-text field (legacy single-field snapshot; textFields is the\n * complete labeled set). */\n textSnapshot: z.string().nullable(),\n textFields: z.array(ReportedTextFieldSchema),\n mediaAssets: z.array(ReportedMediaAssetSchema),\n /** Whether the reported doc is currently hidden (best-effort, doc-flag based). */\n isHidden: z.boolean().nullable(),\n /** The content owner / uploader uid, when derivable. */\n ownerUid: z.string().nullable(),\n /** The FROZEN report-time snapshot (captured at intake), so the operator sees what was\n * reported even if the author edited the live doc to evade. Null for older reports. */\n reportTimeSnapshot: z.object({\n capturedText: z.string().nullable(),\n capturedMediaAssetIds: z.array(z.string()),\n revision: z.number().nullable(),\n capturedAt: z.number().nullable(),\n }).nullable(),\n});\nexport type GetReportedContentDetailResult = z.infer<typeof GetReportedContentDetailResultSchema>;\n\nexport const HideHallSubItemInputSchema = z.object({\n hallItemId: hallItemIdSchema,\n workProjectType: workProjectTypeSchema,\n subItemId: z.string().min(1),\n reason: z.string().min(1),\n}).strict();\nexport type HideHallSubItemInput = z.infer<typeof HideHallSubItemInputSchema>;\n\nexport const RestoreHallSubItemInputSchema = z.object({\n hallItemId: hallItemIdSchema,\n workProjectType: workProjectTypeSchema,\n subItemId: z.string().min(1),\n}).strict();\nexport type RestoreHallSubItemInput = z.infer<typeof RestoreHallSubItemInputSchema>;\n\nexport const HideWorkProjectInputSchema = z.object({\n workProjectId: workProjectIdSchema,\n reason: z.string().min(1),\n}).strict();\nexport type HideWorkProjectInput = z.infer<typeof HideWorkProjectInputSchema>;\n\nexport const HideWorkRealmInputSchema = z.object({\n workRealmId: z.string().min(1),\n reason: z.string().min(1),\n}).strict();\nexport type HideWorkRealmInput = z.infer<typeof HideWorkRealmInputSchema>;\n\n// `cascadeId` is OPTIONAL: the app backends derive all active cascades for the target when it is\n// omitted, and restore just that one cascade when it is supplied.\nexport const RestoreWorkProjectInputSchema = z.object({\n workProjectId: workProjectIdSchema,\n cascadeId: z.string().min(1).optional(),\n}).strict();\nexport type RestoreWorkProjectInput = z.infer<typeof RestoreWorkProjectInputSchema>;\n\nexport const RestoreWorkRealmInputSchema = z.object({\n workRealmId: z.string().min(1),\n cascadeId: z.string().min(1).optional(),\n}).strict();\nexport type RestoreWorkRealmInput = z.infer<typeof RestoreWorkRealmInputSchema>;\n\n// The `requireWorkProjectRetitle` / `requireWorkRealmRetitle` callables share this base\n// `{ reason }` shape and each `.extend(...)` it with its own id field at parse time.\nexport const RequireRetitleInputSchema = z.object({\n reason: z.string().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type RequireRetitleInput = z.infer<typeof RequireRetitleInputSchema>;\n\n// --- Page-level \"Clear text (moderation)\" callables (per-field extension of the retitle family) ---\n\n// The clearable SHELL fields (raw doc field names) for the workProject + workRealm contexts.\n// Derived from the canonical clearable-field map — the two shell surfaces share the same fields.\nconst ModerationShellClearFieldSchema = z.enum(MODERATION_CLEARABLE_TEXT_FIELDS.workProject);\nexport type ModerationShellClearField = z.infer<typeof ModerationShellClearFieldSchema>;\n\nexport const ClearWorkProjectTextInputSchema = z.object({\n workProjectId: workProjectIdSchema,\n fields: z.array(ModerationShellClearFieldSchema).min(1),\n reason: z.string().trim().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type ClearWorkProjectTextInput = z.infer<typeof ClearWorkProjectTextInputSchema>;\n\nexport const ClearWorkRealmTextInputSchema = z.object({\n workRealmId: z.string().min(1),\n fields: z.array(ModerationShellClearFieldSchema).min(1),\n reason: z.string().trim().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type ClearWorkRealmTextInput = z.infer<typeof ClearWorkRealmTextInputSchema>;\n\n// The clearable TEXT fields across the whole hall content family — derived from the canonical\n// map (union of every hall surface's fields), never restated literals.\nconst HallClearFieldSchema = z.enum(HALL_CLEARABLE_TEXT_FIELD_NAMES);\nexport type HallClearField = z.infer<typeof HallClearFieldSchema>;\n\nexport const ClearHallContentTextInputSchema = z.object({\n hallItemId: hallItemIdSchema,\n workProjectType: workProjectTypeSchema,\n subItemId: z.string().min(1).optional(),\n fields: z.array(HallClearFieldSchema).min(1),\n reason: z.string().trim().min(1).max(MAX_REQUIRE_RETITLE_REASON_LENGTH),\n}).strict();\nexport type ClearHallContentTextInput = z.infer<typeof ClearHallContentTextInputSchema>;\n\n// --- getLatestHideCascade — resolve the latest hide-cascade id for a Work/Realm ---\n\nexport const GetLatestHideCascadeInputSchema = z.object({\n entityId: z.string().min(1),\n targetType: z.enum(['work-project', 'work-realm']),\n}).strict();\nexport type GetLatestHideCascadeInput = z.infer<typeof GetLatestHideCascadeInputSchema>;\n\n// --- moderateReportedContent — hide / restore / soft perma-remove an individual reported item ---\n\n// The single-item content-action target set (SUBSET of ReportableItemType — excludes the\n// close-out-only hall-library-sub-item). `admin-work-message` is allowlisted for this file in\n// the definition-redeclaration guard.\nconst MODERATE_REPORTED_CONTENT_TARGET_TYPES = [\n 'square-streetz-post',\n 'audition',\n 'audition-entry',\n 'commission-listing',\n 'commission-proposal',\n 'work-asset',\n 'profile-picture',\n 'hall-library-item',\n 'craft-skill',\n 'admin-work-message',\n] as const satisfies readonly ReportableItemType[];\n\nexport const ModerateReportedContentInputSchema = z.object({\n reportGroupId: z.string().min(1),\n targetType: z.enum(MODERATE_REPORTED_CONTENT_TARGET_TYPES),\n reportedItemId: z.string().min(1),\n parentItemId: z.string().min(1).optional(),\n action: z.enum(['hide', 'restore', 'remove']),\n // [EUAS-023] A destructive action (hide/remove) MUST carry a reason; restore is a reversal.\n reason: z.string().trim().min(1).max(MAX_INTERNAL_REASON_LENGTH).optional(),\n})\n .strict()\n .superRefine((val, ctx) => {\n if ((val.action === 'hide' || val.action === 'remove') && !val.reason) {\n ctx.addIssue({\n code: 'custom',\n message: 'A reason is required to hide or remove content.',\n path: ['reason'],\n });\n }\n });\nexport type ModerateReportedContentInput = z.infer<typeof ModerateReportedContentInputSchema>;\n\n// --- resolveAdminTask — the ONE guided close-out for EVERY admin case type ---\n\n// [EUAS-005] The content-action target set ALSO accepts hall-library-sub-item (hide/restore only),\n// which routes to the dedicated `runSetHallSubItemHidden` core (not `runModerateReportedContent`).\nconst CONTENT_ACTION_TARGET_TYPES = [\n 'square-streetz-post',\n 'audition',\n 'audition-entry',\n 'commission-listing',\n 'commission-proposal',\n 'work-asset',\n 'profile-picture',\n 'hall-library-item',\n 'craft-skill',\n 'hall-library-sub-item',\n // Work-party admin correspondence message — single-doc `hidden` flip via\n // `runModerateReportedContent` (tombstone rendering in the thread views).\n 'admin-work-message',\n] as const satisfies readonly ReportableItemType[];\n\nconst ContentActionSchema = z\n .object({\n button: z.enum(['hideContent', 'restoreContent', 'permaRemoveContent']),\n targetType: z.enum(CONTENT_ACTION_TARGET_TYPES),\n reportedItemId: z.string().min(1),\n parentItemId: z.string().min(1).optional(),\n })\n .strict();\n\nconst WarnUserSchema = z\n .object({\n button: z.literal('warnUser'),\n userId: z.string().min(1),\n // A warning IS an admin dispatch (resolveAdminTask → runCreateAdminDispatchToUser),\n // so it shares the dispatch subject/body caps.\n subject: z.string().trim().min(1).max(MAX_ADMIN_DISPATCH_SUBJECT_LENGTH),\n message: z.string().trim().min(1).max(MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH),\n })\n .strict();\n\nconst SuspendOrBanSchema = z\n .object({\n button: z.enum(['suspendUser', 'banUser']),\n userId: z.string().min(1),\n reason: z.string().trim().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n })\n .strict();\n\nconst ReinstateUserSchema = z\n .object({ button: z.literal('reinstateUser'), userId: z.string().min(1), reason: z.string().trim().max(MAX_INTERNAL_REASON_LENGTH).optional() })\n .strict();\n\nconst ForceUsernameResetSchema = z\n .object({ button: z.literal('forceUsernameReset'), userId: z.string().min(1), reason: z.string().trim().min(1).max(MAX_INTERNAL_REASON_LENGTH).optional() })\n .strict();\n\n/** Whole-object Work/Realm remedies — `reportedItemId` is the workProjectId / workRealmId. */\nconst WorkObjectActionSchema = z\n .object({\n button: z.enum(['hideWorkObject', 'restoreWorkObject', 'forceRetitle']),\n targetType: z.enum(['work-project', 'work-realm']),\n reportedItemId: z.string().min(1),\n })\n .strict();\n\n/** Chat message tombstone — channel + seq from the report, revision from the live thread-read. */\nconst TombstoneChatSchema = z\n .object({\n button: z.literal('tombstoneChat'),\n channel: z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('channel'), workProjectId: z.string().min(1), guildChatChannelId: z.string().min(1) }).strict(),\n z.object({ kind: z.literal('invite'), guildInviteId: z.string().min(1) }).strict(),\n ]),\n messageSeq: z.number().int().nonnegative(),\n expectedMessageRevision: z.number().int().nonnegative(),\n })\n .strict();\n\nexport const StagedActionSchema = z.discriminatedUnion('button', [\n ContentActionSchema,\n WarnUserSchema,\n SuspendOrBanSchema,\n ReinstateUserSchema,\n ForceUsernameResetSchema,\n WorkObjectActionSchema,\n TombstoneChatSchema,\n]);\nexport type StagedAction = z.infer<typeof StagedActionSchema>;\n\nexport const NormalReportInputSchema = z\n .object({\n caseType: z.literal('normalReport').default('normalReport'),\n taskId: z.string().min(1),\n outcome: z.enum(['founded', 'unfounded']),\n resolutionSummary: z.string().trim().min(1).max(MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH),\n actions: z.array(StagedActionSchema).max(16).default([]),\n userFacingReasonCode: z.string().trim().min(1).max(128).optional(),\n userFacingReasonDetail: z.string().trim().max(MAX_USER_FACING_REASON_DETAIL_LENGTH).optional(),\n adminNote: z.string().trim().max(MAX_SAFETY_ADMIN_NOTE_LENGTH).optional(),\n })\n .strict();\nexport type ResolveAdminTaskInput = z.infer<typeof NormalReportInputSchema>;\n\nconst SafetyDispositionActionSchema = z\n .object({\n button: z.literal('setReportDisposition'),\n // Derived from the ONE canonical disposition enum — 'undetermined' is the initial\n // state, never an operator-settable target, so it is excluded (not re-declared).\n disposition: ReportDispositionSchema.exclude(['undetermined']),\n dispositionReasonCode: ReportDispositionReasonCodeSchema,\n // Derived from the ONE receipts-cap constant (doc-schemas/safety/evidence.ts) — the same\n // bound the callable + the embedded SetReportDispositionInputV1Schema use. No field-level min:\n // the reportRequired⇒non-empty rule lives in the shared cross-field refinement below, so every\n // other disposition may legally stage this action with no evidence revealed.\n evidenceRefs: z.array(z.string().min(1)).max(MAX_MANIFEST_NCMEC_RECEIPTS),\n expectedRevision: z.number().int().nonnegative(),\n })\n .strict();\n\nconst QuarantineActionSchema = z.object({ button: z.literal('quarantinePreserveFile') }).strict();\n\n// [C-01/EUAS-002] No client-supplied requestId — the linked statutory request id(s) are derived\n// SERVER-SIDE from the case's `requestLinks` inside `enqueueNciiRemovalForCase`.\nconst HashRemoveActionSchema = z.object({ button: z.literal('hashRemoveFile') }).strict();\n\nconst SafetyAccountActionSchema = z\n .object({\n button: z.enum(['suspendUser', 'banUser', 'reinstateUser']),\n targetUid: z.string().min(1),\n reasonInternal: z.string().trim().min(4).max(MAX_INTERNAL_REASON_LENGTH),\n reasonUserFacing: z.string().trim().min(1).max(MAX_USER_FACING_REASON_LENGTH),\n role: ChildSafetyAccountRoleSchema,\n subjectDisposition: ChildSafetyAccountSubjectDispositionSchema,\n })\n .strict();\n\nexport const SafetyStagedActionSchema = z\n .discriminatedUnion('button', [\n SafetyDispositionActionSchema,\n QuarantineActionSchema,\n HashRemoveActionSchema,\n SafetyAccountActionSchema,\n ])\n // The setReportDisposition arm reuses the ONE canonical cross-field rules (foundation.ts) via the\n // shared refinements — never re-declaring them here: the disposition↔reason pairing AND the\n // reportRequired⇒evidence-present rule. Other arms carry no such fields.\n .superRefine((value, ctx) => {\n if (value.button === 'setReportDisposition') {\n refineReportDispositionReasonCode(value, ctx);\n refineReportDispositionEvidenceRefs(value, ctx);\n }\n });\nexport type SafetyStagedAction = z.infer<typeof SafetyStagedActionSchema>;\n\nexport const SafetyCaseInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1),\n outcome: z.enum(['founded', 'unfounded']),\n resolutionSummary: z.string().trim().min(1).max(MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH),\n actions: z.array(SafetyStagedActionSchema).max(16).default([]),\n adminNote: z.string().trim().max(MAX_SAFETY_ADMIN_NOTE_LENGTH).optional(),\n // [EUAS-017] Optimistic-concurrency token (`childSafetyCaseList.revision` / `nciiCases.revision`).\n // The close is rejected if the case changed since the operator loaded it — concurrent stale closes\n // can't silently overwrite. Optional for backward compatibility; the console always supplies it.\n expectedRevision: z.number().int().nonnegative().optional(),\n // Interim reauth: a single explicit typed confirmation for the privileged safety actions,\n // standing in for the passkey two-step until [H-17]. The callable is full-admin gated.\n confirmation: z.literal(SAFETY_ACTIONS_CONFIRMATION),\n })\n .strict();\nexport type SafetyCaseInput = z.infer<typeof SafetyCaseInputSchema>;\n\nexport const ReopenSafetyCaseInputSchema = z\n .object({\n caseType: z.enum(['csam', 'ncii']),\n caseId: z.string().min(1),\n reasonInternal: z.string().trim().min(4).max(MAX_INTERNAL_REASON_LENGTH),\n expectedRevision: z.number().int().nonnegative().optional(),\n confirmation: z.literal(SAFETY_CASE_REOPEN_CONFIRMATION),\n })\n .strict();\nexport type ReopenSafetyCaseInput = z.infer<typeof ReopenSafetyCaseInputSchema>;\n\n// ---------------------------------------------------------------------------\n// Dead-letter operations — adminReplayDeadLetter + getDeadLetters (Ops Repairs).\n// ---------------------------------------------------------------------------\n\n/** Every ledger the dead-letter replay callable supports. `hallSubItemEdgeSync`\n * rows live at a 4-segment nested path, so their docId IS the full document path\n * (the callable splits it); every other lane is the flat [collection, docId] tuple. */\nexport const DeadLetterCollectionSchema = z.enum([\n 'chatSyncEvents',\n 'chatAdminActionCommands',\n 'notificationDeliveries',\n 'chatMessageOutbox',\n 'squareAnnouncementJobs',\n 'chatSyncFanoutJobs',\n 'mediaAssets',\n 'quarantineSagaJobs',\n 'nciiRemovalJobs',\n 'safetyEvidenceJobs',\n 'accountActionCommands',\n 'activeReportGroups',\n 'hallSubItemEdgeSync',\n]);\nexport type DeadLetterCollection = z.infer<typeof DeadLetterCollectionSchema>;\n\nexport const AdminReplayDeadLetterInputSchema = z\n .object({\n collection: DeadLetterCollectionSchema,\n // Structural id bound (hallSubItemEdgeSync docIds are full nested paths).\n docId: z.string().min(1).max(200),\n reason: z.string().min(1).max(MAX_INTERNAL_REASON_LENGTH),\n dryRun: z.boolean().optional(),\n })\n .strict();\nexport type AdminReplayDeadLetterInput = z.infer<typeof AdminReplayDeadLetterInputSchema>;\n\nexport const GetDeadLettersInputSchema = z\n .object({\n /** Restrict to one ledger; absent = all supported ledgers. */\n collection: DeadLetterCollectionSchema.optional(),\n /** Per-ledger row cap (the callable's own ceiling applies regardless). */\n limit: z.number().int().min(1).max(200).optional(),\n })\n .strict()\n .nullish();\nexport type GetDeadLettersInput = z.infer<typeof GetDeadLettersInputSchema>;\n\n\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ttt-productions/ttt-core",
|
|
3
|
-
"version": "0.78.
|
|
3
|
+
"version": "0.78.17",
|
|
4
4
|
"description": "Core types, Firestore path constants, and shared constants for TTT Productions",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -60,6 +60,14 @@
|
|
|
60
60
|
"types": "./dist/constants/storage-keys.d.ts",
|
|
61
61
|
"default": "./dist/constants/storage-keys.js"
|
|
62
62
|
},
|
|
63
|
+
"./constants/company-mascots": {
|
|
64
|
+
"types": "./dist/constants/company-mascots.d.ts",
|
|
65
|
+
"default": "./dist/constants/company-mascots.js"
|
|
66
|
+
},
|
|
67
|
+
"./constants/center-stage-rooms": {
|
|
68
|
+
"types": "./dist/constants/center-stage-rooms.d.ts",
|
|
69
|
+
"default": "./dist/constants/center-stage-rooms.js"
|
|
70
|
+
},
|
|
63
71
|
"./utils": {
|
|
64
72
|
"types": "./dist/utils/index.d.ts",
|
|
65
73
|
"default": "./dist/utils/index.js"
|