@ttt-productions/ttt-core 0.79.100 → 0.79.102

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 (581) 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/app-mode.d.ts +2 -0
  8. package/dist/constants/app-mode.d.ts.map +1 -1
  9. package/dist/constants/app-mode.js +3 -1
  10. package/dist/constants/app-mode.js.map +1 -1
  11. package/dist/constants/audition-deadlines.d.ts.map +1 -1
  12. package/dist/constants/audition-deadlines.js.map +1 -1
  13. package/dist/constants/business-admin.d.ts +6 -2
  14. package/dist/constants/business-admin.d.ts.map +1 -1
  15. package/dist/constants/business-admin.js +6 -2
  16. package/dist/constants/business-admin.js.map +1 -1
  17. package/dist/constants/business-content.d.ts +5 -8
  18. package/dist/constants/business-content.d.ts.map +1 -1
  19. package/dist/constants/business-content.js +9 -12
  20. package/dist/constants/business-content.js.map +1 -1
  21. package/dist/constants/business-work-project.d.ts +3 -3
  22. package/dist/constants/business-work-project.d.ts.map +1 -1
  23. package/dist/constants/business-work-project.js +6 -5
  24. package/dist/constants/business-work-project.js.map +1 -1
  25. package/dist/constants/chat.d.ts +5 -5
  26. package/dist/constants/chat.d.ts.map +1 -1
  27. package/dist/constants/chat.js +5 -5
  28. package/dist/constants/chat.js.map +1 -1
  29. package/dist/constants/company-mascots.d.ts.map +1 -1
  30. package/dist/constants/company-mascots.js +18 -5
  31. package/dist/constants/company-mascots.js.map +1 -1
  32. package/dist/constants/index.d.ts +6 -1
  33. package/dist/constants/index.d.ts.map +1 -1
  34. package/dist/constants/index.js +6 -1
  35. package/dist/constants/index.js.map +1 -1
  36. package/dist/constants/legal-review-notice.d.ts.map +1 -1
  37. package/dist/constants/legal-review-notice.js +22 -6
  38. package/dist/constants/legal-review-notice.js.map +1 -1
  39. package/dist/constants/options.d.ts +4 -4
  40. package/dist/constants/options.d.ts.map +1 -1
  41. package/dist/constants/options.js +17 -14
  42. package/dist/constants/options.js.map +1 -1
  43. package/dist/constants/pagination.d.ts.map +1 -1
  44. package/dist/constants/pagination.js +3 -1
  45. package/dist/constants/pagination.js.map +1 -1
  46. package/dist/constants/pledge-and-bouquet-copy.d.ts.map +1 -1
  47. package/dist/constants/pledge-and-bouquet-copy.js.map +1 -1
  48. package/dist/constants/safety-active-statuses.d.ts +2 -2
  49. package/dist/constants/safety-active-statuses.d.ts.map +1 -1
  50. package/dist/constants/safety-active-statuses.js.map +1 -1
  51. package/dist/constants/safety-confirmation-phrases.d.ts.map +1 -1
  52. package/dist/constants/safety-confirmation-phrases.js.map +1 -1
  53. package/dist/constants/safety-telemetry-patterns.d.ts.map +1 -1
  54. package/dist/constants/safety-telemetry-patterns.js.map +1 -1
  55. package/dist/constants/telemetry-content-policy.d.ts.map +1 -1
  56. package/dist/constants/telemetry-content-policy.js +14 -1
  57. package/dist/constants/telemetry-content-policy.js.map +1 -1
  58. package/dist/constants/text-fields.d.ts.map +1 -1
  59. package/dist/constants/text-fields.js +470 -77
  60. package/dist/constants/text-fields.js.map +1 -1
  61. package/dist/doc-schemas/account-deletion.d.ts.map +1 -1
  62. package/dist/doc-schemas/account-deletion.js +2 -1
  63. package/dist/doc-schemas/account-deletion.js.map +1 -1
  64. package/dist/doc-schemas/backend-state.d.ts.map +1 -1
  65. package/dist/doc-schemas/backend-state.js +5 -1
  66. package/dist/doc-schemas/backend-state.js.map +1 -1
  67. package/dist/doc-schemas/chat-sync.d.ts +5 -5
  68. package/dist/doc-schemas/chat-sync.d.ts.map +1 -1
  69. package/dist/doc-schemas/chat-sync.js +34 -15
  70. package/dist/doc-schemas/chat-sync.js.map +1 -1
  71. package/dist/doc-schemas/commissions.d.ts +5 -5
  72. package/dist/doc-schemas/commissions.d.ts.map +1 -1
  73. package/dist/doc-schemas/commissions.js +1 -2
  74. package/dist/doc-schemas/commissions.js.map +1 -1
  75. package/dist/doc-schemas/content.d.ts +4 -4
  76. package/dist/doc-schemas/content.d.ts.map +1 -1
  77. package/dist/doc-schemas/content.js +5 -3
  78. package/dist/doc-schemas/content.js.map +1 -1
  79. package/dist/doc-schemas/erasure-fates.d.ts.map +1 -1
  80. package/dist/doc-schemas/erasure-fates.js +12 -3
  81. package/dist/doc-schemas/erasure-fates.js.map +1 -1
  82. package/dist/doc-schemas/index.d.ts.map +1 -1
  83. package/dist/doc-schemas/index.js +3 -4
  84. package/dist/doc-schemas/index.js.map +1 -1
  85. package/dist/doc-schemas/media-activation-jobs.d.ts +8 -8
  86. package/dist/doc-schemas/media-activation-jobs.d.ts.map +1 -1
  87. package/dist/doc-schemas/media-activation-jobs.js +1 -1
  88. package/dist/doc-schemas/media-activation-jobs.js.map +1 -1
  89. package/dist/doc-schemas/media-assets.d.ts +58 -58
  90. package/dist/doc-schemas/media-assets.d.ts.map +1 -1
  91. package/dist/doc-schemas/media-assets.js +64 -23
  92. package/dist/doc-schemas/media-assets.js.map +1 -1
  93. package/dist/doc-schemas/media-copy-intents.d.ts +14 -14
  94. package/dist/doc-schemas/media-copy-intents.d.ts.map +1 -1
  95. package/dist/doc-schemas/media-copy-intents.js +16 -4
  96. package/dist/doc-schemas/media-copy-intents.js.map +1 -1
  97. package/dist/doc-schemas/messaging.d.ts +34 -1
  98. package/dist/doc-schemas/messaging.d.ts.map +1 -1
  99. package/dist/doc-schemas/messaging.js +10 -10
  100. package/dist/doc-schemas/messaging.js.map +1 -1
  101. package/dist/doc-schemas/moderation.d.ts +21 -21
  102. package/dist/doc-schemas/moderation.d.ts.map +1 -1
  103. package/dist/doc-schemas/moderation.js +33 -11
  104. package/dist/doc-schemas/moderation.js.map +1 -1
  105. package/dist/doc-schemas/ncii/allegations.d.ts +1 -1
  106. package/dist/doc-schemas/ncii/allegations.d.ts.map +1 -1
  107. package/dist/doc-schemas/ncii/allegations.js +9 -3
  108. package/dist/doc-schemas/ncii/allegations.js.map +1 -1
  109. package/dist/doc-schemas/ncii/cases.d.ts +4 -4
  110. package/dist/doc-schemas/ncii/cases.d.ts.map +1 -1
  111. package/dist/doc-schemas/ncii/cases.js +33 -15
  112. package/dist/doc-schemas/ncii/cases.js.map +1 -1
  113. package/dist/doc-schemas/ncii/config.d.ts.map +1 -1
  114. package/dist/doc-schemas/ncii/config.js +16 -5
  115. package/dist/doc-schemas/ncii/config.js.map +1 -1
  116. package/dist/doc-schemas/ncii/holds.d.ts.map +1 -1
  117. package/dist/doc-schemas/ncii/holds.js +4 -2
  118. package/dist/doc-schemas/ncii/holds.js.map +1 -1
  119. package/dist/doc-schemas/ncii/removal.d.ts +6 -6
  120. package/dist/doc-schemas/ncii/removal.d.ts.map +1 -1
  121. package/dist/doc-schemas/ncii/removal.js +12 -6
  122. package/dist/doc-schemas/ncii/removal.js.map +1 -1
  123. package/dist/doc-schemas/ncii/requests.d.ts +36 -39
  124. package/dist/doc-schemas/ncii/requests.d.ts.map +1 -1
  125. package/dist/doc-schemas/ncii/requests.js +95 -94
  126. package/dist/doc-schemas/ncii/requests.js.map +1 -1
  127. package/dist/doc-schemas/notification-archive-all-jobs.d.ts +4 -4
  128. package/dist/doc-schemas/notification-archive-all-jobs.d.ts.map +1 -1
  129. package/dist/doc-schemas/notification-archive-all-jobs.js +6 -1
  130. package/dist/doc-schemas/notification-archive-all-jobs.js.map +1 -1
  131. package/dist/doc-schemas/notification-ledger.d.ts +1 -1
  132. package/dist/doc-schemas/notification-ledger.d.ts.map +1 -1
  133. package/dist/doc-schemas/notification-ledger.js +8 -4
  134. package/dist/doc-schemas/notification-ledger.js.map +1 -1
  135. package/dist/doc-schemas/notifications.d.ts +6 -6
  136. package/dist/doc-schemas/operational.d.ts.map +1 -1
  137. package/dist/doc-schemas/operational.js.map +1 -1
  138. package/dist/doc-schemas/payments.d.ts +3 -3
  139. package/dist/doc-schemas/payments.d.ts.map +1 -1
  140. package/dist/doc-schemas/payments.js +13 -6
  141. package/dist/doc-schemas/payments.js.map +1 -1
  142. package/dist/doc-schemas/public-documents.d.ts +10 -10
  143. package/dist/doc-schemas/public-documents.d.ts.map +1 -1
  144. package/dist/doc-schemas/public-documents.js +14 -3
  145. package/dist/doc-schemas/public-documents.js.map +1 -1
  146. package/dist/doc-schemas/registry.d.ts +193 -160
  147. package/dist/doc-schemas/registry.d.ts.map +1 -1
  148. package/dist/doc-schemas/registry.js +6 -6
  149. package/dist/doc-schemas/registry.js.map +1 -1
  150. package/dist/doc-schemas/safety/age.d.ts +8 -11
  151. package/dist/doc-schemas/safety/age.d.ts.map +1 -1
  152. package/dist/doc-schemas/safety/age.js +64 -58
  153. package/dist/doc-schemas/safety/age.js.map +1 -1
  154. package/dist/doc-schemas/safety/case-alert.d.ts +2 -2
  155. package/dist/doc-schemas/safety/case-alert.d.ts.map +1 -1
  156. package/dist/doc-schemas/safety/case-alert.js +4 -2
  157. package/dist/doc-schemas/safety/case-alert.js.map +1 -1
  158. package/dist/doc-schemas/safety/case-aliases.d.ts.map +1 -1
  159. package/dist/doc-schemas/safety/case-aliases.js +4 -2
  160. package/dist/doc-schemas/safety/case-aliases.js.map +1 -1
  161. package/dist/doc-schemas/safety/case.d.ts +5 -5
  162. package/dist/doc-schemas/safety/case.d.ts.map +1 -1
  163. package/dist/doc-schemas/safety/case.js +74 -37
  164. package/dist/doc-schemas/safety/case.js.map +1 -1
  165. package/dist/doc-schemas/safety/evidence.d.ts +48 -48
  166. package/dist/doc-schemas/safety/evidence.d.ts.map +1 -1
  167. package/dist/doc-schemas/safety/evidence.js +82 -45
  168. package/dist/doc-schemas/safety/evidence.js.map +1 -1
  169. package/dist/doc-schemas/safety/foundation.d.ts +33 -37
  170. package/dist/doc-schemas/safety/foundation.d.ts.map +1 -1
  171. package/dist/doc-schemas/safety/foundation.js +85 -30
  172. package/dist/doc-schemas/safety/foundation.js.map +1 -1
  173. package/dist/doc-schemas/safety/holds.d.ts +10 -10
  174. package/dist/doc-schemas/safety/holds.d.ts.map +1 -1
  175. package/dist/doc-schemas/safety/holds.js +24 -12
  176. package/dist/doc-schemas/safety/holds.js.map +1 -1
  177. package/dist/doc-schemas/safety/monitors.d.ts.map +1 -1
  178. package/dist/doc-schemas/safety/monitors.js +8 -4
  179. package/dist/doc-schemas/safety/monitors.js.map +1 -1
  180. package/dist/doc-schemas/safety/provenance.d.ts.map +1 -1
  181. package/dist/doc-schemas/safety/provenance.js +8 -4
  182. package/dist/doc-schemas/safety/provenance.js.map +1 -1
  183. package/dist/doc-schemas/safety/report.d.ts +18 -21
  184. package/dist/doc-schemas/safety/report.d.ts.map +1 -1
  185. package/dist/doc-schemas/safety/report.js +52 -45
  186. package/dist/doc-schemas/safety/report.js.map +1 -1
  187. package/dist/doc-schemas/safety/sagas.d.ts +2 -2
  188. package/dist/doc-schemas/safety/sagas.d.ts.map +1 -1
  189. package/dist/doc-schemas/safety/sagas.js +17 -13
  190. package/dist/doc-schemas/safety/sagas.js.map +1 -1
  191. package/dist/doc-schemas/social.d.ts +7 -7
  192. package/dist/doc-schemas/social.d.ts.map +1 -1
  193. package/dist/doc-schemas/social.js +6 -5
  194. package/dist/doc-schemas/social.js.map +1 -1
  195. package/dist/doc-schemas/square-announcement-jobs.d.ts +3 -3
  196. package/dist/doc-schemas/user.d.ts +2 -3
  197. package/dist/doc-schemas/user.d.ts.map +1 -1
  198. package/dist/doc-schemas/user.js +16 -20
  199. package/dist/doc-schemas/user.js.map +1 -1
  200. package/dist/doc-schemas/work-project.d.ts +1 -1
  201. package/dist/doc-schemas/work-project.d.ts.map +1 -1
  202. package/dist/doc-schemas/work-project.js +1 -1
  203. package/dist/doc-schemas/work-project.js.map +1 -1
  204. package/dist/ids/chat-ids.d.ts.map +1 -1
  205. package/dist/ids/chat-ids.js.map +1 -1
  206. package/dist/index.d.ts +9 -10
  207. package/dist/index.d.ts.map +1 -1
  208. package/dist/index.js +9 -10
  209. package/dist/index.js.map +1 -1
  210. package/dist/media/atoms.d.ts +5 -5
  211. package/dist/media/atoms.d.ts.map +1 -1
  212. package/dist/media/atoms.js +12 -6
  213. package/dist/media/atoms.js.map +1 -1
  214. package/dist/media/conversation-file-ref.d.ts.map +1 -1
  215. package/dist/media/conversation-file-ref.js +8 -4
  216. package/dist/media/conversation-file-ref.js.map +1 -1
  217. package/dist/media/domain-events-admin.d.ts +1 -1
  218. package/dist/media/domain-events-admin.js +3 -3
  219. package/dist/media/domain-events-admin.js.map +1 -1
  220. package/dist/media/domain-events-social.d.ts +1 -1
  221. package/dist/media/domain-events-social.js +1 -1
  222. package/dist/media/domain-events-social.js.map +1 -1
  223. package/dist/media/domain-events-user.d.ts +3 -3
  224. package/dist/media/domain-events-user.js +1 -1
  225. package/dist/media/domain-events-user.js.map +1 -1
  226. package/dist/media/domain-events-work.d.ts +1 -1
  227. package/dist/media/domain-events-work.js +1 -1
  228. package/dist/media/domain-events-work.js.map +1 -1
  229. package/dist/media/domain-events.d.ts +3 -7
  230. package/dist/media/domain-events.d.ts.map +1 -1
  231. package/dist/media/domain-events.js +5 -9
  232. package/dist/media/domain-events.js.map +1 -1
  233. package/dist/media/download-filename.d.ts.map +1 -1
  234. package/dist/media/download-filename.js +5 -4
  235. package/dist/media/download-filename.js.map +1 -1
  236. package/dist/media/edge-serving-contract.d.ts +15 -15
  237. package/dist/media/edge-serving-contract.d.ts.map +1 -1
  238. package/dist/media/edge-serving-contract.js +10 -2
  239. package/dist/media/edge-serving-contract.js.map +1 -1
  240. package/dist/media/file-origin.d.ts +1 -1
  241. package/dist/media/file-origin.js +1 -1
  242. package/dist/media/file-origin.js.map +1 -1
  243. package/dist/media/hall-library-target-fields.d.ts +3 -3
  244. package/dist/media/hall-library-target-fields.d.ts.map +1 -1
  245. package/dist/media/hall-library-target-fields.js.map +1 -1
  246. package/dist/media/index.d.ts +19 -15
  247. package/dist/media/index.d.ts.map +1 -1
  248. package/dist/media/index.js +19 -15
  249. package/dist/media/index.js.map +1 -1
  250. package/dist/media/pending-media.d.ts +23 -23
  251. package/dist/media/pending-media.js +3 -3
  252. package/dist/media/pending-media.js.map +1 -1
  253. package/dist/media/photodna-coverage.d.ts.map +1 -1
  254. package/dist/media/photodna-coverage.js +1 -3
  255. package/dist/media/photodna-coverage.js.map +1 -1
  256. package/dist/media/publication/publication-args.d.ts +3 -3
  257. package/dist/media/publication/publication-args.d.ts.map +1 -1
  258. package/dist/media/publication/publication-args.js +22 -18
  259. package/dist/media/publication/publication-args.js.map +1 -1
  260. package/dist/media/start-upload.d.ts +1 -1
  261. package/dist/media/start-upload.js +3 -3
  262. package/dist/media/start-upload.js.map +1 -1
  263. package/dist/media/target-info.d.ts +3 -3
  264. package/dist/media/target-info.d.ts.map +1 -1
  265. package/dist/media/target-info.js +90 -55
  266. package/dist/media/target-info.js.map +1 -1
  267. package/dist/media/ttt-media-specs.d.ts +5 -2
  268. package/dist/media/ttt-media-specs.d.ts.map +1 -1
  269. package/dist/media/ttt-media-specs.js +688 -618
  270. package/dist/media/ttt-media-specs.js.map +1 -1
  271. package/dist/media/upload-tray-display.js +1 -1
  272. package/dist/media/upload-tray-display.js.map +1 -1
  273. package/dist/notifications/index.d.ts +1 -2
  274. package/dist/notifications/index.d.ts.map +1 -1
  275. package/dist/notifications/index.js +1 -297
  276. package/dist/notifications/index.js.map +1 -1
  277. package/dist/notifications/notification-config.d.ts +3 -0
  278. package/dist/notifications/notification-config.d.ts.map +1 -0
  279. package/dist/notifications/notification-config.js +298 -0
  280. package/dist/notifications/notification-config.js.map +1 -0
  281. package/dist/paths/collection-refs.d.ts.map +1 -1
  282. package/dist/paths/collection-refs.js +92 -18
  283. package/dist/paths/collection-refs.js.map +1 -1
  284. package/dist/paths/collections.d.ts.map +1 -1
  285. package/dist/paths/collections.js.map +1 -1
  286. package/dist/paths/path-builders.d.ts.map +1 -1
  287. package/dist/paths/path-builders.js +798 -154
  288. package/dist/paths/path-builders.js.map +1 -1
  289. package/dist/paths/storage-paths.d.ts.map +1 -1
  290. package/dist/paths/storage-paths.js.map +1 -1
  291. package/dist/paths/work-section-paths.d.ts.map +1 -1
  292. package/dist/paths/work-section-paths.js.map +1 -1
  293. package/dist/permissions/guild-standing-assignment-policy.d.ts.map +1 -1
  294. package/dist/permissions/guild-standing-assignment-policy.js +13 -4
  295. package/dist/permissions/guild-standing-assignment-policy.js.map +1 -1
  296. package/dist/permissions/index.d.ts +1 -0
  297. package/dist/permissions/index.d.ts.map +1 -1
  298. package/dist/permissions/index.js +1 -0
  299. package/dist/permissions/index.js.map +1 -1
  300. package/dist/permissions/work-project-permissions-data.d.ts.map +1 -1
  301. package/dist/permissions/work-project-permissions-data.js.map +1 -1
  302. package/dist/permissions/work-project-permissions.d.ts +1 -2
  303. package/dist/permissions/work-project-permissions.d.ts.map +1 -1
  304. package/dist/permissions/work-project-permissions.js +8 -7
  305. package/dist/permissions/work-project-permissions.js.map +1 -1
  306. package/dist/report/chat-report-channel-ref.d.ts.map +1 -1
  307. package/dist/report/chat-report-channel-ref.js +8 -2
  308. package/dist/report/chat-report-channel-ref.js.map +1 -1
  309. package/dist/report/report-config-values.d.ts.map +1 -1
  310. package/dist/report/report-config-values.js +8 -8
  311. package/dist/report/report-config-values.js.map +1 -1
  312. package/dist/safety/active-safety-case-alert.d.ts +1 -1
  313. package/dist/safety/active-safety-case-alert.d.ts.map +1 -1
  314. package/dist/safety/active-safety-case-alert.js +2 -1
  315. package/dist/safety/active-safety-case-alert.js.map +1 -1
  316. package/dist/safety/ncii-intake-derivations.d.ts +1 -1
  317. package/dist/safety/ncii-intake-derivations.d.ts.map +1 -1
  318. package/dist/safety/ncii-intake-derivations.js.map +1 -1
  319. package/dist/safety/resource-keys.d.ts +2 -1
  320. package/dist/safety/resource-keys.d.ts.map +1 -1
  321. package/dist/safety/resource-keys.js.map +1 -1
  322. package/dist/schemas/admin-dispatch-actions.d.ts.map +1 -1
  323. package/dist/schemas/admin-dispatch-actions.js +20 -10
  324. package/dist/schemas/admin-dispatch-actions.js.map +1 -1
  325. package/dist/schemas/admin.d.ts +32 -21
  326. package/dist/schemas/admin.d.ts.map +1 -1
  327. package/dist/schemas/admin.js +213 -110
  328. package/dist/schemas/admin.js.map +1 -1
  329. package/dist/schemas/atoms.d.ts +39 -1
  330. package/dist/schemas/atoms.d.ts.map +1 -1
  331. package/dist/schemas/atoms.js +36 -10
  332. package/dist/schemas/atoms.js.map +1 -1
  333. package/dist/schemas/auditions.d.ts.map +1 -1
  334. package/dist/schemas/auditions.js +8 -4
  335. package/dist/schemas/auditions.js.map +1 -1
  336. package/dist/schemas/chat.d.ts +68 -2
  337. package/dist/schemas/chat.d.ts.map +1 -1
  338. package/dist/schemas/chat.js +66 -32
  339. package/dist/schemas/chat.js.map +1 -1
  340. package/dist/schemas/commissions.d.ts +2 -2
  341. package/dist/schemas/commissions.d.ts.map +1 -1
  342. package/dist/schemas/commissions.js +20 -18
  343. package/dist/schemas/commissions.js.map +1 -1
  344. package/dist/schemas/conversation-files.d.ts.map +1 -1
  345. package/dist/schemas/conversation-files.js +4 -2
  346. package/dist/schemas/conversation-files.js.map +1 -1
  347. package/dist/schemas/craft-skills.d.ts.map +1 -1
  348. package/dist/schemas/craft-skills.js +8 -4
  349. package/dist/schemas/craft-skills.js.map +1 -1
  350. package/dist/schemas/hall-library.d.ts.map +1 -1
  351. package/dist/schemas/hall-library.js +92 -45
  352. package/dist/schemas/hall-library.js.map +1 -1
  353. package/dist/schemas/index.d.ts +0 -3
  354. package/dist/schemas/index.d.ts.map +1 -1
  355. package/dist/schemas/index.js +0 -7
  356. package/dist/schemas/index.js.map +1 -1
  357. package/dist/schemas/media.d.ts.map +1 -1
  358. package/dist/schemas/media.js +32 -16
  359. package/dist/schemas/media.js.map +1 -1
  360. package/dist/schemas/ncii.d.ts +6 -3
  361. package/dist/schemas/ncii.d.ts.map +1 -1
  362. package/dist/schemas/ncii.js +42 -17
  363. package/dist/schemas/ncii.js.map +1 -1
  364. package/dist/schemas/notification.d.ts +2 -2
  365. package/dist/schemas/notification.d.ts.map +1 -1
  366. package/dist/schemas/notification.js +137 -65
  367. package/dist/schemas/notification.js.map +1 -1
  368. package/dist/schemas/payments.d.ts.map +1 -1
  369. package/dist/schemas/payments.js +25 -12
  370. package/dist/schemas/payments.js.map +1 -1
  371. package/dist/schemas/public-documents.d.ts +4 -4
  372. package/dist/schemas/public-documents.d.ts.map +1 -1
  373. package/dist/schemas/public-documents.js +44 -22
  374. package/dist/schemas/public-documents.js.map +1 -1
  375. package/dist/schemas/safety.d.ts +204 -214
  376. package/dist/schemas/safety.d.ts.map +1 -1
  377. package/dist/schemas/safety.js +70 -31
  378. package/dist/schemas/safety.js.map +1 -1
  379. package/dist/schemas/social.d.ts +7 -7
  380. package/dist/schemas/social.d.ts.map +1 -1
  381. package/dist/schemas/social.js +26 -13
  382. package/dist/schemas/social.js.map +1 -1
  383. package/dist/schemas/stake-share-operation.d.ts.map +1 -1
  384. package/dist/schemas/stake-share-operation.js +41 -21
  385. package/dist/schemas/stake-share-operation.js.map +1 -1
  386. package/dist/schemas/text-field.d.ts +2 -2
  387. package/dist/schemas/text-field.js +2 -2
  388. package/dist/schemas/text-field.js.map +1 -1
  389. package/dist/schemas/users.d.ts +12 -0
  390. package/dist/schemas/users.d.ts.map +1 -1
  391. package/dist/schemas/users.js +83 -39
  392. package/dist/schemas/users.js.map +1 -1
  393. package/dist/schemas/utility.d.ts.map +1 -1
  394. package/dist/schemas/utility.js +45 -21
  395. package/dist/schemas/utility.js.map +1 -1
  396. package/dist/schemas/voting.d.ts.map +1 -1
  397. package/dist/schemas/voting.js +8 -4
  398. package/dist/schemas/voting.js.map +1 -1
  399. package/dist/schemas/work-project-management.d.ts +1 -1
  400. package/dist/schemas/work-project-management.d.ts.map +1 -1
  401. package/dist/schemas/work-project-management.js +187 -94
  402. package/dist/schemas/work-project-management.js.map +1 -1
  403. package/dist/system-slots/help-videos.d.ts.map +1 -1
  404. package/dist/system-slots/help-videos.js +135 -27
  405. package/dist/system-slots/help-videos.js.map +1 -1
  406. package/dist/system-slots/system-slots.d.ts +1 -1
  407. package/dist/system-slots/system-slots.d.ts.map +1 -1
  408. package/dist/system-slots/system-slots.js.map +1 -1
  409. package/dist/types/admin-users.d.ts +0 -1
  410. package/dist/types/admin-users.d.ts.map +1 -1
  411. package/dist/types/admin-users.js +4 -4
  412. package/dist/types/admin-users.js.map +1 -1
  413. package/dist/types/audit.d.ts.map +1 -1
  414. package/dist/types/audit.js.map +1 -1
  415. package/dist/types/content.d.ts +0 -5
  416. package/dist/types/content.d.ts.map +1 -1
  417. package/dist/types/content.js.map +1 -1
  418. package/dist/types/index.d.ts +0 -10
  419. package/dist/types/index.d.ts.map +1 -1
  420. package/dist/types/index.js +0 -9
  421. package/dist/types/index.js.map +1 -1
  422. package/dist/types/payments.d.ts +0 -1
  423. package/dist/types/payments.d.ts.map +1 -1
  424. package/dist/types/payments.js +2 -3
  425. package/dist/types/payments.js.map +1 -1
  426. package/dist/types/work-project.d.ts +0 -2
  427. package/dist/types/work-project.d.ts.map +1 -1
  428. package/dist/types/work-project.js +2 -1
  429. package/dist/types/work-project.js.map +1 -1
  430. package/dist/upload-variables/apply-to-commission-variables.d.ts.map +1 -1
  431. package/dist/upload-variables/apply-to-commission-variables.js +5 -3
  432. package/dist/upload-variables/apply-to-commission-variables.js.map +1 -1
  433. package/dist/upload-variables/create-admin-audition-variables.d.ts.map +1 -1
  434. package/dist/upload-variables/create-admin-audition-variables.js +8 -3
  435. package/dist/upload-variables/create-admin-audition-variables.js.map +1 -1
  436. package/dist/upload-variables/create-audition-entry-variables.d.ts.map +1 -1
  437. package/dist/upload-variables/create-audition-entry-variables.js +4 -2
  438. package/dist/upload-variables/create-audition-entry-variables.js.map +1 -1
  439. package/dist/upload-variables/create-commission-variables.d.ts.map +1 -1
  440. package/dist/upload-variables/create-commission-variables.js +12 -6
  441. package/dist/upload-variables/create-commission-variables.js.map +1 -1
  442. package/dist/upload-variables/create-work-project-audition-variables.d.ts.map +1 -1
  443. package/dist/upload-variables/create-work-project-audition-variables.js +14 -6
  444. package/dist/upload-variables/create-work-project-audition-variables.js.map +1 -1
  445. package/dist/upload-variables/square-streetz-post-variables.d.ts +1 -1
  446. package/dist/upload-variables/square-streetz-post-variables.d.ts.map +1 -1
  447. package/dist/upload-variables/square-streetz-post-variables.js +5 -2
  448. package/dist/upload-variables/square-streetz-post-variables.js.map +1 -1
  449. package/dist/upload-variables/update-chapter-media-variables.d.ts.map +1 -1
  450. package/dist/upload-variables/update-chapter-media-variables.js +5 -3
  451. package/dist/upload-variables/update-chapter-media-variables.js.map +1 -1
  452. package/dist/upload-variables/update-episode-media-variables.d.ts.map +1 -1
  453. package/dist/upload-variables/update-episode-media-variables.js +5 -3
  454. package/dist/upload-variables/update-episode-media-variables.js.map +1 -1
  455. package/dist/upload-variables/update-tale-cover-photo-variables.d.ts.map +1 -1
  456. package/dist/upload-variables/update-tale-cover-photo-variables.js +4 -2
  457. package/dist/upload-variables/update-tale-cover-photo-variables.js.map +1 -1
  458. package/dist/upload-variables/update-television-cover-photo-variables.d.ts.map +1 -1
  459. package/dist/upload-variables/update-television-cover-photo-variables.js +4 -2
  460. package/dist/upload-variables/update-television-cover-photo-variables.js.map +1 -1
  461. package/dist/upload-variables/update-track-media-variables.d.ts.map +1 -1
  462. package/dist/upload-variables/update-track-media-variables.js +5 -3
  463. package/dist/upload-variables/update-track-media-variables.js.map +1 -1
  464. package/dist/upload-variables/update-tune-cover-photo-variables.d.ts.map +1 -1
  465. package/dist/upload-variables/update-tune-cover-photo-variables.js +4 -2
  466. package/dist/upload-variables/update-tune-cover-photo-variables.js.map +1 -1
  467. package/dist/upload-variables/update-work-realm-cover-variables.d.ts.map +1 -1
  468. package/dist/upload-variables/update-work-realm-cover-variables.js +4 -2
  469. package/dist/upload-variables/update-work-realm-cover-variables.js.map +1 -1
  470. package/dist/upload-variables/upload-conversation-file-variables.d.ts.map +1 -1
  471. package/dist/upload-variables/upload-conversation-file-variables.js +4 -2
  472. package/dist/upload-variables/upload-conversation-file-variables.js.map +1 -1
  473. package/dist/upload-variables/upload-craft-skill-variables.d.ts.map +1 -1
  474. package/dist/upload-variables/upload-craft-skill-variables.js +4 -2
  475. package/dist/upload-variables/upload-craft-skill-variables.js.map +1 -1
  476. package/dist/upload-variables/upload-profile-picture-variables.d.ts.map +1 -1
  477. package/dist/upload-variables/upload-profile-picture-variables.js +4 -2
  478. package/dist/upload-variables/upload-profile-picture-variables.js.map +1 -1
  479. package/dist/upload-variables/upload-system-content-variables.d.ts.map +1 -1
  480. package/dist/upload-variables/upload-system-content-variables.js +4 -2
  481. package/dist/upload-variables/upload-system-content-variables.js.map +1 -1
  482. package/dist/upload-variables/upload-work-file-variables.d.ts.map +1 -1
  483. package/dist/upload-variables/upload-work-file-variables.js +4 -2
  484. package/dist/upload-variables/upload-work-file-variables.js.map +1 -1
  485. package/dist/utils/admin-standing.d.ts.map +1 -1
  486. package/dist/utils/admin-standing.js +3 -1
  487. package/dist/utils/admin-standing.js.map +1 -1
  488. package/dist/utils/age-derivation.d.ts.map +1 -1
  489. package/dist/utils/age-derivation.js.map +1 -1
  490. package/dist/utils/app-config.d.ts.map +1 -1
  491. package/dist/utils/app-config.js +3 -1
  492. package/dist/utils/app-config.js.map +1 -1
  493. package/dist/utils/guild-chat-access.d.ts.map +1 -1
  494. package/dist/utils/guild-chat-access.js +5 -3
  495. package/dist/utils/guild-chat-access.js.map +1 -1
  496. package/dist/utils/guild-invite-system-message.d.ts.map +1 -1
  497. package/dist/utils/guild-invite-system-message.js +7 -3
  498. package/dist/utils/guild-invite-system-message.js.map +1 -1
  499. package/dist/utils/hall-content.d.ts +2 -2
  500. package/dist/utils/hall-content.d.ts.map +1 -1
  501. package/dist/utils/hall-content.js +18 -6
  502. package/dist/utils/hall-content.js.map +1 -1
  503. package/dist/utils/pledge-refund-eligibility.d.ts.map +1 -1
  504. package/dist/utils/pledge-refund-eligibility.js +7 -2
  505. package/dist/utils/pledge-refund-eligibility.js.map +1 -1
  506. package/dist/utils/pledge-totals.d.ts.map +1 -1
  507. package/dist/utils/pledge-totals.js.map +1 -1
  508. package/dist/utils/public-documents.d.ts.map +1 -1
  509. package/dist/utils/public-documents.js +1 -1
  510. package/dist/utils/public-documents.js.map +1 -1
  511. package/dist/utils/text-field.d.ts +3 -0
  512. package/dist/utils/text-field.d.ts.map +1 -1
  513. package/dist/utils/text-field.js +5 -0
  514. package/dist/utils/text-field.js.map +1 -1
  515. package/dist/utils/work-file-folder.d.ts.map +1 -1
  516. package/dist/utils/work-file-folder.js.map +1 -1
  517. package/dist/utils/work-publish-readiness.d.ts.map +1 -1
  518. package/dist/utils/work-publish-readiness.js.map +1 -1
  519. package/dist/utils/work-realm-eligibility.d.ts.map +1 -1
  520. package/dist/utils/work-realm-eligibility.js.map +1 -1
  521. package/package.json +8 -48
  522. package/dist/capabilities/index.d.ts +0 -3
  523. package/dist/capabilities/index.d.ts.map +0 -1
  524. package/dist/capabilities/index.js +0 -3
  525. package/dist/capabilities/index.js.map +0 -1
  526. package/dist/constants/business.d.ts +0 -6
  527. package/dist/constants/business.d.ts.map +0 -1
  528. package/dist/constants/business.js +0 -9
  529. package/dist/constants/business.js.map +0 -1
  530. package/dist/ids/index.d.ts +0 -3
  531. package/dist/ids/index.d.ts.map +0 -1
  532. package/dist/ids/index.js +0 -3
  533. package/dist/ids/index.js.map +0 -1
  534. package/dist/media/publication/index.d.ts +0 -2
  535. package/dist/media/publication/index.d.ts.map +0 -1
  536. package/dist/media/publication/index.js +0 -2
  537. package/dist/media/publication/index.js.map +0 -1
  538. package/dist/report/index.d.ts +0 -3
  539. package/dist/report/index.d.ts.map +0 -1
  540. package/dist/report/index.js +0 -3
  541. package/dist/report/index.js.map +0 -1
  542. package/dist/system-slots/index.d.ts +0 -4
  543. package/dist/system-slots/index.d.ts.map +0 -1
  544. package/dist/system-slots/index.js +0 -4
  545. package/dist/system-slots/index.js.map +0 -1
  546. package/dist/types/admin.d.ts +0 -2
  547. package/dist/types/admin.d.ts.map +0 -1
  548. package/dist/types/admin.js +0 -5
  549. package/dist/types/admin.js.map +0 -1
  550. package/dist/types/commissions.d.ts +0 -2
  551. package/dist/types/commissions.d.ts.map +0 -1
  552. package/dist/types/commissions.js +0 -3
  553. package/dist/types/commissions.js.map +0 -1
  554. package/dist/types/messaging.d.ts +0 -2
  555. package/dist/types/messaging.d.ts.map +0 -1
  556. package/dist/types/messaging.js +0 -7
  557. package/dist/types/messaging.js.map +0 -1
  558. package/dist/types/moderation.d.ts +0 -2
  559. package/dist/types/moderation.d.ts.map +0 -1
  560. package/dist/types/moderation.js +0 -5
  561. package/dist/types/moderation.js.map +0 -1
  562. package/dist/types/public-documents.d.ts +0 -3
  563. package/dist/types/public-documents.d.ts.map +0 -1
  564. package/dist/types/public-documents.js +0 -2
  565. package/dist/types/public-documents.js.map +0 -1
  566. package/dist/types/publicUser.d.ts +0 -2
  567. package/dist/types/publicUser.d.ts.map +0 -1
  568. package/dist/types/publicUser.js +0 -9
  569. package/dist/types/publicUser.js.map +0 -1
  570. package/dist/types/social.d.ts +0 -3
  571. package/dist/types/social.d.ts.map +0 -1
  572. package/dist/types/social.js +0 -2
  573. package/dist/types/social.js.map +0 -1
  574. package/dist/types/system.d.ts +0 -24
  575. package/dist/types/system.d.ts.map +0 -1
  576. package/dist/types/system.js +0 -2
  577. package/dist/types/system.js.map +0 -1
  578. package/dist/types/user.d.ts +0 -2
  579. package/dist/types/user.d.ts.map +0 -1
  580. package/dist/types/user.js +0 -3
  581. 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":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAIxE,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,CAM5F,CAAC;AAEF;;;;uEAIuE;AACvE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAM7D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAM9E,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG;KAC5C,CAAC,IAAI,sBAAsB,CAAC,CAAC,EAAE;SAC7B,CAAC,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM;KAC7D;CACF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oCAAoC;;;;CAEI,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAS/E;AAED,kFAAkF;AAClF,eAAO,MAAM,mCAAmC,mBAAmB,CAAC;AAEpE,uFAAuF;AACvF,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAe9E,CAAC;AAEF;4EAC4E;AAC5E,eAAO,MAAM,0BAA0B,EAAE,SAAS;IAChD,KAAK,EAAE,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,EAiBA,CAAC;AAEF,gGAAgG;AAChG,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;0BAI0B;AAC1B,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDe,CAAC;AAEvD,sFAAsF;AACtF,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvF,wDAAwD;AACxD,eAAO,MAAM,wBAAwB,EAAoD,CACvF,oBAAoB,EACpB,GAAG,oBAAoB,EAAE,CAC1B,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAElF;AAKD,uCAAuC;AACvC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAKvD,CAAC;AACF,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,GAAG,MAAM,GAAG,SAAS,CAMrB;AAMD,oGAAoG;AACpG,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,6BAA6B,EAAE,MAAM,CAMpF,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAKtF,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAIzE,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAIrE,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAIpE,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAKtE,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAK7E,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,CAMhF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,+EACwC,CAAC;AAE/E,0FAA0F;AAC1F,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAEjD,gGAAgG;AAChG,eAAO,MAAM,kCAAkC,WAAW,CAAC;AAE3D,oGAAoG;AACpG,eAAO,MAAM,oCAAoC,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAQtF,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAQtE,CAAC"}
@@ -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"]}
@@ -4,6 +4,8 @@ export declare const APP_MODES: readonly ["charter", "full"];
4
4
  export type AppMode = (typeof APP_MODES)[number];
5
5
  /** The deployed mode. Changing this constant (and publishing) IS the flip. */
6
6
  export declare const APP_MODE: AppMode;
7
+ /** Pick a mode-varied limit's value in the given mode. */
8
+ export declare const valueInMode: <T>(mode: AppMode, charter: T, full: T) => T;
7
9
  /** Pick the active value for a mode-varied limit. */
8
10
  export declare const byMode: <T>(charter: T, full: T) => T;
9
11
  /** Upstash-style sliding-window duration, e.g. '1 h'. */
@@ -1 +1 @@
1
- {"version":3,"file":"app-mode.d.ts","sourceRoot":"","sources":["../../src/constants/app-mode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-mode.d.ts","sourceRoot":"","sources":["../../src/constants/app-mode.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,10 @@
13
13
  export const APP_MODES = ['charter', 'full'];
14
14
  /** The deployed mode. Changing this constant (and publishing) IS the flip. */
15
15
  export const APP_MODE = 'charter';
16
+ /** Pick a mode-varied limit's value in the given mode. */
17
+ export const valueInMode = (mode, charter, full) => mode === 'charter' ? charter : full;
16
18
  /** Pick the active value for a mode-varied limit. */
17
- export const byMode = (charter, full) => APP_MODE === 'charter' ? charter : full;
19
+ export const byMode = (charter, full) => valueInMode(APP_MODE, charter, full);
18
20
  export const CHARTER_LIMITS = {
19
21
  mode: 'charter',
20
22
  user: {
@@ -1 +1 @@
1
- {"version":3,"file":"app-mode.js","sourceRoot":"","sources":["../../src/constants/app-mode.ts"],"names":[],"mappings":"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","sourcesContent":["// App mode + the charter/full limit sets — the single published constant that\n// drives the whole app's cost posture. The flip to full-live is: change\n// APP_MODE → publish ttt-core → install in ttt-prod (root + functions) →\n// deploy. There is NO runtime mode flag and NO console toggle.\n// See ttt-prod docs/design/charter-season-and-app-mode.md.\n//\n// Only real cost/abuse drivers vary by mode: media specs (ttt-media-specs.ts),\n// rate-limit values, count caps, batch sizes. Text-length limits and payment\n// min/max are deliberately mode-invariant — with ONE ruled exception (DJ\n// 2026-07-13): chapter body content (maxChapterContentLength), because it\n// bounds threshold-review reading effort per item during charter season.\n\nimport type { WorkProjectType } from '../types/content.js';\n\n/** The app's two modes: charter (the pre-funding limits) and full. */\nexport const APP_MODES = ['charter', 'full'] as const;\nexport type AppMode = (typeof APP_MODES)[number];\n\n/** The deployed mode. Changing this constant (and publishing) IS the flip. */\nexport const APP_MODE: AppMode = 'charter';\n\n/** Pick the active value for a mode-varied limit. */\nexport const byMode = <T>(charter: T, full: T): T =>\n (APP_MODE as AppMode) === 'charter' ? charter : full;\n\n/** Upstash-style sliding-window duration, e.g. '1 h'. */\nexport type RateLimitWindow = `${number} ${'ms' | 's' | 'm' | 'h' | 'd'}`;\n\nexport interface RateLimitValue {\n maxRequests: number;\n window: RateLimitWindow;\n}\n\nexport interface TttLimits {\n mode: AppMode;\n user: {\n maxCraftSkills: number;\n maxOwnedWorkProjects: number;\n maxAssociatedWorkProjects: number;\n };\n workProject: {\n maxGuildSize: number;\n maxFileFolders: number;\n maxWorkFiles: number;\n maxWorkFileStorageBytes: number;\n maxWorkProjectAuditions: number;\n maxCommissionListings: number;\n maxChapters: number;\n /** Chapter BODY length (chars) — the one mode-varied text limit (DJ 2026-07-13). */\n maxChapterContentLength: number;\n maxTuneTracks: number;\n maxTelevisionEpisodes: number;\n };\n /** Conversation Files container caps — PER CONVERSATION (one guild-invite\n * conversation or one admin-support dispatch thread). Both scopes share one cap\n * set; guild chat channels have no Conversation Files. DJ ruling 2026-07-25. */\n conversation: {\n /** Published active Conversation Files allowed in one conversation. */\n maxConversationFiles: number;\n /** Published STORED-OUTPUT bytes allowed in one conversation. */\n maxConversationFileStorageBytes: number;\n };\n hall: {\n maxSubmitBatch: number;\n };\n batches: {\n trendingFeedProcessLimit: number;\n maxFeedbackSubmitters: number;\n };\n /** Values for the backend rate limiters. Prefixes/factory stay in functions. */\n rateLimits: {\n UPLOAD: RateLimitValue;\n ADMIN_UPLOAD: RateLimitValue;\n CONTENT_WRITE: RateLimitValue;\n VOTE: RateLimitValue;\n MODERATION: RateLimitValue;\n SENSITIVE_ACTION: RateLimitValue;\n DISPLAY_NAME_CHECK: RateLimitValue;\n CHAT_MESSAGE: RateLimitValue;\n ADMIN_TASK: RateLimitValue;\n APPEAL_REVIEW: RateLimitValue;\n BAN_ACTION: RateLimitValue;\n SHARE_TRANSFER: RateLimitValue;\n CONTENT_REPORT: RateLimitValue;\n SHORT_LINK_CLICK: RateLimitValue;\n FOLLOW: RateLimitValue;\n MENTION_HISTORY: RateLimitValue;\n MEDIA_GRANT: RateLimitValue;\n CHAT_GRANT: RateLimitValue;\n OPERATOR_STEP_UP: RateLimitValue;\n ADMIN_MESSAGE_READ: RateLimitValue;\n USER_LOOKUP: RateLimitValue;\n NOTIFICATION_BROADCAST: RateLimitValue;\n NOTIFICATION_ARCHIVE: RateLimitValue;\n NOTIFICATION_MARK_SEEN: RateLimitValue;\n FEEDBACK: RateLimitValue;\n SHORT_LINK_CREATE: RateLimitValue;\n INVITE_ACTION: RateLimitValue;\n LIBRARY_SUBMISSION: RateLimitValue;\n CHANNEL_CREATE: RateLimitValue;\n CHECKOUT_CREATE: RateLimitValue;\n AGE_ATTEST: RateLimitValue;\n HALL_PREFERENCE: RateLimitValue;\n REFUND_DECISION: RateLimitValue;\n };\n}\n\nexport const CHARTER_LIMITS: TttLimits = {\n mode: 'charter',\n user: {\n maxCraftSkills: 8,\n maxOwnedWorkProjects: 3,\n maxAssociatedWorkProjects: 10,\n },\n workProject: {\n maxGuildSize: 25,\n maxFileFolders: 10,\n maxWorkFiles: 100,\n maxWorkFileStorageBytes: 2_684_354_560, // 2.5 GiB\n maxWorkProjectAuditions: 3,\n maxCommissionListings: 3,\n maxChapters: 5,\n // ~5,000 words — a full real chapter, while keeping the human threshold-review\n // reading effort per item bounded during charter season.\n maxChapterContentLength: 30_000,\n maxTuneTracks: 5,\n maxTelevisionEpisodes: 3,\n },\n // Conversation Files are QUOTA'D PER CONVERSATION (DJ ruling 2026-07-25). Counted on\n // STORED OUTPUT bytes (what actually sits in R2 after transcode), never on raw upload\n // bytes. Rationale: a per-file `maxBytes` cap alone bounds one upload but nothing stops\n // unbounded accumulation across a long-running conversation — this is the abuse brake\n // on that, and it is what `startUpload`'s reservation and the publication transfer both\n // check. Charter: 10 files / 500 MiB per conversation.\n conversation: {\n maxConversationFiles: 10,\n maxConversationFileStorageBytes: 524_288_000, // 500 MiB\n },\n hall: { maxSubmitBatch: 10 },\n batches: { trendingFeedProcessLimit: 250, maxFeedbackSubmitters: 25 },\n rateLimits: {\n // Uploads are charged ONCE per upload (in startUpload); the processor-side\n // check is a non-charging guard.\n UPLOAD: { maxRequests: 15, window: '1 h' },\n // A separate HIGHER bucket for uploads performed through the sanctioned admin\n // authority path — never an exemption. Bulk admin setup work (creating 3\n // auditions is ~5 uploads) exhausts the 15/h user bucket; 60/h covers a real\n // bulk admin session while keeping a brake on a compromised admin token and on\n // third-party quota/cost (Vision / Video Intelligence / R2). DJ ruling 2026-07-25.\n ADMIN_UPLOAD: { maxRequests: 60, window: '1 h' },\n // General content-write throttle for the non-upload write callables (text posts,\n // craft-skill edits, support-thread starts) that used to charge UPLOAD. Sharing\n // the 15/h charter upload window meant heavy text posting blocked real uploads\n // and vice versa; a separate 30/h bucket keeps each cost driver on its own\n // ceiling. DJ ruling 2026-07-25.\n CONTENT_WRITE: { maxRequests: 30, window: '1 h' },\n VOTE: { maxRequests: 100, window: '1 h' },\n MODERATION: { maxRequests: 50, window: '1 h' },\n // 30/h: one bucket is shared by ~35 callables (register, become-artisan,\n // create-work, invites, trades, appeals, …) — a real first-hour artisan does\n // 10-15 legitimate sensitive actions; 5/h blocked the intended golden path\n // (proven live by the hosted-dev E2E, 2026-07-07). DJ ruling 2026-07-08.\n SENSITIVE_ACTION: { maxRequests: 30, window: '1 h' },\n // 120/h (charter): checkDisplayNameAvailable is enforceAppCheck:true, so\n // reCAPTCHA-Enterprise attestation is the real abuse gate — this bucket is a\n // cost/DoS ceiling, not the security boundary. It is IP-keyed (pre-registration,\n // no uid yet) and the register form fires it debounced-LIVE as you type, so one\n // legit registrant spends ~3-8 checks and shared NAT/CGNAT multiplies that across\n // everyone on the IP. The old 20/h false-rejected legitimate shared-IP users and\n // could not fit a full hosted-dev E2E suite run on one IP. DJ ruling 2026-07-21.\n DISPLAY_NAME_CHECK: { maxRequests: 120, window: '1 h' },\n CHAT_MESSAGE: { maxRequests: 125, window: '1 h' },\n ADMIN_TASK: { maxRequests: 60, window: '1 h' },\n APPEAL_REVIEW: { maxRequests: 30, window: '1 h' },\n BAN_ACTION: { maxRequests: 20, window: '1 h' },\n SHARE_TRANSFER: { maxRequests: 10, window: '1 h' },\n CONTENT_REPORT: { maxRequests: 5, window: '1 h' },\n SHORT_LINK_CLICK: { maxRequests: 60, window: '1 h' },\n FOLLOW: { maxRequests: 20, window: '1 m' },\n MENTION_HISTORY: { maxRequests: 120, window: '1 h' },\n // Scoped-media grant minting (createMediaGrant). Its OWN bucket — it used to charge\n // MENTION_HISTORY, an unrelated surface, so neither limit meant what its name said and the\n // two shared a budget sized for neither (BACKEND-013). Refresh-driven, not user-initiated:\n // a grant is short-TTL (60 min work media, 15 min chat/folder scopes) and the client re-mints\n // under expiry, so a browsing session naturally spends several per hour PER SCOPE (each work,\n // each private file folder, each conversation). Cheap to serve (a Firestore permission read\n // plus an HMAC sign — no third-party cost), and a false 429 breaks media rendering outright,\n // so the ceiling is generous: it exists to stop a scripted grant-farming sweep, not to pace a\n // real reader. 120/h charter.\n MEDIA_GRANT: { maxRequests: 120, window: '1 h' },\n // Realtime chat grant minting (mintChatGrant) — previously NO limiter at all (BACKEND-013),\n // despite minting signed grants at concurrency: 20. Same refresh-driven shape as MEDIA_GRANT:\n // a 15-minute grant TTL means ~4 mints/hour for the inbox plus ~4 per open channel, doubled\n // again by socket reconnects on a flaky mobile network. It stays behind the per-channel\n // authorizeChannelScope gate, so this bucket is a cost/DoS ceiling rather than the\n // authorization boundary — sized to match MEDIA_GRANT so the two grant surfaces are paced\n // alike and neither can be starved by the other (separate Redis prefixes).\n CHAT_GRANT: { maxRequests: 120, window: '1 h' },\n // Operator step-up TOTP verification (confirmOperatorStepUp / verifyOperatorStepUp) —\n // previously unthrottled, so an attacker holding a stolen full-admin session could\n // brute-force the 6-digit second factor guarding the safety console (BACKEND-013).\n // DELIBERATELY THE TIGHTEST BUCKET IN THE SET: a real operator enrolls once and verifies\n // roughly twice an hour (the grant window is 30 minutes), so 10/h absorbs every legitimate\n // mistype while capping guessing at 10 attempts per hour against a code that rotates every\n // 30 seconds. Mode-INVARIANT — this is an admin security control, not a cost driver, so it\n // never loosens at the full-mode flip (same posture as MODERATION / BAN_ACTION / USER_LOOKUP).\n // The lockout-after-N-failures behaviour is a separate app-side concern; this is the throttle.\n OPERATOR_STEP_UP: { maxRequests: 10, window: '1 h' },\n ADMIN_MESSAGE_READ: { maxRequests: 60, window: '1 h' },\n // Admin exact-account lookup (searchPublicUsers / lookupUserByEmailOrUid) — a read, so a\n // generous per-minute bucket that still backstops a scripted enumeration sweep. Admin-only\n // and not a cost driver, so the value is the same in both modes (like MODERATION/ADMIN_TASK).\n USER_LOOKUP: { maxRequests: 30, window: '1 m' },\n NOTIFICATION_BROADCAST: { maxRequests: 10, window: '1 h' },\n NOTIFICATION_ARCHIVE: { maxRequests: 120, window: '1 h' },\n NOTIFICATION_MARK_SEEN: { maxRequests: 120, window: '1 h' },\n FEEDBACK: { maxRequests: 10, window: '1 h' },\n SHORT_LINK_CREATE: { maxRequests: 30, window: '1 h' },\n INVITE_ACTION: { maxRequests: 30, window: '1 h' },\n LIBRARY_SUBMISSION: { maxRequests: 10, window: '1 h' },\n CHANNEL_CREATE: { maxRequests: 5, window: '1 h' },\n CHECKOUT_CREATE: { maxRequests: 5, window: '1 h' },\n // The registration age step, keyed per hashed client IP (pre-account, no uid). One call per\n // attempt — a corrected date or a retry at most doubles it — so 30/h gives one IP the same\n // registrants per hour as DISPLAY_NAME_CHECK's 120/h at its 3–8 debounced checks each, while a\n // script minting age-attestation records gets far less headroom.\n AGE_ATTEST: { maxRequests: 30, window: '1 h' },\n // A member's own Hall settings, ink marks, hidden Works, reading position, and recently viewed\n // list. Reading position and recently viewed are written as the member reads, so the bucket is\n // sized like NOTIFICATION_MARK_SEEN, the other passive per-member write.\n HALL_PREFERENCE: { maxRequests: 120, window: '1 h' },\n // An admin's approve or deny of a refund request. Admin-only, so mode-invariant like\n // APPEAL_REVIEW, the other admin decision on a member's request.\n REFUND_DECISION: { maxRequests: 30, window: '1 h' },\n },\n};\n\nexport const FULL_LIMITS: TttLimits = {\n mode: 'full',\n user: {\n maxCraftSkills: 24,\n maxOwnedWorkProjects: 25,\n maxAssociatedWorkProjects: 100,\n },\n workProject: {\n maxGuildSize: 250,\n maxFileFolders: 25,\n maxWorkFiles: 1000,\n maxWorkFileStorageBytes: 26_843_545_600, // 25 GiB\n maxWorkProjectAuditions: 10,\n maxCommissionListings: 10,\n maxChapters: 50,\n // The intentional design ceiling (~17,000 words; trivially inside Firestore's\n // 1 MiB doc limit) — the audit trail deliberately stores field LENGTHS, not\n // content, because chapters can be this large (runUpdateChapterDetails).\n maxChapterContentLength: 100_000,\n maxTuneTracks: 50,\n maxTelevisionEpisodes: 25,\n },\n // 20 files / 1 GiB (full): the same per-conversation Conversation Files quota as\n // charter, scaled for a public-launch conversation. Still a hard ceiling on\n // unbounded R2 accumulation. See the CHARTER_LIMITS note above. DJ ruling 2026-07-25.\n conversation: {\n maxConversationFiles: 20,\n maxConversationFileStorageBytes: 1_073_741_824, // 1 GiB\n },\n hall: { maxSubmitBatch: 50 },\n batches: { trendingFeedProcessLimit: 1000, maxFeedbackSubmitters: 100 },\n rateLimits: {\n UPLOAD: { maxRequests: 30, window: '1 h' },\n // 120/h (full): the same sanctioned-admin-path upload bucket as charter, scaled\n // with UPLOAD — always HIGHER than the user bucket, never an exemption, so a\n // compromised admin token and third-party media cost stay bounded. See the\n // CHARTER_LIMITS note above. DJ ruling 2026-07-25.\n ADMIN_UPLOAD: { maxRequests: 120, window: '1 h' },\n // 60/h (full): the same non-upload content-write bucket as charter, scaled with\n // UPLOAD so text writes and media uploads never consume each other's ceiling.\n // See the CHARTER_LIMITS note above. DJ ruling 2026-07-25.\n CONTENT_WRITE: { maxRequests: 60, window: '1 h' },\n VOTE: { maxRequests: 200, window: '1 h' },\n MODERATION: { maxRequests: 50, window: '1 h' },\n // 60/h: full-mode power users managing several works do dozens of legitimate\n // management actions per hour; still a hard backstop against scripts.\n // DJ ruling 2026-07-08 (charter 30 / full 60, single bucket; a bucket split\n // is filed post-launch in ttt-prod docs/post-launch/).\n SENSITIVE_ACTION: { maxRequests: 60, window: '1 h' },\n // 300/h (full): same reasoning as the charter value above (App-Check-gated\n // cost ceiling, IP-keyed, debounced-live). Public-launch CGNAT exposure is far\n // larger — hundreds of concurrent legit registrants can sit behind one carrier\n // IP — so err generous; the only cost of \"too high\" is trivial Firestore reads,\n // while \"too low\" false-rejects real users. Raise on evidence (watch prod logs\n // for legit 429s) rather than pre-emptively tightening. DJ ruling 2026-07-21.\n DISPLAY_NAME_CHECK: { maxRequests: 300, window: '1 h' },\n CHAT_MESSAGE: { maxRequests: 150, window: '1 h' },\n ADMIN_TASK: { maxRequests: 60, window: '1 h' },\n APPEAL_REVIEW: { maxRequests: 30, window: '1 h' },\n BAN_ACTION: { maxRequests: 20, window: '1 h' },\n SHARE_TRANSFER: { maxRequests: 10, window: '1 h' },\n CONTENT_REPORT: { maxRequests: 20, window: '1 h' },\n SHORT_LINK_CLICK: { maxRequests: 60, window: '1 h' },\n FOLLOW: { maxRequests: 60, window: '1 m' },\n MENTION_HISTORY: { maxRequests: 120, window: '1 h' },\n // 240/h (full): the same grant-minting buckets as charter, doubled with the surrounding\n // content limits. Full mode raises the ceilings a grant is minted PER (250-guildmate guilds,\n // 25 file folders, 1000 work files, 10 auditions), so one session legitimately touches more\n // scopes and re-mints more often. See the CHARTER_LIMITS notes above.\n MEDIA_GRANT: { maxRequests: 240, window: '1 h' },\n CHAT_GRANT: { maxRequests: 240, window: '1 h' },\n // Operator step-up stays at 10/h in BOTH modes — an admin second-factor throttle is a\n // security control, not a cost lever, so it never loosens at the flip. See CHARTER_LIMITS.\n OPERATOR_STEP_UP: { maxRequests: 10, window: '1 h' },\n ADMIN_MESSAGE_READ: { maxRequests: 60, window: '1 h' },\n // Admin exact-account lookup — same read bucket in both modes (see CHARTER_LIMITS note).\n USER_LOOKUP: { maxRequests: 30, window: '1 m' },\n NOTIFICATION_BROADCAST: { maxRequests: 10, window: '1 h' },\n NOTIFICATION_ARCHIVE: { maxRequests: 120, window: '1 h' },\n NOTIFICATION_MARK_SEEN: { maxRequests: 120, window: '1 h' },\n FEEDBACK: { maxRequests: 10, window: '1 h' },\n SHORT_LINK_CREATE: { maxRequests: 30, window: '1 h' },\n INVITE_ACTION: { maxRequests: 60, window: '1 h' },\n LIBRARY_SUBMISSION: { maxRequests: 20, window: '1 h' },\n CHANNEL_CREATE: { maxRequests: 20, window: '1 h' },\n CHECKOUT_CREATE: { maxRequests: 20, window: '1 h' },\n // Scaled with DISPLAY_NAME_CHECK's full-mode 300/h — see the CHARTER_LIMITS note.\n AGE_ATTEST: { maxRequests: 75, window: '1 h' },\n // Both stay at their charter values — see the CHARTER_LIMITS notes.\n HALL_PREFERENCE: { maxRequests: 120, window: '1 h' },\n REFUND_DECISION: { maxRequests: 30, window: '1 h' },\n },\n};\n\n/** The resolved limit set for the deployed mode. Import THIS (or the alias\n * constants that re-export from it), never CHARTER_/FULL_ directly. A read bound\n * that must hold whichever mode the data was written under uses\n * HALL_SUB_ITEM_READ_BOUND_BY_WORK_TYPE below instead. */\nexport const ACTIVE_LIMITS: TttLimits = byMode(CHARTER_LIMITS, FULL_LIMITS);\n\nconst largestInAnyMode = (pick: (limits: TttLimits) => number): number =>\n Math.max(pick(CHARTER_LIMITS), pick(FULL_LIMITS));\n\n/**\n * The most sub-items one Hall item can hold of each kind (Tale chapters, Tune tracks, Television\n * episodes) in ANY app mode — each kind's count cap at its largest across CHARTER_LIMITS and\n * FULL_LIMITS. A READ bound, never an enforced limit: a Hall item keeps the sub-items it was\n * published with when the mode changes, so a reader that must see all of them sizes its query\n * from this and treats a read that returns more as uncertain. Enforcement reads the active caps\n * (MAX_CHAPTERS, MAX_TUNE_TRACKS, MAX_TELEVISION_EPISODES).\n */\nexport const HALL_SUB_ITEM_READ_BOUND_BY_WORK_TYPE: Readonly<Record<WorkProjectType, number>> = {\n Tales: largestInAnyMode((limits) => limits.workProject.maxChapters),\n Tunes: largestInAnyMode((limits) => limits.workProject.maxTuneTracks),\n Television: largestInAnyMode((limits) => limits.workProject.maxTelevisionEpisodes),\n};\n\n/**\n * User-facing copy for a reached count cap — the ONE owner of the cap-message\n * shape, beside the limits it describes. Every callable refusing on a\n * mode-varied count cap formats through this. In charter mode the message\n * names Charter Season so the cap reads as the season's limit rather than the\n * platform's permanent shape; full mode stays neutral. `hint` is an optional\n * trailing sentence (e.g. \"Delete a file to add another.\").\n */\nexport const countCapReachedMessage = (\n subject: string,\n limit: number,\n noun: string,\n hint?: string,\n): string => {\n const base = byMode(\n `${subject} already has the Charter Season maximum of ${limit} ${noun} — caps expand when Charter Season ends.`,\n `${subject} already has the maximum of ${limit} ${noun}.`,\n );\n return hint ? `${base} ${hint}` : base;\n};\n"]}
1
+ {"version":3,"file":"app-mode.js","sourceRoot":"","sources":["../../src/constants/app-mode.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,yEAAyE;AACzE,+DAA+D;AAC/D,2DAA2D;AAC3D,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AAIzE,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,CAAU,CAAC;AAGtD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,QAAQ,GAAY,SAAS,CAAC;AAE3C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,IAAa,EAAE,OAAU,EAAE,IAAO,EAAK,EAAE,CACtE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAEtC,qDAAqD;AACrD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAI,OAAU,EAAE,IAAO,EAAK,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAoF1F,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,IAAI,EAAE,SAAS;IACf,IAAI,EAAE;QACJ,cAAc,EAAE,CAAC;QACjB,oBAAoB,EAAE,CAAC;QACvB,yBAAyB,EAAE,EAAE;KAC9B;IACD,WAAW,EAAE;QACX,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,GAAG;QACjB,uBAAuB,EAAE,aAAa,EAAE,UAAU;QAClD,uBAAuB,EAAE,CAAC;QAC1B,qBAAqB,EAAE,CAAC;QACxB,WAAW,EAAE,CAAC;QACd,+EAA+E;QAC/E,yDAAyD;QACzD,uBAAuB,EAAE,MAAM;QAC/B,aAAa,EAAE,CAAC;QAChB,qBAAqB,EAAE,CAAC;KACzB;IACD,qFAAqF;IACrF,sFAAsF;IACtF,wFAAwF;IACxF,sFAAsF;IACtF,wFAAwF;IACxF,uDAAuD;IACvD,YAAY,EAAE;QACZ,oBAAoB,EAAE,EAAE;QACxB,+BAA+B,EAAE,WAAW,EAAE,UAAU;KACzD;IACD,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;IAC5B,OAAO,EAAE,EAAE,wBAAwB,EAAE,GAAG,EAAE,qBAAqB,EAAE,EAAE,EAAE;IACrE,UAAU,EAAE;QACV,2EAA2E;QAC3E,iCAAiC;QACjC,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,8EAA8E;QAC9E,yEAAyE;QACzE,6EAA6E;QAC7E,+EAA+E;QAC/E,mFAAmF;QACnF,YAAY,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAChD,iFAAiF;QACjF,gFAAgF;QAChF,+EAA+E;QAC/E,2EAA2E;QAC3E,iCAAiC;QACjC,aAAa,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACzC,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,yEAAyE;QACzE,6EAA6E;QAC7E,2EAA2E;QAC3E,yEAAyE;QACzE,gBAAgB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,yEAAyE;QACzE,6EAA6E;QAC7E,iFAAiF;QACjF,gFAAgF;QAChF,kFAAkF;QAClF,iFAAiF;QACjF,iFAAiF;QACjF,kBAAkB,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACvD,YAAY,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,aAAa,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,cAAc,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,gBAAgB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,eAAe,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,oFAAoF;QACpF,2FAA2F;QAC3F,2FAA2F;QAC3F,8FAA8F;QAC9F,8FAA8F;QAC9F,4FAA4F;QAC5F,6FAA6F;QAC7F,8FAA8F;QAC9F,8BAA8B;QAC9B,WAAW,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QAChD,4FAA4F;QAC5F,8FAA8F;QAC9F,4FAA4F;QAC5F,wFAAwF;QACxF,mFAAmF;QACnF,0FAA0F;QAC1F,2EAA2E;QAC3E,UAAU,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/C,sFAAsF;QACtF,mFAAmF;QACnF,mFAAmF;QACnF,yFAAyF;QACzF,2FAA2F;QAC3F,2FAA2F;QAC3F,2FAA2F;QAC3F,+FAA+F;QAC/F,+FAA+F;QAC/F,gBAAgB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,kBAAkB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACtD,yFAAyF;QACzF,2FAA2F;QAC3F,8FAA8F;QAC9F,WAAW,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/C,sBAAsB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1D,oBAAoB,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACzD,sBAAsB,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QAC3D,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC5C,iBAAiB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACrD,aAAa,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,kBAAkB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACtD,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,eAAe,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,4FAA4F;QAC5F,2FAA2F;QAC3F,+FAA+F;QAC/F,iEAAiE;QACjE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,+FAA+F;QAC/F,+FAA+F;QAC/F,yEAAyE;QACzE,eAAe,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,qFAAqF;QACrF,iEAAiE;QACjE,eAAe,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;KACpD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE;QACJ,cAAc,EAAE,EAAE;QAClB,oBAAoB,EAAE,EAAE;QACxB,yBAAyB,EAAE,GAAG;KAC/B;IACD,WAAW,EAAE;QACX,YAAY,EAAE,GAAG;QACjB,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,IAAI;QAClB,uBAAuB,EAAE,cAAc,EAAE,SAAS;QAClD,uBAAuB,EAAE,EAAE;QAC3B,qBAAqB,EAAE,EAAE;QACzB,WAAW,EAAE,EAAE;QACf,8EAA8E;QAC9E,4EAA4E;QAC5E,yEAAyE;QACzE,uBAAuB,EAAE,OAAO;QAChC,aAAa,EAAE,EAAE;QACjB,qBAAqB,EAAE,EAAE;KAC1B;IACD,iFAAiF;IACjF,4EAA4E;IAC5E,sFAAsF;IACtF,YAAY,EAAE;QACZ,oBAAoB,EAAE,EAAE;QACxB,+BAA+B,EAAE,aAAa,EAAE,QAAQ;KACzD;IACD,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;IAC5B,OAAO,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE;IACvE,UAAU,EAAE;QACV,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,gFAAgF;QAChF,6EAA6E;QAC7E,2EAA2E;QAC3E,mDAAmD;QACnD,YAAY,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,gFAAgF;QAChF,8EAA8E;QAC9E,2DAA2D;QAC3D,aAAa,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACzC,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,6EAA6E;QAC7E,sEAAsE;QACtE,4EAA4E;QAC5E,uDAAuD;QACvD,gBAAgB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,2EAA2E;QAC3E,+EAA+E;QAC/E,+EAA+E;QAC/E,gFAAgF;QAChF,+EAA+E;QAC/E,8EAA8E;QAC9E,kBAAkB,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACvD,YAAY,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,aAAa,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,cAAc,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,cAAc,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,gBAAgB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,eAAe,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,wFAAwF;QACxF,6FAA6F;QAC7F,4FAA4F;QAC5F,sEAAsE;QACtE,WAAW,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QAChD,UAAU,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/C,sFAAsF;QACtF,2FAA2F;QAC3F,gBAAgB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,kBAAkB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACtD,yFAAyF;QACzF,WAAW,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/C,sBAAsB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1D,oBAAoB,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACzD,sBAAsB,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QAC3D,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC5C,iBAAiB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACrD,aAAa,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,kBAAkB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACtD,cAAc,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,eAAe,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACnD,kFAAkF;QAClF,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,oEAAoE;QACpE,eAAe,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;QACpD,eAAe,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;KACpD;CACF,CAAC;AAEF;;;0DAG0D;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAc,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAE5E,MAAM,gBAAgB,GAAG,CAAC,IAAmC,EAAU,EAAE,CACvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAA8C;IAC9F,KAAK,EAAE,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;IACnE,KAAK,EAAE,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC;IACrE,UAAU,EAAE,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC;CACnF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAAe,EACf,KAAa,EACb,IAAY,EACZ,IAAa,EACL,EAAE;IACV,MAAM,IAAI,GAAG,MAAM,CACjB,GAAG,OAAO,8CAA8C,KAAK,IAAI,IAAI,0CAA0C,EAC/G,GAAG,OAAO,+BAA+B,KAAK,IAAI,IAAI,GAAG,CAC1D,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC,CAAC","sourcesContent":["// App mode + the charter/full limit sets — the single published constant that\n// drives the whole app's cost posture. The flip to full-live is: change\n// APP_MODE → publish ttt-core → install in ttt-prod (root + functions) →\n// deploy. There is NO runtime mode flag and NO console toggle.\n// See ttt-prod docs/design/charter-season-and-app-mode.md.\n//\n// Only real cost/abuse drivers vary by mode: media specs (ttt-media-specs.ts),\n// rate-limit values, count caps, batch sizes. Text-length limits and payment\n// min/max are deliberately mode-invariant — with ONE ruled exception (DJ\n// 2026-07-13): chapter body content (maxChapterContentLength), because it\n// bounds threshold-review reading effort per item during charter season.\n\nimport type { WorkProjectType } from '../types/content.js';\n\n/** The app's two modes: charter (the pre-funding limits) and full. */\nexport const APP_MODES = ['charter', 'full'] as const;\nexport type AppMode = (typeof APP_MODES)[number];\n\n/** The deployed mode. Changing this constant (and publishing) IS the flip. */\nexport const APP_MODE: AppMode = 'charter';\n\n/** Pick a mode-varied limit's value in the given mode. */\nexport const valueInMode = <T>(mode: AppMode, charter: T, full: T): T =>\n mode === 'charter' ? charter : full;\n\n/** Pick the active value for a mode-varied limit. */\nexport const byMode = <T>(charter: T, full: T): T => valueInMode(APP_MODE, charter, full);\n\n/** Upstash-style sliding-window duration, e.g. '1 h'. */\nexport type RateLimitWindow = `${number} ${'ms' | 's' | 'm' | 'h' | 'd'}`;\n\nexport interface RateLimitValue {\n maxRequests: number;\n window: RateLimitWindow;\n}\n\nexport interface TttLimits {\n mode: AppMode;\n user: {\n maxCraftSkills: number;\n maxOwnedWorkProjects: number;\n maxAssociatedWorkProjects: number;\n };\n workProject: {\n maxGuildSize: number;\n maxFileFolders: number;\n maxWorkFiles: number;\n maxWorkFileStorageBytes: number;\n maxWorkProjectAuditions: number;\n maxCommissionListings: number;\n maxChapters: number;\n /** Chapter BODY length (chars) — the one mode-varied text limit (DJ 2026-07-13). */\n maxChapterContentLength: number;\n maxTuneTracks: number;\n maxTelevisionEpisodes: number;\n };\n /** Conversation Files container caps — PER CONVERSATION (one guild-invite\n * conversation or one admin-support dispatch thread). Both scopes share one cap\n * set; guild chat channels have no Conversation Files. DJ ruling 2026-07-25. */\n conversation: {\n /** Published active Conversation Files allowed in one conversation. */\n maxConversationFiles: number;\n /** Published STORED-OUTPUT bytes allowed in one conversation. */\n maxConversationFileStorageBytes: number;\n };\n hall: {\n maxSubmitBatch: number;\n };\n batches: {\n trendingFeedProcessLimit: number;\n maxFeedbackSubmitters: number;\n };\n /** Values for the backend rate limiters. Prefixes/factory stay in functions. */\n rateLimits: {\n UPLOAD: RateLimitValue;\n ADMIN_UPLOAD: RateLimitValue;\n CONTENT_WRITE: RateLimitValue;\n VOTE: RateLimitValue;\n MODERATION: RateLimitValue;\n SENSITIVE_ACTION: RateLimitValue;\n DISPLAY_NAME_CHECK: RateLimitValue;\n CHAT_MESSAGE: RateLimitValue;\n ADMIN_TASK: RateLimitValue;\n APPEAL_REVIEW: RateLimitValue;\n BAN_ACTION: RateLimitValue;\n SHARE_TRANSFER: RateLimitValue;\n CONTENT_REPORT: RateLimitValue;\n SHORT_LINK_CLICK: RateLimitValue;\n FOLLOW: RateLimitValue;\n MENTION_HISTORY: RateLimitValue;\n MEDIA_GRANT: RateLimitValue;\n CHAT_GRANT: RateLimitValue;\n OPERATOR_STEP_UP: RateLimitValue;\n ADMIN_MESSAGE_READ: RateLimitValue;\n USER_LOOKUP: RateLimitValue;\n NOTIFICATION_BROADCAST: RateLimitValue;\n NOTIFICATION_ARCHIVE: RateLimitValue;\n NOTIFICATION_MARK_SEEN: RateLimitValue;\n FEEDBACK: RateLimitValue;\n SHORT_LINK_CREATE: RateLimitValue;\n INVITE_ACTION: RateLimitValue;\n LIBRARY_SUBMISSION: RateLimitValue;\n CHANNEL_CREATE: RateLimitValue;\n CHECKOUT_CREATE: RateLimitValue;\n AGE_ATTEST: RateLimitValue;\n HALL_PREFERENCE: RateLimitValue;\n REFUND_DECISION: RateLimitValue;\n };\n}\n\nexport const CHARTER_LIMITS: TttLimits = {\n mode: 'charter',\n user: {\n maxCraftSkills: 8,\n maxOwnedWorkProjects: 3,\n maxAssociatedWorkProjects: 10,\n },\n workProject: {\n maxGuildSize: 25,\n maxFileFolders: 10,\n maxWorkFiles: 100,\n maxWorkFileStorageBytes: 2_684_354_560, // 2.5 GiB\n maxWorkProjectAuditions: 3,\n maxCommissionListings: 3,\n maxChapters: 5,\n // ~5,000 words — a full real chapter, while keeping the human threshold-review\n // reading effort per item bounded during charter season.\n maxChapterContentLength: 30_000,\n maxTuneTracks: 5,\n maxTelevisionEpisodes: 3,\n },\n // Conversation Files are QUOTA'D PER CONVERSATION (DJ ruling 2026-07-25). Counted on\n // STORED OUTPUT bytes (what actually sits in R2 after transcode), never on raw upload\n // bytes. Rationale: a per-file `maxBytes` cap alone bounds one upload but nothing stops\n // unbounded accumulation across a long-running conversation — this is the abuse brake\n // on that, and it is what `startUpload`'s reservation and the publication transfer both\n // check. Charter: 10 files / 500 MiB per conversation.\n conversation: {\n maxConversationFiles: 10,\n maxConversationFileStorageBytes: 524_288_000, // 500 MiB\n },\n hall: { maxSubmitBatch: 10 },\n batches: { trendingFeedProcessLimit: 250, maxFeedbackSubmitters: 25 },\n rateLimits: {\n // Uploads are charged ONCE per upload (in startUpload); the processor-side\n // check is a non-charging guard.\n UPLOAD: { maxRequests: 15, window: '1 h' },\n // A separate HIGHER bucket for uploads performed through the sanctioned admin\n // authority path — never an exemption. Bulk admin setup work (creating 3\n // auditions is ~5 uploads) exhausts the 15/h user bucket; 60/h covers a real\n // bulk admin session while keeping a brake on a compromised admin token and on\n // third-party quota/cost (Vision / Video Intelligence / R2). DJ ruling 2026-07-25.\n ADMIN_UPLOAD: { maxRequests: 60, window: '1 h' },\n // General content-write throttle for the non-upload write callables (text posts,\n // craft-skill edits, support-thread starts) that used to charge UPLOAD. Sharing\n // the 15/h charter upload window meant heavy text posting blocked real uploads\n // and vice versa; a separate 30/h bucket keeps each cost driver on its own\n // ceiling. DJ ruling 2026-07-25.\n CONTENT_WRITE: { maxRequests: 30, window: '1 h' },\n VOTE: { maxRequests: 100, window: '1 h' },\n MODERATION: { maxRequests: 50, window: '1 h' },\n // 30/h: one bucket is shared by ~35 callables (register, become-artisan,\n // create-work, invites, trades, appeals, …) — a real first-hour artisan does\n // 10-15 legitimate sensitive actions; 5/h blocked the intended golden path\n // (proven live by the hosted-dev E2E, 2026-07-07). DJ ruling 2026-07-08.\n SENSITIVE_ACTION: { maxRequests: 30, window: '1 h' },\n // 120/h (charter): checkDisplayNameAvailable is enforceAppCheck:true, so\n // reCAPTCHA-Enterprise attestation is the real abuse gate — this bucket is a\n // cost/DoS ceiling, not the security boundary. It is IP-keyed (pre-registration,\n // no uid yet) and the register form fires it debounced-LIVE as you type, so one\n // legit registrant spends ~3-8 checks and shared NAT/CGNAT multiplies that across\n // everyone on the IP. The old 20/h false-rejected legitimate shared-IP users and\n // could not fit a full hosted-dev E2E suite run on one IP. DJ ruling 2026-07-21.\n DISPLAY_NAME_CHECK: { maxRequests: 120, window: '1 h' },\n CHAT_MESSAGE: { maxRequests: 125, window: '1 h' },\n ADMIN_TASK: { maxRequests: 60, window: '1 h' },\n APPEAL_REVIEW: { maxRequests: 30, window: '1 h' },\n BAN_ACTION: { maxRequests: 20, window: '1 h' },\n SHARE_TRANSFER: { maxRequests: 10, window: '1 h' },\n CONTENT_REPORT: { maxRequests: 5, window: '1 h' },\n SHORT_LINK_CLICK: { maxRequests: 60, window: '1 h' },\n FOLLOW: { maxRequests: 20, window: '1 m' },\n MENTION_HISTORY: { maxRequests: 120, window: '1 h' },\n // Scoped-media grant minting (createMediaGrant). Its OWN bucket — it used to charge\n // MENTION_HISTORY, an unrelated surface, so neither limit meant what its name said and the\n // two shared a budget sized for neither (BACKEND-013). Refresh-driven, not user-initiated:\n // a grant is short-TTL (60 min work media, 15 min chat/folder scopes) and the client re-mints\n // under expiry, so a browsing session naturally spends several per hour PER SCOPE (each work,\n // each private file folder, each conversation). Cheap to serve (a Firestore permission read\n // plus an HMAC sign — no third-party cost), and a false 429 breaks media rendering outright,\n // so the ceiling is generous: it exists to stop a scripted grant-farming sweep, not to pace a\n // real reader. 120/h charter.\n MEDIA_GRANT: { maxRequests: 120, window: '1 h' },\n // Realtime chat grant minting (mintChatGrant) — previously NO limiter at all (BACKEND-013),\n // despite minting signed grants at concurrency: 20. Same refresh-driven shape as MEDIA_GRANT:\n // a 15-minute grant TTL means ~4 mints/hour for the inbox plus ~4 per open channel, doubled\n // again by socket reconnects on a flaky mobile network. It stays behind the per-channel\n // authorizeChannelScope gate, so this bucket is a cost/DoS ceiling rather than the\n // authorization boundary — sized to match MEDIA_GRANT so the two grant surfaces are paced\n // alike and neither can be starved by the other (separate Redis prefixes).\n CHAT_GRANT: { maxRequests: 120, window: '1 h' },\n // Operator step-up TOTP verification (confirmOperatorStepUp / verifyOperatorStepUp) —\n // previously unthrottled, so an attacker holding a stolen full-admin session could\n // brute-force the 6-digit second factor guarding the safety console (BACKEND-013).\n // DELIBERATELY THE TIGHTEST BUCKET IN THE SET: a real operator enrolls once and verifies\n // roughly twice an hour (the grant window is 30 minutes), so 10/h absorbs every legitimate\n // mistype while capping guessing at 10 attempts per hour against a code that rotates every\n // 30 seconds. Mode-INVARIANT — this is an admin security control, not a cost driver, so it\n // never loosens at the full-mode flip (same posture as MODERATION / BAN_ACTION / USER_LOOKUP).\n // The lockout-after-N-failures behaviour is a separate app-side concern; this is the throttle.\n OPERATOR_STEP_UP: { maxRequests: 10, window: '1 h' },\n ADMIN_MESSAGE_READ: { maxRequests: 60, window: '1 h' },\n // Admin exact-account lookup (searchPublicUsers / lookupUserByEmailOrUid) — a read, so a\n // generous per-minute bucket that still backstops a scripted enumeration sweep. Admin-only\n // and not a cost driver, so the value is the same in both modes (like MODERATION/ADMIN_TASK).\n USER_LOOKUP: { maxRequests: 30, window: '1 m' },\n NOTIFICATION_BROADCAST: { maxRequests: 10, window: '1 h' },\n NOTIFICATION_ARCHIVE: { maxRequests: 120, window: '1 h' },\n NOTIFICATION_MARK_SEEN: { maxRequests: 120, window: '1 h' },\n FEEDBACK: { maxRequests: 10, window: '1 h' },\n SHORT_LINK_CREATE: { maxRequests: 30, window: '1 h' },\n INVITE_ACTION: { maxRequests: 30, window: '1 h' },\n LIBRARY_SUBMISSION: { maxRequests: 10, window: '1 h' },\n CHANNEL_CREATE: { maxRequests: 5, window: '1 h' },\n CHECKOUT_CREATE: { maxRequests: 5, window: '1 h' },\n // The registration age step, keyed per hashed client IP (pre-account, no uid). One call per\n // attempt — a corrected date or a retry at most doubles it — so 30/h gives one IP the same\n // registrants per hour as DISPLAY_NAME_CHECK's 120/h at its 3–8 debounced checks each, while a\n // script minting age-attestation records gets far less headroom.\n AGE_ATTEST: { maxRequests: 30, window: '1 h' },\n // A member's own Hall settings, ink marks, hidden Works, reading position, and recently viewed\n // list. Reading position and recently viewed are written as the member reads, so the bucket is\n // sized like NOTIFICATION_MARK_SEEN, the other passive per-member write.\n HALL_PREFERENCE: { maxRequests: 120, window: '1 h' },\n // An admin's approve or deny of a refund request. Admin-only, so mode-invariant like\n // APPEAL_REVIEW, the other admin decision on a member's request.\n REFUND_DECISION: { maxRequests: 30, window: '1 h' },\n },\n};\n\nexport const FULL_LIMITS: TttLimits = {\n mode: 'full',\n user: {\n maxCraftSkills: 24,\n maxOwnedWorkProjects: 25,\n maxAssociatedWorkProjects: 100,\n },\n workProject: {\n maxGuildSize: 250,\n maxFileFolders: 25,\n maxWorkFiles: 1000,\n maxWorkFileStorageBytes: 26_843_545_600, // 25 GiB\n maxWorkProjectAuditions: 10,\n maxCommissionListings: 10,\n maxChapters: 50,\n // The intentional design ceiling (~17,000 words; trivially inside Firestore's\n // 1 MiB doc limit) — the audit trail deliberately stores field LENGTHS, not\n // content, because chapters can be this large (runUpdateChapterDetails).\n maxChapterContentLength: 100_000,\n maxTuneTracks: 50,\n maxTelevisionEpisodes: 25,\n },\n // 20 files / 1 GiB (full): the same per-conversation Conversation Files quota as\n // charter, scaled for a public-launch conversation. Still a hard ceiling on\n // unbounded R2 accumulation. See the CHARTER_LIMITS note above. DJ ruling 2026-07-25.\n conversation: {\n maxConversationFiles: 20,\n maxConversationFileStorageBytes: 1_073_741_824, // 1 GiB\n },\n hall: { maxSubmitBatch: 50 },\n batches: { trendingFeedProcessLimit: 1000, maxFeedbackSubmitters: 100 },\n rateLimits: {\n UPLOAD: { maxRequests: 30, window: '1 h' },\n // 120/h (full): the same sanctioned-admin-path upload bucket as charter, scaled\n // with UPLOAD — always HIGHER than the user bucket, never an exemption, so a\n // compromised admin token and third-party media cost stay bounded. See the\n // CHARTER_LIMITS note above. DJ ruling 2026-07-25.\n ADMIN_UPLOAD: { maxRequests: 120, window: '1 h' },\n // 60/h (full): the same non-upload content-write bucket as charter, scaled with\n // UPLOAD so text writes and media uploads never consume each other's ceiling.\n // See the CHARTER_LIMITS note above. DJ ruling 2026-07-25.\n CONTENT_WRITE: { maxRequests: 60, window: '1 h' },\n VOTE: { maxRequests: 200, window: '1 h' },\n MODERATION: { maxRequests: 50, window: '1 h' },\n // 60/h: full-mode power users managing several works do dozens of legitimate\n // management actions per hour; still a hard backstop against scripts.\n // DJ ruling 2026-07-08 (charter 30 / full 60, single bucket; a bucket split\n // is filed post-launch in ttt-prod docs/post-launch/).\n SENSITIVE_ACTION: { maxRequests: 60, window: '1 h' },\n // 300/h (full): same reasoning as the charter value above (App-Check-gated\n // cost ceiling, IP-keyed, debounced-live). Public-launch CGNAT exposure is far\n // larger — hundreds of concurrent legit registrants can sit behind one carrier\n // IP — so err generous; the only cost of \"too high\" is trivial Firestore reads,\n // while \"too low\" false-rejects real users. Raise on evidence (watch prod logs\n // for legit 429s) rather than pre-emptively tightening. DJ ruling 2026-07-21.\n DISPLAY_NAME_CHECK: { maxRequests: 300, window: '1 h' },\n CHAT_MESSAGE: { maxRequests: 150, window: '1 h' },\n ADMIN_TASK: { maxRequests: 60, window: '1 h' },\n APPEAL_REVIEW: { maxRequests: 30, window: '1 h' },\n BAN_ACTION: { maxRequests: 20, window: '1 h' },\n SHARE_TRANSFER: { maxRequests: 10, window: '1 h' },\n CONTENT_REPORT: { maxRequests: 20, window: '1 h' },\n SHORT_LINK_CLICK: { maxRequests: 60, window: '1 h' },\n FOLLOW: { maxRequests: 60, window: '1 m' },\n MENTION_HISTORY: { maxRequests: 120, window: '1 h' },\n // 240/h (full): the same grant-minting buckets as charter, doubled with the surrounding\n // content limits. Full mode raises the ceilings a grant is minted PER (250-guildmate guilds,\n // 25 file folders, 1000 work files, 10 auditions), so one session legitimately touches more\n // scopes and re-mints more often. See the CHARTER_LIMITS notes above.\n MEDIA_GRANT: { maxRequests: 240, window: '1 h' },\n CHAT_GRANT: { maxRequests: 240, window: '1 h' },\n // Operator step-up stays at 10/h in BOTH modes — an admin second-factor throttle is a\n // security control, not a cost lever, so it never loosens at the flip. See CHARTER_LIMITS.\n OPERATOR_STEP_UP: { maxRequests: 10, window: '1 h' },\n ADMIN_MESSAGE_READ: { maxRequests: 60, window: '1 h' },\n // Admin exact-account lookup — same read bucket in both modes (see CHARTER_LIMITS note).\n USER_LOOKUP: { maxRequests: 30, window: '1 m' },\n NOTIFICATION_BROADCAST: { maxRequests: 10, window: '1 h' },\n NOTIFICATION_ARCHIVE: { maxRequests: 120, window: '1 h' },\n NOTIFICATION_MARK_SEEN: { maxRequests: 120, window: '1 h' },\n FEEDBACK: { maxRequests: 10, window: '1 h' },\n SHORT_LINK_CREATE: { maxRequests: 30, window: '1 h' },\n INVITE_ACTION: { maxRequests: 60, window: '1 h' },\n LIBRARY_SUBMISSION: { maxRequests: 20, window: '1 h' },\n CHANNEL_CREATE: { maxRequests: 20, window: '1 h' },\n CHECKOUT_CREATE: { maxRequests: 20, window: '1 h' },\n // Scaled with DISPLAY_NAME_CHECK's full-mode 300/h — see the CHARTER_LIMITS note.\n AGE_ATTEST: { maxRequests: 75, window: '1 h' },\n // Both stay at their charter values — see the CHARTER_LIMITS notes.\n HALL_PREFERENCE: { maxRequests: 120, window: '1 h' },\n REFUND_DECISION: { maxRequests: 30, window: '1 h' },\n },\n};\n\n/** The resolved limit set for the deployed mode. Import THIS (or the alias\n * constants that re-export from it), never CHARTER_/FULL_ directly. A read bound\n * that must hold whichever mode the data was written under uses\n * HALL_SUB_ITEM_READ_BOUND_BY_WORK_TYPE below instead. */\nexport const ACTIVE_LIMITS: TttLimits = byMode(CHARTER_LIMITS, FULL_LIMITS);\n\nconst largestInAnyMode = (pick: (limits: TttLimits) => number): number =>\n Math.max(pick(CHARTER_LIMITS), pick(FULL_LIMITS));\n\n/**\n * The most sub-items one Hall item can hold of each kind (Tale chapters, Tune tracks, Television\n * episodes) in ANY app mode — each kind's count cap at its largest across CHARTER_LIMITS and\n * FULL_LIMITS. A READ bound, never an enforced limit: a Hall item keeps the sub-items it was\n * published with when the mode changes, so a reader that must see all of them sizes its query\n * from this and treats a read that returns more as uncertain. Enforcement reads the active caps\n * (MAX_CHAPTERS, MAX_TUNE_TRACKS, MAX_TELEVISION_EPISODES).\n */\nexport const HALL_SUB_ITEM_READ_BOUND_BY_WORK_TYPE: Readonly<Record<WorkProjectType, number>> = {\n Tales: largestInAnyMode((limits) => limits.workProject.maxChapters),\n Tunes: largestInAnyMode((limits) => limits.workProject.maxTuneTracks),\n Television: largestInAnyMode((limits) => limits.workProject.maxTelevisionEpisodes),\n};\n\n/**\n * User-facing copy for a reached count cap — the ONE owner of the cap-message\n * shape, beside the limits it describes. Every callable refusing on a\n * mode-varied count cap formats through this. In charter mode the message\n * names Charter Season so the cap reads as the season's limit rather than the\n * platform's permanent shape; full mode stays neutral. `hint` is an optional\n * trailing sentence (e.g. \"Delete a file to add another.\").\n */\nexport const countCapReachedMessage = (\n subject: string,\n limit: number,\n noun: string,\n hint?: string,\n): string => {\n const base = byMode(\n `${subject} already has the Charter Season maximum of ${limit} ${noun} — caps expand when Charter Season ends.`,\n `${subject} already has the maximum of ${limit} ${noun}.`,\n );\n return hint ? `${base} ${hint}` : base;\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"}