@ttt-productions/ttt-core 0.79.99 → 0.79.101

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 (578) hide show
  1. package/dist/capabilities/capability-registry.d.ts.map +1 -1
  2. package/dist/capabilities/capability-registry.js.map +1 -1
  3. package/dist/constants/admin-labels.d.ts +53 -12
  4. package/dist/constants/admin-labels.d.ts.map +1 -1
  5. package/dist/constants/admin-labels.js +55 -16
  6. package/dist/constants/admin-labels.js.map +1 -1
  7. package/dist/constants/audition-deadlines.d.ts.map +1 -1
  8. package/dist/constants/audition-deadlines.js.map +1 -1
  9. package/dist/constants/business-admin.d.ts +6 -2
  10. package/dist/constants/business-admin.d.ts.map +1 -1
  11. package/dist/constants/business-admin.js +6 -2
  12. package/dist/constants/business-admin.js.map +1 -1
  13. package/dist/constants/business-content.d.ts +5 -8
  14. package/dist/constants/business-content.d.ts.map +1 -1
  15. package/dist/constants/business-content.js +9 -12
  16. package/dist/constants/business-content.js.map +1 -1
  17. package/dist/constants/business-work-project.d.ts +3 -3
  18. package/dist/constants/business-work-project.d.ts.map +1 -1
  19. package/dist/constants/business-work-project.js +6 -5
  20. package/dist/constants/business-work-project.js.map +1 -1
  21. package/dist/constants/chat.d.ts +5 -5
  22. package/dist/constants/chat.d.ts.map +1 -1
  23. package/dist/constants/chat.js +5 -5
  24. package/dist/constants/chat.js.map +1 -1
  25. package/dist/constants/company-mascots.d.ts.map +1 -1
  26. package/dist/constants/company-mascots.js +18 -5
  27. package/dist/constants/company-mascots.js.map +1 -1
  28. package/dist/constants/index.d.ts +6 -1
  29. package/dist/constants/index.d.ts.map +1 -1
  30. package/dist/constants/index.js +6 -1
  31. package/dist/constants/index.js.map +1 -1
  32. package/dist/constants/legal-review-notice.d.ts.map +1 -1
  33. package/dist/constants/legal-review-notice.js +22 -6
  34. package/dist/constants/legal-review-notice.js.map +1 -1
  35. package/dist/constants/options.d.ts +4 -4
  36. package/dist/constants/options.d.ts.map +1 -1
  37. package/dist/constants/options.js +17 -14
  38. package/dist/constants/options.js.map +1 -1
  39. package/dist/constants/pagination.d.ts.map +1 -1
  40. package/dist/constants/pagination.js +3 -1
  41. package/dist/constants/pagination.js.map +1 -1
  42. package/dist/constants/pledge-and-bouquet-copy.d.ts.map +1 -1
  43. package/dist/constants/pledge-and-bouquet-copy.js.map +1 -1
  44. package/dist/constants/safety-active-statuses.d.ts +2 -2
  45. package/dist/constants/safety-active-statuses.d.ts.map +1 -1
  46. package/dist/constants/safety-active-statuses.js.map +1 -1
  47. package/dist/constants/safety-confirmation-phrases.d.ts.map +1 -1
  48. package/dist/constants/safety-confirmation-phrases.js.map +1 -1
  49. package/dist/constants/safety-telemetry-patterns.d.ts.map +1 -1
  50. package/dist/constants/safety-telemetry-patterns.js.map +1 -1
  51. package/dist/constants/telemetry-content-policy.d.ts.map +1 -1
  52. package/dist/constants/telemetry-content-policy.js +14 -1
  53. package/dist/constants/telemetry-content-policy.js.map +1 -1
  54. package/dist/constants/text-fields.d.ts +11 -4
  55. package/dist/constants/text-fields.d.ts.map +1 -1
  56. package/dist/constants/text-fields.js +474 -79
  57. package/dist/constants/text-fields.js.map +1 -1
  58. package/dist/doc-schemas/account-deletion.d.ts.map +1 -1
  59. package/dist/doc-schemas/account-deletion.js +2 -1
  60. package/dist/doc-schemas/account-deletion.js.map +1 -1
  61. package/dist/doc-schemas/backend-state.d.ts.map +1 -1
  62. package/dist/doc-schemas/backend-state.js +5 -1
  63. package/dist/doc-schemas/backend-state.js.map +1 -1
  64. package/dist/doc-schemas/chat-sync.d.ts +5 -5
  65. package/dist/doc-schemas/chat-sync.d.ts.map +1 -1
  66. package/dist/doc-schemas/chat-sync.js +34 -15
  67. package/dist/doc-schemas/chat-sync.js.map +1 -1
  68. package/dist/doc-schemas/commissions.d.ts +5 -5
  69. package/dist/doc-schemas/commissions.d.ts.map +1 -1
  70. package/dist/doc-schemas/commissions.js +1 -2
  71. package/dist/doc-schemas/commissions.js.map +1 -1
  72. package/dist/doc-schemas/content.d.ts +4 -4
  73. package/dist/doc-schemas/content.d.ts.map +1 -1
  74. package/dist/doc-schemas/content.js +5 -3
  75. package/dist/doc-schemas/content.js.map +1 -1
  76. package/dist/doc-schemas/erasure-fates.d.ts.map +1 -1
  77. package/dist/doc-schemas/erasure-fates.js +12 -3
  78. package/dist/doc-schemas/erasure-fates.js.map +1 -1
  79. package/dist/doc-schemas/index.d.ts.map +1 -1
  80. package/dist/doc-schemas/index.js +3 -4
  81. package/dist/doc-schemas/index.js.map +1 -1
  82. package/dist/doc-schemas/media-activation-jobs.d.ts +8 -8
  83. package/dist/doc-schemas/media-activation-jobs.d.ts.map +1 -1
  84. package/dist/doc-schemas/media-activation-jobs.js +1 -1
  85. package/dist/doc-schemas/media-activation-jobs.js.map +1 -1
  86. package/dist/doc-schemas/media-assets.d.ts +58 -58
  87. package/dist/doc-schemas/media-assets.d.ts.map +1 -1
  88. package/dist/doc-schemas/media-assets.js +64 -23
  89. package/dist/doc-schemas/media-assets.js.map +1 -1
  90. package/dist/doc-schemas/media-copy-intents.d.ts +14 -14
  91. package/dist/doc-schemas/media-copy-intents.d.ts.map +1 -1
  92. package/dist/doc-schemas/media-copy-intents.js +16 -4
  93. package/dist/doc-schemas/media-copy-intents.js.map +1 -1
  94. package/dist/doc-schemas/messaging.d.ts +34 -1
  95. package/dist/doc-schemas/messaging.d.ts.map +1 -1
  96. package/dist/doc-schemas/messaging.js +10 -10
  97. package/dist/doc-schemas/messaging.js.map +1 -1
  98. package/dist/doc-schemas/moderation.d.ts +21 -21
  99. package/dist/doc-schemas/moderation.d.ts.map +1 -1
  100. package/dist/doc-schemas/moderation.js +33 -11
  101. package/dist/doc-schemas/moderation.js.map +1 -1
  102. package/dist/doc-schemas/ncii/allegations.d.ts +1 -1
  103. package/dist/doc-schemas/ncii/allegations.d.ts.map +1 -1
  104. package/dist/doc-schemas/ncii/allegations.js +9 -3
  105. package/dist/doc-schemas/ncii/allegations.js.map +1 -1
  106. package/dist/doc-schemas/ncii/cases.d.ts +4 -4
  107. package/dist/doc-schemas/ncii/cases.d.ts.map +1 -1
  108. package/dist/doc-schemas/ncii/cases.js +33 -15
  109. package/dist/doc-schemas/ncii/cases.js.map +1 -1
  110. package/dist/doc-schemas/ncii/config.d.ts.map +1 -1
  111. package/dist/doc-schemas/ncii/config.js +16 -5
  112. package/dist/doc-schemas/ncii/config.js.map +1 -1
  113. package/dist/doc-schemas/ncii/holds.d.ts.map +1 -1
  114. package/dist/doc-schemas/ncii/holds.js +4 -2
  115. package/dist/doc-schemas/ncii/holds.js.map +1 -1
  116. package/dist/doc-schemas/ncii/removal.d.ts +6 -6
  117. package/dist/doc-schemas/ncii/removal.d.ts.map +1 -1
  118. package/dist/doc-schemas/ncii/removal.js +12 -6
  119. package/dist/doc-schemas/ncii/removal.js.map +1 -1
  120. package/dist/doc-schemas/ncii/requests.d.ts +36 -39
  121. package/dist/doc-schemas/ncii/requests.d.ts.map +1 -1
  122. package/dist/doc-schemas/ncii/requests.js +95 -94
  123. package/dist/doc-schemas/ncii/requests.js.map +1 -1
  124. package/dist/doc-schemas/notification-archive-all-jobs.d.ts +4 -4
  125. package/dist/doc-schemas/notification-archive-all-jobs.d.ts.map +1 -1
  126. package/dist/doc-schemas/notification-archive-all-jobs.js +6 -1
  127. package/dist/doc-schemas/notification-archive-all-jobs.js.map +1 -1
  128. package/dist/doc-schemas/notification-ledger.d.ts +1 -1
  129. package/dist/doc-schemas/notification-ledger.d.ts.map +1 -1
  130. package/dist/doc-schemas/notification-ledger.js +8 -4
  131. package/dist/doc-schemas/notification-ledger.js.map +1 -1
  132. package/dist/doc-schemas/notifications.d.ts +6 -6
  133. package/dist/doc-schemas/operational.d.ts.map +1 -1
  134. package/dist/doc-schemas/operational.js.map +1 -1
  135. package/dist/doc-schemas/payments.d.ts +3 -3
  136. package/dist/doc-schemas/payments.d.ts.map +1 -1
  137. package/dist/doc-schemas/payments.js +13 -6
  138. package/dist/doc-schemas/payments.js.map +1 -1
  139. package/dist/doc-schemas/public-documents.d.ts +10 -10
  140. package/dist/doc-schemas/public-documents.d.ts.map +1 -1
  141. package/dist/doc-schemas/public-documents.js +14 -3
  142. package/dist/doc-schemas/public-documents.js.map +1 -1
  143. package/dist/doc-schemas/registry.d.ts +193 -160
  144. package/dist/doc-schemas/registry.d.ts.map +1 -1
  145. package/dist/doc-schemas/registry.js +6 -6
  146. package/dist/doc-schemas/registry.js.map +1 -1
  147. package/dist/doc-schemas/safety/age.d.ts +8 -11
  148. package/dist/doc-schemas/safety/age.d.ts.map +1 -1
  149. package/dist/doc-schemas/safety/age.js +64 -58
  150. package/dist/doc-schemas/safety/age.js.map +1 -1
  151. package/dist/doc-schemas/safety/case-alert.d.ts +2 -2
  152. package/dist/doc-schemas/safety/case-alert.d.ts.map +1 -1
  153. package/dist/doc-schemas/safety/case-alert.js +4 -2
  154. package/dist/doc-schemas/safety/case-alert.js.map +1 -1
  155. package/dist/doc-schemas/safety/case-aliases.d.ts.map +1 -1
  156. package/dist/doc-schemas/safety/case-aliases.js +4 -2
  157. package/dist/doc-schemas/safety/case-aliases.js.map +1 -1
  158. package/dist/doc-schemas/safety/case.d.ts +5 -5
  159. package/dist/doc-schemas/safety/case.d.ts.map +1 -1
  160. package/dist/doc-schemas/safety/case.js +74 -37
  161. package/dist/doc-schemas/safety/case.js.map +1 -1
  162. package/dist/doc-schemas/safety/evidence.d.ts +48 -48
  163. package/dist/doc-schemas/safety/evidence.d.ts.map +1 -1
  164. package/dist/doc-schemas/safety/evidence.js +82 -45
  165. package/dist/doc-schemas/safety/evidence.js.map +1 -1
  166. package/dist/doc-schemas/safety/foundation.d.ts +33 -37
  167. package/dist/doc-schemas/safety/foundation.d.ts.map +1 -1
  168. package/dist/doc-schemas/safety/foundation.js +85 -30
  169. package/dist/doc-schemas/safety/foundation.js.map +1 -1
  170. package/dist/doc-schemas/safety/holds.d.ts +10 -10
  171. package/dist/doc-schemas/safety/holds.d.ts.map +1 -1
  172. package/dist/doc-schemas/safety/holds.js +24 -12
  173. package/dist/doc-schemas/safety/holds.js.map +1 -1
  174. package/dist/doc-schemas/safety/monitors.d.ts.map +1 -1
  175. package/dist/doc-schemas/safety/monitors.js +8 -4
  176. package/dist/doc-schemas/safety/monitors.js.map +1 -1
  177. package/dist/doc-schemas/safety/provenance.d.ts.map +1 -1
  178. package/dist/doc-schemas/safety/provenance.js +8 -4
  179. package/dist/doc-schemas/safety/provenance.js.map +1 -1
  180. package/dist/doc-schemas/safety/report.d.ts +18 -21
  181. package/dist/doc-schemas/safety/report.d.ts.map +1 -1
  182. package/dist/doc-schemas/safety/report.js +52 -45
  183. package/dist/doc-schemas/safety/report.js.map +1 -1
  184. package/dist/doc-schemas/safety/sagas.d.ts +2 -2
  185. package/dist/doc-schemas/safety/sagas.d.ts.map +1 -1
  186. package/dist/doc-schemas/safety/sagas.js +17 -13
  187. package/dist/doc-schemas/safety/sagas.js.map +1 -1
  188. package/dist/doc-schemas/social.d.ts +7 -7
  189. package/dist/doc-schemas/social.d.ts.map +1 -1
  190. package/dist/doc-schemas/social.js +6 -5
  191. package/dist/doc-schemas/social.js.map +1 -1
  192. package/dist/doc-schemas/square-announcement-jobs.d.ts +3 -3
  193. package/dist/doc-schemas/user.d.ts +2 -3
  194. package/dist/doc-schemas/user.d.ts.map +1 -1
  195. package/dist/doc-schemas/user.js +16 -20
  196. package/dist/doc-schemas/user.js.map +1 -1
  197. package/dist/doc-schemas/work-project.d.ts +1 -1
  198. package/dist/doc-schemas/work-project.d.ts.map +1 -1
  199. package/dist/doc-schemas/work-project.js +1 -1
  200. package/dist/doc-schemas/work-project.js.map +1 -1
  201. package/dist/ids/chat-ids.d.ts.map +1 -1
  202. package/dist/ids/chat-ids.js.map +1 -1
  203. package/dist/index.d.ts +9 -10
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +9 -10
  206. package/dist/index.js.map +1 -1
  207. package/dist/media/atoms.d.ts +5 -5
  208. package/dist/media/atoms.d.ts.map +1 -1
  209. package/dist/media/atoms.js +12 -6
  210. package/dist/media/atoms.js.map +1 -1
  211. package/dist/media/conversation-file-ref.d.ts.map +1 -1
  212. package/dist/media/conversation-file-ref.js +8 -4
  213. package/dist/media/conversation-file-ref.js.map +1 -1
  214. package/dist/media/domain-events-admin.d.ts +1 -1
  215. package/dist/media/domain-events-admin.js +3 -3
  216. package/dist/media/domain-events-admin.js.map +1 -1
  217. package/dist/media/domain-events-social.d.ts +1 -1
  218. package/dist/media/domain-events-social.js +1 -1
  219. package/dist/media/domain-events-social.js.map +1 -1
  220. package/dist/media/domain-events-user.d.ts +3 -3
  221. package/dist/media/domain-events-user.js +1 -1
  222. package/dist/media/domain-events-user.js.map +1 -1
  223. package/dist/media/domain-events-work.d.ts +1 -1
  224. package/dist/media/domain-events-work.js +1 -1
  225. package/dist/media/domain-events-work.js.map +1 -1
  226. package/dist/media/domain-events.d.ts +3 -7
  227. package/dist/media/domain-events.d.ts.map +1 -1
  228. package/dist/media/domain-events.js +5 -9
  229. package/dist/media/domain-events.js.map +1 -1
  230. package/dist/media/download-filename.d.ts.map +1 -1
  231. package/dist/media/download-filename.js +5 -4
  232. package/dist/media/download-filename.js.map +1 -1
  233. package/dist/media/edge-serving-contract.d.ts +15 -15
  234. package/dist/media/edge-serving-contract.d.ts.map +1 -1
  235. package/dist/media/edge-serving-contract.js +10 -2
  236. package/dist/media/edge-serving-contract.js.map +1 -1
  237. package/dist/media/file-origin.d.ts +1 -1
  238. package/dist/media/file-origin.js +1 -1
  239. package/dist/media/file-origin.js.map +1 -1
  240. package/dist/media/hall-library-target-fields.d.ts +3 -3
  241. package/dist/media/hall-library-target-fields.d.ts.map +1 -1
  242. package/dist/media/hall-library-target-fields.js.map +1 -1
  243. package/dist/media/index.d.ts +19 -15
  244. package/dist/media/index.d.ts.map +1 -1
  245. package/dist/media/index.js +19 -15
  246. package/dist/media/index.js.map +1 -1
  247. package/dist/media/pending-media.d.ts +23 -23
  248. package/dist/media/pending-media.js +3 -3
  249. package/dist/media/pending-media.js.map +1 -1
  250. package/dist/media/photodna-coverage.d.ts.map +1 -1
  251. package/dist/media/photodna-coverage.js +1 -3
  252. package/dist/media/photodna-coverage.js.map +1 -1
  253. package/dist/media/publication/publication-args.d.ts +3 -3
  254. package/dist/media/publication/publication-args.d.ts.map +1 -1
  255. package/dist/media/publication/publication-args.js +22 -18
  256. package/dist/media/publication/publication-args.js.map +1 -1
  257. package/dist/media/start-upload.d.ts +1 -1
  258. package/dist/media/start-upload.js +3 -3
  259. package/dist/media/start-upload.js.map +1 -1
  260. package/dist/media/target-info.d.ts +3 -3
  261. package/dist/media/target-info.d.ts.map +1 -1
  262. package/dist/media/target-info.js +90 -55
  263. package/dist/media/target-info.js.map +1 -1
  264. package/dist/media/ttt-media-specs.d.ts +2 -2
  265. package/dist/media/ttt-media-specs.d.ts.map +1 -1
  266. package/dist/media/ttt-media-specs.js +84 -25
  267. package/dist/media/ttt-media-specs.js.map +1 -1
  268. package/dist/media/upload-tray-display.js +1 -1
  269. package/dist/media/upload-tray-display.js.map +1 -1
  270. package/dist/notifications/index.d.ts +1 -2
  271. package/dist/notifications/index.d.ts.map +1 -1
  272. package/dist/notifications/index.js +1 -297
  273. package/dist/notifications/index.js.map +1 -1
  274. package/dist/notifications/notification-config.d.ts +3 -0
  275. package/dist/notifications/notification-config.d.ts.map +1 -0
  276. package/dist/notifications/notification-config.js +298 -0
  277. package/dist/notifications/notification-config.js.map +1 -0
  278. package/dist/paths/collection-refs.d.ts.map +1 -1
  279. package/dist/paths/collection-refs.js +92 -18
  280. package/dist/paths/collection-refs.js.map +1 -1
  281. package/dist/paths/collections.d.ts.map +1 -1
  282. package/dist/paths/collections.js.map +1 -1
  283. package/dist/paths/path-builders.d.ts.map +1 -1
  284. package/dist/paths/path-builders.js +798 -154
  285. package/dist/paths/path-builders.js.map +1 -1
  286. package/dist/paths/storage-paths.d.ts.map +1 -1
  287. package/dist/paths/storage-paths.js.map +1 -1
  288. package/dist/paths/work-section-paths.d.ts.map +1 -1
  289. package/dist/paths/work-section-paths.js.map +1 -1
  290. package/dist/permissions/guild-standing-assignment-policy.d.ts.map +1 -1
  291. package/dist/permissions/guild-standing-assignment-policy.js +13 -4
  292. package/dist/permissions/guild-standing-assignment-policy.js.map +1 -1
  293. package/dist/permissions/index.d.ts +1 -0
  294. package/dist/permissions/index.d.ts.map +1 -1
  295. package/dist/permissions/index.js +1 -0
  296. package/dist/permissions/index.js.map +1 -1
  297. package/dist/permissions/work-project-permissions-data.d.ts.map +1 -1
  298. package/dist/permissions/work-project-permissions-data.js.map +1 -1
  299. package/dist/permissions/work-project-permissions.d.ts +1 -2
  300. package/dist/permissions/work-project-permissions.d.ts.map +1 -1
  301. package/dist/permissions/work-project-permissions.js +8 -7
  302. package/dist/permissions/work-project-permissions.js.map +1 -1
  303. package/dist/report/chat-report-channel-ref.d.ts.map +1 -1
  304. package/dist/report/chat-report-channel-ref.js +8 -2
  305. package/dist/report/chat-report-channel-ref.js.map +1 -1
  306. package/dist/report/report-config-values.d.ts.map +1 -1
  307. package/dist/report/report-config-values.js +8 -8
  308. package/dist/report/report-config-values.js.map +1 -1
  309. package/dist/safety/active-safety-case-alert.d.ts +1 -1
  310. package/dist/safety/active-safety-case-alert.d.ts.map +1 -1
  311. package/dist/safety/active-safety-case-alert.js +2 -1
  312. package/dist/safety/active-safety-case-alert.js.map +1 -1
  313. package/dist/safety/ncii-intake-derivations.d.ts +1 -1
  314. package/dist/safety/ncii-intake-derivations.d.ts.map +1 -1
  315. package/dist/safety/ncii-intake-derivations.js.map +1 -1
  316. package/dist/safety/resource-keys.d.ts +2 -1
  317. package/dist/safety/resource-keys.d.ts.map +1 -1
  318. package/dist/safety/resource-keys.js.map +1 -1
  319. package/dist/schemas/admin-dispatch-actions.d.ts.map +1 -1
  320. package/dist/schemas/admin-dispatch-actions.js +20 -10
  321. package/dist/schemas/admin-dispatch-actions.js.map +1 -1
  322. package/dist/schemas/admin.d.ts +32 -25
  323. package/dist/schemas/admin.d.ts.map +1 -1
  324. package/dist/schemas/admin.js +214 -114
  325. package/dist/schemas/admin.js.map +1 -1
  326. package/dist/schemas/atoms.d.ts +39 -1
  327. package/dist/schemas/atoms.d.ts.map +1 -1
  328. package/dist/schemas/atoms.js +36 -10
  329. package/dist/schemas/atoms.js.map +1 -1
  330. package/dist/schemas/auditions.d.ts.map +1 -1
  331. package/dist/schemas/auditions.js +8 -4
  332. package/dist/schemas/auditions.js.map +1 -1
  333. package/dist/schemas/chat.d.ts +68 -2
  334. package/dist/schemas/chat.d.ts.map +1 -1
  335. package/dist/schemas/chat.js +66 -32
  336. package/dist/schemas/chat.js.map +1 -1
  337. package/dist/schemas/commissions.d.ts +2 -2
  338. package/dist/schemas/commissions.d.ts.map +1 -1
  339. package/dist/schemas/commissions.js +20 -18
  340. package/dist/schemas/commissions.js.map +1 -1
  341. package/dist/schemas/conversation-files.d.ts.map +1 -1
  342. package/dist/schemas/conversation-files.js +4 -2
  343. package/dist/schemas/conversation-files.js.map +1 -1
  344. package/dist/schemas/craft-skills.d.ts.map +1 -1
  345. package/dist/schemas/craft-skills.js +8 -4
  346. package/dist/schemas/craft-skills.js.map +1 -1
  347. package/dist/schemas/hall-library.d.ts.map +1 -1
  348. package/dist/schemas/hall-library.js +92 -45
  349. package/dist/schemas/hall-library.js.map +1 -1
  350. package/dist/schemas/index.d.ts +0 -3
  351. package/dist/schemas/index.d.ts.map +1 -1
  352. package/dist/schemas/index.js +0 -7
  353. package/dist/schemas/index.js.map +1 -1
  354. package/dist/schemas/media.d.ts.map +1 -1
  355. package/dist/schemas/media.js +32 -16
  356. package/dist/schemas/media.js.map +1 -1
  357. package/dist/schemas/ncii.d.ts +6 -3
  358. package/dist/schemas/ncii.d.ts.map +1 -1
  359. package/dist/schemas/ncii.js +42 -17
  360. package/dist/schemas/ncii.js.map +1 -1
  361. package/dist/schemas/notification.d.ts +2 -2
  362. package/dist/schemas/notification.d.ts.map +1 -1
  363. package/dist/schemas/notification.js +137 -65
  364. package/dist/schemas/notification.js.map +1 -1
  365. package/dist/schemas/payments.d.ts.map +1 -1
  366. package/dist/schemas/payments.js +25 -12
  367. package/dist/schemas/payments.js.map +1 -1
  368. package/dist/schemas/public-documents.d.ts +4 -4
  369. package/dist/schemas/public-documents.d.ts.map +1 -1
  370. package/dist/schemas/public-documents.js +44 -22
  371. package/dist/schemas/public-documents.js.map +1 -1
  372. package/dist/schemas/safety.d.ts +210 -214
  373. package/dist/schemas/safety.d.ts.map +1 -1
  374. package/dist/schemas/safety.js +75 -31
  375. package/dist/schemas/safety.js.map +1 -1
  376. package/dist/schemas/social.d.ts +7 -7
  377. package/dist/schemas/social.d.ts.map +1 -1
  378. package/dist/schemas/social.js +26 -13
  379. package/dist/schemas/social.js.map +1 -1
  380. package/dist/schemas/stake-share-operation.d.ts.map +1 -1
  381. package/dist/schemas/stake-share-operation.js +41 -21
  382. package/dist/schemas/stake-share-operation.js.map +1 -1
  383. package/dist/schemas/text-field.d.ts +2 -2
  384. package/dist/schemas/text-field.js +2 -2
  385. package/dist/schemas/text-field.js.map +1 -1
  386. package/dist/schemas/users.d.ts +17 -1
  387. package/dist/schemas/users.d.ts.map +1 -1
  388. package/dist/schemas/users.js +90 -43
  389. package/dist/schemas/users.js.map +1 -1
  390. package/dist/schemas/utility.d.ts.map +1 -1
  391. package/dist/schemas/utility.js +45 -21
  392. package/dist/schemas/utility.js.map +1 -1
  393. package/dist/schemas/voting.d.ts.map +1 -1
  394. package/dist/schemas/voting.js +8 -4
  395. package/dist/schemas/voting.js.map +1 -1
  396. package/dist/schemas/work-project-management.d.ts +1 -1
  397. package/dist/schemas/work-project-management.d.ts.map +1 -1
  398. package/dist/schemas/work-project-management.js +187 -94
  399. package/dist/schemas/work-project-management.js.map +1 -1
  400. package/dist/system-slots/help-videos.d.ts.map +1 -1
  401. package/dist/system-slots/help-videos.js +135 -27
  402. package/dist/system-slots/help-videos.js.map +1 -1
  403. package/dist/system-slots/system-slots.d.ts +1 -1
  404. package/dist/system-slots/system-slots.d.ts.map +1 -1
  405. package/dist/system-slots/system-slots.js.map +1 -1
  406. package/dist/types/admin-users.d.ts +0 -1
  407. package/dist/types/admin-users.d.ts.map +1 -1
  408. package/dist/types/admin-users.js +4 -4
  409. package/dist/types/admin-users.js.map +1 -1
  410. package/dist/types/audit.d.ts.map +1 -1
  411. package/dist/types/audit.js.map +1 -1
  412. package/dist/types/content.d.ts +0 -5
  413. package/dist/types/content.d.ts.map +1 -1
  414. package/dist/types/content.js.map +1 -1
  415. package/dist/types/index.d.ts +0 -10
  416. package/dist/types/index.d.ts.map +1 -1
  417. package/dist/types/index.js +0 -9
  418. package/dist/types/index.js.map +1 -1
  419. package/dist/types/payments.d.ts +0 -1
  420. package/dist/types/payments.d.ts.map +1 -1
  421. package/dist/types/payments.js +2 -3
  422. package/dist/types/payments.js.map +1 -1
  423. package/dist/types/work-project.d.ts +0 -2
  424. package/dist/types/work-project.d.ts.map +1 -1
  425. package/dist/types/work-project.js +2 -1
  426. package/dist/types/work-project.js.map +1 -1
  427. package/dist/upload-variables/apply-to-commission-variables.d.ts.map +1 -1
  428. package/dist/upload-variables/apply-to-commission-variables.js +5 -3
  429. package/dist/upload-variables/apply-to-commission-variables.js.map +1 -1
  430. package/dist/upload-variables/create-admin-audition-variables.d.ts.map +1 -1
  431. package/dist/upload-variables/create-admin-audition-variables.js +8 -3
  432. package/dist/upload-variables/create-admin-audition-variables.js.map +1 -1
  433. package/dist/upload-variables/create-audition-entry-variables.d.ts.map +1 -1
  434. package/dist/upload-variables/create-audition-entry-variables.js +4 -2
  435. package/dist/upload-variables/create-audition-entry-variables.js.map +1 -1
  436. package/dist/upload-variables/create-commission-variables.d.ts.map +1 -1
  437. package/dist/upload-variables/create-commission-variables.js +12 -6
  438. package/dist/upload-variables/create-commission-variables.js.map +1 -1
  439. package/dist/upload-variables/create-work-project-audition-variables.d.ts.map +1 -1
  440. package/dist/upload-variables/create-work-project-audition-variables.js +14 -6
  441. package/dist/upload-variables/create-work-project-audition-variables.js.map +1 -1
  442. package/dist/upload-variables/square-streetz-post-variables.d.ts +1 -1
  443. package/dist/upload-variables/square-streetz-post-variables.d.ts.map +1 -1
  444. package/dist/upload-variables/square-streetz-post-variables.js +5 -2
  445. package/dist/upload-variables/square-streetz-post-variables.js.map +1 -1
  446. package/dist/upload-variables/update-chapter-media-variables.d.ts.map +1 -1
  447. package/dist/upload-variables/update-chapter-media-variables.js +5 -3
  448. package/dist/upload-variables/update-chapter-media-variables.js.map +1 -1
  449. package/dist/upload-variables/update-episode-media-variables.d.ts.map +1 -1
  450. package/dist/upload-variables/update-episode-media-variables.js +5 -3
  451. package/dist/upload-variables/update-episode-media-variables.js.map +1 -1
  452. package/dist/upload-variables/update-tale-cover-photo-variables.d.ts.map +1 -1
  453. package/dist/upload-variables/update-tale-cover-photo-variables.js +4 -2
  454. package/dist/upload-variables/update-tale-cover-photo-variables.js.map +1 -1
  455. package/dist/upload-variables/update-television-cover-photo-variables.d.ts.map +1 -1
  456. package/dist/upload-variables/update-television-cover-photo-variables.js +4 -2
  457. package/dist/upload-variables/update-television-cover-photo-variables.js.map +1 -1
  458. package/dist/upload-variables/update-track-media-variables.d.ts.map +1 -1
  459. package/dist/upload-variables/update-track-media-variables.js +5 -3
  460. package/dist/upload-variables/update-track-media-variables.js.map +1 -1
  461. package/dist/upload-variables/update-tune-cover-photo-variables.d.ts.map +1 -1
  462. package/dist/upload-variables/update-tune-cover-photo-variables.js +4 -2
  463. package/dist/upload-variables/update-tune-cover-photo-variables.js.map +1 -1
  464. package/dist/upload-variables/update-work-realm-cover-variables.d.ts.map +1 -1
  465. package/dist/upload-variables/update-work-realm-cover-variables.js +4 -2
  466. package/dist/upload-variables/update-work-realm-cover-variables.js.map +1 -1
  467. package/dist/upload-variables/upload-conversation-file-variables.d.ts.map +1 -1
  468. package/dist/upload-variables/upload-conversation-file-variables.js +4 -2
  469. package/dist/upload-variables/upload-conversation-file-variables.js.map +1 -1
  470. package/dist/upload-variables/upload-craft-skill-variables.d.ts.map +1 -1
  471. package/dist/upload-variables/upload-craft-skill-variables.js +4 -2
  472. package/dist/upload-variables/upload-craft-skill-variables.js.map +1 -1
  473. package/dist/upload-variables/upload-profile-picture-variables.d.ts.map +1 -1
  474. package/dist/upload-variables/upload-profile-picture-variables.js +4 -2
  475. package/dist/upload-variables/upload-profile-picture-variables.js.map +1 -1
  476. package/dist/upload-variables/upload-system-content-variables.d.ts.map +1 -1
  477. package/dist/upload-variables/upload-system-content-variables.js +4 -2
  478. package/dist/upload-variables/upload-system-content-variables.js.map +1 -1
  479. package/dist/upload-variables/upload-work-file-variables.d.ts.map +1 -1
  480. package/dist/upload-variables/upload-work-file-variables.js +4 -2
  481. package/dist/upload-variables/upload-work-file-variables.js.map +1 -1
  482. package/dist/utils/admin-standing.d.ts.map +1 -1
  483. package/dist/utils/admin-standing.js +3 -1
  484. package/dist/utils/admin-standing.js.map +1 -1
  485. package/dist/utils/age-derivation.d.ts.map +1 -1
  486. package/dist/utils/age-derivation.js.map +1 -1
  487. package/dist/utils/app-config.d.ts.map +1 -1
  488. package/dist/utils/app-config.js +3 -1
  489. package/dist/utils/app-config.js.map +1 -1
  490. package/dist/utils/guild-chat-access.d.ts.map +1 -1
  491. package/dist/utils/guild-chat-access.js +5 -3
  492. package/dist/utils/guild-chat-access.js.map +1 -1
  493. package/dist/utils/guild-invite-system-message.d.ts.map +1 -1
  494. package/dist/utils/guild-invite-system-message.js +7 -3
  495. package/dist/utils/guild-invite-system-message.js.map +1 -1
  496. package/dist/utils/hall-content.d.ts +2 -2
  497. package/dist/utils/hall-content.d.ts.map +1 -1
  498. package/dist/utils/hall-content.js +18 -6
  499. package/dist/utils/hall-content.js.map +1 -1
  500. package/dist/utils/pledge-refund-eligibility.d.ts.map +1 -1
  501. package/dist/utils/pledge-refund-eligibility.js +7 -2
  502. package/dist/utils/pledge-refund-eligibility.js.map +1 -1
  503. package/dist/utils/pledge-totals.d.ts.map +1 -1
  504. package/dist/utils/pledge-totals.js.map +1 -1
  505. package/dist/utils/public-documents.d.ts.map +1 -1
  506. package/dist/utils/public-documents.js +1 -1
  507. package/dist/utils/public-documents.js.map +1 -1
  508. package/dist/utils/text-field.d.ts +3 -0
  509. package/dist/utils/text-field.d.ts.map +1 -1
  510. package/dist/utils/text-field.js +5 -0
  511. package/dist/utils/text-field.js.map +1 -1
  512. package/dist/utils/work-file-folder.d.ts.map +1 -1
  513. package/dist/utils/work-file-folder.js.map +1 -1
  514. package/dist/utils/work-publish-readiness.d.ts.map +1 -1
  515. package/dist/utils/work-publish-readiness.js.map +1 -1
  516. package/dist/utils/work-realm-eligibility.d.ts.map +1 -1
  517. package/dist/utils/work-realm-eligibility.js.map +1 -1
  518. package/package.json +8 -48
  519. package/dist/capabilities/index.d.ts +0 -3
  520. package/dist/capabilities/index.d.ts.map +0 -1
  521. package/dist/capabilities/index.js +0 -3
  522. package/dist/capabilities/index.js.map +0 -1
  523. package/dist/constants/business.d.ts +0 -6
  524. package/dist/constants/business.d.ts.map +0 -1
  525. package/dist/constants/business.js +0 -9
  526. package/dist/constants/business.js.map +0 -1
  527. package/dist/ids/index.d.ts +0 -3
  528. package/dist/ids/index.d.ts.map +0 -1
  529. package/dist/ids/index.js +0 -3
  530. package/dist/ids/index.js.map +0 -1
  531. package/dist/media/publication/index.d.ts +0 -2
  532. package/dist/media/publication/index.d.ts.map +0 -1
  533. package/dist/media/publication/index.js +0 -2
  534. package/dist/media/publication/index.js.map +0 -1
  535. package/dist/report/index.d.ts +0 -3
  536. package/dist/report/index.d.ts.map +0 -1
  537. package/dist/report/index.js +0 -3
  538. package/dist/report/index.js.map +0 -1
  539. package/dist/system-slots/index.d.ts +0 -4
  540. package/dist/system-slots/index.d.ts.map +0 -1
  541. package/dist/system-slots/index.js +0 -4
  542. package/dist/system-slots/index.js.map +0 -1
  543. package/dist/types/admin.d.ts +0 -2
  544. package/dist/types/admin.d.ts.map +0 -1
  545. package/dist/types/admin.js +0 -5
  546. package/dist/types/admin.js.map +0 -1
  547. package/dist/types/commissions.d.ts +0 -2
  548. package/dist/types/commissions.d.ts.map +0 -1
  549. package/dist/types/commissions.js +0 -3
  550. package/dist/types/commissions.js.map +0 -1
  551. package/dist/types/messaging.d.ts +0 -2
  552. package/dist/types/messaging.d.ts.map +0 -1
  553. package/dist/types/messaging.js +0 -7
  554. package/dist/types/messaging.js.map +0 -1
  555. package/dist/types/moderation.d.ts +0 -2
  556. package/dist/types/moderation.d.ts.map +0 -1
  557. package/dist/types/moderation.js +0 -5
  558. package/dist/types/moderation.js.map +0 -1
  559. package/dist/types/public-documents.d.ts +0 -3
  560. package/dist/types/public-documents.d.ts.map +0 -1
  561. package/dist/types/public-documents.js +0 -2
  562. package/dist/types/public-documents.js.map +0 -1
  563. package/dist/types/publicUser.d.ts +0 -2
  564. package/dist/types/publicUser.d.ts.map +0 -1
  565. package/dist/types/publicUser.js +0 -9
  566. package/dist/types/publicUser.js.map +0 -1
  567. package/dist/types/social.d.ts +0 -3
  568. package/dist/types/social.d.ts.map +0 -1
  569. package/dist/types/social.js +0 -2
  570. package/dist/types/social.js.map +0 -1
  571. package/dist/types/system.d.ts +0 -24
  572. package/dist/types/system.d.ts.map +0 -1
  573. package/dist/types/system.js +0 -2
  574. package/dist/types/system.js.map +0 -1
  575. package/dist/types/user.d.ts +0 -2
  576. package/dist/types/user.d.ts.map +0 -1
  577. package/dist/types/user.js +0 -3
  578. package/dist/types/user.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../src/capabilities/capability-registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;6CAE6C;AAC7C,MAAM,MAAM,YAAY,GACpB,uBAAuB,GACvB,aAAa,GACb,yBAAyB,GACzB,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,qBAAqB,GACrB,kCAAkC,GAClC,6BAA6B,GAC7B,kBAAkB,GAClB,eAAe,CAAC;AAEpB,gDAAgD;AAChD,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,MAAM,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB;iFAC6E;IAC7E,cAAc,EAAE,wBAAwB,CAAC;IACzC,8EAA8E;IAC9E,SAAS,EAAE,OAAO,CAAC;IACnB;4DACwD;IACxD,aAAa,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAED;;;+DAG+D;AAC/D,eAAO,MAAM,yBAAyB,wWAiBI,CAAC;AAE3C,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,YAAY,EAAE,oBAAoB,CA8E1E,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,EAAuC,YAAY,EAAE,CAAC;AAErF;gDACgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,YAAY,EACxB,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAIT;AAED,4CAA4C;AAC5C,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElE"}
1
+ {"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../src/capabilities/capability-registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;6CAE6C;AAC7C,MAAM,MAAM,YAAY,GACpB,uBAAuB,GACvB,aAAa,GACb,yBAAyB,GACzB,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,qBAAqB,GACrB,kCAAkC,GAClC,6BAA6B,GAC7B,kBAAkB,GAClB,eAAe,CAAC;AAEpB,gDAAgD;AAChD,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,MAAM,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB;iFAC6E;IAC7E,cAAc,EAAE,wBAAwB,CAAC;IACzC,8EAA8E;IAC9E,SAAS,EAAE,OAAO,CAAC;IACnB;4DACwD;IACxD,aAAa,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAED;;;+DAG+D;AAC/D,eAAO,MAAM,yBAAyB,wWAiBI,CAAC;AAE3C,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,YAAY,EAAE,oBAAoB,CA8E1E,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,EAAuC,YAAY,EAAE,CAAC;AAErF;gDACgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAI7F;AAED,4CAA4C;AAC5C,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAElE"}
@@ -1 +1 @@
1
- {"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/capabilities/capability-registry.ts"],"names":[],"mappings":"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","sourcesContent":["// ============================================================================\n// CAPABILITY REGISTRY — the ONE declaration of the age/eligibility capability\n// model (Phase 6). Consolidated here 2026-07-13 from the former byte-for-byte\n// mirrors in ttt-prod `src/lib/capabilities/capability-registry.ts` and\n// `functions/src/shared/capability-registry.ts` (both trees now import this;\n// the two-tree sync tests are deleted). Upload origins are compile-linked to\n// the canonical `FileOrigin` union — an origin rename fails the build here.\n// ============================================================================\n\nimport type { FileOrigin } from '../media/file-origin.js';\n\n/** Every age/eligibility-gated capability id. Past-tense/imperative-neutral,\n * dotted-namespace. Adding a value here REQUIRES adding it to CAPABILITY_REGISTRY\n * (the exhaustive test enforces the 1:1). */\nexport type CapabilityId =\n | 'account.becomeArtisan'\n | 'square.post'\n | 'square.acceptAgreements'\n | 'pledge.create'\n | 'messaging.guildInvite'\n | 'messaging.send'\n | 'messaging.fileShare'\n | 'collaboration.commissionProposal'\n | 'collaboration.auditionEntry'\n | 'stakeShares.hold'\n | 'upload.origin';\n\n/** The age requirement a capability imposes. */\nexport type CapabilityAgeRequirement =\n | 'adult18Plus' // both actor (and, for messaging, recipient) must be 18+\n | 'none'; // available to any eligible (13+) account\n\nexport interface CapabilityDefinition {\n id: CapabilityId;\n /** Human-facing summary (admin/debug only; not user copy). */\n description: string;\n /** The age gate. `adult18Plus` capabilities are server-enforced against the age flag\n * the backend reads from `privateData`; no age claim exists on the token. */\n ageRequirement: CapabilityAgeRequirement;\n /** When true, BOTH ends must satisfy the requirement (no-minor-messaging). */\n bilateral: boolean;\n /** Upload origins this capability governs (for the startUpload gate). Empty\n * unless the capability is `upload.origin`-adjacent. */\n uploadOrigins: readonly FileOrigin[];\n}\n\n/** Upload origins that require an 18+ account to initiate (origin-level gate, not\n * just the create callable — Phase 6 item 3). Origins tied to artisan-only\n * surfaces (collaboration, hall publication, work assets) are 18+ because only\n * 18+ accounts can be artisan creators / hold stake shares. */\nexport const ADULT_ONLY_UPLOAD_ORIGINS = [\n 'squareStreetz',\n 'commission-posting',\n 'commission-proposal',\n 'audition-prompt',\n 'audition-entry',\n 'hallLibrary-cover-square',\n 'hallLibrary-cover-poster',\n 'hallLibrary-cover-cinematic',\n 'realm-cover',\n 'chapter-photo',\n 'tune-track-photo',\n 'tune-track-audio',\n 'television-episode-photo',\n 'television-episode-video',\n 'conversation-file',\n 'work-asset',\n] as const satisfies readonly FileOrigin[];\n\nexport const CAPABILITY_REGISTRY: Record<CapabilityId, CapabilityDefinition> = {\n 'account.becomeArtisan': {\n id: 'account.becomeArtisan',\n description: 'Become an artisan creator (privilege + stake-share eligibility).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'square.post': {\n id: 'square.post',\n description: 'Create a Square Streetz post.',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ['squareStreetz'],\n },\n 'square.acceptAgreements': {\n id: 'square.acceptAgreements',\n description: 'Accept the Square Streetz posting agreements.',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'pledge.create': {\n id: 'pledge.create',\n description: 'Create a pledge / payment (18+ only, pledge-only payments).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'messaging.guildInvite': {\n id: 'messaging.guildInvite',\n description: 'Send a guild invite (opens an invite-conversation thread).',\n ageRequirement: 'adult18Plus',\n bilateral: true,\n uploadOrigins: [],\n },\n 'messaging.send': {\n id: 'messaging.send',\n description: 'Send a chat / invite-thread message.',\n ageRequirement: 'adult18Plus',\n bilateral: true,\n uploadOrigins: [],\n },\n 'messaging.fileShare': {\n id: 'messaging.fileShare',\n description: 'Share a Conversation File in an invite / admin-support conversation.',\n ageRequirement: 'adult18Plus',\n bilateral: true,\n uploadOrigins: ['conversation-file'],\n },\n 'collaboration.commissionProposal': {\n id: 'collaboration.commissionProposal',\n description: 'Submit a commission proposal (artisan collaboration surface).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ['commission-proposal'],\n },\n 'collaboration.auditionEntry': {\n id: 'collaboration.auditionEntry',\n description: 'Submit an audition entry (artisan collaboration surface).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ['audition-entry'],\n },\n 'stakeShares.hold': {\n id: 'stakeShares.hold',\n description: 'Hold stake shares (guild membership / revenue).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'upload.origin': {\n id: 'upload.origin',\n description: 'Initiate an upload for an adult-only origin (startUpload gate).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ADULT_ONLY_UPLOAD_ORIGINS,\n },\n};\n\n/** All capability ids (for exhaustiveness tests + iteration). */\nexport const ALL_CAPABILITY_IDS = Object.keys(CAPABILITY_REGISTRY) as CapabilityId[];\n\n/** The actor's age-relevant view, read server-side from privateData — the only age\n * authority; the token carries no age claim. */\nexport interface AgeCapabilityContext {\n is18Plus: boolean;\n accountCapabilityVersion: number;\n}\n\n/** Does this context satisfy a capability's age requirement? */\nexport function contextSatisfies(\n capability: CapabilityId,\n ctx: AgeCapabilityContext,\n): boolean {\n const def = CAPABILITY_REGISTRY[capability];\n if (def.ageRequirement === 'none') return true;\n return ctx.is18Plus === true;\n}\n\n/** Is the given upload origin 18+-gated? */\nexport function uploadOriginRequires18Plus(origin: string): boolean {\n return (ADULT_ONLY_UPLOAD_ORIGINS as readonly string[]).includes(origin);\n}\n"]}
1
+ {"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/capabilities/capability-registry.ts"],"names":[],"mappings":"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","sourcesContent":["// ============================================================================\n// CAPABILITY REGISTRY — the ONE declaration of the age/eligibility capability\n// model (Phase 6). Consolidated here 2026-07-13 from the former byte-for-byte\n// mirrors in ttt-prod `src/lib/capabilities/capability-registry.ts` and\n// `functions/src/shared/capability-registry.ts` (both trees now import this;\n// the two-tree sync tests are deleted). Upload origins are compile-linked to\n// the canonical `FileOrigin` union — an origin rename fails the build here.\n// ============================================================================\n\nimport type { FileOrigin } from '../media/file-origin.js';\n\n/** Every age/eligibility-gated capability id. Past-tense/imperative-neutral,\n * dotted-namespace. Adding a value here REQUIRES adding it to CAPABILITY_REGISTRY\n * (the exhaustive test enforces the 1:1). */\nexport type CapabilityId =\n | 'account.becomeArtisan'\n | 'square.post'\n | 'square.acceptAgreements'\n | 'pledge.create'\n | 'messaging.guildInvite'\n | 'messaging.send'\n | 'messaging.fileShare'\n | 'collaboration.commissionProposal'\n | 'collaboration.auditionEntry'\n | 'stakeShares.hold'\n | 'upload.origin';\n\n/** The age requirement a capability imposes. */\nexport type CapabilityAgeRequirement =\n | 'adult18Plus' // both actor (and, for messaging, recipient) must be 18+\n | 'none'; // available to any eligible (13+) account\n\nexport interface CapabilityDefinition {\n id: CapabilityId;\n /** Human-facing summary (admin/debug only; not user copy). */\n description: string;\n /** The age gate. `adult18Plus` capabilities are server-enforced against the age flag\n * the backend reads from `privateData`; no age claim exists on the token. */\n ageRequirement: CapabilityAgeRequirement;\n /** When true, BOTH ends must satisfy the requirement (no-minor-messaging). */\n bilateral: boolean;\n /** Upload origins this capability governs (for the startUpload gate). Empty\n * unless the capability is `upload.origin`-adjacent. */\n uploadOrigins: readonly FileOrigin[];\n}\n\n/** Upload origins that require an 18+ account to initiate (origin-level gate, not\n * just the create callable — Phase 6 item 3). Origins tied to artisan-only\n * surfaces (collaboration, hall publication, work assets) are 18+ because only\n * 18+ accounts can be artisan creators / hold stake shares. */\nexport const ADULT_ONLY_UPLOAD_ORIGINS = [\n 'squareStreetz',\n 'commission-posting',\n 'commission-proposal',\n 'audition-prompt',\n 'audition-entry',\n 'hallLibrary-cover-square',\n 'hallLibrary-cover-poster',\n 'hallLibrary-cover-cinematic',\n 'realm-cover',\n 'chapter-photo',\n 'tune-track-photo',\n 'tune-track-audio',\n 'television-episode-photo',\n 'television-episode-video',\n 'conversation-file',\n 'work-asset',\n] as const satisfies readonly FileOrigin[];\n\nexport const CAPABILITY_REGISTRY: Record<CapabilityId, CapabilityDefinition> = {\n 'account.becomeArtisan': {\n id: 'account.becomeArtisan',\n description: 'Become an artisan creator (privilege + stake-share eligibility).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'square.post': {\n id: 'square.post',\n description: 'Create a Square Streetz post.',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ['squareStreetz'],\n },\n 'square.acceptAgreements': {\n id: 'square.acceptAgreements',\n description: 'Accept the Square Streetz posting agreements.',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'pledge.create': {\n id: 'pledge.create',\n description: 'Create a pledge / payment (18+ only, pledge-only payments).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'messaging.guildInvite': {\n id: 'messaging.guildInvite',\n description: 'Send a guild invite (opens an invite-conversation thread).',\n ageRequirement: 'adult18Plus',\n bilateral: true,\n uploadOrigins: [],\n },\n 'messaging.send': {\n id: 'messaging.send',\n description: 'Send a chat / invite-thread message.',\n ageRequirement: 'adult18Plus',\n bilateral: true,\n uploadOrigins: [],\n },\n 'messaging.fileShare': {\n id: 'messaging.fileShare',\n description: 'Share a Conversation File in an invite / admin-support conversation.',\n ageRequirement: 'adult18Plus',\n bilateral: true,\n uploadOrigins: ['conversation-file'],\n },\n 'collaboration.commissionProposal': {\n id: 'collaboration.commissionProposal',\n description: 'Submit a commission proposal (artisan collaboration surface).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ['commission-proposal'],\n },\n 'collaboration.auditionEntry': {\n id: 'collaboration.auditionEntry',\n description: 'Submit an audition entry (artisan collaboration surface).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ['audition-entry'],\n },\n 'stakeShares.hold': {\n id: 'stakeShares.hold',\n description: 'Hold stake shares (guild membership / revenue).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: [],\n },\n 'upload.origin': {\n id: 'upload.origin',\n description: 'Initiate an upload for an adult-only origin (startUpload gate).',\n ageRequirement: 'adult18Plus',\n bilateral: false,\n uploadOrigins: ADULT_ONLY_UPLOAD_ORIGINS,\n },\n};\n\n/** All capability ids (for exhaustiveness tests + iteration). */\nexport const ALL_CAPABILITY_IDS = Object.keys(CAPABILITY_REGISTRY) as CapabilityId[];\n\n/** The actor's age-relevant view, read server-side from privateData — the only age\n * authority; the token carries no age claim. */\nexport interface AgeCapabilityContext {\n is18Plus: boolean;\n accountCapabilityVersion: number;\n}\n\n/** Does this context satisfy a capability's age requirement? */\nexport function contextSatisfies(capability: CapabilityId, ctx: AgeCapabilityContext): boolean {\n const def = CAPABILITY_REGISTRY[capability];\n if (def.ageRequirement === 'none') return true;\n return ctx.is18Plus === true;\n}\n\n/** Is the given upload origin 18+-gated? */\nexport function uploadOriginRequires18Plus(origin: string): boolean {\n return (ADULT_ONLY_UPLOAD_ORIGINS as readonly string[]).includes(origin);\n}\n"]}
@@ -1,17 +1,17 @@
1
1
  import type { UserAccountStatus } from '../doc-schemas/user.js';
2
- import type { FeedbackType } from './business-admin.js';
3
- import type { ClearableTextFieldName } from './business-content.js';
4
- import { HALL_CONTENT_TEXT_FIELDS } from './business-content.js';
5
2
  import type { HallContentTextSurface } from '../doc-schemas/content.js';
6
3
  import type { ReportDisposition, NciiInternalStatus } from '../doc-schemas/safety/foundation.js';
7
4
  import type { ChildSafetyWorkStatus } from '../doc-schemas/safety/case.js';
5
+ import type { AdminDispatch } from '../doc-schemas/messaging.js';
6
+ import type { Audition } from '../doc-schemas/commissions.js';
7
+ import type { FeedbackType } from './business-admin.js';
8
+ import type { ClearableTextFieldName } from './business-content.js';
9
+ import { HALL_CONTENT_TEXT_FIELDS } from './business-content.js';
8
10
  import type { BroadcastAudienceSelector } from '../schemas/notification.js';
9
11
  import type { DeadLetterCollection } from '../schemas/admin.js';
10
12
  import type { GuildInviteConversationStatus, ShortLinkTargetType } from '../schemas/atoms.js';
11
- import type { AdminDispatch } from '../doc-schemas/messaging.js';
12
13
  import type { CommissionProposalStatus } from '../schemas/commissions.js';
13
14
  import type { InviteSourceType } from '../schemas/work-project-management.js';
14
- import type { Audition } from '../doc-schemas/commissions.js';
15
15
  import type { HallWingType, RuleGroup, WorkProjectType } from '../types/content.js';
16
16
  import type { HallSubItemStatus } from '../utils/hall-content.js';
17
17
  /** Moderation status labels (user-management view, status badges). */
@@ -50,12 +50,9 @@ export type ClearableTextFieldLabelOverrides = {
50
50
  };
51
51
  };
52
52
  /**
53
- * A Realm's identity field is called **Name** on every Realm surface (DJ ruling 2026-07-29,
54
- * settling a four-surface Name/Title conflict: the creation flow said "Realm Name", the inline
55
- * edit form "Working Title", the moderation-cleared banner "Title", and the request-update
56
- * dialog "Name"). The `workingTitle` doc field is shared with the Work shell, where it IS a
57
- * Title — so the difference is per-surface, not per-field, and lives here rather than flattening
58
- * one of the two settled terms.
53
+ * A Realm's identity field is called **Name** on every Realm surface. The `workingTitle` doc
54
+ * field is shared with the Work shell, where it IS a Title — so the difference is per-surface, not
55
+ * per-field, and lives here rather than flattening one of the two settled terms.
59
56
  */
60
57
  export declare const CLEARABLE_TEXT_FIELD_LABEL_OVERRIDES: {
61
58
  readonly workRealm: {
@@ -96,7 +93,51 @@ export interface UserFacingReasonOption {
96
93
  * enumeration, so every client (web, phone, TV, admin app) renders the same options + labels by
97
94
  * importing from here. Final user-/legal-facing wording is subject to lawyer review; these are
98
95
  * functional defaults. */
99
- export declare const USER_FACING_REASON_OPTIONS: readonly UserFacingReasonOption[];
96
+ export declare const USER_FACING_REASON_OPTIONS: readonly [{
97
+ readonly code: "harassment";
98
+ readonly label: "Harassment or bullying";
99
+ readonly description: "Targeted abuse, threats, or sustained harassment of a person.";
100
+ }, {
101
+ readonly code: "hate";
102
+ readonly label: "Hate speech";
103
+ readonly description: "Attacks on people based on a protected characteristic.";
104
+ }, {
105
+ readonly code: "adult-content";
106
+ readonly label: "Explicit / adult content";
107
+ readonly description: "Sexual or graphic content not allowed on the platform.";
108
+ }, {
109
+ readonly code: "violence";
110
+ readonly label: "Violence or threats";
111
+ readonly description: "Threats of violence, or content glorifying or inciting it.";
112
+ }, {
113
+ readonly code: "spam";
114
+ readonly label: "Spam or scam";
115
+ readonly description: "Unsolicited bulk content, deceptive links, or fraud.";
116
+ }, {
117
+ readonly code: "impersonation";
118
+ readonly label: "Impersonation";
119
+ readonly description: "Pretending to be another person, brand, or entity.";
120
+ }, {
121
+ readonly code: "ip";
122
+ readonly label: "Intellectual property";
123
+ readonly description: "Use of someone else’s work without the right to do so.";
124
+ }, {
125
+ readonly code: "nonconsensual";
126
+ readonly label: "Nonconsensual intimate imagery";
127
+ readonly description: "Intimate or sexual imagery shared without the subject’s consent.";
128
+ }, {
129
+ readonly code: "safety";
130
+ readonly label: "Safety violation";
131
+ readonly description: "A serious safety violation handled under our safety policies.";
132
+ }, {
133
+ readonly code: "other";
134
+ readonly label: "Other (explain)";
135
+ readonly description: "A policy violation not covered above — describe it in the detail box.";
136
+ }];
137
+ /** One user-facing reason code — the codes the picklist owns, never a free string. */
138
+ export type UserFacingReasonCode = (typeof USER_FACING_REASON_OPTIONS)[number]['code'];
139
+ /** Every user-facing reason code, in picklist order. */
140
+ export declare const USER_FACING_REASON_CODES: [UserFacingReasonCode, ...UserFacingReasonCode[]];
100
141
  /** The user-facing label for a reason code (undefined when the code is unknown/absent). */
101
142
  export declare function userFacingReasonLabel(code: string | undefined): string | undefined;
102
143
  /** Each fixed rule group's heading. */
@@ -1 +1 @@
1
- {"version":3,"file":"admin-labels.d.ts","sourceRoot":"","sources":["../../src/constants/admin-labels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-labels.d.ts","sourceRoot":"","sources":["../../src/constants/admin-labels.ts"],"names":[],"mappings":"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"}
@@ -54,12 +54,9 @@ export const CLEARABLE_TEXT_FIELD_LABELS = {
54
54
  content: 'Content',
55
55
  };
56
56
  /**
57
- * A Realm's identity field is called **Name** on every Realm surface (DJ ruling 2026-07-29,
58
- * settling a four-surface Name/Title conflict: the creation flow said "Realm Name", the inline
59
- * edit form "Working Title", the moderation-cleared banner "Title", and the request-update
60
- * dialog "Name"). The `workingTitle` doc field is shared with the Work shell, where it IS a
61
- * Title — so the difference is per-surface, not per-field, and lives here rather than flattening
62
- * one of the two settled terms.
57
+ * A Realm's identity field is called **Name** on every Realm surface. The `workingTitle` doc
58
+ * field is shared with the Work shell, where it IS a Title — so the difference is per-surface, not
59
+ * per-field, and lives here rather than flattening one of the two settled terms.
63
60
  */
64
61
  export const CLEARABLE_TEXT_FIELD_LABEL_OVERRIDES = {
65
62
  workRealm: { workingTitle: 'Name' },
@@ -125,17 +122,59 @@ export const REPORT_DISPOSITION_OPTIONS = [
125
122
  * importing from here. Final user-/legal-facing wording is subject to lawyer review; these are
126
123
  * functional defaults. */
127
124
  export const USER_FACING_REASON_OPTIONS = [
128
- { code: 'harassment', label: 'Harassment or bullying', description: 'Targeted abuse, threats, or sustained harassment of a person.' },
129
- { code: 'hate', label: 'Hate speech', description: 'Attacks on people based on a protected characteristic.' },
130
- { code: 'adult-content', label: 'Explicit / adult content', description: 'Sexual or graphic content not allowed on the platform.' },
131
- { code: 'violence', label: 'Violence or threats', description: 'Threats of violence, or content glorifying or inciting it.' },
132
- { code: 'spam', label: 'Spam or scam', description: 'Unsolicited bulk content, deceptive links, or fraud.' },
133
- { code: 'impersonation', label: 'Impersonation', description: 'Pretending to be another person, brand, or entity.' },
134
- { code: 'ip', label: 'Intellectual property', description: 'Use of someone else’s work without the right to do so.' },
135
- { code: 'nonconsensual', label: 'Nonconsensual intimate imagery', description: 'Intimate or sexual imagery shared without the subject’s consent.' },
136
- { code: 'safety', label: 'Safety violation', description: 'A serious safety violation handled under our safety policies.' },
137
- { code: 'other', label: 'Other (explain)', description: 'A policy violation not covered above — describe it in the detail box.' },
125
+ {
126
+ code: 'harassment',
127
+ label: 'Harassment or bullying',
128
+ description: 'Targeted abuse, threats, or sustained harassment of a person.',
129
+ },
130
+ {
131
+ code: 'hate',
132
+ label: 'Hate speech',
133
+ description: 'Attacks on people based on a protected characteristic.',
134
+ },
135
+ {
136
+ code: 'adult-content',
137
+ label: 'Explicit / adult content',
138
+ description: 'Sexual or graphic content not allowed on the platform.',
139
+ },
140
+ {
141
+ code: 'violence',
142
+ label: 'Violence or threats',
143
+ description: 'Threats of violence, or content glorifying or inciting it.',
144
+ },
145
+ {
146
+ code: 'spam',
147
+ label: 'Spam or scam',
148
+ description: 'Unsolicited bulk content, deceptive links, or fraud.',
149
+ },
150
+ {
151
+ code: 'impersonation',
152
+ label: 'Impersonation',
153
+ description: 'Pretending to be another person, brand, or entity.',
154
+ },
155
+ {
156
+ code: 'ip',
157
+ label: 'Intellectual property',
158
+ description: 'Use of someone else’s work without the right to do so.',
159
+ },
160
+ {
161
+ code: 'nonconsensual',
162
+ label: 'Nonconsensual intimate imagery',
163
+ description: 'Intimate or sexual imagery shared without the subject’s consent.',
164
+ },
165
+ {
166
+ code: 'safety',
167
+ label: 'Safety violation',
168
+ description: 'A serious safety violation handled under our safety policies.',
169
+ },
170
+ {
171
+ code: 'other',
172
+ label: 'Other (explain)',
173
+ description: 'A policy violation not covered above — describe it in the detail box.',
174
+ },
138
175
  ];
176
+ /** Every user-facing reason code, in picklist order. */
177
+ export const USER_FACING_REASON_CODES = USER_FACING_REASON_OPTIONS.map((o) => o.code);
139
178
  /** The user-facing label for a reason code (undefined when the code is unknown/absent). */
140
179
  export function userFacingReasonLabel(code) {
141
180
  return USER_FACING_REASON_OPTIONS.find((o) => o.code === code)?.label;
@@ -1 +1 @@
1
- {"version":3,"file":"admin-labels.js","sourceRoot":"","sources":["../../src/constants/admin-labels.ts"],"names":[],"mappings":"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","sourcesContent":["// ============================================================================\n// ADMIN-SURFACE DISPLAY LABELS — the ONE home for business display copy keyed\n// by canonical ttt-core enums (ARCH-102). Any client (web, phone, TV, admin app)\n// renders the same labels by importing these.\n//\n// A few entries here are copy for ADMIN-MANAGED content that a PUBLIC surface also\n// renders (the Rules & Agreements section titles). The organizing principle is one\n// declaration, not one consumer.\n// ============================================================================\n\nimport type { UserAccountStatus } from '../doc-schemas/user.js';\nimport type { FeedbackType } from './business-admin.js';\nimport type { ClearableTextFieldName } from './business-content.js';\n// Value import: the per-surface override type below indexes this map to restrict each surface's\n// override keys to the fields that surface actually exposes.\nimport { HALL_CONTENT_TEXT_FIELDS } from './business-content.js';\nimport type { HallContentTextSurface } from '../doc-schemas/content.js';\nimport type { ReportDisposition, NciiInternalStatus } from '../doc-schemas/safety/foundation.js';\nimport type { ChildSafetyWorkStatus } from '../doc-schemas/safety/case.js';\nimport type { BroadcastAudienceSelector } from '../schemas/notification.js';\nimport type { DeadLetterCollection } from '../schemas/admin.js';\nimport type { GuildInviteConversationStatus, ShortLinkTargetType } from '../schemas/atoms.js';\nimport type { AdminDispatch } from '../doc-schemas/messaging.js';\nimport type { CommissionProposalStatus } from '../schemas/commissions.js';\nimport type { InviteSourceType } from '../schemas/work-project-management.js';\nimport type { Audition } from '../doc-schemas/commissions.js';\nimport type { HallWingType, RuleGroup, WorkProjectType } from '../types/content.js';\nimport { HALL_WING_TYPES, WORK_PROJECT_TYPES } from './options.js';\nimport type { HallSubItemStatus } from '../utils/hall-content.js';\n\n/** Moderation status labels (user-management view, status badges). */\nexport const USER_ACCOUNT_STATUS_LABELS: Record<UserAccountStatus, string> = {\n active: 'Active',\n suspended: 'Suspended',\n banned: 'Banned',\n};\n\n/** Broadcast audience selector labels (announcement composer). */\nexport const BROADCAST_AUDIENCE_KIND_LABELS: Record<BroadcastAudienceSelector['kind'], string> = {\n allActiveUsers: 'All active users',\n allArtisans: 'All artisan creators',\n explicitUids: 'Specific users (paste uids)',\n workMembers: \"A Work's guild members\",\n realmMembers: \"A Realm's members\",\n};\n\n/** Human labels for the canonical feedback types — the admin feedback-suggestions views and\n * the user-facing feedback-submission surface render these instead of restating copy. Keyed\n * by FeedbackType, so a new FEEDBACK_TYPES member fails the build until its label exists.\n * UI copy uses the SHORT settled terms (Trade → \"Trades\", Craft → \"Craft Tags\", Genre →\n * \"<Kind> Genres\"), never the compound code identifiers (ARCH-107). */\nexport const FEEDBACK_TYPE_LABELS: Record<FeedbackType, string> = {\n tradeProfessionSuggestions: 'Trades',\n craftSkillTagSuggestions: 'Craft Tags',\n talesWorkGenreSuggestions: 'Tales Genres',\n tunesWorkGenreSuggestions: 'Tunes Genres',\n televisionWorkGenreSuggestions: 'Television Genres',\n};\n\n/**\n * Human labels for the raw clearable/changeable TEXT-FIELD names the moderation text-clear\n * remedy and the published \"Update details\" change-request flow work in. The backend stores and\n * validates the raw doc field names (`workingTitle`, `description`, `content`); these are the\n * only display strings for them — rendered by the member-facing \"text removed by moderation\"\n * banners, every admin clear-text field picker, the change-request dialog, and the admin\n * change-request work view. Keyed by the derived ClearableTextFieldName union, so a new\n * clearable field fails the build here until it has a label (ARCH-102).\n *\n * The `working*` pair belongs to the Work shell and the Realm doc; the labels stay the plain\n * short terms (ARCH-107 — the code identifier carries `working`, the UI never shows it).\n */\nexport const CLEARABLE_TEXT_FIELD_LABELS: Record<ClearableTextFieldName, string> = {\n workingTitle: 'Title',\n workingDescription: 'Description',\n title: 'Title',\n description: 'Description',\n content: 'Content',\n};\n\n/**\n * Per-surface label overrides for the field labels above: `[surface][field] → label`. Only a\n * surface that genuinely names a field differently appears here; everything else resolves to the\n * base map. Each surface's override keys are restricted to the fields THAT surface exposes\n * (indexed off `HALL_CONTENT_TEXT_FIELDS`), so an override for a field the surface does not have\n * is a compile error — as is an override for a surface outside `HallContentTextSurface`.\n */\nexport type ClearableTextFieldLabelOverrides = {\n [S in HallContentTextSurface]?: {\n [F in (typeof HALL_CONTENT_TEXT_FIELDS)[S][number]]?: string;\n };\n};\n\n/**\n * A Realm's identity field is called **Name** on every Realm surface (DJ ruling 2026-07-29,\n * settling a four-surface Name/Title conflict: the creation flow said \"Realm Name\", the inline\n * edit form \"Working Title\", the moderation-cleared banner \"Title\", and the request-update\n * dialog \"Name\"). The `workingTitle` doc field is shared with the Work shell, where it IS a\n * Title — so the difference is per-surface, not per-field, and lives here rather than flattening\n * one of the two settled terms.\n */\nexport const CLEARABLE_TEXT_FIELD_LABEL_OVERRIDES = {\n workRealm: { workingTitle: 'Name' },\n} as const satisfies ClearableTextFieldLabelOverrides;\n\n/**\n * The display label for one raw clearable text-field name: the surface's override when it has\n * one, otherwise the base label, otherwise the raw name. This is the ONE accessor every surface\n * calls — pass the surface whenever the caller knows it (a Realm surface must, or it renders\n * \"Title\" for a Name); omit it only for a genuinely surface-agnostic caller.\n *\n * Both parameters tolerate a plain `string` because callers read field names off stored documents\n * (`moderationClearedFields`) and callable payloads, and the surface may be the `workProject`\n * shell — which is a clearable surface but not a `HallContentTextSurface`, so it simply has no\n * overrides and falls through to the base map.\n */\nexport function clearableTextFieldLabel(field: string, surface?: string): string {\n const overrides = surface\n ? (CLEARABLE_TEXT_FIELD_LABEL_OVERRIDES as Record<string, Record<string, string> | undefined>)[\n surface\n ]\n : undefined;\n return (\n overrides?.[field] ?? (CLEARABLE_TEXT_FIELD_LABELS as Record<string, string>)[field] ?? field\n );\n}\n\n/** What the admin screens show for a thread whose `awaitingAdminReply` is set. */\nexport const ADMIN_DISPATCH_AWAITING_REPLY_LABEL = 'Awaiting reply';\n\n/** Human labels for the dead-letter replay ledgers (Ops Repairs dead-letter table). */\nexport const DEAD_LETTER_COLLECTION_LABELS: Record<DeadLetterCollection, string> = {\n chatSyncEvents: 'Chat sync event',\n chatAdminActionCommands: 'Chat moderation command',\n notificationDeliveries: 'Notification delivery',\n chatMessageOutbox: 'Chat message publish',\n squareAnnouncementJobs: 'Square announcement',\n chatSyncFanoutJobs: 'Chat access fanout',\n mediaAssets: 'Media authority sync',\n quarantineSagaJobs: 'Quarantine saga',\n nciiRemovalJobs: 'NCII removal',\n safetyEvidenceJobs: 'Safety evidence job',\n accountActionCommands: 'Account safety action',\n activeReportGroups: 'Report edge sync',\n hallSubItemEdgeSync: 'Hall sub-item edge sync',\n chatParkedDeliveries: 'Chat room delivery',\n};\n\n/** Operator-settable report dispositions with their console copy. 'undetermined' is the\n * initial state, never a settable target, so it carries no option entry. */\nexport const REPORT_DISPOSITION_OPTIONS: readonly {\n value: Exclude<ReportDisposition, 'undetermined'>;\n label: string;\n description: string;\n}[] = [\n {\n value: 'reportRequired',\n label: 'Report required (NCMEC)',\n description:\n 'Apparent CSAM — a report is legally required. Establishes actual knowledge + arms the clock.',\n },\n {\n value: 'notRequired',\n label: 'No report required',\n description: 'No reporting obligation ever arose. Disallowed once there is a validated match.',\n },\n {\n value: 'correctedNoApparentViolation',\n label: 'False positive — correct it',\n description: 'There was a triggering signal but on review it is a false positive.',\n },\n];\n\n/** One user-facing reason option (shown to the affected user for any user-affecting action). */\nexport interface UserFacingReasonOption {\n code: string;\n label: string;\n description: string;\n}\n\n/** User-facing reason picklist for the guided case-resolution flow — the affected user sees the\n * label for any user-affecting action. Canonical home (ARCH-102): the codes ARE this list's own\n * enumeration, so every client (web, phone, TV, admin app) renders the same options + labels by\n * importing from here. Final user-/legal-facing wording is subject to lawyer review; these are\n * functional defaults. */\nexport const USER_FACING_REASON_OPTIONS: readonly UserFacingReasonOption[] = [\n { code: 'harassment', label: 'Harassment or bullying', description: 'Targeted abuse, threats, or sustained harassment of a person.' },\n { code: 'hate', label: 'Hate speech', description: 'Attacks on people based on a protected characteristic.' },\n { code: 'adult-content', label: 'Explicit / adult content', description: 'Sexual or graphic content not allowed on the platform.' },\n { code: 'violence', label: 'Violence or threats', description: 'Threats of violence, or content glorifying or inciting it.' },\n { code: 'spam', label: 'Spam or scam', description: 'Unsolicited bulk content, deceptive links, or fraud.' },\n { code: 'impersonation', label: 'Impersonation', description: 'Pretending to be another person, brand, or entity.' },\n { code: 'ip', label: 'Intellectual property', description: 'Use of someone else’s work without the right to do so.' },\n { code: 'nonconsensual', label: 'Nonconsensual intimate imagery', description: 'Intimate or sexual imagery shared without the subject’s consent.' },\n { code: 'safety', label: 'Safety violation', description: 'A serious safety violation handled under our safety policies.' },\n { code: 'other', label: 'Other (explain)', description: 'A policy violation not covered above — describe it in the detail box.' },\n] as const;\n\n/** The user-facing label for a reason code (undefined when the code is unknown/absent). */\nexport function userFacingReasonLabel(code: string | undefined): string | undefined {\n return USER_FACING_REASON_OPTIONS.find((o) => o.code === code)?.label;\n}\n\n// --- Rules & Agreements section titles and type labels ---\n// The admin rules editor and the public rules page both render these (ENG-002).\n\n/** Each fixed rule group's heading. */\nexport const RULE_GROUP_TITLES: Record<RuleGroup, string> = {\n generic: 'General Site Rules',\n merchandising: 'Merchandising, Endorsements & Revenue Sharing',\n hallWing: 'Hall Wing Rules',\n workRealm: 'Realm Rules',\n};\nexport const ARTISAN_AGREEMENTS_TITLE = 'Artisan Agreements';\n\n/**\n * The label for a rule or agreement point narrowed to one type (\"Tales only\", \"Educational wing\n * only\", \"Tales, Educational wing only\"); undefined when it applies to every type.\n */\nexport function appliesToTypeLabel(entry: {\n workProjectType?: WorkProjectType;\n hallWingType?: HallWingType;\n}): string | undefined {\n const parts = [\n entry.workProjectType && WORK_PROJECT_TYPES[entry.workProjectType].label,\n entry.hallWingType && `${HALL_WING_TYPES[entry.hallWingType].label} wing`,\n ].filter((part): part is string => Boolean(part));\n return parts.length > 0 ? `${parts.join(', ')} only` : undefined;\n}\n\n// --- Stored-enum display labels ---\n// What a screen shows for a stored enum value, keyed by the canonical union so a new member fails\n// the build until it has its text. A screen renders the label, never the raw value.\n\n/** Guild invite statuses (a Work's invited-users list and an invite conversation's status line). */\nexport const GUILD_INVITE_STATUS_LABELS: Record<GuildInviteConversationStatus, string> = {\n pending: 'Pending',\n accepted: 'Accepted',\n declined: 'Declined',\n cancelled: 'Cancelled',\n finalized: 'Finalized',\n};\n\n/** Commission proposal statuses (a Work's proposals table). */\nexport const COMMISSION_PROPOSAL_STATUS_LABELS: Record<CommissionProposalStatus, string> = {\n open: 'Open',\n invited: 'Invited',\n accepted: 'Accepted',\n rejected: 'Rejected',\n};\n\n/** Chapter, track, and episode review statuses (the Tale, Tune, and Television section tables). */\nexport const HALL_SUB_ITEM_STATUS_LABELS: Record<HallSubItemStatus, string> = {\n unpublished: 'unpublished',\n pending_approval: 'Pending approval',\n published: 'published',\n};\n\n/** Audition statuses (the audition page). */\nexport const AUDITION_STATUS_LABELS: Record<Audition['status'], string> = {\n open: 'Open',\n closed: 'Closed',\n pendingReview: 'PendingReview',\n};\n\n/** Work types (Work lists, the Work overview, the Works popover). */\nexport const WORK_PROJECT_TYPE_LABELS: Record<WorkProjectType, string> = {\n Tales: 'Tales',\n Tunes: 'Tunes',\n Television: 'Television',\n};\n\n/** Invite source types, as the invite dialog names the context an invite was sent from. */\nexport const INVITE_SOURCE_TYPE_LABELS: Record<InviteSourceType, string> = {\n standalone: 'standalone',\n craftSkill: 'craftSkill',\n commission: 'commission',\n audition: 'audition',\n};\n\n/** Short-link target types (the admin Short Links list), in the target-type enum's order. */\nexport const SHORT_LINK_TARGET_TYPE_LABELS: Record<ShortLinkTargetType, string> = {\n audition: 'Audition',\n 'audition-entry': 'Audition entry',\n commission: 'Commission',\n 'hall-library-item': 'Hall entry',\n};\n\n/** Support-thread statuses (a member's Messages, a Work's Correspondence, the admin browse list). */\nexport const ADMIN_DISPATCH_STATUS_LABELS: Record<AdminDispatch['status'], string> = {\n open: 'Open',\n user_reply: 'User replied',\n admin_reply: 'Admin replied',\n closed_resolved: 'Resolved',\n closed_unresolved: 'Closed',\n};\n\n/**\n * Why a full admin cannot remove their own Admin standing: the server refuses it, and the roster\n * panel withholds the control with the same words. Another full admin removes it.\n */\nexport const ADMIN_SELF_REVOKE_REFUSAL = \"You can't revoke your own admin standing. Ask another full admin to do it.\";\n\n/** The marker beside the sender of a support-thread message sent with admin authority. */\nexport const ADMIN_SENDER_MARKER_LABEL = 'Admin';\n\n/** The sender label on a support thread's system line (a close notice) in the admin preview. */\nexport const ADMIN_DISPATCH_SYSTEM_SENDER_LABEL = 'System';\n\n/** Child-safety case work statuses (the safety case console's case rows and closed-case lookup). */\nexport const CHILD_SAFETY_CASE_WORK_STATUS_LABELS: Record<ChildSafetyWorkStatus, string> = {\n new: 'new',\n triaged: 'triaged',\n reporting: 'reporting',\n actioning: 'actioning',\n processing: 'processing',\n failed: 'failed',\n operationallyResolved: 'operationallyResolved',\n};\n\n/** NCII case statuses (the safety case console's case rows and closed-case lookup). */\nexport const NCII_CASE_STATUS_LABELS: Record<NciiInternalStatus, string> = {\n open: 'open',\n removalInProgress: 'removalInProgress',\n processing: 'processing',\n failed: 'failed',\n removed: 'removed',\n rejected: 'rejected',\n closed: 'closed',\n};\n"]}
1
+ {"version":3,"file":"admin-labels.js","sourceRoot":"","sources":["../../src/constants/admin-labels.ts"],"names":[],"mappings":"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","sourcesContent":["// ============================================================================\n// ADMIN-SURFACE DISPLAY LABELS — the ONE home for business display copy keyed\n// by canonical ttt-core enums (ARCH-102). Any client (web, phone, TV, admin app)\n// renders the same labels by importing these.\n//\n// A few entries here are copy for ADMIN-MANAGED content that a PUBLIC surface also\n// renders (the Rules & Agreements section titles). The organizing principle is one\n// declaration, not one consumer.\n// ============================================================================\n\nimport type { UserAccountStatus } from '../doc-schemas/user.js';\nimport type { HallContentTextSurface } from '../doc-schemas/content.js';\nimport type { ReportDisposition, NciiInternalStatus } from '../doc-schemas/safety/foundation.js';\nimport type { ChildSafetyWorkStatus } from '../doc-schemas/safety/case.js';\nimport type { AdminDispatch } from '../doc-schemas/messaging.js';\nimport type { Audition } from '../doc-schemas/commissions.js';\nimport type { FeedbackType } from './business-admin.js';\nimport type { ClearableTextFieldName } from './business-content.js';\n// Value import: the per-surface override type below indexes this map to restrict each surface's\n// override keys to the fields that surface actually exposes.\nimport { HALL_CONTENT_TEXT_FIELDS } from './business-content.js';\nimport type { BroadcastAudienceSelector } from '../schemas/notification.js';\nimport type { DeadLetterCollection } from '../schemas/admin.js';\nimport type { GuildInviteConversationStatus, ShortLinkTargetType } from '../schemas/atoms.js';\nimport type { CommissionProposalStatus } from '../schemas/commissions.js';\nimport type { InviteSourceType } from '../schemas/work-project-management.js';\nimport type { HallWingType, RuleGroup, WorkProjectType } from '../types/content.js';\nimport { HALL_WING_TYPES, WORK_PROJECT_TYPES } from './options.js';\nimport type { HallSubItemStatus } from '../utils/hall-content.js';\n\n/** Moderation status labels (user-management view, status badges). */\nexport const USER_ACCOUNT_STATUS_LABELS: Record<UserAccountStatus, string> = {\n active: 'Active',\n suspended: 'Suspended',\n banned: 'Banned',\n};\n\n/** Broadcast audience selector labels (announcement composer). */\nexport const BROADCAST_AUDIENCE_KIND_LABELS: Record<BroadcastAudienceSelector['kind'], string> = {\n allActiveUsers: 'All active users',\n allArtisans: 'All artisan creators',\n explicitUids: 'Specific users (paste uids)',\n workMembers: \"A Work's guild members\",\n realmMembers: \"A Realm's members\",\n};\n\n/** Human labels for the canonical feedback types — the admin feedback-suggestions views and\n * the user-facing feedback-submission surface render these instead of restating copy. Keyed\n * by FeedbackType, so a new FEEDBACK_TYPES member fails the build until its label exists.\n * UI copy uses the SHORT settled terms (Trade → \"Trades\", Craft → \"Craft Tags\", Genre →\n * \"<Kind> Genres\"), never the compound code identifiers (ARCH-107). */\nexport const FEEDBACK_TYPE_LABELS: Record<FeedbackType, string> = {\n tradeProfessionSuggestions: 'Trades',\n craftSkillTagSuggestions: 'Craft Tags',\n talesWorkGenreSuggestions: 'Tales Genres',\n tunesWorkGenreSuggestions: 'Tunes Genres',\n televisionWorkGenreSuggestions: 'Television Genres',\n};\n\n/**\n * Human labels for the raw clearable/changeable TEXT-FIELD names the moderation text-clear\n * remedy and the published \"Update details\" change-request flow work in. The backend stores and\n * validates the raw doc field names (`workingTitle`, `description`, `content`); these are the\n * only display strings for them — rendered by the member-facing \"text removed by moderation\"\n * banners, every admin clear-text field picker, the change-request dialog, and the admin\n * change-request work view. Keyed by the derived ClearableTextFieldName union, so a new\n * clearable field fails the build here until it has a label (ARCH-102).\n *\n * The `working*` pair belongs to the Work shell and the Realm doc; the labels stay the plain\n * short terms (ARCH-107 — the code identifier carries `working`, the UI never shows it).\n */\nexport const CLEARABLE_TEXT_FIELD_LABELS: Record<ClearableTextFieldName, string> = {\n workingTitle: 'Title',\n workingDescription: 'Description',\n title: 'Title',\n description: 'Description',\n content: 'Content',\n};\n\n/**\n * Per-surface label overrides for the field labels above: `[surface][field] → label`. Only a\n * surface that genuinely names a field differently appears here; everything else resolves to the\n * base map. Each surface's override keys are restricted to the fields THAT surface exposes\n * (indexed off `HALL_CONTENT_TEXT_FIELDS`), so an override for a field the surface does not have\n * is a compile error — as is an override for a surface outside `HallContentTextSurface`.\n */\nexport type ClearableTextFieldLabelOverrides = {\n [S in HallContentTextSurface]?: {\n [F in (typeof HALL_CONTENT_TEXT_FIELDS)[S][number]]?: string;\n };\n};\n\n/**\n * A Realm's identity field is called **Name** on every Realm surface. The `workingTitle` doc\n * field is shared with the Work shell, where it IS a Title — so the difference is per-surface, not\n * per-field, and lives here rather than flattening one of the two settled terms.\n */\nexport const CLEARABLE_TEXT_FIELD_LABEL_OVERRIDES = {\n workRealm: { workingTitle: 'Name' },\n} as const satisfies ClearableTextFieldLabelOverrides;\n\n/**\n * The display label for one raw clearable text-field name: the surface's override when it has\n * one, otherwise the base label, otherwise the raw name. This is the ONE accessor every surface\n * calls — pass the surface whenever the caller knows it (a Realm surface must, or it renders\n * \"Title\" for a Name); omit it only for a genuinely surface-agnostic caller.\n *\n * Both parameters tolerate a plain `string` because callers read field names off stored documents\n * (`moderationClearedFields`) and callable payloads, and the surface may be the `workProject`\n * shell — which is a clearable surface but not a `HallContentTextSurface`, so it simply has no\n * overrides and falls through to the base map.\n */\nexport function clearableTextFieldLabel(field: string, surface?: string): string {\n const overrides = surface\n ? (CLEARABLE_TEXT_FIELD_LABEL_OVERRIDES as Record<string, Record<string, string> | undefined>)[\n surface\n ]\n : undefined;\n return (\n overrides?.[field] ?? (CLEARABLE_TEXT_FIELD_LABELS as Record<string, string>)[field] ?? field\n );\n}\n\n/** What the admin screens show for a thread whose `awaitingAdminReply` is set. */\nexport const ADMIN_DISPATCH_AWAITING_REPLY_LABEL = 'Awaiting reply';\n\n/** Human labels for the dead-letter replay ledgers (Ops Repairs dead-letter table). */\nexport const DEAD_LETTER_COLLECTION_LABELS: Record<DeadLetterCollection, string> = {\n chatSyncEvents: 'Chat sync event',\n chatAdminActionCommands: 'Chat moderation command',\n notificationDeliveries: 'Notification delivery',\n chatMessageOutbox: 'Chat message publish',\n squareAnnouncementJobs: 'Square announcement',\n chatSyncFanoutJobs: 'Chat access fanout',\n mediaAssets: 'Media authority sync',\n quarantineSagaJobs: 'Quarantine saga',\n nciiRemovalJobs: 'NCII removal',\n safetyEvidenceJobs: 'Safety evidence job',\n accountActionCommands: 'Account safety action',\n activeReportGroups: 'Report edge sync',\n hallSubItemEdgeSync: 'Hall sub-item edge sync',\n chatParkedDeliveries: 'Chat room delivery',\n};\n\n/** Operator-settable report dispositions with their console copy. 'undetermined' is the\n * initial state, never a settable target, so it carries no option entry. */\nexport const REPORT_DISPOSITION_OPTIONS: readonly {\n value: Exclude<ReportDisposition, 'undetermined'>;\n label: string;\n description: string;\n}[] = [\n {\n value: 'reportRequired',\n label: 'Report required (NCMEC)',\n description:\n 'Apparent CSAM — a report is legally required. Establishes actual knowledge + arms the clock.',\n },\n {\n value: 'notRequired',\n label: 'No report required',\n description: 'No reporting obligation ever arose. Disallowed once there is a validated match.',\n },\n {\n value: 'correctedNoApparentViolation',\n label: 'False positive — correct it',\n description: 'There was a triggering signal but on review it is a false positive.',\n },\n];\n\n/** One user-facing reason option (shown to the affected user for any user-affecting action). */\nexport interface UserFacingReasonOption {\n code: string;\n label: string;\n description: string;\n}\n\n/** User-facing reason picklist for the guided case-resolution flow — the affected user sees the\n * label for any user-affecting action. Canonical home (ARCH-102): the codes ARE this list's own\n * enumeration, so every client (web, phone, TV, admin app) renders the same options + labels by\n * importing from here. Final user-/legal-facing wording is subject to lawyer review; these are\n * functional defaults. */\nexport const USER_FACING_REASON_OPTIONS = [\n {\n code: 'harassment',\n label: 'Harassment or bullying',\n description: 'Targeted abuse, threats, or sustained harassment of a person.',\n },\n {\n code: 'hate',\n label: 'Hate speech',\n description: 'Attacks on people based on a protected characteristic.',\n },\n {\n code: 'adult-content',\n label: 'Explicit / adult content',\n description: 'Sexual or graphic content not allowed on the platform.',\n },\n {\n code: 'violence',\n label: 'Violence or threats',\n description: 'Threats of violence, or content glorifying or inciting it.',\n },\n {\n code: 'spam',\n label: 'Spam or scam',\n description: 'Unsolicited bulk content, deceptive links, or fraud.',\n },\n {\n code: 'impersonation',\n label: 'Impersonation',\n description: 'Pretending to be another person, brand, or entity.',\n },\n {\n code: 'ip',\n label: 'Intellectual property',\n description: 'Use of someone else’s work without the right to do so.',\n },\n {\n code: 'nonconsensual',\n label: 'Nonconsensual intimate imagery',\n description: 'Intimate or sexual imagery shared without the subject’s consent.',\n },\n {\n code: 'safety',\n label: 'Safety violation',\n description: 'A serious safety violation handled under our safety policies.',\n },\n {\n code: 'other',\n label: 'Other (explain)',\n description: 'A policy violation not covered above — describe it in the detail box.',\n },\n] as const satisfies readonly UserFacingReasonOption[];\n\n/** One user-facing reason code — the codes the picklist owns, never a free string. */\nexport type UserFacingReasonCode = (typeof USER_FACING_REASON_OPTIONS)[number]['code'];\n\n/** Every user-facing reason code, in picklist order. */\nexport const USER_FACING_REASON_CODES = USER_FACING_REASON_OPTIONS.map((o) => o.code) as [\n UserFacingReasonCode,\n ...UserFacingReasonCode[],\n];\n\n/** The user-facing label for a reason code (undefined when the code is unknown/absent). */\nexport function userFacingReasonLabel(code: string | undefined): string | undefined {\n return USER_FACING_REASON_OPTIONS.find((o) => o.code === code)?.label;\n}\n\n// --- Rules & Agreements section titles and type labels ---\n// The admin rules editor and the public rules page both render these (ENG-002).\n\n/** Each fixed rule group's heading. */\nexport const RULE_GROUP_TITLES: Record<RuleGroup, string> = {\n generic: 'General Site Rules',\n merchandising: 'Merchandising, Endorsements & Revenue Sharing',\n hallWing: 'Hall Wing Rules',\n workRealm: 'Realm Rules',\n};\nexport const ARTISAN_AGREEMENTS_TITLE = 'Artisan Agreements';\n\n/**\n * The label for a rule or agreement point narrowed to one type (\"Tales only\", \"Educational wing\n * only\", \"Tales, Educational wing only\"); undefined when it applies to every type.\n */\nexport function appliesToTypeLabel(entry: {\n workProjectType?: WorkProjectType;\n hallWingType?: HallWingType;\n}): string | undefined {\n const parts = [\n entry.workProjectType && WORK_PROJECT_TYPES[entry.workProjectType].label,\n entry.hallWingType && `${HALL_WING_TYPES[entry.hallWingType].label} wing`,\n ].filter((part): part is string => Boolean(part));\n return parts.length > 0 ? `${parts.join(', ')} only` : undefined;\n}\n\n// --- Stored-enum display labels ---\n// What a screen shows for a stored enum value, keyed by the canonical union so a new member fails\n// the build until it has its text. A screen renders the label, never the raw value.\n\n/** Guild invite statuses (a Work's invited-users list and an invite conversation's status line). */\nexport const GUILD_INVITE_STATUS_LABELS: Record<GuildInviteConversationStatus, string> = {\n pending: 'Pending',\n accepted: 'Accepted',\n declined: 'Declined',\n cancelled: 'Cancelled',\n finalized: 'Finalized',\n};\n\n/** Commission proposal statuses (a Work's proposals table). */\nexport const COMMISSION_PROPOSAL_STATUS_LABELS: Record<CommissionProposalStatus, string> = {\n open: 'Open',\n invited: 'Invited',\n accepted: 'Accepted',\n rejected: 'Rejected',\n};\n\n/** Chapter, track, and episode review statuses (the Tale, Tune, and Television section tables). */\nexport const HALL_SUB_ITEM_STATUS_LABELS: Record<HallSubItemStatus, string> = {\n unpublished: 'unpublished',\n pending_approval: 'Pending approval',\n published: 'published',\n};\n\n/** Audition statuses (the audition page). */\nexport const AUDITION_STATUS_LABELS: Record<Audition['status'], string> = {\n open: 'Open',\n closed: 'Closed',\n pendingReview: 'PendingReview',\n};\n\n/** Work types (Work lists, the Work overview, the Works popover). */\nexport const WORK_PROJECT_TYPE_LABELS: Record<WorkProjectType, string> = {\n Tales: 'Tales',\n Tunes: 'Tunes',\n Television: 'Television',\n};\n\n/** Invite source types, as the invite dialog names the context an invite was sent from. */\nexport const INVITE_SOURCE_TYPE_LABELS: Record<InviteSourceType, string> = {\n standalone: 'standalone',\n craftSkill: 'craftSkill',\n commission: 'commission',\n audition: 'audition',\n};\n\n/** Short-link target types (the admin Short Links list), in the target-type enum's order. */\nexport const SHORT_LINK_TARGET_TYPE_LABELS: Record<ShortLinkTargetType, string> = {\n audition: 'Audition',\n 'audition-entry': 'Audition entry',\n commission: 'Commission',\n 'hall-library-item': 'Hall entry',\n};\n\n/** Support-thread statuses (a member's Messages, a Work's Correspondence, the admin browse list). */\nexport const ADMIN_DISPATCH_STATUS_LABELS: Record<AdminDispatch['status'], string> = {\n open: 'Open',\n user_reply: 'User replied',\n admin_reply: 'Admin replied',\n closed_resolved: 'Resolved',\n closed_unresolved: 'Closed',\n};\n\n/**\n * Why a full admin cannot remove their own Admin standing: the server refuses it, and the roster\n * panel withholds the control with the same words. Another full admin removes it.\n */\nexport const ADMIN_SELF_REVOKE_REFUSAL =\n \"You can't revoke your own admin standing. Ask another full admin to do it.\";\n\n/** The marker beside the sender of a support-thread message sent with admin authority. */\nexport const ADMIN_SENDER_MARKER_LABEL = 'Admin';\n\n/** The sender label on a support thread's system line (a close notice) in the admin preview. */\nexport const ADMIN_DISPATCH_SYSTEM_SENDER_LABEL = 'System';\n\n/** Child-safety case work statuses (the safety case console's case rows and closed-case lookup). */\nexport const CHILD_SAFETY_CASE_WORK_STATUS_LABELS: Record<ChildSafetyWorkStatus, string> = {\n new: 'new',\n triaged: 'triaged',\n reporting: 'reporting',\n actioning: 'actioning',\n processing: 'processing',\n failed: 'failed',\n operationallyResolved: 'operationallyResolved',\n};\n\n/** NCII case statuses (the safety case console's case rows and closed-case lookup). */\nexport const NCII_CASE_STATUS_LABELS: Record<NciiInternalStatus, string> = {\n open: 'open',\n removalInProgress: 'removalInProgress',\n processing: 'processing',\n failed: 'failed',\n removed: 'removed',\n rejected: 'rejected',\n closed: 'closed',\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"audition-deadlines.d.ts","sourceRoot":"","sources":["../../src/constants/audition-deadlines.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAM9D,qEAAqE;AACrE,eAAO,MAAM,4BAA4B,QAAa,CAAC;AAEvD,+FAA+F;AAC/F,eAAO,MAAM,oCAAoC,QAAe,CAAC;AAEjE,0FAA0F;AAC1F,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD,kGAAkG;AAClG,eAAO,MAAM,yCAAyC,IAAI,CAAC;AAE3D,mFAAmF;AACnF,eAAO,MAAM,mBAAmB;;;CAAsC,CAAC;AAEvE,wCAAwC;AACxC,eAAO,MAAM,sBAAsB,aAA8B,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,oDAAoD;AACpD,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,GAAG,sBAAsB,CAAC;AAErF,oGAAoG;AACpG,eAAO,MAAM,kCAAkC,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAGtF,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAIhG;AAED,oFAAoF;AACpF,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,MAAM,GACf,uBAAuB,GAAG,IAAI,CAIhC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAAC,EACrD,WAAW,EAAE,MAAM,GAClB,OAAO,CAET;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAAC,EACtD,GAAG,EAAE,MAAM,GACV,OAAO,CAET;AAMD,yFAAyF;AACzF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAM/D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,IAAI,GAAG,IAAI,CAQjE"}
1
+ {"version":3,"file":"audition-deadlines.d.ts","sourceRoot":"","sources":["../../src/constants/audition-deadlines.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAM9D,qEAAqE;AACrE,eAAO,MAAM,4BAA4B,QAAa,CAAC;AAEvD,+FAA+F;AAC/F,eAAO,MAAM,oCAAoC,QAAe,CAAC;AAEjE,0FAA0F;AAC1F,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD,kGAAkG;AAClG,eAAO,MAAM,yCAAyC,IAAI,CAAC;AAE3D,mFAAmF;AACnF,eAAO,MAAM,mBAAmB;;;CAAsC,CAAC;AAEvE,wCAAwC;AACxC,eAAO,MAAM,sBAAsB,aAA8B,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,oDAAoD;AACpD,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,GAAG,sBAAsB,CAAC;AAErF,oGAAoG;AACpG,eAAO,MAAM,kCAAkC,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAGtF,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAIhG;AAED,oFAAoF;AACpF,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,MAAM,GACf,uBAAuB,GAAG,IAAI,CAMhC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAAC,EACrD,WAAW,EAAE,MAAM,GAClB,OAAO,CAET;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAAC,EACtD,GAAG,EAAE,MAAM,GACV,OAAO,CAET;AAcD,yFAAyF;AACzF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAM/D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,IAAI,GAAG,IAAI,CAgBjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"audition-deadlines.js","sourceRoot":"","sources":["../../src/constants/audition-deadlines.ts"],"names":[],"mappings":"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","sourcesContent":["// An audition's two deadlines, both picked by its poster:\n// - entries close (`entriesCloseAt`) — an entry counts by the moment it was SUBMITTED, so one\n// uploaded before the cut-off still publishes if its processing finishes after it;\n// - the audition closes (`auditionCloseAt`) — voting runs until then.\n// Entries and voting both open when the audition is posted. The server enforces both cut-offs\n// exactly through the predicates below; the daily job only tidies `status`. The UI offers an\n// action from the same predicates (FRONTEND-110).\n\nimport { z } from 'zod';\nimport type { Audition } from '../doc-schemas/commissions.js';\n\nconst MINUTE_MS = 60 * 1000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Entries close at least this long after the audition is posted. */\nexport const AUDITION_MIN_ENTRY_WINDOW_MS = 7 * DAY_MS;\n\n/** The audition closes at least this long after entries close (voting continues meanwhile). */\nexport const AUDITION_MIN_VOTING_AFTER_ENTRIES_MS = 24 * HOUR_MS;\n\n/** The entries-close picker opens this many weeks after today, at the end of that day. */\nexport const AUDITION_DEFAULT_ENTRY_WINDOW_WEEKS = 3;\n\n/** The audition-close picker opens this many days after entries close, at the end of that day. */\nexport const AUDITION_DEFAULT_CLOSE_AFTER_ENTRIES_DAYS = 1;\n\n/** End of a day, as the date-and-time picker expresses it: 11:59 PM local time. */\nexport const AUDITION_END_OF_DAY = { hours: 23, minutes: 59 } as const;\n\n/** One deadline: epoch milliseconds. */\nexport const AuditionDeadlineSchema = z.number().int().positive();\n\nexport interface AuditionDeadlines {\n entriesCloseAt: number;\n auditionCloseAt: number;\n}\n\n/** Which minimum gap a pair of deadlines breaks. */\nexport type AuditionDeadlineProblem = 'entriesCloseTooSoon' | 'auditionCloseTooSoon';\n\n/** The refusal each broken minimum gap answers with — the server's refusal and the form's alike. */\nexport const AUDITION_DEADLINE_PROBLEM_MESSAGES: Record<AuditionDeadlineProblem, string> = {\n entriesCloseTooSoon: `Entries must stay open for at least ${AUDITION_MIN_ENTRY_WINDOW_MS / DAY_MS} days after posting.`,\n auditionCloseTooSoon: `The audition must close at least ${AUDITION_MIN_VOTING_AFTER_ENTRIES_MS / HOUR_MS} hours after entries close.`,\n};\n\n/**\n * The deadline-pair rule every wire schema carrying both deadlines refines with: the audition\n * closes at least `AUDITION_MIN_VOTING_AFTER_ENTRIES_MS` after entries close. (The gap from the\n * posting time depends on WHEN the audition is posted, so it is checked by\n * `auditionDeadlineProblem` at the moment of posting, never inside a schema a later step\n * re-parses.)\n */\nexport function refineAuditionDeadlineOrder(value: AuditionDeadlines, ctx: z.RefinementCtx): void {\n if (value.auditionCloseAt < value.entriesCloseAt + AUDITION_MIN_VOTING_AFTER_ENTRIES_MS) {\n ctx.addIssue({ code: 'custom', path: ['auditionCloseAt'] });\n }\n}\n\n/** The earliest allowed entries-close time for an audition posted at `postedAt`. */\nexport function earliestAuditionEntriesCloseAt(postedAt: number): number {\n return postedAt + AUDITION_MIN_ENTRY_WINDOW_MS;\n}\n\n/** The earliest allowed audition-close time for entries closing at `entriesCloseAt`. */\nexport function earliestAuditionCloseAt(entriesCloseAt: number): number {\n return entriesCloseAt + AUDITION_MIN_VOTING_AFTER_ENTRIES_MS;\n}\n\n/**\n * Which minimum gap `deadlines` break for an audition posted at `postedAt` — the submit time\n * of its upload — or `null` when both hold.\n */\nexport function auditionDeadlineProblem(\n deadlines: AuditionDeadlines,\n postedAt: number,\n): AuditionDeadlineProblem | null {\n if (deadlines.entriesCloseAt < earliestAuditionEntriesCloseAt(postedAt)) return 'entriesCloseTooSoon';\n if (deadlines.auditionCloseAt < earliestAuditionCloseAt(deadlines.entriesCloseAt)) return 'auditionCloseTooSoon';\n return null;\n}\n\n/**\n * Whether an entry submitted at `submittedAt` is in time: the audition is open and the entry\n * was submitted before entries closed. The server passes the upload's submit time (so a\n * slow-processing entry submitted in time still counts); the UI passes now.\n */\nexport function areAuditionEntriesOpen(\n audition: Pick<Audition, 'status' | 'entriesCloseAt'>,\n submittedAt: number,\n): boolean {\n return audition.status === 'open' && submittedAt < audition.entriesCloseAt;\n}\n\n/** Whether a vote cast at `now` is in time: the audition is open and has not closed. */\nexport function isAuditionVotingOpen(\n audition: Pick<Audition, 'status' | 'auditionCloseAt'>,\n now: number,\n): boolean {\n return audition.status === 'open' && now < audition.auditionCloseAt;\n}\n\nfunction endOfLocalDay(year: number, monthIndex: number, day: number): Date {\n return new Date(year, monthIndex, day, AUDITION_END_OF_DAY.hours, AUDITION_END_OF_DAY.minutes, 0, 0);\n}\n\n/** Where the entries-close picker opens: the end of the day three weeks from `today`. */\nexport function defaultAuditionEntriesCloseAt(today: Date): Date {\n return endOfLocalDay(\n today.getFullYear(),\n today.getMonth(),\n today.getDate() + AUDITION_DEFAULT_ENTRY_WINDOW_WEEKS * 7,\n );\n}\n\n/**\n * Where the audition-close picker opens: the end of the day after entries close — or of the\n * next day that keeps the 24-hour minimum, should a clock change shorten that day.\n */\nexport function defaultAuditionCloseAt(entriesCloseAt: Date): Date {\n let offset = AUDITION_DEFAULT_CLOSE_AFTER_ENTRIES_DAYS;\n let candidate = endOfLocalDay(entriesCloseAt.getFullYear(), entriesCloseAt.getMonth(), entriesCloseAt.getDate() + offset);\n while (candidate.getTime() < earliestAuditionCloseAt(entriesCloseAt.getTime())) {\n offset += 1;\n candidate = endOfLocalDay(entriesCloseAt.getFullYear(), entriesCloseAt.getMonth(), entriesCloseAt.getDate() + offset);\n }\n return candidate;\n}\n"]}
1
+ {"version":3,"file":"audition-deadlines.js","sourceRoot":"","sources":["../../src/constants/audition-deadlines.ts"],"names":[],"mappings":"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","sourcesContent":["// An audition's two deadlines, both picked by its poster:\n// - entries close (`entriesCloseAt`) — an entry counts by the moment it was SUBMITTED, so one\n// uploaded before the cut-off still publishes if its processing finishes after it;\n// - the audition closes (`auditionCloseAt`) — voting runs until then.\n// Entries and voting both open when the audition is posted. The server enforces both cut-offs\n// exactly through the predicates below; the daily job only tidies `status`. The UI offers an\n// action from the same predicates (FRONTEND-110).\n\nimport { z } from 'zod';\nimport type { Audition } from '../doc-schemas/commissions.js';\n\nconst MINUTE_MS = 60 * 1000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Entries close at least this long after the audition is posted. */\nexport const AUDITION_MIN_ENTRY_WINDOW_MS = 7 * DAY_MS;\n\n/** The audition closes at least this long after entries close (voting continues meanwhile). */\nexport const AUDITION_MIN_VOTING_AFTER_ENTRIES_MS = 24 * HOUR_MS;\n\n/** The entries-close picker opens this many weeks after today, at the end of that day. */\nexport const AUDITION_DEFAULT_ENTRY_WINDOW_WEEKS = 3;\n\n/** The audition-close picker opens this many days after entries close, at the end of that day. */\nexport const AUDITION_DEFAULT_CLOSE_AFTER_ENTRIES_DAYS = 1;\n\n/** End of a day, as the date-and-time picker expresses it: 11:59 PM local time. */\nexport const AUDITION_END_OF_DAY = { hours: 23, minutes: 59 } as const;\n\n/** One deadline: epoch milliseconds. */\nexport const AuditionDeadlineSchema = z.number().int().positive();\n\nexport interface AuditionDeadlines {\n entriesCloseAt: number;\n auditionCloseAt: number;\n}\n\n/** Which minimum gap a pair of deadlines breaks. */\nexport type AuditionDeadlineProblem = 'entriesCloseTooSoon' | 'auditionCloseTooSoon';\n\n/** The refusal each broken minimum gap answers with — the server's refusal and the form's alike. */\nexport const AUDITION_DEADLINE_PROBLEM_MESSAGES: Record<AuditionDeadlineProblem, string> = {\n entriesCloseTooSoon: `Entries must stay open for at least ${AUDITION_MIN_ENTRY_WINDOW_MS / DAY_MS} days after posting.`,\n auditionCloseTooSoon: `The audition must close at least ${AUDITION_MIN_VOTING_AFTER_ENTRIES_MS / HOUR_MS} hours after entries close.`,\n};\n\n/**\n * The deadline-pair rule every wire schema carrying both deadlines refines with: the audition\n * closes at least `AUDITION_MIN_VOTING_AFTER_ENTRIES_MS` after entries close. (The gap from the\n * posting time depends on WHEN the audition is posted, so it is checked by\n * `auditionDeadlineProblem` at the moment of posting, never inside a schema a later step\n * re-parses.)\n */\nexport function refineAuditionDeadlineOrder(value: AuditionDeadlines, ctx: z.RefinementCtx): void {\n if (value.auditionCloseAt < value.entriesCloseAt + AUDITION_MIN_VOTING_AFTER_ENTRIES_MS) {\n ctx.addIssue({ code: 'custom', path: ['auditionCloseAt'] });\n }\n}\n\n/** The earliest allowed entries-close time for an audition posted at `postedAt`. */\nexport function earliestAuditionEntriesCloseAt(postedAt: number): number {\n return postedAt + AUDITION_MIN_ENTRY_WINDOW_MS;\n}\n\n/** The earliest allowed audition-close time for entries closing at `entriesCloseAt`. */\nexport function earliestAuditionCloseAt(entriesCloseAt: number): number {\n return entriesCloseAt + AUDITION_MIN_VOTING_AFTER_ENTRIES_MS;\n}\n\n/**\n * Which minimum gap `deadlines` break for an audition posted at `postedAt` — the submit time\n * of its upload — or `null` when both hold.\n */\nexport function auditionDeadlineProblem(\n deadlines: AuditionDeadlines,\n postedAt: number,\n): AuditionDeadlineProblem | null {\n if (deadlines.entriesCloseAt < earliestAuditionEntriesCloseAt(postedAt))\n return 'entriesCloseTooSoon';\n if (deadlines.auditionCloseAt < earliestAuditionCloseAt(deadlines.entriesCloseAt))\n return 'auditionCloseTooSoon';\n return null;\n}\n\n/**\n * Whether an entry submitted at `submittedAt` is in time: the audition is open and the entry\n * was submitted before entries closed. The server passes the upload's submit time (so a\n * slow-processing entry submitted in time still counts); the UI passes now.\n */\nexport function areAuditionEntriesOpen(\n audition: Pick<Audition, 'status' | 'entriesCloseAt'>,\n submittedAt: number,\n): boolean {\n return audition.status === 'open' && submittedAt < audition.entriesCloseAt;\n}\n\n/** Whether a vote cast at `now` is in time: the audition is open and has not closed. */\nexport function isAuditionVotingOpen(\n audition: Pick<Audition, 'status' | 'auditionCloseAt'>,\n now: number,\n): boolean {\n return audition.status === 'open' && now < audition.auditionCloseAt;\n}\n\nfunction endOfLocalDay(year: number, monthIndex: number, day: number): Date {\n return new Date(\n year,\n monthIndex,\n day,\n AUDITION_END_OF_DAY.hours,\n AUDITION_END_OF_DAY.minutes,\n 0,\n 0,\n );\n}\n\n/** Where the entries-close picker opens: the end of the day three weeks from `today`. */\nexport function defaultAuditionEntriesCloseAt(today: Date): Date {\n return endOfLocalDay(\n today.getFullYear(),\n today.getMonth(),\n today.getDate() + AUDITION_DEFAULT_ENTRY_WINDOW_WEEKS * 7,\n );\n}\n\n/**\n * Where the audition-close picker opens: the end of the day after entries close — or of the\n * next day that keeps the 24-hour minimum, should a clock change shorten that day.\n */\nexport function defaultAuditionCloseAt(entriesCloseAt: Date): Date {\n let offset = AUDITION_DEFAULT_CLOSE_AFTER_ENTRIES_DAYS;\n let candidate = endOfLocalDay(\n entriesCloseAt.getFullYear(),\n entriesCloseAt.getMonth(),\n entriesCloseAt.getDate() + offset,\n );\n while (candidate.getTime() < earliestAuditionCloseAt(entriesCloseAt.getTime())) {\n offset += 1;\n candidate = endOfLocalDay(\n entriesCloseAt.getFullYear(),\n entriesCloseAt.getMonth(),\n entriesCloseAt.getDate() + offset,\n );\n }\n return candidate;\n}\n"]}
@@ -28,8 +28,7 @@ export declare const TASK_PRIORITY_SCORE: {
28
28
  readonly HIGH: 800;
29
29
  readonly CRITICAL: 1000;
30
30
  /** Money-integrity anomaly (stake-share / pledge-ledger corruption signal) — outranks
31
- * everything except safety-class reports. The three anomaly creators that previously
32
- * hardcoded `priority: 1` (LOW) all write this. */
31
+ * everything except safety-class reports. Every money-anomaly task creator writes this. */
33
32
  readonly MONEY_ANOMALY: 1100;
34
33
  };
35
34
  export type TaskPriorityScore = (typeof TASK_PRIORITY_SCORE)[keyof typeof TASK_PRIORITY_SCORE];
@@ -141,6 +140,11 @@ export declare const MAX_NCII_ACTION_SUMMARY_LENGTH = 280;
141
140
  export declare const MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH = 500;
142
141
  /** Operator proof note on a manual NCMEC portal filing. */
143
142
  export declare const MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH = 2000;
143
+ /** The report number NCMEC assigns a manual-portal filing, as the operator copies it. */
144
+ export declare const MAX_NCMEC_REPORT_NUMBER_LENGTH = 64;
145
+ /** The key of an object in the restricted evidence vault — Cloud Storage caps an object name at
146
+ * 1,024 bytes. */
147
+ export declare const MAX_EVIDENCE_VAULT_KEY_LENGTH = 1024;
144
148
  /** Requester's typed name on the no-login TAKE IT DOWN statutory intake. */
145
149
  export declare const MAX_NCII_REQUESTER_NAME_LENGTH = 256;
146
150
  /** Name of the depicted person a representative files on behalf of. */
@@ -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":"AAQA,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAEnF,eAAO,MAAM,oBAAoB;;;;;CAKvB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB;;;;;IAK9B;+FAC2F;;CAEnF,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAE/F,mFAAmF;AACnF,eAAO,MAAM,4BAA4B;;;;;CAK/B,CAAC;AAIX,yDAAyD;AACzD,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD,qEAAqE;AACrE,eAAO,MAAM,sCAAsC,OAAO,CAAC;AAI3D,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;gEACgE;AAChE,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAEtD;;yCAEyC;AACzC,eAAO,MAAM,0CAA0C,OAAO,CAAC;AAM/D,8FAA8F;AAC9F,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,8FAA8F;AAC9F,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD,6FAA6F;AAC7F,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,sEAAsE;AACtE,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,sDAAsD;AACtD,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAIjD,wFAAwF;AACxF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;6FAC6F;AAC7F,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;iFACiF;AACjF,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C;8EAC8E;AAC9E,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAEtD,oFAAoF;AACpF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAMhD,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAC1E,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAE5D,kEAAkE;AAClE,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,mFAAmF;AACnF,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAMpD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,kCAAkC,OAAO,CAAC;AACvD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,oCAAoC,OAAO,CAAC;AACzD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,yEAAyE;AACzE,eAAO,MAAM,gCAAgC,OAAO,CAAC;AACrD,2GAA2G;AAC3G,eAAO,MAAM,oCAAoC,OAAO,CAAC;AACzD,eAAO,MAAM,iCAAiC,MAAM,CAAC;AACrD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAClD,+FAA+F;AAC/F,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,wGAAwG;AACxG,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,2FAA2F;AAC3F,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;sEAEsE;AACtE,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD,oEAAoE;AACpE,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,0DAA0D;AAC1D,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD,sEAAsE;AACtE,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,wDAAwD;AACxD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,+DAA+D;AAC/D,eAAO,MAAM,0BAA0B,MAAgC,CAAC;AAExE,qCAAqC;AACrC,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAIhD,sFAAsF;AACtF,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,oFAAoF;AACpF,eAAO,MAAM,oCAAoC,OAAO,CAAC;AAEzD,8DAA8D;AAC9D,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,gEAAgE;AAChE,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD,oEAAoE;AACpE,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,uFAAuF;AACvF,eAAO,MAAM,sCAAsC,MAAM,CAAC;AAE1D,2DAA2D;AAC3D,eAAO,MAAM,kCAAkC,OAAO,CAAC;AAEvD,yFAAyF;AACzF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;mBACmB;AACnB,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,uEAAuE;AACvE,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAE3D,iFAAiF;AACjF,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,qFAAqF;AACrF,eAAO,MAAM,sCAAsC,MAAM,CAAC;AAE1D,oFAAoF;AACpF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;0DAC0D;AAC1D,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD,sFAAsF;AACtF,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,oDAAoD;AACpD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,gDAAgD;AAChD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,QAA8C,CAAC;AAEnF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,iKAMjB,CAAC;AAEX,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,gGAAgG;AAChG,eAAO,MAAM,6BAA6B,QAAoC,CAAC;AAI/E,qCAAqC;AACrC,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,uIAQ/B,CAAC;AACX,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAErF,uGAAuG;AACvG,eAAO,MAAM,mCAAmC;;;;;;;;;;;;CAYoB,CAAC;AAErE;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKtE;AAED,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,KAAK,CAAC"}
@@ -32,8 +32,7 @@ export const TASK_PRIORITY_SCORE = {
32
32
  HIGH: 800,
33
33
  CRITICAL: 1000,
34
34
  /** Money-integrity anomaly (stake-share / pledge-ledger corruption signal) — outranks
35
- * everything except safety-class reports. The three anomaly creators that previously
36
- * hardcoded `priority: 1` (LOW) all write this. */
35
+ * everything except safety-class reports. Every money-anomaly task creator writes this. */
37
36
  MONEY_ANOMALY: 1100,
38
37
  };
39
38
  /** Maps a level-based TASK_PRIORITY value (1–4) to its canonical numeric score. */
@@ -158,6 +157,11 @@ export const MAX_NCII_ACTION_SUMMARY_LENGTH = 280;
158
157
  export const MAX_SAFETY_ARTIFACT_DESCRIPTION_LENGTH = 500;
159
158
  /** Operator proof note on a manual NCMEC portal filing. */
160
159
  export const MAX_NCMEC_PORTAL_PROOF_TEXT_LENGTH = 2000;
160
+ /** The report number NCMEC assigns a manual-portal filing, as the operator copies it. */
161
+ export const MAX_NCMEC_REPORT_NUMBER_LENGTH = 64;
162
+ /** The key of an object in the restricted evidence vault — Cloud Storage caps an object name at
163
+ * 1,024 bytes. */
164
+ export const MAX_EVIDENCE_VAULT_KEY_LENGTH = 1024;
161
165
  /** Requester's typed name on the no-login TAKE IT DOWN statutory intake. */
162
166
  export const MAX_NCII_REQUESTER_NAME_LENGTH = 256;
163
167
  /** Name of the depicted person a representative files on behalf of. */
@@ -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';\nimport { MAX_WORK_PROJECT_TITLE_LENGTH } from './business-work-project.js';\nimport type { AdminTaskType } from '../doc-schemas/report-docs.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 optional reason an admin records when closing an account discovered to be under 13. */\nexport const MAX_UNDER_13_CLOSE_REASON_LENGTH = 1000;\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 ids a client names as the target of a report — the item, its parent reference, and the\n * owner hint. They are hints the server re-derives, so the cap only bounds what is read. */\nexport const MAX_REPORT_TARGET_ID_LENGTH = 256;\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/** How many digits an operator step-up authenticator code has. */\nexport const OPERATOR_STEP_UP_CODE_LENGTH = 6;\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;\n/** A public document page's intro (Future Plans, Rules & Agreements). */\nexport const MAX_PUBLIC_DOCUMENT_INTRO_LENGTH = 4000;\n/** A public document section's intention line (a Future Plans group, a rule group, Artisan Agreements). */\nexport const MAX_PUBLIC_DOCUMENT_INTENTION_LENGTH = 1000;\nexport const MAX_FUTURE_PLAN_GROUP_NAME_LENGTH = 200;\nexport const MAX_FUTURE_PLAN_GROUPS = 50;\nexport const MAX_FUTURE_PLANS = 200;\nexport const MAX_PLATFORM_RULES = 500;\nexport const MAX_AGREEMENT_POINTS = 200;\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/** `_appConfig/app.appVersion` — the force-refresh version string VersionGate compares. */\nexport const MAX_APP_VERSION_LENGTH = 64;\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 broadcast title — the same length as a Work title. */\nexport const MAX_BROADCAST_TITLE_LENGTH = MAX_WORK_PROJECT_TITLE_LENGTH;\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 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/** The external URL a no-login statutory request names as the content to remove. */\nexport const MAX_NCII_LOCATOR_URL_LENGTH = 2048;\n\n/** The client-generated idempotency key of a statutory request: a retried submit carries the same\n * key, and the server derives the request id from it. */\nexport const NCII_IDEMPOTENCY_KEY_MIN_LENGTH = 8;\nexport const NCII_IDEMPOTENCY_KEY_MAX_LENGTH = 256;\n\n/** A statutory requester's contact email (the address-length ceiling of an email). */\nexport const MAX_NCII_CONTACT_EMAIL_LENGTH = 320;\n\n/** A statutory requester's contact phone number. */\nexport const NCII_CONTACT_PHONE_MIN_LENGTH = 3;\nexport const NCII_CONTACT_PHONE_MAX_LENGTH = 64;\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\n/**\n * Who resolves each kind of admin task. `checkin` means the generic queue check-in completes it\n * (the task carries no decision of its own). Every other owner is the domain decision that closes\n * the task — and deletes it in the same transaction — so a generic check-in must never mark one\n * of those tasks resolved: that would drop the decision it exists to collect.\n */\nexport const ADMIN_TASK_RESOLUTION_OWNERS = [\n 'checkin',\n 'reportResolution',\n 'thresholdReview',\n 'appealReview',\n 'refundDecision',\n 'changeRequestReview',\n 'dispatchClose',\n] as const;\nexport type AdminTaskResolutionOwner = (typeof ADMIN_TASK_RESOLUTION_OWNERS)[number];\n\n/** The resolution owner of every admin task type. A new task type fails the build until classified. */\nexport const ADMIN_TASK_RESOLUTION_OWNER_BY_TYPE = {\n adminDispatch: 'dispatchClose',\n thresholdLibraryReview: 'thresholdReview',\n userReport: 'reportResolution',\n 'content-appeal': 'appealReview',\n stakeShareAnomaly: 'checkin',\n pledgeLedgerAnomaly: 'checkin',\n pledgePaymentRepairNeeded: 'checkin',\n pledgeDisputeOpened: 'checkin',\n pledgeRefundRequested: 'refundDecision',\n pledgeRefundFailed: 'refundDecision',\n hallContentChangeRequest: 'changeRequestReview',\n} as const satisfies Record<AdminTaskType, AdminTaskResolutionOwner>;\n\n/**\n * Whether a generic check-in may mark a task of this stored type resolved. The type is read off an\n * untrusted stored task as a string, so an unknown type answers `false` (fails closed).\n */\nexport function isAdminTaskResolvedByCheckin(taskType: string): boolean {\n return (\n Object.hasOwn(ADMIN_TASK_RESOLUTION_OWNER_BY_TYPE, taskType) &&\n ADMIN_TASK_RESOLUTION_OWNER_BY_TYPE[taskType as AdminTaskType] === 'checkin'\n );\n}\n\n/** The most accounts one `uidList` system slot can name. */\nexport const MAX_SYSTEM_UID_LIST = 25;\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';\nimport { MAX_WORK_PROJECT_TITLE_LENGTH } from './business-work-project.js';\nimport type { AdminTaskType } from '../doc-schemas/report-docs.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. Every money-anomaly task creator writes 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 optional reason an admin records when closing an account discovered to be under 13. */\nexport const MAX_UNDER_13_CLOSE_REASON_LENGTH = 1000;\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 ids a client names as the target of a report — the item, its parent reference, and the\n * owner hint. They are hints the server re-derives, so the cap only bounds what is read. */\nexport const MAX_REPORT_TARGET_ID_LENGTH = 256;\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/** How many digits an operator step-up authenticator code has. */\nexport const OPERATOR_STEP_UP_CODE_LENGTH = 6;\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;\n/** A public document page's intro (Future Plans, Rules & Agreements). */\nexport const MAX_PUBLIC_DOCUMENT_INTRO_LENGTH = 4000;\n/** A public document section's intention line (a Future Plans group, a rule group, Artisan Agreements). */\nexport const MAX_PUBLIC_DOCUMENT_INTENTION_LENGTH = 1000;\nexport const MAX_FUTURE_PLAN_GROUP_NAME_LENGTH = 200;\nexport const MAX_FUTURE_PLAN_GROUPS = 50;\nexport const MAX_FUTURE_PLANS = 200;\nexport const MAX_PLATFORM_RULES = 500;\nexport const MAX_AGREEMENT_POINTS = 200;\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/** `_appConfig/app.appVersion` — the force-refresh version string VersionGate compares. */\nexport const MAX_APP_VERSION_LENGTH = 64;\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 broadcast title — the same length as a Work title. */\nexport const MAX_BROADCAST_TITLE_LENGTH = MAX_WORK_PROJECT_TITLE_LENGTH;\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 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/** The report number NCMEC assigns a manual-portal filing, as the operator copies it. */\nexport const MAX_NCMEC_REPORT_NUMBER_LENGTH = 64;\n\n/** The key of an object in the restricted evidence vault — Cloud Storage caps an object name at\n * 1,024 bytes. */\nexport const MAX_EVIDENCE_VAULT_KEY_LENGTH = 1024;\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/** The external URL a no-login statutory request names as the content to remove. */\nexport const MAX_NCII_LOCATOR_URL_LENGTH = 2048;\n\n/** The client-generated idempotency key of a statutory request: a retried submit carries the same\n * key, and the server derives the request id from it. */\nexport const NCII_IDEMPOTENCY_KEY_MIN_LENGTH = 8;\nexport const NCII_IDEMPOTENCY_KEY_MAX_LENGTH = 256;\n\n/** A statutory requester's contact email (the address-length ceiling of an email). */\nexport const MAX_NCII_CONTACT_EMAIL_LENGTH = 320;\n\n/** A statutory requester's contact phone number. */\nexport const NCII_CONTACT_PHONE_MIN_LENGTH = 3;\nexport const NCII_CONTACT_PHONE_MAX_LENGTH = 64;\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\n/**\n * Who resolves each kind of admin task. `checkin` means the generic queue check-in completes it\n * (the task carries no decision of its own). Every other owner is the domain decision that closes\n * the task — and deletes it in the same transaction — so a generic check-in must never mark one\n * of those tasks resolved: that would drop the decision it exists to collect.\n */\nexport const ADMIN_TASK_RESOLUTION_OWNERS = [\n 'checkin',\n 'reportResolution',\n 'thresholdReview',\n 'appealReview',\n 'refundDecision',\n 'changeRequestReview',\n 'dispatchClose',\n] as const;\nexport type AdminTaskResolutionOwner = (typeof ADMIN_TASK_RESOLUTION_OWNERS)[number];\n\n/** The resolution owner of every admin task type. A new task type fails the build until classified. */\nexport const ADMIN_TASK_RESOLUTION_OWNER_BY_TYPE = {\n adminDispatch: 'dispatchClose',\n thresholdLibraryReview: 'thresholdReview',\n userReport: 'reportResolution',\n 'content-appeal': 'appealReview',\n stakeShareAnomaly: 'checkin',\n pledgeLedgerAnomaly: 'checkin',\n pledgePaymentRepairNeeded: 'checkin',\n pledgeDisputeOpened: 'checkin',\n pledgeRefundRequested: 'refundDecision',\n pledgeRefundFailed: 'refundDecision',\n hallContentChangeRequest: 'changeRequestReview',\n} as const satisfies Record<AdminTaskType, AdminTaskResolutionOwner>;\n\n/**\n * Whether a generic check-in may mark a task of this stored type resolved. The type is read off an\n * untrusted stored task as a string, so an unknown type answers `false` (fails closed).\n */\nexport function isAdminTaskResolvedByCheckin(taskType: string): boolean {\n return (\n Object.hasOwn(ADMIN_TASK_RESOLUTION_OWNER_BY_TYPE, taskType) &&\n ADMIN_TASK_RESOLUTION_OWNER_BY_TYPE[taskType as AdminTaskType] === 'checkin'\n );\n}\n\n/** The most accounts one `uidList` system slot can name. */\nexport const MAX_SYSTEM_UID_LIST = 25;\n"]}