@ttt-productions/ttt-core 0.79.48 → 0.79.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/constants/business-admin.d.ts +7 -0
  2. package/dist/constants/business-admin.d.ts.map +1 -1
  3. package/dist/constants/business-admin.js +7 -0
  4. package/dist/constants/business-admin.js.map +1 -1
  5. package/dist/constants/craft-skill-statements.d.ts +20 -0
  6. package/dist/constants/craft-skill-statements.d.ts.map +1 -1
  7. package/dist/constants/craft-skill-statements.js +25 -9
  8. package/dist/constants/craft-skill-statements.js.map +1 -1
  9. package/dist/constants/index.d.ts +3 -0
  10. package/dist/constants/index.d.ts.map +1 -1
  11. package/dist/constants/index.js +3 -0
  12. package/dist/constants/index.js.map +1 -1
  13. package/dist/constants/legal-review-notice-state.d.ts +5 -0
  14. package/dist/constants/legal-review-notice-state.d.ts.map +1 -0
  15. package/dist/constants/legal-review-notice-state.js +19 -0
  16. package/dist/constants/legal-review-notice-state.js.map +1 -0
  17. package/dist/constants/legal-review-notice.d.ts +105 -0
  18. package/dist/constants/legal-review-notice.d.ts.map +1 -0
  19. package/dist/constants/legal-review-notice.js +174 -0
  20. package/dist/constants/legal-review-notice.js.map +1 -0
  21. package/dist/constants/public-documents.d.ts +27 -0
  22. package/dist/constants/public-documents.d.ts.map +1 -0
  23. package/dist/constants/public-documents.js +55 -0
  24. package/dist/constants/public-documents.js.map +1 -0
  25. package/dist/doc-schemas/content.d.ts +56 -0
  26. package/dist/doc-schemas/content.d.ts.map +1 -1
  27. package/dist/doc-schemas/content.js +34 -0
  28. package/dist/doc-schemas/content.js.map +1 -1
  29. package/dist/doc-schemas/index.d.ts +2 -0
  30. package/dist/doc-schemas/index.d.ts.map +1 -1
  31. package/dist/doc-schemas/index.js +2 -0
  32. package/dist/doc-schemas/index.js.map +1 -1
  33. package/dist/doc-schemas/legal-review-notice.d.ts +8 -0
  34. package/dist/doc-schemas/legal-review-notice.d.ts.map +1 -0
  35. package/dist/doc-schemas/legal-review-notice.js +14 -0
  36. package/dist/doc-schemas/legal-review-notice.js.map +1 -0
  37. package/dist/doc-schemas/ncii/config.d.ts +1 -5
  38. package/dist/doc-schemas/ncii/config.d.ts.map +1 -1
  39. package/dist/doc-schemas/ncii/config.js +8 -19
  40. package/dist/doc-schemas/ncii/config.js.map +1 -1
  41. package/dist/doc-schemas/operational.d.ts +47 -2
  42. package/dist/doc-schemas/operational.d.ts.map +1 -1
  43. package/dist/doc-schemas/operational.js +32 -7
  44. package/dist/doc-schemas/operational.js.map +1 -1
  45. package/dist/doc-schemas/payments.d.ts +4 -0
  46. package/dist/doc-schemas/payments.d.ts.map +1 -1
  47. package/dist/doc-schemas/payments.js +6 -0
  48. package/dist/doc-schemas/payments.js.map +1 -1
  49. package/dist/doc-schemas/public-documents.d.ts +677 -0
  50. package/dist/doc-schemas/public-documents.d.ts.map +1 -0
  51. package/dist/doc-schemas/public-documents.js +158 -0
  52. package/dist/doc-schemas/public-documents.js.map +1 -0
  53. package/dist/doc-schemas/registry.d.ts +351 -29
  54. package/dist/doc-schemas/registry.d.ts.map +1 -1
  55. package/dist/doc-schemas/registry.js +8 -1
  56. package/dist/doc-schemas/registry.js.map +1 -1
  57. package/dist/doc-schemas/safety/case.d.ts +3 -3
  58. package/dist/doc-schemas/system.d.ts +14 -0
  59. package/dist/doc-schemas/system.d.ts.map +1 -1
  60. package/dist/doc-schemas/system.js +7 -0
  61. package/dist/doc-schemas/system.js.map +1 -1
  62. package/dist/doc-schemas/user.d.ts +14 -1
  63. package/dist/doc-schemas/user.d.ts.map +1 -1
  64. package/dist/doc-schemas/user.js +13 -7
  65. package/dist/doc-schemas/user.js.map +1 -1
  66. package/dist/media/domain-events-admin.d.ts +0 -6
  67. package/dist/media/domain-events-admin.d.ts.map +1 -1
  68. package/dist/media/domain-events-admin.js +0 -10
  69. package/dist/media/domain-events-admin.js.map +1 -1
  70. package/dist/media/domain-events.d.ts +0 -5
  71. package/dist/media/domain-events.d.ts.map +1 -1
  72. package/dist/media/domain-events.js +1 -2
  73. package/dist/media/domain-events.js.map +1 -1
  74. package/dist/media/pending-media.d.ts +0 -55
  75. package/dist/media/pending-media.d.ts.map +1 -1
  76. package/dist/paths/collection-refs.d.ts +2 -0
  77. package/dist/paths/collection-refs.d.ts.map +1 -1
  78. package/dist/paths/collection-refs.js +3 -0
  79. package/dist/paths/collection-refs.js.map +1 -1
  80. package/dist/paths/collections.d.ts +5 -0
  81. package/dist/paths/collections.d.ts.map +1 -1
  82. package/dist/paths/collections.js +14 -0
  83. package/dist/paths/collections.js.map +1 -1
  84. package/dist/paths/path-builders.d.ts +8 -0
  85. package/dist/paths/path-builders.d.ts.map +1 -1
  86. package/dist/paths/path-builders.js +17 -0
  87. package/dist/paths/path-builders.js.map +1 -1
  88. package/dist/schemas/admin.d.ts +119 -42
  89. package/dist/schemas/admin.d.ts.map +1 -1
  90. package/dist/schemas/admin.js +49 -30
  91. package/dist/schemas/admin.js.map +1 -1
  92. package/dist/schemas/atoms.d.ts +8 -0
  93. package/dist/schemas/atoms.d.ts.map +1 -1
  94. package/dist/schemas/atoms.js +8 -0
  95. package/dist/schemas/atoms.js.map +1 -1
  96. package/dist/schemas/hall-library.d.ts +1 -0
  97. package/dist/schemas/hall-library.d.ts.map +1 -1
  98. package/dist/schemas/hall-library.js +6 -1
  99. package/dist/schemas/hall-library.js.map +1 -1
  100. package/dist/schemas/index.d.ts +1 -0
  101. package/dist/schemas/index.d.ts.map +1 -1
  102. package/dist/schemas/index.js +1 -0
  103. package/dist/schemas/index.js.map +1 -1
  104. package/dist/schemas/notification.d.ts +1 -1
  105. package/dist/schemas/payments.d.ts +1 -0
  106. package/dist/schemas/payments.d.ts.map +1 -1
  107. package/dist/schemas/payments.js +5 -0
  108. package/dist/schemas/payments.js.map +1 -1
  109. package/dist/schemas/public-documents.d.ts +399 -0
  110. package/dist/schemas/public-documents.d.ts.map +1 -0
  111. package/dist/schemas/public-documents.js +147 -0
  112. package/dist/schemas/public-documents.js.map +1 -0
  113. package/dist/schemas/safety.d.ts +1 -1
  114. package/dist/schemas/utility.d.ts +2 -0
  115. package/dist/schemas/utility.d.ts.map +1 -1
  116. package/dist/schemas/utility.js +5 -2
  117. package/dist/schemas/utility.js.map +1 -1
  118. package/dist/types/audit.d.ts +1 -1
  119. package/dist/types/audit.d.ts.map +1 -1
  120. package/dist/types/audit.js.map +1 -1
  121. package/dist/types/index.d.ts +1 -0
  122. package/dist/types/index.d.ts.map +1 -1
  123. package/dist/types/index.js +1 -0
  124. package/dist/types/index.js.map +1 -1
  125. package/dist/types/public-documents.d.ts +3 -0
  126. package/dist/types/public-documents.d.ts.map +1 -0
  127. package/dist/types/public-documents.js +2 -0
  128. package/dist/types/public-documents.js.map +1 -0
  129. package/dist/types/system.d.ts +3 -3
  130. package/dist/types/system.js.map +1 -1
  131. package/dist/utils/index.d.ts +1 -0
  132. package/dist/utils/index.d.ts.map +1 -1
  133. package/dist/utils/index.js +1 -0
  134. package/dist/utils/index.js.map +1 -1
  135. package/dist/utils/public-documents.d.ts +77 -0
  136. package/dist/utils/public-documents.d.ts.map +1 -0
  137. package/dist/utils/public-documents.js +163 -0
  138. package/dist/utils/public-documents.js.map +1 -0
  139. package/package.json +4 -4
@@ -84,7 +84,14 @@ export declare const MAX_PLATFORM_RULE_DESCRIPTION_LENGTH = 4000;
84
84
  export declare const MAX_AGREEMENT_POINT_LENGTH = 2000;
85
85
  export declare const MAX_CONTENT_PAGE_HEADING_LENGTH = 300;
86
86
  export declare const MAX_CONTENT_PAGE_BODY_LENGTH = 20000;
87
+ /** Sections in one long-form content page (Terms, Privacy, the DMCA policy's process text). */
88
+ export declare const MAX_CONTENT_PAGE_SECTIONS = 300;
87
89
  export declare const MAX_TAKE_IT_DOWN_COPY_LENGTH = 8000;
90
+ /** DMCA policy page: the labeled contact blocks (service provider, designated agent) and their rows. */
91
+ export declare const MAX_DMCA_CONTACT_BLOCKS = 10;
92
+ export declare const MAX_DMCA_CONTACT_ROWS = 20;
93
+ export declare const MAX_DMCA_CONTACT_LABEL_LENGTH = 100;
94
+ export declare const MAX_DMCA_CONTACT_VALUE_LENGTH = 500;
88
95
  export declare const MAX_MAINTENANCE_MESSAGE_LENGTH = 2000;
89
96
  /** Announcement-banner copy on `_appConfig/app.announcementMessage`. Deliberately far
90
97
  * shorter than the maintenance message: the announcement renders as a one-line banner
@@ -1 +1 @@
1
- {"version":3,"file":"business-admin.d.ts","sourceRoot":"","sources":["../../src/constants/business-admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"business-admin.d.ts","sourceRoot":"","sources":["../../src/constants/business-admin.ts"],"names":[],"mappings":"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"}
@@ -99,7 +99,14 @@ export const MAX_PLATFORM_RULE_DESCRIPTION_LENGTH = 4000;
99
99
  export const MAX_AGREEMENT_POINT_LENGTH = 2000;
100
100
  export const MAX_CONTENT_PAGE_HEADING_LENGTH = 300;
101
101
  export const MAX_CONTENT_PAGE_BODY_LENGTH = 20000;
102
+ /** Sections in one long-form content page (Terms, Privacy, the DMCA policy's process text). */
103
+ export const MAX_CONTENT_PAGE_SECTIONS = 300;
102
104
  export const MAX_TAKE_IT_DOWN_COPY_LENGTH = 8000;
105
+ /** DMCA policy page: the labeled contact blocks (service provider, designated agent) and their rows. */
106
+ export const MAX_DMCA_CONTACT_BLOCKS = 10;
107
+ export const MAX_DMCA_CONTACT_ROWS = 20;
108
+ export const MAX_DMCA_CONTACT_LABEL_LENGTH = 100;
109
+ export const MAX_DMCA_CONTACT_VALUE_LENGTH = 500;
103
110
  export const MAX_MAINTENANCE_MESSAGE_LENGTH = 2000;
104
111
  /** Announcement-banner copy on `_appConfig/app.announcementMessage`. Deliberately far
105
112
  * shorter than the maintenance message: the announcement renders as a one-line banner
@@ -1 +1 @@
1
- {"version":3,"file":"business-admin.js","sourceRoot":"","sources":["../../src/constants/business-admin.ts"],"names":[],"mappings":"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","sourcesContent":["// Admin + content-moderation business-rule constants — task priority, dispatches,\n// the moderation/feedback workflow, and admin-task lifecycle.\nimport { ACTIVE_LIMITS } from './app-mode.js';\n\n// --- Admin Task Priority System ---\n\nexport const TASK_PRIORITY = {\n CRITICAL: 4,\n HIGH: 3,\n NORMAL: 2,\n LOW: 1,\n} as const;\n\nexport type TaskPriorityLevel = (typeof TASK_PRIORITY)[keyof typeof TASK_PRIORITY];\n\nexport const TASK_PRIORITY_LABELS = {\n 4: 'CRITICAL',\n 3: 'HIGH',\n 2: 'NORMAL',\n 1: 'LOW',\n} as const;\n\n/**\n * Canonical NUMERIC priority scale for `adminTasks.priority`, shared by BOTH\n * priority systems so `checkoutNextImportantTask` (orderBy priority desc across all\n * task types) compares commensurable values. The userReport report-core score formula\n * already writes on this scale (≈40–2250); the level-based types (thresholdLibraryReview,\n * content-appeal, adminDispatch) map their TASK_PRIORITY level onto these numbers instead\n * of writing the raw 1–4.\n *\n * Resulting order: safety reports (1200–2250) > money anomalies (1100) >\n * CRITICAL (1000) > HIGH (800) > routine reports interleave below > spam-tier (~80).\n */\nexport const TASK_PRIORITY_SCORE = {\n LOW: 50,\n NORMAL: 200,\n HIGH: 800,\n CRITICAL: 1000,\n /** Money-integrity anomaly (stake-share / pledge-ledger corruption signal) — outranks\n * everything except safety-class reports. The three anomaly creators that previously\n * hardcoded `priority: 1` (LOW) all write this. */\n MONEY_ANOMALY: 1100,\n} as const;\n\nexport type TaskPriorityScore = (typeof TASK_PRIORITY_SCORE)[keyof typeof TASK_PRIORITY_SCORE];\n\n/** Maps a level-based TASK_PRIORITY value (1–4) to its canonical numeric score. */\nexport const TASK_PRIORITY_LEVEL_TO_SCORE = {\n [TASK_PRIORITY.LOW]: TASK_PRIORITY_SCORE.LOW,\n [TASK_PRIORITY.NORMAL]: TASK_PRIORITY_SCORE.NORMAL,\n [TASK_PRIORITY.HIGH]: TASK_PRIORITY_SCORE.HIGH,\n [TASK_PRIORITY.CRITICAL]: TASK_PRIORITY_SCORE.CRITICAL,\n} as const;\n\n// --- Admin Dispatches ---\n\n/** Maximum length for an admin-dispatch subject line. */\nexport const MAX_ADMIN_DISPATCH_SUBJECT_LENGTH = 100;\n\n/** Maximum length for the initial body text of an admin dispatch. */\nexport const MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH = 1000;\n\n// --- Content Moderation Workflow ---\n\n/** Maximum length for a content-violation appeal message. */\nexport const MAX_APPEAL_MESSAGE_LENGTH = 1000;\n\n/** Threshold-review reviewer notes (revision notes shown to the author). One owner for\n * the review callable schema AND the admin work-view input. */\nexport const MAX_THRESHOLD_REVIEW_NOTES_LENGTH = 2000;\n\n/** Operator-facing reason stamped on a threshold item whose publish parked terminally\n * (`publishParkedReason`). Server-authored text, bounded so a long copy-failure message\n * cannot grow the doc without limit. */\nexport const MAX_THRESHOLD_PUBLISH_PARKED_REASON_LENGTH = 2000;\n\n// --- Moderation / safety operator text caps ---\n// Each is declared ONCE here and derived by every input schema AND persisted doc schema\n// that carries the field — the numbers must never be re-hardcoded at an enforcement point.\n\n/** Operator-facing INTERNAL reason/rationale (LE-loggable; account actions, case reopens). */\nexport const MAX_INTERNAL_REASON_LENGTH = 2000;\n\n/** The generic owner-readable (user-facing) reason — deliberately short, no detail leaks. */\nexport const MAX_USER_FACING_REASON_LENGTH = 280;\n\n/** Structured close-out summary on report/safety-case resolutions. */\nexport const MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH = 2000;\n\n/** Optional operator note attached to a close-out. */\nexport const MAX_SAFETY_ADMIN_NOTE_LENGTH = 4000;\n\n// --- Report intake text caps ---\n\n/** Reporter free-text narrative/comment (segregated private doc; never on the root). */\nexport const MAX_REPORT_NARRATIVE_LENGTH = 4000;\n\n/** The report DIALOG's comment field cap (the client-side compose bound — tighter than\n * the server narrative cap above, which also absorbs upgrade concatenations). */\nexport const MAX_REPORT_COMMENT_LENGTH = 1000;\n\n/** Minimum operator rationale/reason length on safety-console staged actions. */\nexport const MIN_SAFETY_RATIONALE_LENGTH = 10;\n\n/** Operator reason on an admin chat-moderation action (adminModerateChatMessage /\n * adminReadChannelContext). ONE owner for both callables' `reason` bound. */\nexport const MAX_CHAT_MODERATION_REASON_LENGTH = 1000;\n\n/** Broadcast explicitUids selector audience cap (schema + composer both derive). */\nexport const MAX_BROADCAST_EXPLICIT_UIDS = 2000;\n\n// --- Operator step-up sentinel error codes ---\n// The two backend HttpsError messages the operator TOTP step-up throws; the frontend\n// matches them to open the step-up dialog in ENROLL vs VERIFY mode. ONE declaration —\n// both the callable (functions operatorStepUp.ts) and the frontend hook import these.\nexport const STEP_UP_ENROLL_REQUIRED = 'OPERATOR_STEP_UP_ENROLL_REQUIRED';\nexport const STEP_UP_REQUIRED = 'OPERATOR_STEP_UP_REQUIRED';\n\n/** The frozen report-time captured text snapshot (edit-to-evade guard; NO PII). */\nexport const MAX_REPORT_SNAPSHOT_TEXT_LENGTH = 4000;\n\n// --- Admin console config-content text caps ---\n// Every number the system uses lives HERE — even a field only one surface consumes\n// today, because any future client (TV / phone / admin app) reads ttt-core.\n\nexport const MAX_FUTURE_PLAN_TITLE_LENGTH = 200;\nexport const MAX_FUTURE_PLAN_DESCRIPTION_LENGTH = 4000;\nexport const MAX_PLATFORM_RULE_TITLE_LENGTH = 200;\nexport const MAX_PLATFORM_RULE_DESCRIPTION_LENGTH = 4000;\nexport const MAX_AGREEMENT_POINT_LENGTH = 2000;\nexport const MAX_CONTENT_PAGE_HEADING_LENGTH = 300;\nexport const MAX_CONTENT_PAGE_BODY_LENGTH = 20000;\nexport const MAX_TAKE_IT_DOWN_COPY_LENGTH = 8000;\nexport const MAX_MAINTENANCE_MESSAGE_LENGTH = 2000;\n\n/** Announcement-banner copy on `_appConfig/app.announcementMessage`. Deliberately far\n * shorter than the maintenance message: the announcement renders as a one-line banner\n * on the landing page and login screen, not a full-page takeover. */\nexport const MAX_ANNOUNCEMENT_MESSAGE_LENGTH = 300;\n\n/** Admin notes on a content-appeal review (reviewContentAppeal). */\nexport const MAX_APPEAL_REVIEW_NOTES_LENGTH = 2000;\n\n/** Admin reason on a Work/Realm forced-retitle remedy. */\nexport const MAX_REQUIRE_RETITLE_REASON_LENGTH = 500;\n\n/** Optional user-facing DETAIL text on a normal-report resolution. */\nexport const MAX_USER_FACING_REASON_DETAIL_LENGTH = 2000;\n\n/** Admin broadcast / user notification message body. */\nexport const MAX_NOTIFICATION_MESSAGE_LENGTH = 2000;\n\n/** Admin user-search query input. */\nexport const MAX_USER_SEARCH_QUERY_LENGTH = 100;\n\n// --- NCII / child-safety statutory + operator text caps ---\n\n/** Operator reason on the admin \"mark as NCII linked evidence\" intake. */\nexport const MAX_NCII_EVIDENCE_REASON_LENGTH = 1000;\n\n/** Operator written rationale on a TAKE IT DOWN validity decision (immutable row). */\nexport const MAX_NCII_RATIONALE_LENGTH = 4000;\n\n/** Requester's statement of nonconsent (statutory intake — in-app and no-login). */\nexport const MAX_NCII_NONCONSENT_STATEMENT_LENGTH = 4000;\n\n/** Typed-name electronic signature on a statutory request. */\nexport const MAX_NCII_SIGNED_NAME_LENGTH = 256;\n\n/** Requester's optional supporting facts (statutory intake). */\nexport const MAX_NCII_SUPPORTING_FACTS_LENGTH = 8000;\n\n/** Bounded, non-sensitive summary on an NCII request action row. */\nexport const MAX_NCII_ACTION_SUMMARY_LENGTH = 280;\n\n/** Operator description of a registered evidence artifact (e.g. portal screenshot). */\nexport const MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH = 500;\n\n/** Operator proof note on a manual NCMEC portal filing. */\nexport const MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH = 2000;\n\n/** Requester's typed name on the no-login TAKE IT DOWN statutory intake. */\nexport const MAX_NCII_REQUESTER_NAME_LENGTH = 256;\n\n/** Name of the depicted person a representative files on behalf of. */\nexport const MAX_NCII_REPRESENTED_PERSON_NAME_LENGTH = 256;\n\n/** Representative's stated basis of authority (parent/guardian/counsel etc.). */\nexport const MAX_NCII_AUTHORITY_BASIS_LENGTH = 2000;\n\n/** Optional pointer/reference to authority evidence supplied by a representative. */\nexport const MAX_NCII_AUTHORITY_EVIDENCE_REF_LENGTH = 512;\n\n/** Maximum length for a feedback suggestion. */\nexport const MAX_FEEDBACK_SUGGESTION_LENGTH = 100;\n\n/** Maximum number of distinct submitters tracked per feedback suggestion. Mode-varied. */\nexport const MAX_FEEDBACK_SUBMITTERS = ACTIVE_LIMITS.batches.maxFeedbackSubmitters;\n\n/**\n * Canonical list of feedback types accepted by `submitFeedback`. Used both\n * for runtime validation in the schema (`SubmitFeedbackInputSchema`) and\n * for type-safe consumer props on the frontend `<FeedbackSubmission />`\n * component. Adding a new type here is the single source of truth — no\n * mirroring in callers required.\n */\nexport const FEEDBACK_TYPES = [\n 'tradeProfessionSuggestions',\n 'craftSkillTagSuggestions',\n 'talesWorkGenreSuggestions',\n 'tunesWorkGenreSuggestions',\n 'televisionWorkGenreSuggestions',\n] as const;\n\n/** Union of canonical feedback types. */\nexport type FeedbackType = (typeof FEEDBACK_TYPES)[number];\n\n/** Maximum number of items submitted in a single hallLibrary-review submission. Mode-varied. */\nexport const MAX_HALL_LIBRARY_SUBMIT_BATCH = ACTIVE_LIMITS.hall.maxSubmitBatch;\n\n// --- Admin Tasks ---\n\n/** Admin task lifecycle statuses. */\nexport const ADMIN_TASK_STATUS = {\n PENDING: 'pending',\n CHECKED_OUT: 'checkedOut',\n WORK_LATER: 'workLater',\n COMPLETED: 'completed',\n} as const;\n"]}
1
+ {"version":3,"file":"business-admin.js","sourceRoot":"","sources":["../../src/constants/business-admin.ts"],"names":[],"mappings":"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","sourcesContent":["// Admin + content-moderation business-rule constants — task priority, dispatches,\n// the moderation/feedback workflow, and admin-task lifecycle.\nimport { ACTIVE_LIMITS } from './app-mode.js';\n\n// --- Admin Task Priority System ---\n\nexport const TASK_PRIORITY = {\n CRITICAL: 4,\n HIGH: 3,\n NORMAL: 2,\n LOW: 1,\n} as const;\n\nexport type TaskPriorityLevel = (typeof TASK_PRIORITY)[keyof typeof TASK_PRIORITY];\n\nexport const TASK_PRIORITY_LABELS = {\n 4: 'CRITICAL',\n 3: 'HIGH',\n 2: 'NORMAL',\n 1: 'LOW',\n} as const;\n\n/**\n * Canonical NUMERIC priority scale for `adminTasks.priority`, shared by BOTH\n * priority systems so `checkoutNextImportantTask` (orderBy priority desc across all\n * task types) compares commensurable values. The userReport report-core score formula\n * already writes on this scale (≈40–2250); the level-based types (thresholdLibraryReview,\n * content-appeal, adminDispatch) map their TASK_PRIORITY level onto these numbers instead\n * of writing the raw 1–4.\n *\n * Resulting order: safety reports (1200–2250) > money anomalies (1100) >\n * CRITICAL (1000) > HIGH (800) > routine reports interleave below > spam-tier (~80).\n */\nexport const TASK_PRIORITY_SCORE = {\n LOW: 50,\n NORMAL: 200,\n HIGH: 800,\n CRITICAL: 1000,\n /** Money-integrity anomaly (stake-share / pledge-ledger corruption signal) — outranks\n * everything except safety-class reports. The three anomaly creators that previously\n * hardcoded `priority: 1` (LOW) all write this. */\n MONEY_ANOMALY: 1100,\n} as const;\n\nexport type TaskPriorityScore = (typeof TASK_PRIORITY_SCORE)[keyof typeof TASK_PRIORITY_SCORE];\n\n/** Maps a level-based TASK_PRIORITY value (1–4) to its canonical numeric score. */\nexport const TASK_PRIORITY_LEVEL_TO_SCORE = {\n [TASK_PRIORITY.LOW]: TASK_PRIORITY_SCORE.LOW,\n [TASK_PRIORITY.NORMAL]: TASK_PRIORITY_SCORE.NORMAL,\n [TASK_PRIORITY.HIGH]: TASK_PRIORITY_SCORE.HIGH,\n [TASK_PRIORITY.CRITICAL]: TASK_PRIORITY_SCORE.CRITICAL,\n} as const;\n\n// --- Admin Dispatches ---\n\n/** Maximum length for an admin-dispatch subject line. */\nexport const MAX_ADMIN_DISPATCH_SUBJECT_LENGTH = 100;\n\n/** Maximum length for the initial body text of an admin dispatch. */\nexport const MAX_ADMIN_DISPATCH_INITIAL_TEXT_LENGTH = 1000;\n\n// --- Content Moderation Workflow ---\n\n/** Maximum length for a content-violation appeal message. */\nexport const MAX_APPEAL_MESSAGE_LENGTH = 1000;\n\n/** Threshold-review reviewer notes (revision notes shown to the author). One owner for\n * the review callable schema AND the admin work-view input. */\nexport const MAX_THRESHOLD_REVIEW_NOTES_LENGTH = 2000;\n\n/** Operator-facing reason stamped on a threshold item whose publish parked terminally\n * (`publishParkedReason`). Server-authored text, bounded so a long copy-failure message\n * cannot grow the doc without limit. */\nexport const MAX_THRESHOLD_PUBLISH_PARKED_REASON_LENGTH = 2000;\n\n// --- Moderation / safety operator text caps ---\n// Each is declared ONCE here and derived by every input schema AND persisted doc schema\n// that carries the field — the numbers must never be re-hardcoded at an enforcement point.\n\n/** Operator-facing INTERNAL reason/rationale (LE-loggable; account actions, case reopens). */\nexport const MAX_INTERNAL_REASON_LENGTH = 2000;\n\n/** The generic owner-readable (user-facing) reason — deliberately short, no detail leaks. */\nexport const MAX_USER_FACING_REASON_LENGTH = 280;\n\n/** Structured close-out summary on report/safety-case resolutions. */\nexport const MAX_SAFETY_RESOLUTION_SUMMARY_LENGTH = 2000;\n\n/** Optional operator note attached to a close-out. */\nexport const MAX_SAFETY_ADMIN_NOTE_LENGTH = 4000;\n\n// --- Report intake text caps ---\n\n/** Reporter free-text narrative/comment (segregated private doc; never on the root). */\nexport const MAX_REPORT_NARRATIVE_LENGTH = 4000;\n\n/** The report DIALOG's comment field cap (the client-side compose bound — tighter than\n * the server narrative cap above, which also absorbs upgrade concatenations). */\nexport const MAX_REPORT_COMMENT_LENGTH = 1000;\n\n/** Minimum operator rationale/reason length on safety-console staged actions. */\nexport const MIN_SAFETY_RATIONALE_LENGTH = 10;\n\n/** Operator reason on an admin chat-moderation action (adminModerateChatMessage /\n * adminReadChannelContext). ONE owner for both callables' `reason` bound. */\nexport const MAX_CHAT_MODERATION_REASON_LENGTH = 1000;\n\n/** Broadcast explicitUids selector audience cap (schema + composer both derive). */\nexport const MAX_BROADCAST_EXPLICIT_UIDS = 2000;\n\n// --- Operator step-up sentinel error codes ---\n// The two backend HttpsError messages the operator TOTP step-up throws; the frontend\n// matches them to open the step-up dialog in ENROLL vs VERIFY mode. ONE declaration —\n// both the callable (functions operatorStepUp.ts) and the frontend hook import these.\nexport const STEP_UP_ENROLL_REQUIRED = 'OPERATOR_STEP_UP_ENROLL_REQUIRED';\nexport const STEP_UP_REQUIRED = 'OPERATOR_STEP_UP_REQUIRED';\n\n/** The frozen report-time captured text snapshot (edit-to-evade guard; NO PII). */\nexport const MAX_REPORT_SNAPSHOT_TEXT_LENGTH = 4000;\n\n// --- Admin console config-content text caps ---\n// Every number the system uses lives HERE — even a field only one surface consumes\n// today, because any future client (TV / phone / admin app) reads ttt-core.\n\nexport const MAX_FUTURE_PLAN_TITLE_LENGTH = 200;\nexport const MAX_FUTURE_PLAN_DESCRIPTION_LENGTH = 4000;\nexport const MAX_PLATFORM_RULE_TITLE_LENGTH = 200;\nexport const MAX_PLATFORM_RULE_DESCRIPTION_LENGTH = 4000;\nexport const MAX_AGREEMENT_POINT_LENGTH = 2000;\nexport const MAX_CONTENT_PAGE_HEADING_LENGTH = 300;\nexport const MAX_CONTENT_PAGE_BODY_LENGTH = 20000;\n/** Sections in one long-form content page (Terms, Privacy, the DMCA policy's process text). */\nexport const MAX_CONTENT_PAGE_SECTIONS = 300;\nexport const MAX_TAKE_IT_DOWN_COPY_LENGTH = 8000;\n/** DMCA policy page: the labeled contact blocks (service provider, designated agent) and their rows. */\nexport const MAX_DMCA_CONTACT_BLOCKS = 10;\nexport const MAX_DMCA_CONTACT_ROWS = 20;\nexport const MAX_DMCA_CONTACT_LABEL_LENGTH = 100;\nexport const MAX_DMCA_CONTACT_VALUE_LENGTH = 500;\nexport const MAX_MAINTENANCE_MESSAGE_LENGTH = 2000;\n\n/** Announcement-banner copy on `_appConfig/app.announcementMessage`. Deliberately far\n * shorter than the maintenance message: the announcement renders as a one-line banner\n * on the landing page and login screen, not a full-page takeover. */\nexport const MAX_ANNOUNCEMENT_MESSAGE_LENGTH = 300;\n\n/** Admin notes on a content-appeal review (reviewContentAppeal). */\nexport const MAX_APPEAL_REVIEW_NOTES_LENGTH = 2000;\n\n/** Admin reason on a Work/Realm forced-retitle remedy. */\nexport const MAX_REQUIRE_RETITLE_REASON_LENGTH = 500;\n\n/** Optional user-facing DETAIL text on a normal-report resolution. */\nexport const MAX_USER_FACING_REASON_DETAIL_LENGTH = 2000;\n\n/** Admin broadcast / user notification message body. */\nexport const MAX_NOTIFICATION_MESSAGE_LENGTH = 2000;\n\n/** Admin user-search query input. */\nexport const MAX_USER_SEARCH_QUERY_LENGTH = 100;\n\n// --- NCII / child-safety statutory + operator text caps ---\n\n/** Operator reason on the admin \"mark as NCII linked evidence\" intake. */\nexport const MAX_NCII_EVIDENCE_REASON_LENGTH = 1000;\n\n/** Operator written rationale on a TAKE IT DOWN validity decision (immutable row). */\nexport const MAX_NCII_RATIONALE_LENGTH = 4000;\n\n/** Requester's statement of nonconsent (statutory intake — in-app and no-login). */\nexport const MAX_NCII_NONCONSENT_STATEMENT_LENGTH = 4000;\n\n/** Typed-name electronic signature on a statutory request. */\nexport const MAX_NCII_SIGNED_NAME_LENGTH = 256;\n\n/** Requester's optional supporting facts (statutory intake). */\nexport const MAX_NCII_SUPPORTING_FACTS_LENGTH = 8000;\n\n/** Bounded, non-sensitive summary on an NCII request action row. */\nexport const MAX_NCII_ACTION_SUMMARY_LENGTH = 280;\n\n/** Operator description of a registered evidence artifact (e.g. portal screenshot). */\nexport const MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH = 500;\n\n/** Operator proof note on a manual NCMEC portal filing. */\nexport const MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH = 2000;\n\n/** Requester's typed name on the no-login TAKE IT DOWN statutory intake. */\nexport const MAX_NCII_REQUESTER_NAME_LENGTH = 256;\n\n/** Name of the depicted person a representative files on behalf of. */\nexport const MAX_NCII_REPRESENTED_PERSON_NAME_LENGTH = 256;\n\n/** Representative's stated basis of authority (parent/guardian/counsel etc.). */\nexport const MAX_NCII_AUTHORITY_BASIS_LENGTH = 2000;\n\n/** Optional pointer/reference to authority evidence supplied by a representative. */\nexport const MAX_NCII_AUTHORITY_EVIDENCE_REF_LENGTH = 512;\n\n/** Maximum length for a feedback suggestion. */\nexport const MAX_FEEDBACK_SUGGESTION_LENGTH = 100;\n\n/** Maximum number of distinct submitters tracked per feedback suggestion. Mode-varied. */\nexport const MAX_FEEDBACK_SUBMITTERS = ACTIVE_LIMITS.batches.maxFeedbackSubmitters;\n\n/**\n * Canonical list of feedback types accepted by `submitFeedback`. Used both\n * for runtime validation in the schema (`SubmitFeedbackInputSchema`) and\n * for type-safe consumer props on the frontend `<FeedbackSubmission />`\n * component. Adding a new type here is the single source of truth — no\n * mirroring in callers required.\n */\nexport const FEEDBACK_TYPES = [\n 'tradeProfessionSuggestions',\n 'craftSkillTagSuggestions',\n 'talesWorkGenreSuggestions',\n 'tunesWorkGenreSuggestions',\n 'televisionWorkGenreSuggestions',\n] as const;\n\n/** Union of canonical feedback types. */\nexport type FeedbackType = (typeof FEEDBACK_TYPES)[number];\n\n/** Maximum number of items submitted in a single hallLibrary-review submission. Mode-varied. */\nexport const MAX_HALL_LIBRARY_SUBMIT_BATCH = ACTIVE_LIMITS.hall.maxSubmitBatch;\n\n// --- Admin Tasks ---\n\n/** Admin task lifecycle statuses. */\nexport const ADMIN_TASK_STATUS = {\n PENDING: 'pending',\n CHECKED_OUT: 'checkedOut',\n WORK_LATER: 'workLater',\n COMPLETED: 'completed',\n} as const;\n"]}
@@ -7,4 +7,24 @@ export declare const CRAFT_SKILL_KIND_LABELS: Record<CraftSkillKind, string>;
7
7
  export declare const CRAFT_SKILL_KIND_DESCRIPTIONS: Record<CraftSkillKind, string>;
8
8
  export declare const CRAFT_SKILL_STATEMENTS: Record<CraftSkillKind, string>;
9
9
  export declare const CRAFT_SKILL_KIND_ORDER: CraftSkillKind[];
10
+ /**
11
+ * Why "Mimicked work from outside TTT Productions" cannot be chosen yet: the picker shows it
12
+ * when a person selects that kind, and the upload callable refuses the kind with the same words.
13
+ */
14
+ export declare const CRAFT_SKILL_MIMIC_OFF_TTT_UNAVAILABLE_MESSAGE = "This option isn't available yet: sharing covers or recreations of work from outside TTT needs legal review first.";
15
+ /**
16
+ * The ONE owner of which craft kinds are blocked at launch, with each one's refusal copy. A
17
+ * blocked kind still renders in the picker (so people see it is coming) but selecting it stops
18
+ * the flow with this copy, and the upload callable refuses it with the same words. Unblocking a
19
+ * kind is removing its entry here.
20
+ */
21
+ export declare const CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES: {
22
+ readonly mimicOffTtt: "This option isn't available yet: sharing covers or recreations of work from outside TTT needs legal review first.";
23
+ };
24
+ /** A craft kind that is blocked at launch. */
25
+ export type BlockedCraftSkillKind = keyof typeof CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES;
26
+ /** Every craft kind blocked at launch — derived from the refusal copy, never restated. */
27
+ export declare const BLOCKED_CRAFT_SKILL_KINDS: readonly BlockedCraftSkillKind[];
28
+ /** True when `kind` is blocked at launch; narrows it to index its refusal copy. */
29
+ export declare function isBlockedCraftSkillKind(kind: CraftSkillKind): kind is BlockedCraftSkillKind;
10
30
  //# sourceMappingURL=craft-skill-statements.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"craft-skill-statements.d.ts","sourceRoot":"","sources":["../../src/constants/craft-skill-statements.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D;kEACkE;AAClE,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAIlE,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAIxE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAOjE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAA8C,CAAC"}
1
+ {"version":3,"file":"craft-skill-statements.d.ts","sourceRoot":"","sources":["../../src/constants/craft-skill-statements.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D;kEACkE;AAClE,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAIlE,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAIxE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAOjE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAA8C,CAAC;AAElG;;;GAGG;AACH,eAAO,MAAM,6CAA6C,sHAC2D,CAAC;AAEtH;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC;;CAEU,CAAC;AAE7D,8CAA8C;AAC9C,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,qCAAqC,CAAC;AAEvF,0FAA0F;AAC1F,eAAO,MAAM,yBAAyB,EAEjC,SAAS,qBAAqB,EAAE,CAAC;AAEtC,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,IAAI,qBAAqB,CAE3F"}
@@ -1,14 +1,10 @@
1
1
  // ============================================================================
2
2
  // CRAFT-SKILL ATTESTATION — the ONE home for the three-kind upload flow's
3
- // statement version, VERBATIM agreement statements (v1, wording agreed with DJ
4
- // 2026-07-04), kind labels/descriptions, and picker order. Consolidated here
5
- // 2026-07-13 from the former "keep identical" pair in ttt-prod
6
- // `src/lib/craft-skill-statements.ts` (live frontend copy) and
7
- // `functions/src/craft-skills/craftSkillUploadContract.ts` (dead backend
8
- // mirror). The client displays these and the user must explicitly agree before
9
- // the file picker unlocks; the backend records only `{ statementKind,
10
- // statementVersion, agreedAt }` and validates the version against
11
- // CRAFT_SKILL_STATEMENT_VERSION.
3
+ // statement version, VERBATIM agreement statements, kind labels/descriptions,
4
+ // picker order, and the refusal copy for a kind that is not available yet. The
5
+ // client displays these and the user must explicitly agree before the file
6
+ // picker unlocks; the backend records only `{ statementKind, statementVersion,
7
+ // agreedAt }` and validates the version against CRAFT_SKILL_STATEMENT_VERSION.
12
8
  // ============================================================================
13
9
  /** Bump when any VERBATIM statement below changes; the version is recorded on every
14
10
  * craft-skill doc so we know which wording the user agreed to. */
@@ -30,4 +26,24 @@ export const CRAFT_SKILL_STATEMENTS = {
30
26
  mimicOffTtt: 'This craft skill is my performance or recreation of a work that did not originate on TTT Productions (including public-domain or out-of-copyright works), shown only to demonstrate my abilities. The underlying work belongs to its owner, and I claim no ownership of it. I understand TTT Productions may remove this content at any time, including in response to a rights-holder request.',
31
27
  };
32
28
  export const CRAFT_SKILL_KIND_ORDER = ['original', 'mimicOnTtt', 'mimicOffTtt'];
29
+ /**
30
+ * Why "Mimicked work from outside TTT Productions" cannot be chosen yet: the picker shows it
31
+ * when a person selects that kind, and the upload callable refuses the kind with the same words.
32
+ */
33
+ export const CRAFT_SKILL_MIMIC_OFF_TTT_UNAVAILABLE_MESSAGE = "This option isn't available yet: sharing covers or recreations of work from outside TTT needs legal review first.";
34
+ /**
35
+ * The ONE owner of which craft kinds are blocked at launch, with each one's refusal copy. A
36
+ * blocked kind still renders in the picker (so people see it is coming) but selecting it stops
37
+ * the flow with this copy, and the upload callable refuses it with the same words. Unblocking a
38
+ * kind is removing its entry here.
39
+ */
40
+ export const CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES = {
41
+ mimicOffTtt: CRAFT_SKILL_MIMIC_OFF_TTT_UNAVAILABLE_MESSAGE,
42
+ };
43
+ /** Every craft kind blocked at launch — derived from the refusal copy, never restated. */
44
+ export const BLOCKED_CRAFT_SKILL_KINDS = Object.keys(CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES);
45
+ /** True when `kind` is blocked at launch; narrows it to index its refusal copy. */
46
+ export function isBlockedCraftSkillKind(kind) {
47
+ return Object.prototype.hasOwnProperty.call(CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES, kind);
48
+ }
33
49
  //# sourceMappingURL=craft-skill-statements.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"craft-skill-statements.js","sourceRoot":"","sources":["../../src/constants/craft-skill-statements.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0EAA0E;AAC1E,+EAA+E;AAC/E,6EAA6E;AAC7E,+DAA+D;AAC/D,+DAA+D;AAC/D,yEAAyE;AACzE,+EAA+E;AAC/E,sEAAsE;AACtE,kEAAkE;AAClE,iCAAiC;AACjC,+EAA+E;AAI/E;kEACkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAAmC;IACrE,QAAQ,EAAE,aAAa;IACvB,UAAU,EAAE,oCAAoC;IAChD,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAmC;IAC3E,QAAQ,EAAE,sCAAsC;IAChD,UAAU,EAAE,gFAAgF;IAC5F,WAAW,EAAE,iFAAiF;CAC/F,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAmC;IACpE,QAAQ,EACN,qJAAqJ;IACvJ,UAAU,EACR,oRAAoR;IACtR,WAAW,EACT,iYAAiY;CACpY,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAqB,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC","sourcesContent":["// ============================================================================\n// CRAFT-SKILL ATTESTATION — the ONE home for the three-kind upload flow's\n// statement version, VERBATIM agreement statements (v1, wording agreed with DJ\n// 2026-07-04), kind labels/descriptions, and picker order. Consolidated here\n// 2026-07-13 from the former \"keep identical\" pair in ttt-prod\n// `src/lib/craft-skill-statements.ts` (live frontend copy) and\n// `functions/src/craft-skills/craftSkillUploadContract.ts` (dead backend\n// mirror). The client displays these and the user must explicitly agree before\n// the file picker unlocks; the backend records only `{ statementKind,\n// statementVersion, agreedAt }` and validates the version against\n// CRAFT_SKILL_STATEMENT_VERSION.\n// ============================================================================\n\nimport type { CraftSkillKind } from '../doc-schemas/user.js';\n\n/** Bump when any VERBATIM statement below changes; the version is recorded on every\n * craft-skill doc so we know which wording the user agreed to. */\nexport const CRAFT_SKILL_STATEMENT_VERSION = 1;\n\nexport const CRAFT_SKILL_KIND_LABELS: Record<CraftSkillKind, string> = {\n original: 'My own work',\n mimicOnTtt: 'Mimicked work from TTT Productions',\n mimicOffTtt: 'Mimicked work from outside TTT Productions',\n};\n\n/** One-line helper shown under each kind option in the picker. */\nexport const CRAFT_SKILL_KIND_DESCRIPTIONS: Record<CraftSkillKind, string> = {\n original: 'Entirely your own original creation.',\n mimicOnTtt: 'Your performance or recreation of another member’s TTT work (link the source).',\n mimicOffTtt: 'A cover or recreation of work from outside TTT (including public-domain works).',\n};\n\nexport const CRAFT_SKILL_STATEMENTS: Record<CraftSkillKind, string> = {\n original:\n 'I certify this craft skill is entirely my own original creation and I own all rights to it. No part of it copies or imitates another person’s work.',\n mimicOnTtt:\n 'This craft skill is my performance or recreation of work created by a member of the TTT Productions community, shown here to demonstrate my abilities. I have linked the original artisan or work below. The original work belongs to its creator, and I claim no ownership of it.',\n mimicOffTtt:\n 'This craft skill is my performance or recreation of a work that did not originate on TTT Productions (including public-domain or out-of-copyright works), shown only to demonstrate my abilities. The underlying work belongs to its owner, and I claim no ownership of it. I understand TTT Productions may remove this content at any time, including in response to a rights-holder request.',\n};\n\nexport const CRAFT_SKILL_KIND_ORDER: CraftSkillKind[] = ['original', 'mimicOnTtt', 'mimicOffTtt'];\n"]}
1
+ {"version":3,"file":"craft-skill-statements.js","sourceRoot":"","sources":["../../src/constants/craft-skill-statements.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAI/E;kEACkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,uBAAuB,GAAmC;IACrE,QAAQ,EAAE,aAAa;IACvB,UAAU,EAAE,oCAAoC;IAChD,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAmC;IAC3E,QAAQ,EAAE,sCAAsC;IAChD,UAAU,EAAE,gFAAgF;IAC5F,WAAW,EAAE,iFAAiF;CAC/F,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAmC;IACpE,QAAQ,EACN,qJAAqJ;IACvJ,UAAU,EACR,oRAAoR;IACtR,WAAW,EACT,iYAAiY;CACpY,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAqB,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAElG;;;GAGG;AACH,MAAM,CAAC,MAAM,6CAA6C,GACxD,mHAAmH,CAAC;AAEtH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG;IACnD,WAAW,EAAE,6CAA6C;CACA,CAAC;AAK7D,0FAA0F;AAC1F,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAClD,qCAAqC,CACF,CAAC;AAEtC,mFAAmF;AACnF,MAAM,UAAU,uBAAuB,CAAC,IAAoB;IAC1D,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,qCAAqC,EAAE,IAAI,CAAC,CAAC;AAC3F,CAAC","sourcesContent":["// ============================================================================\n// CRAFT-SKILL ATTESTATION — the ONE home for the three-kind upload flow's\n// statement version, VERBATIM agreement statements, kind labels/descriptions,\n// picker order, and the refusal copy for a kind that is not available yet. The\n// client displays these and the user must explicitly agree before the file\n// picker unlocks; the backend records only `{ statementKind, statementVersion,\n// agreedAt }` and validates the version against CRAFT_SKILL_STATEMENT_VERSION.\n// ============================================================================\n\nimport type { CraftSkillKind } from '../doc-schemas/user.js';\n\n/** Bump when any VERBATIM statement below changes; the version is recorded on every\n * craft-skill doc so we know which wording the user agreed to. */\nexport const CRAFT_SKILL_STATEMENT_VERSION = 1;\n\nexport const CRAFT_SKILL_KIND_LABELS: Record<CraftSkillKind, string> = {\n original: 'My own work',\n mimicOnTtt: 'Mimicked work from TTT Productions',\n mimicOffTtt: 'Mimicked work from outside TTT Productions',\n};\n\n/** One-line helper shown under each kind option in the picker. */\nexport const CRAFT_SKILL_KIND_DESCRIPTIONS: Record<CraftSkillKind, string> = {\n original: 'Entirely your own original creation.',\n mimicOnTtt: 'Your performance or recreation of another member’s TTT work (link the source).',\n mimicOffTtt: 'A cover or recreation of work from outside TTT (including public-domain works).',\n};\n\nexport const CRAFT_SKILL_STATEMENTS: Record<CraftSkillKind, string> = {\n original:\n 'I certify this craft skill is entirely my own original creation and I own all rights to it. No part of it copies or imitates another person’s work.',\n mimicOnTtt:\n 'This craft skill is my performance or recreation of work created by a member of the TTT Productions community, shown here to demonstrate my abilities. I have linked the original artisan or work below. The original work belongs to its creator, and I claim no ownership of it.',\n mimicOffTtt:\n 'This craft skill is my performance or recreation of a work that did not originate on TTT Productions (including public-domain or out-of-copyright works), shown only to demonstrate my abilities. The underlying work belongs to its owner, and I claim no ownership of it. I understand TTT Productions may remove this content at any time, including in response to a rights-holder request.',\n};\n\nexport const CRAFT_SKILL_KIND_ORDER: CraftSkillKind[] = ['original', 'mimicOnTtt', 'mimicOffTtt'];\n\n/**\n * Why \"Mimicked work from outside TTT Productions\" cannot be chosen yet: the picker shows it\n * when a person selects that kind, and the upload callable refuses the kind with the same words.\n */\nexport const CRAFT_SKILL_MIMIC_OFF_TTT_UNAVAILABLE_MESSAGE =\n \"This option isn't available yet: sharing covers or recreations of work from outside TTT needs legal review first.\";\n\n/**\n * The ONE owner of which craft kinds are blocked at launch, with each one's refusal copy. A\n * blocked kind still renders in the picker (so people see it is coming) but selecting it stops\n * the flow with this copy, and the upload callable refuses it with the same words. Unblocking a\n * kind is removing its entry here.\n */\nexport const CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES = {\n mimicOffTtt: CRAFT_SKILL_MIMIC_OFF_TTT_UNAVAILABLE_MESSAGE,\n} as const satisfies Partial<Record<CraftSkillKind, string>>;\n\n/** A craft kind that is blocked at launch. */\nexport type BlockedCraftSkillKind = keyof typeof CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES;\n\n/** Every craft kind blocked at launch — derived from the refusal copy, never restated. */\nexport const BLOCKED_CRAFT_SKILL_KINDS = Object.keys(\n CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES,\n) as readonly BlockedCraftSkillKind[];\n\n/** True when `kind` is blocked at launch; narrows it to index its refusal copy. */\nexport function isBlockedCraftSkillKind(kind: CraftSkillKind): kind is BlockedCraftSkillKind {\n return Object.prototype.hasOwnProperty.call(CRAFT_SKILL_KIND_UNAVAILABLE_MESSAGES, kind);\n}\n"]}
@@ -7,6 +7,9 @@ export * from './options.js';
7
7
  export * from './admin-labels.js';
8
8
  export * from './craft-skill-statements.js';
9
9
  export * from './publish-attestations.js';
10
+ export * from './public-documents.js';
11
+ export * from './legal-review-notice-state.js';
12
+ export * from './legal-review-notice.js';
10
13
  export * from './safety-confirmation-phrases.js';
11
14
  export * from './safety-telemetry-patterns.js';
12
15
  export * from './pagination.js';
@@ -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,yBAAyB,CAAC;AACxC,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,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,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,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,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,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC"}
@@ -7,6 +7,9 @@ export * from './options.js';
7
7
  export * from './admin-labels.js';
8
8
  export * from './craft-skill-statements.js';
9
9
  export * from './publish-attestations.js';
10
+ export * from './public-documents.js';
11
+ export * from './legal-review-notice-state.js';
12
+ export * from './legal-review-notice.js';
10
13
  export * from './safety-confirmation-phrases.js';
11
14
  export * from './safety-telemetry-patterns.js';
12
15
  export * from './pagination.js';
@@ -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,yBAAyB,CAAC;AACxC,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,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,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 './conversation-files.js';\nexport * from './moderation.js';\nexport * from './options.js';\nexport * from './admin-labels.js';\nexport * from './craft-skill-statements.js';\nexport * from './publish-attestations.js';\nexport * from './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 './media-download.js';\nexport * from './media-processing.js';\nexport * from './storage-keys.js';\nexport * from './company-mascots.js';\nexport * from './center-stage-rooms.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,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,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,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,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 './conversation-files.js';\nexport * from './moderation.js';\nexport * from './options.js';\nexport * from './admin-labels.js';\nexport * from './craft-skill-statements.js';\nexport * from './publish-attestations.js';\nexport * from './public-documents.js';\nexport * from './legal-review-notice-state.js';\nexport * from './legal-review-notice.js';\nexport * from './safety-confirmation-phrases.js';\nexport * from './safety-telemetry-patterns.js';\nexport * from './pagination.js';\nexport * from './release-flags.js';\nexport * from './retention.js';\nexport * from './scheduled-jobs.js';\nexport * from './media-download.js';\nexport * from './media-processing.js';\nexport * from './storage-keys.js';\nexport * from './company-mascots.js';\nexport * from './center-stage-rooms.js';\n"]}
@@ -0,0 +1,5 @@
1
+ /** Whether the founder notice is shown and its acknowledgment required. */
2
+ export declare const LEGAL_REVIEW_NOTICE_ACTIVE: boolean;
3
+ /** Identifies the exact notice copy in force. Recorded with every acceptance and receipt. */
4
+ export declare const LEGAL_REVIEW_NOTICE_REVISION = "founder-note-v1";
5
+ //# sourceMappingURL=legal-review-notice-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-review-notice-state.d.ts","sourceRoot":"","sources":["../../src/constants/legal-review-notice-state.ts"],"names":[],"mappings":"AAeA,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,EAAE,OAAc,CAAC;AAExD,6FAA6F;AAC7F,eAAO,MAAM,4BAA4B,oBAAoB,CAAC"}
@@ -0,0 +1,19 @@
1
+ // ============================================================================
2
+ // FOUNDER LEGAL-REVIEW NOTICE — the switch. Code-controlled, exactly like APP_MODE:
3
+ // change the constant → publish ttt-core → install → deploy. It is NOT an Admin
4
+ // switch, and it is independent of APP_MODE and of any release's "require
5
+ // acceptance" choice — none of the three implies a value for another.
6
+ //
7
+ // Off: the notice renders nowhere and no notice acknowledgment is required.
8
+ // Receipts already recorded (registration, pledge, Hall submission) remain.
9
+ //
10
+ // The copy lives beside it in ./legal-review-notice.ts. The REVISION names that
11
+ // exact copy and is immutable: any wording change ships under a NEW revision id,
12
+ // so every recorded receipt keeps pointing at the words the person actually saw
13
+ // (the package test pins each revision's copy).
14
+ // ============================================================================
15
+ /** Whether the founder notice is shown and its acknowledgment required. */
16
+ export const LEGAL_REVIEW_NOTICE_ACTIVE = true;
17
+ /** Identifies the exact notice copy in force. Recorded with every acceptance and receipt. */
18
+ export const LEGAL_REVIEW_NOTICE_REVISION = 'founder-note-v1';
19
+ //# sourceMappingURL=legal-review-notice-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-review-notice-state.js","sourceRoot":"","sources":["../../src/constants/legal-review-notice-state.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oFAAoF;AACpF,gFAAgF;AAChF,0EAA0E;AAC1E,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,gDAAgD;AAChD,+EAA+E;AAE/E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,0BAA0B,GAAY,IAAI,CAAC;AAExD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,4BAA4B,GAAG,iBAAiB,CAAC","sourcesContent":["// ============================================================================\n// FOUNDER LEGAL-REVIEW NOTICE — the switch. Code-controlled, exactly like APP_MODE:\n// change the constant → publish ttt-core → install → deploy. It is NOT an Admin\n// switch, and it is independent of APP_MODE and of any release's \"require\n// acceptance\" choice — none of the three implies a value for another.\n//\n// Off: the notice renders nowhere and no notice acknowledgment is required.\n// Receipts already recorded (registration, pledge, Hall submission) remain.\n//\n// The copy lives beside it in ./legal-review-notice.ts. The REVISION names that\n// exact copy and is immutable: any wording change ships under a NEW revision id,\n// so every recorded receipt keeps pointing at the words the person actually saw\n// (the package test pins each revision's copy).\n// ============================================================================\n\n/** Whether the founder notice is shown and its acknowledgment required. */\nexport const LEGAL_REVIEW_NOTICE_ACTIVE: boolean = true;\n\n/** Identifies the exact notice copy in force. Recorded with every acceptance and receipt. */\nexport const LEGAL_REVIEW_NOTICE_REVISION = 'founder-note-v1';\n"]}
@@ -0,0 +1,105 @@
1
+ import { type PublicDocumentId } from './public-documents.js';
2
+ import type { LegalReviewNoticeReceipt } from '../doc-schemas/legal-review-notice.js';
3
+ /** Where a notice link points: a public document, or the founder's full note. */
4
+ export type LegalReviewNoticeLinkTarget = PublicDocumentId | 'founderNote';
5
+ /** One run of notice copy. A link carries a semantic target, never a URL. */
6
+ export type LegalReviewNoticeSegment = {
7
+ readonly kind: 'text';
8
+ readonly text: string;
9
+ } | {
10
+ readonly kind: 'link';
11
+ readonly label: string;
12
+ readonly target: LegalReviewNoticeLinkTarget;
13
+ };
14
+ /** The full note's heading (the note's first sentence). */
15
+ export declare const LEGAL_REVIEW_NOTICE_HEADING = "A note from DJ, TTT's founder.";
16
+ /** The full note's body. */
17
+ export declare const LEGAL_REVIEW_NOTICE_BODY: string;
18
+ /** The short line. Its closing sentence links to the full note. */
19
+ export declare const LEGAL_REVIEW_NOTICE_SHORT_LINE: readonly LegalReviewNoticeSegment[];
20
+ /** The required acknowledgment checkbox (Hall submission, pledge). */
21
+ export declare const LEGAL_REVIEW_NOTICE_CHECKBOX: string;
22
+ /** The registration Terms checkbox label, with the notice clause exactly while the notice is active. */
23
+ export declare function registrationTermsAgreementSegments(): readonly LegalReviewNoticeSegment[];
24
+ /**
25
+ * How the notice renders:
26
+ * - `inline` — the short line, in the flow of surrounding text;
27
+ * - `strip` — the short line as a compact strip;
28
+ * - `card` — the full note (heading + body);
29
+ * - `checkbox` — the required acknowledgment checkbox.
30
+ */
31
+ export declare const LEGAL_REVIEW_NOTICE_VARIANTS: readonly ["inline", "strip", "card", "checkbox"];
32
+ export type LegalReviewNoticeVariant = (typeof LEGAL_REVIEW_NOTICE_VARIANTS)[number];
33
+ /**
34
+ * Every placement of the notice and the variants it may render (the first is its default).
35
+ * The keys ARE the typed context union. Take It Down and the DMCA policy are statutory
36
+ * processes and carry no notice, so they have no context
37
+ * (see `publicDocumentCarriesLegalReviewNotice`).
38
+ */
39
+ export declare const LEGAL_REVIEW_NOTICE_PLACEMENTS: {
40
+ /** Terms, Privacy, Rules & Agreements, Future Plans — beside the current content, rendered at
41
+ * display time (never stored in the document body); also the Admin editors' preview. */
42
+ readonly publicDocument: readonly ["strip"];
43
+ /** Registration — the full note above the agreement checkboxes. */
44
+ readonly registration: readonly ["card"];
45
+ /** The "Our stuff has changed" re-acceptance prompt — the full note. */
46
+ readonly reacceptance: readonly ["card"];
47
+ /** Pledge checkout — a compact explanation plus a separate required checkbox on every pledge. */
48
+ readonly pledge: readonly ["strip", "checkbox"];
49
+ /** Hall submission — a required checkbox in the publish attestations, above Submit for Approval. */
50
+ readonly publish: readonly ["checkbox"];
51
+ /** Work / Realm creation, beside its agreement. */
52
+ readonly workProjectCreation: readonly ["inline", "strip"];
53
+ /** Artisan upgrade, beside its agreement. */
54
+ readonly artisanCreatorUpgrade: readonly ["inline", "strip"];
55
+ /** Craft-skill upload, beside its agreement. */
56
+ readonly craftSkillUpload: readonly ["inline", "strip"];
57
+ /** An Artisan submitting an Audition entry — a compact strip beside Submit Entry (the launch
58
+ * mascot Auditions hand their winning art to TTT). */
59
+ readonly auditionEntrySubmission: readonly ["strip"];
60
+ /** Square first post, beside its agreement. */
61
+ readonly squareStreetzFirstPost: readonly ["inline", "strip"];
62
+ /** Guild invite agreements. */
63
+ readonly guildInviteAgreement: readonly ["inline", "strip"];
64
+ /** Hall download, beside its acknowledgment. */
65
+ readonly hallDownload: readonly ["inline", "strip"];
66
+ /** The Charter Season explainer. */
67
+ readonly charterExplainer: readonly ["inline", "card"];
68
+ /** The landing page's founder section. */
69
+ readonly landingFounder: readonly ["inline", "card"];
70
+ /** The landing page's fundraising section. */
71
+ readonly landingFundraising: readonly ["inline", "card"];
72
+ /** Stake explanations. */
73
+ readonly stakeShareExplanation: readonly ["inline", "card"];
74
+ /** Bouquet explanations. */
75
+ readonly bouquetAppreciationExplanation: readonly ["inline", "card"];
76
+ /** The site footer. */
77
+ readonly footer: readonly ["inline"];
78
+ };
79
+ /** A named placement of the notice. */
80
+ export type LegalReviewNoticeContext = keyof typeof LEGAL_REVIEW_NOTICE_PLACEMENTS;
81
+ /** The variants a given placement may render. */
82
+ export type LegalReviewNoticeVariantFor<C extends LegalReviewNoticeContext> = (typeof LEGAL_REVIEW_NOTICE_PLACEMENTS)[C][number];
83
+ export declare const LEGAL_REVIEW_NOTICE_CONTEXTS: LegalReviewNoticeContext[];
84
+ /**
85
+ * Whether a public document's page (and its Admin editor preview) shows the `publicDocument`
86
+ * notice strip. A placement fact only — the notice itself still renders nothing while off.
87
+ */
88
+ export declare function publicDocumentCarriesLegalReviewNotice(documentId: PublicDocumentId): boolean;
89
+ /** Flatten segments to plain text: text as written, a link as its label. */
90
+ export declare function legalReviewNoticeSegmentsText(segments: readonly LegalReviewNoticeSegment[]): string;
91
+ /**
92
+ * The notice as plain text for a placement, for backend-owned copy (a Stripe description, an
93
+ * email). `null` while the notice is off. `variant` defaults to the placement's first variant;
94
+ * a variant the placement does not render throws.
95
+ */
96
+ export declare function legalReviewNoticePlainText<C extends LegalReviewNoticeContext>(context: C, variant?: LegalReviewNoticeVariantFor<C>): string | null;
97
+ /** The revision a server records with an acceptance or acknowledgment now; `null` while off. */
98
+ export declare function activeLegalReviewNoticeRevision(): string | null;
99
+ /**
100
+ * The receipt a server records when a person acknowledges the notice (pledge evidence, the Hall
101
+ * threshold item): the active revision and the server time. `null` while the notice is off —
102
+ * nothing is required, so nothing is recorded.
103
+ */
104
+ export declare function buildLegalReviewNoticeReceipt(acknowledgedAt: number): LegalReviewNoticeReceipt | null;
105
+ //# sourceMappingURL=legal-review-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-review-notice.d.ts","sourceRoot":"","sources":["../../src/constants/legal-review-notice.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAItF,iFAAiF;AACjF,MAAM,MAAM,2BAA2B,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAE3E,6EAA6E;AAC7E,MAAM,MAAM,wBAAwB,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAA;CAAE,CAAC;AAIpG,2DAA2D;AAC3D,eAAO,MAAM,2BAA2B,mCAAmC,CAAC;AAE5E,4BAA4B;AAC5B,eAAO,MAAM,wBAAwB,QAMuC,CAAC;AAE7E,mEAAmE;AACnE,eAAO,MAAM,8BAA8B,EAAE,SAAS,wBAAwB,EAG7E,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,4BAA4B,QAE2B,CAAC;AAqBrE,wGAAwG;AACxG,wBAAgB,kCAAkC,IAAI,SAAS,wBAAwB,EAAE,CAIxF;AAID;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,kDAAmD,CAAC;AAC7F,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;IACzC;6FACyF;;IAEzF,mEAAmE;;IAEnE,wEAAwE;;IAExE,iGAAiG;;IAEjG,oGAAoG;;IAEpG,mDAAmD;;IAEnD,6CAA6C;;IAE7C,gDAAgD;;IAEhD;2DACuD;;IAEvD,+CAA+C;;IAE/C,+BAA+B;;IAE/B,gDAAgD;;IAEhD,oCAAoC;;IAEpC,0CAA0C;;IAE1C,8CAA8C;;IAE9C,0BAA0B;;IAE1B,4BAA4B;;IAE5B,uBAAuB;;CAEwC,CAAC;AAElE,uCAAuC;AACvC,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,8BAA8B,CAAC;AAEnF,iDAAiD;AACjD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,wBAAwB,IACxE,CAAC,OAAO,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,4BAA4B,EAEpC,wBAAwB,EAAE,CAAC;AAYhC;;;GAGG;AACH,wBAAgB,sCAAsC,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAE5F;AAID,4EAA4E;AAC5E,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,GAAG,MAAM,CAEnG;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,wBAAwB,EAC3E,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACvC,MAAM,GAAG,IAAI,CAgBf;AAID,gGAAgG;AAChG,wBAAgB,+BAA+B,IAAI,MAAM,GAAG,IAAI,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAGrG"}
@@ -0,0 +1,174 @@
1
+ // ============================================================================
2
+ // FOUNDER LEGAL-REVIEW NOTICE — the ONE owner of the notice copy, its placements,
3
+ // and the plain-text helper for backend-owned copy. The on/off switch and the
4
+ // immutable revision id live in ./legal-review-notice-state.ts.
5
+ //
6
+ // TTT's public pages were written by the founder before any legal review. The
7
+ // notice says so wherever people read policy, create accounts, upload, publish,
8
+ // or pledge. The app renders it through one component,
9
+ // `<LegalReviewNotice context=… variant=… />`; nothing restates these words or
10
+ // keeps a local flag.
11
+ //
12
+ // Copy is settled and verbatim — never reword it in place. A wording change is a
13
+ // new LEGAL_REVIEW_NOTICE_REVISION (the package test pins each revision's copy).
14
+ // Links are semantic targets, not URLs: a public document id, or the founder's
15
+ // note itself; the app maps them to routes or its note dialog.
16
+ // ============================================================================
17
+ import { SPECIAL_DOCS } from '../paths/collections.js';
18
+ import { PUBLIC_DOCUMENT_LABELS } from './public-documents.js';
19
+ import { LEGAL_REVIEW_NOTICE_ACTIVE, LEGAL_REVIEW_NOTICE_REVISION } from './legal-review-notice-state.js';
20
+ // ── The settled copy ─────────────────────────────────────────────────────────
21
+ /** The full note's heading (the note's first sentence). */
22
+ export const LEGAL_REVIEW_NOTICE_HEADING = "A note from DJ, TTT's founder.";
23
+ /** The full note's body. */
24
+ export const LEGAL_REVIEW_NOTICE_BODY = "These pages describe how I intend TTT to work: my principles and what I'm trying to build. " +
25
+ 'I wrote them myself, with help from AI tools, before I could afford a lawyer, so none of it ' +
26
+ "has had legal review, and I honestly don't know whether all of it is legally sound. Charter " +
27
+ "Season support keeps TTT running first; after that, it's how I'll get a lawyer to turn this " +
28
+ 'into real, reviewed legal wording. The words may change when that happens. My intentions ' +
29
+ "won't. If a change needs your agreement, I'll ask you before it applies.";
30
+ /** The short line. Its closing sentence links to the full note. */
31
+ export const LEGAL_REVIEW_NOTICE_SHORT_LINE = [
32
+ { kind: 'text', text: "TTT's terms are my intentions, written by me and not yet reviewed by a lawyer. " },
33
+ { kind: 'link', label: "Read the founder's note.", target: 'founderNote' },
34
+ ];
35
+ /** The required acknowledgment checkbox (Hall submission, pledge). */
36
+ export const LEGAL_REVIEW_NOTICE_CHECKBOX = "I understand TTT's terms express the founder's intentions, have not had legal review, and " +
37
+ 'will be updated once Charter Season support makes that possible.';
38
+ // The registration Terms checkbox. While the notice is active it carries the notice clause;
39
+ // otherwise it is the plain agreement. Both link the two documents by their canonical labels.
40
+ const REGISTRATION_TERMS_AGREEMENT_LEAD = [
41
+ { kind: 'text', text: 'I have read and agree to the ' },
42
+ { kind: 'link', label: PUBLIC_DOCUMENT_LABELS[SPECIAL_DOCS.TERMS_PAGE], target: SPECIAL_DOCS.TERMS_PAGE },
43
+ { kind: 'text', text: ' and ' },
44
+ { kind: 'link', label: PUBLIC_DOCUMENT_LABELS[SPECIAL_DOCS.PRIVACY_PAGE], target: SPECIAL_DOCS.PRIVACY_PAGE },
45
+ ];
46
+ const REGISTRATION_TERMS_AGREEMENT_WITH_NOTICE = [
47
+ ...REGISTRATION_TERMS_AGREEMENT_LEAD,
48
+ { kind: 'text', text: ", and I understand they express the founder's intentions and have not had legal review." },
49
+ ];
50
+ const REGISTRATION_TERMS_AGREEMENT_WITHOUT_NOTICE = [
51
+ ...REGISTRATION_TERMS_AGREEMENT_LEAD,
52
+ { kind: 'text', text: '.' },
53
+ ];
54
+ /** The registration Terms checkbox label, with the notice clause exactly while the notice is active. */
55
+ export function registrationTermsAgreementSegments() {
56
+ return LEGAL_REVIEW_NOTICE_ACTIVE
57
+ ? REGISTRATION_TERMS_AGREEMENT_WITH_NOTICE
58
+ : REGISTRATION_TERMS_AGREEMENT_WITHOUT_NOTICE;
59
+ }
60
+ // ── Variants and placements ──────────────────────────────────────────────────
61
+ /**
62
+ * How the notice renders:
63
+ * - `inline` — the short line, in the flow of surrounding text;
64
+ * - `strip` — the short line as a compact strip;
65
+ * - `card` — the full note (heading + body);
66
+ * - `checkbox` — the required acknowledgment checkbox.
67
+ */
68
+ export const LEGAL_REVIEW_NOTICE_VARIANTS = ['inline', 'strip', 'card', 'checkbox'];
69
+ /**
70
+ * Every placement of the notice and the variants it may render (the first is its default).
71
+ * The keys ARE the typed context union. Take It Down and the DMCA policy are statutory
72
+ * processes and carry no notice, so they have no context
73
+ * (see `publicDocumentCarriesLegalReviewNotice`).
74
+ */
75
+ export const LEGAL_REVIEW_NOTICE_PLACEMENTS = {
76
+ /** Terms, Privacy, Rules & Agreements, Future Plans — beside the current content, rendered at
77
+ * display time (never stored in the document body); also the Admin editors' preview. */
78
+ publicDocument: ['strip'],
79
+ /** Registration — the full note above the agreement checkboxes. */
80
+ registration: ['card'],
81
+ /** The "Our stuff has changed" re-acceptance prompt — the full note. */
82
+ reacceptance: ['card'],
83
+ /** Pledge checkout — a compact explanation plus a separate required checkbox on every pledge. */
84
+ pledge: ['strip', 'checkbox'],
85
+ /** Hall submission — a required checkbox in the publish attestations, above Submit for Approval. */
86
+ publish: ['checkbox'],
87
+ /** Work / Realm creation, beside its agreement. */
88
+ workProjectCreation: ['inline', 'strip'],
89
+ /** Artisan upgrade, beside its agreement. */
90
+ artisanCreatorUpgrade: ['inline', 'strip'],
91
+ /** Craft-skill upload, beside its agreement. */
92
+ craftSkillUpload: ['inline', 'strip'],
93
+ /** An Artisan submitting an Audition entry — a compact strip beside Submit Entry (the launch
94
+ * mascot Auditions hand their winning art to TTT). */
95
+ auditionEntrySubmission: ['strip'],
96
+ /** Square first post, beside its agreement. */
97
+ squareStreetzFirstPost: ['inline', 'strip'],
98
+ /** Guild invite agreements. */
99
+ guildInviteAgreement: ['inline', 'strip'],
100
+ /** Hall download, beside its acknowledgment. */
101
+ hallDownload: ['inline', 'strip'],
102
+ /** The Charter Season explainer. */
103
+ charterExplainer: ['inline', 'card'],
104
+ /** The landing page's founder section. */
105
+ landingFounder: ['inline', 'card'],
106
+ /** The landing page's fundraising section. */
107
+ landingFundraising: ['inline', 'card'],
108
+ /** Stake explanations. */
109
+ stakeShareExplanation: ['inline', 'card'],
110
+ /** Bouquet explanations. */
111
+ bouquetAppreciationExplanation: ['inline', 'card'],
112
+ /** The site footer. */
113
+ footer: ['inline'],
114
+ };
115
+ export const LEGAL_REVIEW_NOTICE_CONTEXTS = Object.keys(LEGAL_REVIEW_NOTICE_PLACEMENTS);
116
+ const PUBLIC_DOCUMENT_CARRIES_NOTICE = {
117
+ [SPECIAL_DOCS.TERMS_PAGE]: true,
118
+ [SPECIAL_DOCS.PRIVACY_PAGE]: true,
119
+ [SPECIAL_DOCS.RULES_AND_AGREEMENTS]: true,
120
+ [SPECIAL_DOCS.FUTURE_PLANS]: true,
121
+ // Statutory processes run as built.
122
+ [SPECIAL_DOCS.DMCA_POLICY]: false,
123
+ [SPECIAL_DOCS.TAKE_IT_DOWN_PAGE_COPY]: false,
124
+ };
125
+ /**
126
+ * Whether a public document's page (and its Admin editor preview) shows the `publicDocument`
127
+ * notice strip. A placement fact only — the notice itself still renders nothing while off.
128
+ */
129
+ export function publicDocumentCarriesLegalReviewNotice(documentId) {
130
+ return PUBLIC_DOCUMENT_CARRIES_NOTICE[documentId];
131
+ }
132
+ // ── Plain text (backend-owned copy) ──────────────────────────────────────────
133
+ /** Flatten segments to plain text: text as written, a link as its label. */
134
+ export function legalReviewNoticeSegmentsText(segments) {
135
+ return segments.map((segment) => (segment.kind === 'text' ? segment.text : segment.label)).join('');
136
+ }
137
+ /**
138
+ * The notice as plain text for a placement, for backend-owned copy (a Stripe description, an
139
+ * email). `null` while the notice is off. `variant` defaults to the placement's first variant;
140
+ * a variant the placement does not render throws.
141
+ */
142
+ export function legalReviewNoticePlainText(context, variant) {
143
+ if (!LEGAL_REVIEW_NOTICE_ACTIVE)
144
+ return null;
145
+ const allowed = LEGAL_REVIEW_NOTICE_PLACEMENTS[context];
146
+ const chosen = variant ?? allowed[0];
147
+ if (!allowed.includes(chosen)) {
148
+ throw new Error(`The ${context} notice placement does not render the ${chosen} variant.`);
149
+ }
150
+ switch (chosen) {
151
+ case 'inline':
152
+ case 'strip':
153
+ return legalReviewNoticeSegmentsText(LEGAL_REVIEW_NOTICE_SHORT_LINE);
154
+ case 'card':
155
+ return `${LEGAL_REVIEW_NOTICE_HEADING} ${LEGAL_REVIEW_NOTICE_BODY}`;
156
+ case 'checkbox':
157
+ return LEGAL_REVIEW_NOTICE_CHECKBOX;
158
+ }
159
+ }
160
+ // ── What gets recorded ───────────────────────────────────────────────────────
161
+ /** The revision a server records with an acceptance or acknowledgment now; `null` while off. */
162
+ export function activeLegalReviewNoticeRevision() {
163
+ return LEGAL_REVIEW_NOTICE_ACTIVE ? LEGAL_REVIEW_NOTICE_REVISION : null;
164
+ }
165
+ /**
166
+ * The receipt a server records when a person acknowledges the notice (pledge evidence, the Hall
167
+ * threshold item): the active revision and the server time. `null` while the notice is off —
168
+ * nothing is required, so nothing is recorded.
169
+ */
170
+ export function buildLegalReviewNoticeReceipt(acknowledgedAt) {
171
+ const revision = activeLegalReviewNoticeRevision();
172
+ return revision === null ? null : { revision, acknowledgedAt };
173
+ }
174
+ //# sourceMappingURL=legal-review-notice.js.map