@atproto/ozone 0.1.172 → 0.1.174

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 (450) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +40 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/moderation/emitEvent.d.ts.map +1 -1
  6. package/dist/api/moderation/emitEvent.js +31 -0
  7. package/dist/api/moderation/emitEvent.js.map +1 -1
  8. package/dist/api/queue/assignModerator.d.ts +4 -0
  9. package/dist/api/queue/assignModerator.d.ts.map +1 -0
  10. package/dist/api/queue/assignModerator.js +28 -0
  11. package/dist/api/queue/assignModerator.js.map +1 -0
  12. package/dist/api/queue/createQueue.d.ts +4 -0
  13. package/dist/api/queue/createQueue.d.ts.map +1 -0
  14. package/dist/api/queue/createQueue.js +44 -0
  15. package/dist/api/queue/createQueue.js.map +1 -0
  16. package/dist/api/queue/deleteQueue.d.ts +4 -0
  17. package/dist/api/queue/deleteQueue.d.ts.map +1 -0
  18. package/dist/api/queue/deleteQueue.js +40 -0
  19. package/dist/api/queue/deleteQueue.js.map +1 -0
  20. package/dist/api/queue/getAssignments.d.ts +4 -0
  21. package/dist/api/queue/getAssignments.d.ts.map +1 -0
  22. package/dist/api/queue/getAssignments.js +19 -0
  23. package/dist/api/queue/getAssignments.js.map +1 -0
  24. package/dist/api/queue/listQueues.d.ts +4 -0
  25. package/dist/api/queue/listQueues.d.ts.map +1 -0
  26. package/dist/api/queue/listQueues.js +29 -0
  27. package/dist/api/queue/listQueues.js.map +1 -0
  28. package/dist/api/queue/routeReports.d.ts +4 -0
  29. package/dist/api/queue/routeReports.d.ts.map +1 -0
  30. package/dist/api/queue/routeReports.js +33 -0
  31. package/dist/api/queue/routeReports.js.map +1 -0
  32. package/dist/api/queue/unassignModerator.d.ts +4 -0
  33. package/dist/api/queue/unassignModerator.d.ts.map +1 -0
  34. package/dist/api/queue/unassignModerator.js +24 -0
  35. package/dist/api/queue/unassignModerator.js.map +1 -0
  36. package/dist/api/queue/updateQueue.d.ts +4 -0
  37. package/dist/api/queue/updateQueue.d.ts.map +1 -0
  38. package/dist/api/queue/updateQueue.js +39 -0
  39. package/dist/api/queue/updateQueue.js.map +1 -0
  40. package/dist/api/report/assignModerator.d.ts +4 -0
  41. package/dist/api/report/assignModerator.d.ts.map +1 -0
  42. package/dist/api/report/assignModerator.js +33 -0
  43. package/dist/api/report/assignModerator.js.map +1 -0
  44. package/dist/api/report/createActivity.d.ts +4 -0
  45. package/dist/api/report/createActivity.d.ts.map +1 -0
  46. package/dist/api/report/createActivity.js +44 -0
  47. package/dist/api/report/createActivity.js.map +1 -0
  48. package/dist/api/report/getAssignments.d.ts +4 -0
  49. package/dist/api/report/getAssignments.d.ts.map +1 -0
  50. package/dist/api/report/getAssignments.js +19 -0
  51. package/dist/api/report/getAssignments.js.map +1 -0
  52. package/dist/api/report/getHistoricalStats.d.ts +4 -0
  53. package/dist/api/report/getHistoricalStats.d.ts.map +1 -0
  54. package/dist/api/report/getHistoricalStats.js +32 -0
  55. package/dist/api/report/getHistoricalStats.js.map +1 -0
  56. package/dist/api/report/getLatestReport.d.ts +4 -0
  57. package/dist/api/report/getLatestReport.d.ts.map +1 -0
  58. package/dist/api/report/getLatestReport.js +31 -0
  59. package/dist/api/report/getLatestReport.js.map +1 -0
  60. package/dist/api/report/getLiveStats.d.ts +4 -0
  61. package/dist/api/report/getLiveStats.d.ts.map +1 -0
  62. package/dist/api/report/getLiveStats.js +25 -0
  63. package/dist/api/report/getLiveStats.js.map +1 -0
  64. package/dist/api/report/getReport.d.ts +4 -0
  65. package/dist/api/report/getReport.d.ts.map +1 -0
  66. package/dist/api/report/getReport.js +35 -0
  67. package/dist/api/report/getReport.js.map +1 -0
  68. package/dist/api/report/listActivities.d.ts +4 -0
  69. package/dist/api/report/listActivities.d.ts.map +1 -0
  70. package/dist/api/report/listActivities.js +25 -0
  71. package/dist/api/report/listActivities.js.map +1 -0
  72. package/dist/api/report/queryReports.d.ts +4 -0
  73. package/dist/api/report/queryReports.d.ts.map +1 -0
  74. package/dist/api/report/queryReports.js +29 -0
  75. package/dist/api/report/queryReports.js.map +1 -0
  76. package/dist/api/report/reassignQueue.d.ts +4 -0
  77. package/dist/api/report/reassignQueue.d.ts.map +1 -0
  78. package/dist/api/report/reassignQueue.js +45 -0
  79. package/dist/api/report/reassignQueue.js.map +1 -0
  80. package/dist/api/report/refreshStats.d.ts +4 -0
  81. package/dist/api/report/refreshStats.d.ts.map +1 -0
  82. package/dist/api/report/refreshStats.js +26 -0
  83. package/dist/api/report/refreshStats.js.map +1 -0
  84. package/dist/api/report/unassignModerator.d.ts +4 -0
  85. package/dist/api/report/unassignModerator.d.ts.map +1 -0
  86. package/dist/api/report/unassignModerator.js +21 -0
  87. package/dist/api/report/unassignModerator.js.map +1 -0
  88. package/dist/api/util.d.ts +2 -0
  89. package/dist/api/util.d.ts.map +1 -1
  90. package/dist/api/util.js +9 -1
  91. package/dist/api/util.js.map +1 -1
  92. package/dist/assignment/index.d.ts +89 -0
  93. package/dist/assignment/index.d.ts.map +1 -0
  94. package/dist/assignment/index.js +537 -0
  95. package/dist/assignment/index.js.map +1 -0
  96. package/dist/config/config.d.ts +14 -0
  97. package/dist/config/config.d.ts.map +1 -1
  98. package/dist/config/config.js +9 -0
  99. package/dist/config/config.js.map +1 -1
  100. package/dist/config/env.d.ts +3 -0
  101. package/dist/config/env.d.ts.map +1 -1
  102. package/dist/config/env.js +3 -0
  103. package/dist/config/env.js.map +1 -1
  104. package/dist/context.d.ts +9 -0
  105. package/dist/context.d.ts.map +1 -1
  106. package/dist/context.js +31 -10
  107. package/dist/context.js.map +1 -1
  108. package/dist/daemon/context.d.ts +6 -0
  109. package/dist/daemon/context.d.ts.map +1 -1
  110. package/dist/daemon/context.js +28 -4
  111. package/dist/daemon/context.js.map +1 -1
  112. package/dist/daemon/event-reverser.d.ts +1 -0
  113. package/dist/daemon/event-reverser.d.ts.map +1 -1
  114. package/dist/daemon/event-reverser.js +42 -1
  115. package/dist/daemon/event-reverser.js.map +1 -1
  116. package/dist/daemon/job-cursor.d.ts +5 -0
  117. package/dist/daemon/job-cursor.d.ts.map +1 -0
  118. package/dist/daemon/job-cursor.js +28 -0
  119. package/dist/daemon/job-cursor.js.map +1 -0
  120. package/dist/daemon/queue-router.d.ts +17 -0
  121. package/dist/daemon/queue-router.d.ts.map +1 -0
  122. package/dist/daemon/queue-router.js +114 -0
  123. package/dist/daemon/queue-router.js.map +1 -0
  124. package/dist/daemon/stats-computer.d.ts +51 -0
  125. package/dist/daemon/stats-computer.d.ts.map +1 -0
  126. package/dist/daemon/stats-computer.js +117 -0
  127. package/dist/daemon/stats-computer.js.map +1 -0
  128. package/dist/daemon/strike-expiry-processor.d.ts.map +1 -1
  129. package/dist/daemon/strike-expiry-processor.js +4 -19
  130. package/dist/daemon/strike-expiry-processor.js.map +1 -1
  131. package/dist/db/migrations/20260219T164523000Z-create-report-table.d.ts +4 -0
  132. package/dist/db/migrations/20260219T164523000Z-create-report-table.d.ts.map +1 -0
  133. package/dist/db/migrations/20260219T164523000Z-create-report-table.js +126 -0
  134. package/dist/db/migrations/20260219T164523000Z-create-report-table.js.map +1 -0
  135. package/dist/db/migrations/20260219T165302248Z-moderator-assignment.d.ts +4 -0
  136. package/dist/db/migrations/20260219T165302248Z-moderator-assignment.d.ts.map +1 -0
  137. package/dist/db/migrations/20260219T165302248Z-moderator-assignment.js +35 -0
  138. package/dist/db/migrations/20260219T165302248Z-moderator-assignment.js.map +1 -0
  139. package/dist/db/migrations/20260225T000000000Z-add-report-queue-table.d.ts +4 -0
  140. package/dist/db/migrations/20260225T000000000Z-add-report-queue-table.d.ts.map +1 -0
  141. package/dist/db/migrations/20260225T000000000Z-add-report-queue-table.js +36 -0
  142. package/dist/db/migrations/20260225T000000000Z-add-report-queue-table.js.map +1 -0
  143. package/dist/db/migrations/20260313T000000000Z-add-report-activity-table.d.ts +4 -0
  144. package/dist/db/migrations/20260313T000000000Z-add-report-activity-table.d.ts.map +1 -0
  145. package/dist/db/migrations/20260313T000000000Z-add-report-activity-table.js +39 -0
  146. package/dist/db/migrations/20260313T000000000Z-add-report-activity-table.js.map +1 -0
  147. package/dist/db/migrations/20260318T152058935Z-add-report-stat.d.ts +4 -0
  148. package/dist/db/migrations/20260318T152058935Z-add-report-stat.d.ts.map +1 -0
  149. package/dist/db/migrations/20260318T152058935Z-add-report-stat.js +34 -0
  150. package/dist/db/migrations/20260318T152058935Z-add-report-stat.js.map +1 -0
  151. package/dist/db/migrations/20260428T000000000Z-add-expiring-tag-table.d.ts +4 -0
  152. package/dist/db/migrations/20260428T000000000Z-add-expiring-tag-table.d.ts.map +1 -0
  153. package/dist/db/migrations/20260428T000000000Z-add-expiring-tag-table.js +32 -0
  154. package/dist/db/migrations/20260428T000000000Z-add-expiring-tag-table.js.map +1 -0
  155. package/dist/db/migrations/index.d.ts +6 -0
  156. package/dist/db/migrations/index.d.ts.map +1 -1
  157. package/dist/db/migrations/index.js +7 -1
  158. package/dist/db/migrations/index.js.map +1 -1
  159. package/dist/db/pagination.d.ts +31 -0
  160. package/dist/db/pagination.d.ts.map +1 -1
  161. package/dist/db/pagination.js +74 -1
  162. package/dist/db/pagination.js.map +1 -1
  163. package/dist/db/schema/expiring_tag.d.ts +15 -0
  164. package/dist/db/schema/expiring_tag.d.ts.map +1 -0
  165. package/dist/db/schema/expiring_tag.js +5 -0
  166. package/dist/db/schema/expiring_tag.js.map +1 -0
  167. package/dist/db/schema/index.d.ts +7 -1
  168. package/dist/db/schema/index.d.ts.map +1 -1
  169. package/dist/db/schema/index.js.map +1 -1
  170. package/dist/db/schema/moderator_assignment.d.ts +14 -0
  171. package/dist/db/schema/moderator_assignment.d.ts.map +1 -0
  172. package/dist/db/schema/moderator_assignment.js +5 -0
  173. package/dist/db/schema/moderator_assignment.js.map +1 -0
  174. package/dist/db/schema/report.d.ts +25 -0
  175. package/dist/db/schema/report.d.ts.map +1 -0
  176. package/dist/db/schema/report.js +5 -0
  177. package/dist/db/schema/report.js.map +1 -0
  178. package/dist/db/schema/report_activity.d.ts +18 -0
  179. package/dist/db/schema/report_activity.d.ts.map +1 -0
  180. package/dist/db/schema/report_activity.js +5 -0
  181. package/dist/db/schema/report_activity.js.map +1 -0
  182. package/dist/db/schema/report_queue.d.ts +19 -0
  183. package/dist/db/schema/report_queue.d.ts.map +1 -0
  184. package/dist/db/schema/report_queue.js +5 -0
  185. package/dist/db/schema/report_queue.js.map +1 -0
  186. package/dist/db/schema/report_stat.d.ts +20 -0
  187. package/dist/db/schema/report_stat.d.ts.map +1 -0
  188. package/dist/db/schema/report_stat.js +5 -0
  189. package/dist/db/schema/report_stat.js.map +1 -0
  190. package/dist/lexicon/index.d.ts +50 -0
  191. package/dist/lexicon/index.d.ts.map +1 -1
  192. package/dist/lexicon/index.js +120 -2
  193. package/dist/lexicon/index.js.map +1 -1
  194. package/dist/lexicon/lexicons.d.ts +11255 -7885
  195. package/dist/lexicon/lexicons.d.ts.map +1 -1
  196. package/dist/lexicon/lexicons.js +1900 -120
  197. package/dist/lexicon/lexicons.js.map +1 -1
  198. package/dist/lexicon/types/app/bsky/embed/external.d.ts +2 -0
  199. package/dist/lexicon/types/app/bsky/embed/external.d.ts.map +1 -1
  200. package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
  201. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts +8 -2
  202. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts.map +1 -1
  203. package/dist/lexicon/types/chat/bsky/actor/defs.js +9 -0
  204. package/dist/lexicon/types/chat/bsky/actor/defs.js.map +1 -1
  205. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +37 -10
  206. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -1
  207. package/dist/lexicon/types/chat/bsky/convo/defs.js +9 -0
  208. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  209. package/dist/lexicon/types/chat/bsky/convo/getMessages.d.ts +3 -0
  210. package/dist/lexicon/types/chat/bsky/convo/getMessages.d.ts.map +1 -1
  211. package/dist/lexicon/types/chat/bsky/convo/getMessages.js.map +1 -1
  212. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +2 -0
  213. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  214. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  215. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts +19 -0
  216. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts.map +1 -1
  217. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js +9 -0
  218. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js.map +1 -1
  219. package/dist/lexicon/types/tools/ozone/queue/assignModerator.d.ts +27 -0
  220. package/dist/lexicon/types/tools/ozone/queue/assignModerator.d.ts.map +1 -0
  221. package/dist/lexicon/types/tools/ozone/queue/assignModerator.js +7 -0
  222. package/dist/lexicon/types/tools/ozone/queue/assignModerator.js.map +1 -0
  223. package/dist/lexicon/types/tools/ozone/queue/createQueue.d.ts +35 -0
  224. package/dist/lexicon/types/tools/ozone/queue/createQueue.d.ts.map +1 -0
  225. package/dist/lexicon/types/tools/ozone/queue/createQueue.js +7 -0
  226. package/dist/lexicon/types/tools/ozone/queue/createQueue.js.map +1 -0
  227. package/dist/lexicon/types/tools/ozone/queue/defs.d.ts +62 -0
  228. package/dist/lexicon/types/tools/ozone/queue/defs.d.ts.map +1 -0
  229. package/dist/lexicon/types/tools/ozone/queue/defs.js +34 -0
  230. package/dist/lexicon/types/tools/ozone/queue/defs.js.map +1 -0
  231. package/dist/lexicon/types/tools/ozone/queue/deleteQueue.d.ts +29 -0
  232. package/dist/lexicon/types/tools/ozone/queue/deleteQueue.d.ts.map +1 -0
  233. package/dist/lexicon/types/tools/ozone/queue/deleteQueue.js +7 -0
  234. package/dist/lexicon/types/tools/ozone/queue/deleteQueue.js.map +1 -0
  235. package/dist/lexicon/types/tools/ozone/queue/getAssignments.d.ts +30 -0
  236. package/dist/lexicon/types/tools/ozone/queue/getAssignments.d.ts.map +1 -0
  237. package/dist/lexicon/types/tools/ozone/queue/getAssignments.js +7 -0
  238. package/dist/lexicon/types/tools/ozone/queue/getAssignments.js.map +1 -0
  239. package/dist/lexicon/types/tools/ozone/queue/listQueues.d.ts +32 -0
  240. package/dist/lexicon/types/tools/ozone/queue/listQueues.d.ts.map +1 -0
  241. package/dist/lexicon/types/tools/ozone/queue/listQueues.js +7 -0
  242. package/dist/lexicon/types/tools/ozone/queue/listQueues.js.map +1 -0
  243. package/dist/lexicon/types/tools/ozone/queue/routeReports.d.ts +31 -0
  244. package/dist/lexicon/types/tools/ozone/queue/routeReports.d.ts.map +1 -0
  245. package/dist/lexicon/types/tools/ozone/queue/routeReports.js +7 -0
  246. package/dist/lexicon/types/tools/ozone/queue/routeReports.js.map +1 -0
  247. package/dist/lexicon/types/tools/ozone/queue/unassignModerator.d.ts +18 -0
  248. package/dist/lexicon/types/tools/ozone/queue/unassignModerator.d.ts.map +1 -0
  249. package/dist/lexicon/types/tools/ozone/queue/unassignModerator.js +7 -0
  250. package/dist/lexicon/types/tools/ozone/queue/unassignModerator.js.map +1 -0
  251. package/dist/lexicon/types/tools/ozone/queue/updateQueue.d.ts +32 -0
  252. package/dist/lexicon/types/tools/ozone/queue/updateQueue.d.ts.map +1 -0
  253. package/dist/lexicon/types/tools/ozone/queue/updateQueue.js +7 -0
  254. package/dist/lexicon/types/tools/ozone/queue/updateQueue.js.map +1 -0
  255. package/dist/lexicon/types/tools/ozone/report/assignModerator.d.ts +31 -0
  256. package/dist/lexicon/types/tools/ozone/report/assignModerator.d.ts.map +1 -0
  257. package/dist/lexicon/types/tools/ozone/report/assignModerator.js +7 -0
  258. package/dist/lexicon/types/tools/ozone/report/assignModerator.js.map +1 -0
  259. package/dist/lexicon/types/tools/ozone/report/createActivity.d.ts +37 -0
  260. package/dist/lexicon/types/tools/ozone/report/createActivity.d.ts.map +1 -0
  261. package/dist/lexicon/types/tools/ozone/report/createActivity.js +7 -0
  262. package/dist/lexicon/types/tools/ozone/report/createActivity.js.map +1 -0
  263. package/dist/lexicon/types/tools/ozone/report/defs.d.ts +185 -0
  264. package/dist/lexicon/types/tools/ozone/report/defs.d.ts.map +1 -1
  265. package/dist/lexicon/types/tools/ozone/report/defs.js +108 -0
  266. package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
  267. package/dist/lexicon/types/tools/ozone/report/getAssignments.d.ts +30 -0
  268. package/dist/lexicon/types/tools/ozone/report/getAssignments.d.ts.map +1 -0
  269. package/dist/lexicon/types/tools/ozone/report/getAssignments.js +7 -0
  270. package/dist/lexicon/types/tools/ozone/report/getAssignments.js.map +1 -0
  271. package/dist/lexicon/types/tools/ozone/report/getHistoricalStats.d.ts +36 -0
  272. package/dist/lexicon/types/tools/ozone/report/getHistoricalStats.d.ts.map +1 -0
  273. package/dist/lexicon/types/tools/ozone/report/getHistoricalStats.js +7 -0
  274. package/dist/lexicon/types/tools/ozone/report/getHistoricalStats.js.map +1 -0
  275. package/dist/lexicon/types/tools/ozone/report/getLatestReport.d.ts +21 -0
  276. package/dist/lexicon/types/tools/ozone/report/getLatestReport.d.ts.map +1 -0
  277. package/dist/lexicon/types/tools/ozone/report/getLatestReport.js +7 -0
  278. package/dist/lexicon/types/tools/ozone/report/getLatestReport.js.map +1 -0
  279. package/dist/lexicon/types/tools/ozone/report/getLiveStats.d.ts +27 -0
  280. package/dist/lexicon/types/tools/ozone/report/getLiveStats.d.ts.map +1 -0
  281. package/dist/lexicon/types/tools/ozone/report/getLiveStats.js +7 -0
  282. package/dist/lexicon/types/tools/ozone/report/getLiveStats.js.map +1 -0
  283. package/dist/lexicon/types/tools/ozone/report/getReport.d.ts +22 -0
  284. package/dist/lexicon/types/tools/ozone/report/getReport.d.ts.map +1 -0
  285. package/dist/lexicon/types/tools/ozone/report/getReport.js +7 -0
  286. package/dist/lexicon/types/tools/ozone/report/getReport.js.map +1 -0
  287. package/dist/lexicon/types/tools/ozone/report/listActivities.d.ts +26 -0
  288. package/dist/lexicon/types/tools/ozone/report/listActivities.d.ts.map +1 -0
  289. package/dist/lexicon/types/tools/ozone/report/listActivities.js +7 -0
  290. package/dist/lexicon/types/tools/ozone/report/listActivities.js.map +1 -0
  291. package/dist/lexicon/types/tools/ozone/report/queryReports.d.ts +48 -0
  292. package/dist/lexicon/types/tools/ozone/report/queryReports.d.ts.map +1 -0
  293. package/dist/lexicon/types/tools/ozone/report/queryReports.js +7 -0
  294. package/dist/lexicon/types/tools/ozone/report/queryReports.js.map +1 -0
  295. package/dist/lexicon/types/tools/ozone/report/reassignQueue.d.ts +31 -0
  296. package/dist/lexicon/types/tools/ozone/report/reassignQueue.d.ts.map +1 -0
  297. package/dist/lexicon/types/tools/ozone/report/reassignQueue.js +7 -0
  298. package/dist/lexicon/types/tools/ozone/report/reassignQueue.js.map +1 -0
  299. package/dist/lexicon/types/tools/ozone/report/refreshStats.d.ts +28 -0
  300. package/dist/lexicon/types/tools/ozone/report/refreshStats.d.ts.map +1 -0
  301. package/dist/lexicon/types/tools/ozone/report/refreshStats.js +7 -0
  302. package/dist/lexicon/types/tools/ozone/report/refreshStats.js.map +1 -0
  303. package/dist/lexicon/types/tools/ozone/report/unassignModerator.d.ts +25 -0
  304. package/dist/lexicon/types/tools/ozone/report/unassignModerator.d.ts.map +1 -0
  305. package/dist/lexicon/types/tools/ozone/report/unassignModerator.js +7 -0
  306. package/dist/lexicon/types/tools/ozone/report/unassignModerator.js.map +1 -0
  307. package/dist/mod-service/expiring-tags.d.ts +27 -0
  308. package/dist/mod-service/expiring-tags.d.ts.map +1 -0
  309. package/dist/mod-service/expiring-tags.js +62 -0
  310. package/dist/mod-service/expiring-tags.js.map +1 -0
  311. package/dist/mod-service/index.d.ts +3 -1
  312. package/dist/mod-service/index.d.ts.map +1 -1
  313. package/dist/mod-service/index.js +61 -2
  314. package/dist/mod-service/index.js.map +1 -1
  315. package/dist/mod-service/report.d.ts +64 -0
  316. package/dist/mod-service/report.d.ts.map +1 -0
  317. package/dist/mod-service/report.js +282 -0
  318. package/dist/mod-service/report.js.map +1 -0
  319. package/dist/mod-service/status.d.ts +24 -0
  320. package/dist/mod-service/status.d.ts.map +1 -1
  321. package/dist/queue/service.d.ts +86 -0
  322. package/dist/queue/service.d.ts.map +1 -0
  323. package/dist/queue/service.js +430 -0
  324. package/dist/queue/service.js.map +1 -0
  325. package/dist/report/activity.d.ts +77 -0
  326. package/dist/report/activity.d.ts.map +1 -0
  327. package/dist/report/activity.js +141 -0
  328. package/dist/report/activity.js.map +1 -0
  329. package/dist/report/handle-report-update.d.ts +47 -0
  330. package/dist/report/handle-report-update.d.ts.map +1 -0
  331. package/dist/report/handle-report-update.js +178 -0
  332. package/dist/report/handle-report-update.js.map +1 -0
  333. package/dist/report/reassign.d.ts +10 -0
  334. package/dist/report/reassign.d.ts.map +1 -0
  335. package/dist/report/reassign.js +75 -0
  336. package/dist/report/reassign.js.map +1 -0
  337. package/dist/report/stats.d.ts +105 -0
  338. package/dist/report/stats.d.ts.map +1 -0
  339. package/dist/report/stats.js +619 -0
  340. package/dist/report/stats.js.map +1 -0
  341. package/dist/report/views.d.ts +111 -0
  342. package/dist/report/views.d.ts.map +1 -0
  343. package/dist/report/views.js +156 -0
  344. package/dist/report/views.js.map +1 -0
  345. package/dist/team/index.d.ts +1 -0
  346. package/dist/team/index.d.ts.map +1 -1
  347. package/dist/team/index.js +11 -0
  348. package/dist/team/index.js.map +1 -1
  349. package/package.json +3 -3
  350. package/src/api/index.ts +40 -0
  351. package/src/api/moderation/emitEvent.ts +38 -0
  352. package/src/api/queue/assignModerator.ts +31 -0
  353. package/src/api/queue/createQueue.ts +62 -0
  354. package/src/api/queue/deleteQueue.ts +56 -0
  355. package/src/api/queue/getAssignments.ts +19 -0
  356. package/src/api/queue/listQueues.ts +39 -0
  357. package/src/api/queue/routeReports.ts +44 -0
  358. package/src/api/queue/unassignModerator.ts +26 -0
  359. package/src/api/queue/updateQueue.ts +54 -0
  360. package/src/api/report/assignModerator.ts +36 -0
  361. package/src/api/report/createActivity.ts +57 -0
  362. package/src/api/report/getAssignments.ts +20 -0
  363. package/src/api/report/getHistoricalStats.ts +41 -0
  364. package/src/api/report/getLatestReport.ts +44 -0
  365. package/src/api/report/getLiveStats.ts +26 -0
  366. package/src/api/report/getReport.ts +55 -0
  367. package/src/api/report/listActivities.ts +34 -0
  368. package/src/api/report/queryReports.ts +44 -0
  369. package/src/api/report/reassignQueue.ts +68 -0
  370. package/src/api/report/refreshStats.ts +27 -0
  371. package/src/api/report/unassignModerator.ts +21 -0
  372. package/src/api/util.ts +12 -0
  373. package/src/assignment/index.ts +731 -0
  374. package/src/config/config.ts +27 -0
  375. package/src/config/env.ts +8 -0
  376. package/src/context.ts +31 -0
  377. package/src/daemon/context.ts +34 -0
  378. package/src/daemon/event-reverser.ts +50 -1
  379. package/src/daemon/job-cursor.ts +33 -0
  380. package/src/daemon/queue-router.ts +101 -0
  381. package/src/daemon/stats-computer.ts +101 -0
  382. package/src/daemon/strike-expiry-processor.ts +4 -20
  383. package/src/db/migrations/20260219T164523000Z-create-report-table.ts +155 -0
  384. package/src/db/migrations/20260219T165302248Z-moderator-assignment.ts +42 -0
  385. package/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts +41 -0
  386. package/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts +48 -0
  387. package/src/db/migrations/20260318T152058935Z-add-report-stat.ts +35 -0
  388. package/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts +32 -0
  389. package/src/db/migrations/index.ts +6 -0
  390. package/src/db/pagination.ts +85 -0
  391. package/src/db/schema/expiring_tag.ts +17 -0
  392. package/src/db/schema/index.ts +13 -1
  393. package/src/db/schema/moderator_assignment.ts +16 -0
  394. package/src/db/schema/report.ts +27 -0
  395. package/src/db/schema/report_activity.ts +22 -0
  396. package/src/db/schema/report_queue.ts +21 -0
  397. package/src/db/schema/report_stat.ts +27 -0
  398. package/src/lexicon/index.ts +280 -0
  399. package/src/lexicon/lexicons.ts +2083 -214
  400. package/src/lexicon/types/app/bsky/embed/external.ts +2 -0
  401. package/src/lexicon/types/chat/bsky/actor/defs.ts +17 -1
  402. package/src/lexicon/types/chat/bsky/convo/defs.ts +50 -10
  403. package/src/lexicon/types/chat/bsky/convo/getMessages.ts +3 -0
  404. package/src/lexicon/types/tools/ozone/moderation/defs.ts +2 -0
  405. package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +24 -0
  406. package/src/lexicon/types/tools/ozone/queue/assignModerator.ts +46 -0
  407. package/src/lexicon/types/tools/ozone/queue/createQueue.ts +54 -0
  408. package/src/lexicon/types/tools/ozone/queue/defs.ts +99 -0
  409. package/src/lexicon/types/tools/ozone/queue/deleteQueue.ts +48 -0
  410. package/src/lexicon/types/tools/ozone/queue/getAssignments.ts +48 -0
  411. package/src/lexicon/types/tools/ozone/queue/listQueues.ts +50 -0
  412. package/src/lexicon/types/tools/ozone/queue/routeReports.ts +50 -0
  413. package/src/lexicon/types/tools/ozone/queue/unassignModerator.ts +37 -0
  414. package/src/lexicon/types/tools/ozone/queue/updateQueue.ts +51 -0
  415. package/src/lexicon/types/tools/ozone/report/assignModerator.ts +50 -0
  416. package/src/lexicon/types/tools/ozone/report/createActivity.ts +60 -0
  417. package/src/lexicon/types/tools/ozone/report/defs.ts +327 -0
  418. package/src/lexicon/types/tools/ozone/report/getAssignments.ts +48 -0
  419. package/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts +54 -0
  420. package/src/lexicon/types/tools/ozone/report/getLatestReport.ts +39 -0
  421. package/src/lexicon/types/tools/ozone/report/getLiveStats.ts +45 -0
  422. package/src/lexicon/types/tools/ozone/report/getReport.ts +38 -0
  423. package/src/lexicon/types/tools/ozone/report/listActivities.ts +44 -0
  424. package/src/lexicon/types/tools/ozone/report/queryReports.ts +72 -0
  425. package/src/lexicon/types/tools/ozone/report/reassignQueue.ts +55 -0
  426. package/src/lexicon/types/tools/ozone/report/refreshStats.ts +46 -0
  427. package/src/lexicon/types/tools/ozone/report/unassignModerator.ts +44 -0
  428. package/src/mod-service/expiring-tags.ts +98 -0
  429. package/src/mod-service/index.ts +71 -3
  430. package/src/mod-service/report.ts +408 -0
  431. package/src/queue/service.ts +599 -0
  432. package/src/report/activity.ts +234 -0
  433. package/src/report/handle-report-update.ts +209 -0
  434. package/src/report/reassign.ts +109 -0
  435. package/src/report/stats.ts +850 -0
  436. package/src/report/views.ts +241 -0
  437. package/src/team/index.ts +11 -0
  438. package/tests/expiring-tags.test.ts +231 -0
  439. package/tests/get-report.test.ts +136 -0
  440. package/tests/query-reports.test.ts +608 -0
  441. package/tests/queue-assignment.test.ts +428 -0
  442. package/tests/queue-router.test.ts +306 -0
  443. package/tests/queues.test.ts +690 -0
  444. package/tests/report-action.test.ts +308 -0
  445. package/tests/report-activity.test.ts +567 -0
  446. package/tests/report-assignment.test.ts +517 -0
  447. package/tests/report-reassign-queue.test.ts +340 -0
  448. package/tests/report-routing.test.ts +245 -0
  449. package/tests/report-stats.test.ts +545 -0
  450. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.paginate = exports.CreatedAtUriKeyset = exports.TimeIdKeyset = exports.StatusKeyset = exports.GenericKeyset = void 0;
3
+ exports.paginate = exports.ComputedAtIdKeyset = exports.EndAtIdKeyset = exports.CreatedAtUriKeyset = exports.TimeIdKeyset = exports.StatusKeyset = exports.GenericKeyset = void 0;
4
4
  const kysely_1 = require("kysely");
5
5
  const xrpc_server_1 = require("@atproto/xrpc-server");
6
6
  /**
@@ -192,6 +192,79 @@ class CreatedAtUriKeyset extends GenericKeyset {
192
192
  }
193
193
  }
194
194
  exports.CreatedAtUriKeyset = CreatedAtUriKeyset;
195
+ // Special value used here to represent a "permanent" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future).
196
+ // Chosen to sort before all real timestamps in DESC order.
197
+ const PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z';
198
+ class EndAtIdKeyset extends GenericKeyset {
199
+ labelResult(result) {
200
+ return {
201
+ primary: result.endAt ?? PERMANENT_ENDSAT,
202
+ secondary: result.id.toString(),
203
+ };
204
+ }
205
+ labeledResultToCursor(labeled) {
206
+ return {
207
+ primary: new Date(labeled.primary).getTime().toString(),
208
+ secondary: labeled.secondary,
209
+ };
210
+ }
211
+ cursorToLabeledResult(cursor) {
212
+ const primaryDate = new Date(parseInt(cursor.primary, 10));
213
+ if (isNaN(primaryDate.getTime())) {
214
+ throw new xrpc_server_1.InvalidRequestError('Malformed cursor');
215
+ }
216
+ return {
217
+ primary: primaryDate.toISOString(),
218
+ secondary: cursor.secondary,
219
+ };
220
+ }
221
+ // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows
222
+ // so cursor pagination works across permanent (endAt IS NULL) assignments.
223
+ getSql(labeled, direction, tryIndex) {
224
+ if (labeled === undefined)
225
+ return;
226
+ const primaryRef = (0, kysely_1.sql) `COALESCE(${this.primary}, ${PERMANENT_ENDSAT})`;
227
+ if (tryIndex) {
228
+ if (direction === 'asc') {
229
+ return (0, kysely_1.sql) `((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`;
230
+ }
231
+ else {
232
+ return (0, kysely_1.sql) `((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`;
233
+ }
234
+ }
235
+ else {
236
+ if (direction === 'asc') {
237
+ return (0, kysely_1.sql) `((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`;
238
+ }
239
+ else {
240
+ return (0, kysely_1.sql) `((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`;
241
+ }
242
+ }
243
+ }
244
+ }
245
+ exports.EndAtIdKeyset = EndAtIdKeyset;
246
+ class ComputedAtIdKeyset extends GenericKeyset {
247
+ labelResult(result) {
248
+ return { primary: result.computedAt, secondary: result.id.toString() };
249
+ }
250
+ labeledResultToCursor(labeled) {
251
+ return {
252
+ primary: new Date(labeled.primary).getTime().toString(),
253
+ secondary: labeled.secondary,
254
+ };
255
+ }
256
+ cursorToLabeledResult(cursor) {
257
+ const primaryDate = new Date(parseInt(cursor.primary, 10));
258
+ if (isNaN(primaryDate.getTime())) {
259
+ throw new xrpc_server_1.InvalidRequestError('Malformed cursor');
260
+ }
261
+ return {
262
+ primary: primaryDate.toISOString(),
263
+ secondary: cursor.secondary,
264
+ };
265
+ }
266
+ }
267
+ exports.ComputedAtIdKeyset = ComputedAtIdKeyset;
195
268
  const paginate = (qb, opts) => {
196
269
  const { limit, cursor, keyset, direction = 'desc', tryIndex, nullsLast, } = opts;
197
270
  const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex);
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DynamicModule, sql } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './types'\n\nexport type Cursor = { primary: string; secondary: string }\nexport type LabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000::bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends LabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): Cursor\n abstract cursorToLabeledResult(cursor: Cursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: Cursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}::${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype StatusKeysetParam = {\n lastReviewedAt: string | null\n lastReportedAt: string | null\n id: number\n}\n\nexport class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {\n labelResult(result: StatusKeysetParam): Cursor\n labelResult(result: StatusKeysetParam) {\n const primaryField = (\n this.primary as ReturnType<DynamicModule['ref']>\n ).dynamicReference.includes('lastReviewedAt')\n ? 'lastReviewedAt'\n : 'lastReportedAt'\n\n return {\n primary: result[primaryField]\n ? new Date(`${result[primaryField]}`).getTime().toString()\n : '',\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: labeled.primary,\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n return {\n primary: cursor.primary\n ? new Date(parseInt(cursor.primary, 10)).toISOString()\n : '',\n secondary: cursor.secondary,\n }\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n // This is specifically built to handle nullable columns as primary sorting column\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} > ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n } else {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} < ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n }\n }\n}\n\ntype TimeIdKeysetParam = {\n id: number\n createdAt: string | Date\n}\ntype TimeIdResult = TimeIdKeysetParam\n\nexport class TimeIdKeyset extends GenericKeyset<TimeIdKeysetParam, Cursor> {\n labelResult(result: TimeIdResult): Cursor\n labelResult(result: TimeIdResult) {\n return { primary: result.createdAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype CreatedAtUriKeysetParam = {\n createdAt: string\n uri: string\n}\n\nexport class CreatedAtUriKeyset extends GenericKeyset<\n CreatedAtUriKeysetParam,\n Cursor\n> {\n labelResult(result: CreatedAtUriKeysetParam): Cursor\n labelResult(result: CreatedAtUriKeysetParam) {\n return { primary: result.createdAt, secondary: result.uri }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n const {\n limit,\n cursor,\n keyset,\n direction = 'desc',\n tryIndex,\n nullsLast,\n } = opts\n const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.primary} asc nulls last`\n : sql`${keyset.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.secondary} asc nulls last`\n : sql`${keyset.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n}\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DynamicModule, sql } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './types'\n\nexport type Cursor = { primary: string; secondary: string }\nexport type LabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000::bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends LabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): Cursor\n abstract cursorToLabeledResult(cursor: Cursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: Cursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}::${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype StatusKeysetParam = {\n lastReviewedAt: string | null\n lastReportedAt: string | null\n id: number\n}\n\nexport class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {\n labelResult(result: StatusKeysetParam): Cursor\n labelResult(result: StatusKeysetParam) {\n const primaryField = (\n this.primary as ReturnType<DynamicModule['ref']>\n ).dynamicReference.includes('lastReviewedAt')\n ? 'lastReviewedAt'\n : 'lastReportedAt'\n\n return {\n primary: result[primaryField]\n ? new Date(`${result[primaryField]}`).getTime().toString()\n : '',\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: labeled.primary,\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n return {\n primary: cursor.primary\n ? new Date(parseInt(cursor.primary, 10)).toISOString()\n : '',\n secondary: cursor.secondary,\n }\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n // This is specifically built to handle nullable columns as primary sorting column\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} > ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n } else {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} < ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n }\n }\n}\n\ntype TimeIdKeysetParam = {\n id: number\n createdAt: string | Date\n}\ntype TimeIdResult = TimeIdKeysetParam\n\nexport class TimeIdKeyset extends GenericKeyset<TimeIdKeysetParam, Cursor> {\n labelResult(result: TimeIdResult): Cursor\n labelResult(result: TimeIdResult) {\n return { primary: result.createdAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype CreatedAtUriKeysetParam = {\n createdAt: string\n uri: string\n}\n\nexport class CreatedAtUriKeyset extends GenericKeyset<\n CreatedAtUriKeysetParam,\n Cursor\n> {\n labelResult(result: CreatedAtUriKeysetParam): Cursor\n labelResult(result: CreatedAtUriKeysetParam) {\n return { primary: result.createdAt, secondary: result.uri }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype EndAtIdKeysetParam = {\n id: number\n endAt: string | null\n}\n\n// Special value used here to represent a \"permanent\" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future).\n// Chosen to sort before all real timestamps in DESC order.\nconst PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z'\n\nexport class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cursor> {\n labelResult(result: EndAtIdKeysetParam): Cursor\n labelResult(result: EndAtIdKeysetParam) {\n return {\n primary: result.endAt ?? PERMANENT_ENDSAT,\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows\n // so cursor pagination works across permanent (endAt IS NULL) assignments.\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n const primaryRef = sql`COALESCE(${this.primary}, ${PERMANENT_ENDSAT})`\n if (tryIndex) {\n if (direction === 'asc') {\n return sql`((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n if (direction === 'asc') {\n return sql`((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype ComputedAtIdKeysetParam = {\n id: number\n computedAt: string | Date\n}\n\nexport class ComputedAtIdKeyset extends GenericKeyset<\n ComputedAtIdKeysetParam,\n Cursor\n> {\n labelResult(result: ComputedAtIdKeysetParam): Cursor\n labelResult(result: ComputedAtIdKeysetParam) {\n return { primary: result.computedAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n const {\n limit,\n cursor,\n keyset,\n direction = 'desc',\n tryIndex,\n nullsLast,\n } = opts\n const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.primary} asc nulls last`\n : sql`${keyset.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.secondary} asc nulls last`\n : sql`${keyset.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { Generated } from 'kysely';
2
+ export declare const tableName = "expiring_tag";
3
+ export interface ExpiringTag {
4
+ id: Generated<number>;
5
+ eventId: number;
6
+ did: string;
7
+ recordPath: string;
8
+ tag: string;
9
+ expiresAt: string;
10
+ createdBy: string;
11
+ }
12
+ export type PartialDB = {
13
+ [tableName]: ExpiringTag;
14
+ };
15
+ //# sourceMappingURL=expiring_tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expiring_tag.d.ts","sourceRoot":"","sources":["../../../src/db/schema/expiring_tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,SAAS,iBAAiB,CAAA;AAEvC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,SAAS,CAAC,EAAE,WAAW,CAAA;CACzB,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tableName = void 0;
4
+ exports.tableName = 'expiring_tag';
5
+ //# sourceMappingURL=expiring_tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expiring_tag.js","sourceRoot":"","sources":["../../../src/db/schema/expiring_tag.ts"],"names":[],"mappings":";;;AAEa,QAAA,SAAS,GAAG,cAAc,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const tableName = 'expiring_tag'\n\nexport interface ExpiringTag {\n id: Generated<number>\n eventId: number\n did: string\n recordPath: string\n tag: string\n expiresAt: string\n createdBy: string\n}\n\nexport type PartialDB = {\n [tableName]: ExpiringTag\n}\n"]}
@@ -5,22 +5,28 @@ import * as accountRecordStatusStats from './account_record_status_stats';
5
5
  import * as accountStrike from './account_strike';
6
6
  import * as blobPushEvent from './blob_push_event';
7
7
  import * as communicationTemplate from './communication_template';
8
+ import * as expiringTag from './expiring_tag';
8
9
  import * as firehoseCursor from './firehose_cursor';
9
10
  import * as jobCursor from './job_cursor';
10
11
  import * as label from './label';
11
12
  import * as member from './member';
12
13
  import * as modEvent from './moderation_event';
13
14
  import * as modSubjectStatus from './moderation_subject_status';
15
+ import * as moderatorAssignment from './moderator_assignment';
14
16
  import * as set from './ozone_set';
15
17
  import * as recordEventsStats from './record_events_stats';
16
18
  import * as recordPushEvent from './record_push_event';
17
19
  import * as repoPushEvent from './repo_push_event';
20
+ import * as report from './report';
21
+ import * as reportActivity from './report_activity';
22
+ import * as reportQueue from './report_queue';
23
+ import * as reportStat from './report_stat';
18
24
  import * as safelink from './safelink';
19
25
  import * as scheduledAction from './scheduled-action';
20
26
  import * as setting from './setting';
21
27
  import * as signingKey from './signing_key';
22
28
  import * as verification from './verification';
23
- export type DatabaseSchemaType = modEvent.PartialDB & modSubjectStatus.PartialDB & label.PartialDB & signingKey.PartialDB & repoPushEvent.PartialDB & recordPushEvent.PartialDB & blobPushEvent.PartialDB & communicationTemplate.PartialDB & set.PartialDB & member.PartialDB & setting.PartialDB & accountEventsStats.PartialDB & recordEventsStats.PartialDB & accountRecordEventsStats.PartialDB & accountRecordStatusStats.PartialDB & accountStrike.PartialDB & verification.PartialDB & firehoseCursor.PartialDB & jobCursor.PartialDB & safelink.PartialDB & scheduledAction.PartialDB;
29
+ export type DatabaseSchemaType = modEvent.PartialDB & modSubjectStatus.PartialDB & report.PartialDB & reportActivity.PartialDB & reportQueue.PartialDB & label.PartialDB & signingKey.PartialDB & repoPushEvent.PartialDB & recordPushEvent.PartialDB & blobPushEvent.PartialDB & communicationTemplate.PartialDB & set.PartialDB & member.PartialDB & setting.PartialDB & accountEventsStats.PartialDB & recordEventsStats.PartialDB & accountRecordEventsStats.PartialDB & accountRecordStatusStats.PartialDB & accountStrike.PartialDB & verification.PartialDB & firehoseCursor.PartialDB & jobCursor.PartialDB & safelink.PartialDB & scheduledAction.PartialDB & moderatorAssignment.PartialDB & reportStat.PartialDB & expiringTag.PartialDB;
24
30
  export type DatabaseSchema = Kysely<DatabaseSchemaType>;
25
31
  export default DatabaseSchema;
26
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,kBAAkB,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,wBAAwB,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,wBAAwB,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,qBAAqB,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,eAAe,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,OAAO,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,UAAU,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAA;AAE9C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,GACjD,gBAAgB,CAAC,SAAS,GAC1B,KAAK,CAAC,SAAS,GACf,UAAU,CAAC,SAAS,GACpB,aAAa,CAAC,SAAS,GACvB,eAAe,CAAC,SAAS,GACzB,aAAa,CAAC,SAAS,GACvB,qBAAqB,CAAC,SAAS,GAC/B,GAAG,CAAC,SAAS,GACb,MAAM,CAAC,SAAS,GAChB,OAAO,CAAC,SAAS,GACjB,kBAAkB,CAAC,SAAS,GAC5B,iBAAiB,CAAC,SAAS,GAC3B,wBAAwB,CAAC,SAAS,GAClC,wBAAwB,CAAC,SAAS,GAClC,aAAa,CAAC,SAAS,GACvB,YAAY,CAAC,SAAS,GACtB,cAAc,CAAC,SAAS,GACxB,SAAS,CAAC,SAAS,GACnB,QAAQ,CAAC,SAAS,GAClB,eAAe,CAAC,SAAS,CAAA;AAE3B,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;AAEvD,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,kBAAkB,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,wBAAwB,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,wBAAwB,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,qBAAqB,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,eAAe,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,OAAO,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,UAAU,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAA;AAE9C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,GACjD,gBAAgB,CAAC,SAAS,GAC1B,MAAM,CAAC,SAAS,GAChB,cAAc,CAAC,SAAS,GACxB,WAAW,CAAC,SAAS,GACrB,KAAK,CAAC,SAAS,GACf,UAAU,CAAC,SAAS,GACpB,aAAa,CAAC,SAAS,GACvB,eAAe,CAAC,SAAS,GACzB,aAAa,CAAC,SAAS,GACvB,qBAAqB,CAAC,SAAS,GAC/B,GAAG,CAAC,SAAS,GACb,MAAM,CAAC,SAAS,GAChB,OAAO,CAAC,SAAS,GACjB,kBAAkB,CAAC,SAAS,GAC5B,iBAAiB,CAAC,SAAS,GAC3B,wBAAwB,CAAC,SAAS,GAClC,wBAAwB,CAAC,SAAS,GAClC,aAAa,CAAC,SAAS,GACvB,YAAY,CAAC,SAAS,GACtB,cAAc,CAAC,SAAS,GACxB,SAAS,CAAC,SAAS,GACnB,QAAQ,CAAC,SAAS,GAClB,eAAe,CAAC,SAAS,GACzB,mBAAmB,CAAC,SAAS,GAC7B,UAAU,CAAC,SAAS,GACpB,WAAW,CAAC,SAAS,CAAA;AAEvB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;AAEvD,eAAe,cAAc,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/schema/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Kysely } from 'kysely'\nimport * as accountEventsStats from './account_events_stats'\nimport * as accountRecordEventsStats from './account_record_events_stats'\nimport * as accountRecordStatusStats from './account_record_status_stats'\nimport * as accountStrike from './account_strike'\nimport * as blobPushEvent from './blob_push_event'\nimport * as communicationTemplate from './communication_template'\nimport * as firehoseCursor from './firehose_cursor'\nimport * as jobCursor from './job_cursor'\nimport * as label from './label'\nimport * as member from './member'\nimport * as modEvent from './moderation_event'\nimport * as modSubjectStatus from './moderation_subject_status'\nimport * as set from './ozone_set'\nimport * as recordEventsStats from './record_events_stats'\nimport * as recordPushEvent from './record_push_event'\nimport * as repoPushEvent from './repo_push_event'\nimport * as safelink from './safelink'\nimport * as scheduledAction from './scheduled-action'\nimport * as setting from './setting'\nimport * as signingKey from './signing_key'\nimport * as verification from './verification'\n\nexport type DatabaseSchemaType = modEvent.PartialDB &\n modSubjectStatus.PartialDB &\n label.PartialDB &\n signingKey.PartialDB &\n repoPushEvent.PartialDB &\n recordPushEvent.PartialDB &\n blobPushEvent.PartialDB &\n communicationTemplate.PartialDB &\n set.PartialDB &\n member.PartialDB &\n setting.PartialDB &\n accountEventsStats.PartialDB &\n recordEventsStats.PartialDB &\n accountRecordEventsStats.PartialDB &\n accountRecordStatusStats.PartialDB &\n accountStrike.PartialDB &\n verification.PartialDB &\n firehoseCursor.PartialDB &\n jobCursor.PartialDB &\n safelink.PartialDB &\n scheduledAction.PartialDB\n\nexport type DatabaseSchema = Kysely<DatabaseSchemaType>\n\nexport default DatabaseSchema\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/schema/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Kysely } from 'kysely'\nimport * as accountEventsStats from './account_events_stats'\nimport * as accountRecordEventsStats from './account_record_events_stats'\nimport * as accountRecordStatusStats from './account_record_status_stats'\nimport * as accountStrike from './account_strike'\nimport * as blobPushEvent from './blob_push_event'\nimport * as communicationTemplate from './communication_template'\nimport * as expiringTag from './expiring_tag'\nimport * as firehoseCursor from './firehose_cursor'\nimport * as jobCursor from './job_cursor'\nimport * as label from './label'\nimport * as member from './member'\nimport * as modEvent from './moderation_event'\nimport * as modSubjectStatus from './moderation_subject_status'\nimport * as moderatorAssignment from './moderator_assignment'\nimport * as set from './ozone_set'\nimport * as recordEventsStats from './record_events_stats'\nimport * as recordPushEvent from './record_push_event'\nimport * as repoPushEvent from './repo_push_event'\nimport * as report from './report'\nimport * as reportActivity from './report_activity'\nimport * as reportQueue from './report_queue'\nimport * as reportStat from './report_stat'\nimport * as safelink from './safelink'\nimport * as scheduledAction from './scheduled-action'\nimport * as setting from './setting'\nimport * as signingKey from './signing_key'\nimport * as verification from './verification'\n\nexport type DatabaseSchemaType = modEvent.PartialDB &\n modSubjectStatus.PartialDB &\n report.PartialDB &\n reportActivity.PartialDB &\n reportQueue.PartialDB &\n label.PartialDB &\n signingKey.PartialDB &\n repoPushEvent.PartialDB &\n recordPushEvent.PartialDB &\n blobPushEvent.PartialDB &\n communicationTemplate.PartialDB &\n set.PartialDB &\n member.PartialDB &\n setting.PartialDB &\n accountEventsStats.PartialDB &\n recordEventsStats.PartialDB &\n accountRecordEventsStats.PartialDB &\n accountRecordStatusStats.PartialDB &\n accountStrike.PartialDB &\n verification.PartialDB &\n firehoseCursor.PartialDB &\n jobCursor.PartialDB &\n safelink.PartialDB &\n scheduledAction.PartialDB &\n moderatorAssignment.PartialDB &\n reportStat.PartialDB &\n expiringTag.PartialDB\n\nexport type DatabaseSchema = Kysely<DatabaseSchemaType>\n\nexport default DatabaseSchema\n"]}
@@ -0,0 +1,14 @@
1
+ import { Generated } from 'kysely';
2
+ export declare const moderatorAssignmentTableName = "moderator_assignment";
3
+ export interface ModeratorAssignment {
4
+ id: Generated<number>;
5
+ did: string;
6
+ reportId: number | null;
7
+ queueId: number | null;
8
+ startAt: string;
9
+ endAt: string | null;
10
+ }
11
+ export type PartialDB = {
12
+ [moderatorAssignmentTableName]: ModeratorAssignment;
13
+ };
14
+ //# sourceMappingURL=moderator_assignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moderator_assignment.d.ts","sourceRoot":"","sources":["../../../src/db/schema/moderator_assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,4BAA4B,yBAAyB,CAAA;AAElE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,4BAA4B,CAAC,EAAE,mBAAmB,CAAA;CACpD,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.moderatorAssignmentTableName = void 0;
4
+ exports.moderatorAssignmentTableName = 'moderator_assignment';
5
+ //# sourceMappingURL=moderator_assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moderator_assignment.js","sourceRoot":"","sources":["../../../src/db/schema/moderator_assignment.ts"],"names":[],"mappings":";;;AAEa,QAAA,4BAA4B,GAAG,sBAAsB,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const moderatorAssignmentTableName = 'moderator_assignment'\n\nexport interface ModeratorAssignment {\n id: Generated<number>\n did: string\n reportId: number | null\n queueId: number | null\n startAt: string\n endAt: string | null\n}\n\nexport type PartialDB = {\n [moderatorAssignmentTableName]: ModeratorAssignment\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { Generated } from 'kysely';
2
+ export declare const reportTableName = "report";
3
+ export interface Report {
4
+ id: Generated<number>;
5
+ eventId: number;
6
+ queueId: number | null;
7
+ queuedAt: string | null;
8
+ actionEventIds: number[] | null;
9
+ actionNote: string | null;
10
+ isMuted: boolean;
11
+ status: string;
12
+ reportType: string;
13
+ did: string;
14
+ recordPath: string;
15
+ subjectMessageId: string | null;
16
+ createdAt: string;
17
+ updatedAt: string;
18
+ assignedTo: string | null;
19
+ assignedAt: string | null;
20
+ closedAt: string | null;
21
+ }
22
+ export type PartialDB = {
23
+ [reportTableName]: Report;
24
+ };
25
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/db/schema/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,eAAe,WAAW,CAAA;AAEvC,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportTableName = void 0;
4
+ exports.reportTableName = 'report';
5
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/db/schema/report.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAG,QAAQ,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const reportTableName = 'report'\n\nexport interface Report {\n id: Generated<number>\n eventId: number // References moderation_event.id\n queueId: number | null // NULL = not yet assigned, -1 = no matching queue\n queuedAt: string | null\n actionEventIds: number[] | null // Array of event IDs, sorted DESC [newest, ..., oldest]\n actionNote: string | null\n isMuted: boolean\n status: string // 'open', 'closed', 'escalated', 'queued', 'assigned'\n reportType: string // Denormalized from moderation_event.meta.reportType\n did: string // Denormalized from moderation_event.subjectDid\n recordPath: string // '' = account/message, 'collection/rkey' = record\n subjectMessageId: string | null // Denormalized from moderation_event.subjectMessageId\n createdAt: string\n updatedAt: string\n assignedTo: string | null // DID of permanently assigned moderator, null if unassigned\n assignedAt: string | null // When the permanent assignment was created\n closedAt: string | null\n}\n\nexport type PartialDB = {\n [reportTableName]: Report\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { Generated } from 'kysely';
2
+ export declare const reportActivityTableName = "report_activity";
3
+ export interface ReportActivity {
4
+ id: Generated<number>;
5
+ reportId: number;
6
+ activityType: string;
7
+ previousStatus: string | null;
8
+ internalNote: string | null;
9
+ publicNote: string | null;
10
+ meta: unknown | null;
11
+ isAutomated: boolean;
12
+ createdBy: string;
13
+ createdAt: string;
14
+ }
15
+ export type PartialDB = {
16
+ [reportActivityTableName]: ReportActivity;
17
+ };
18
+ //# sourceMappingURL=report_activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_activity.d.ts","sourceRoot":"","sources":["../../../src/db/schema/report_activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,uBAAuB,oBAAoB,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAGhB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,uBAAuB,CAAC,EAAE,cAAc,CAAA;CAC1C,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportActivityTableName = void 0;
4
+ exports.reportActivityTableName = 'report_activity';
5
+ //# sourceMappingURL=report_activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_activity.js","sourceRoot":"","sources":["../../../src/db/schema/report_activity.ts"],"names":[],"mappings":";;;AAEa,QAAA,uBAAuB,GAAG,iBAAiB,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const reportActivityTableName = 'report_activity'\n\nexport interface ReportActivity {\n id: Generated<number>\n reportId: number\n // One of: queueActivity | assignmentActivity | escalationActivity\n // | closeActivity | internalNoteActivity | publicNoteActivity\n activityType: string\n previousStatus: string | null // report status before this activity; null for note-only types\n internalNote: string | null // moderator-only note\n publicNote: string | null // potentially reporter-visible note\n meta: unknown | null // loose activity-specific metadata (e.g. { assignmentId: 42 })\n isAutomated: boolean\n createdBy: string // DID of actor (or service DID for automated activities)\n createdAt: string // ISO string\n}\n\nexport type PartialDB = {\n [reportActivityTableName]: ReportActivity\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { Generated } from 'kysely';
2
+ export declare const reportQueueTableName = "report_queue";
3
+ export interface ReportQueue {
4
+ id: Generated<number>;
5
+ name: string;
6
+ subjectTypes: string[];
7
+ collection: string | null;
8
+ reportTypes: string[];
9
+ description: string | null;
10
+ createdBy: string;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ enabled: boolean;
14
+ deletedAt: string | null;
15
+ }
16
+ export type PartialDB = {
17
+ [reportQueueTableName]: ReportQueue;
18
+ };
19
+ //# sourceMappingURL=report_queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_queue.d.ts","sourceRoot":"","sources":["../../../src/db/schema/report_queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,oBAAoB,iBAAiB,CAAA;AAElD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAA;CACpC,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportQueueTableName = void 0;
4
+ exports.reportQueueTableName = 'report_queue';
5
+ //# sourceMappingURL=report_queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_queue.js","sourceRoot":"","sources":["../../../src/db/schema/report_queue.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAG,cAAc,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const reportQueueTableName = 'report_queue'\n\nexport interface ReportQueue {\n id: Generated<number>\n name: string\n subjectTypes: string[] // ['account'] or ['record'] or ['account', 'record']\n collection: string | null // Collection name (e.g., 'app.bsky.feed.post'), NULL for accounts\n reportTypes: string[] // Array of report reason types (fully qualified NSIDs)\n description: string | null // Optional description of the queue\n createdBy: string // DID of moderator who created this queue\n createdAt: string\n updatedAt: string\n enabled: boolean\n deletedAt: string | null // NULL = active, timestamp = soft-deleted\n}\n\nexport type PartialDB = {\n [reportQueueTableName]: ReportQueue\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { Generated } from 'kysely';
2
+ export declare const reportStatTableName = "report_stat";
3
+ export interface ReportStat {
4
+ id: Generated<number>;
5
+ computedAt: string;
6
+ date: string;
7
+ queueId: number | null;
8
+ reportTypes: string[] | null;
9
+ moderatorDid: string | null;
10
+ inboundCount: number | null;
11
+ pendingCount: number | null;
12
+ actionedCount: number | null;
13
+ escalatedCount: number | null;
14
+ actionRate: number | null;
15
+ avgHandlingTimeSec: number | null;
16
+ }
17
+ export type PartialDB = {
18
+ [reportStatTableName]: ReportStat;
19
+ };
20
+ //# sourceMappingURL=report_stat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_stat.d.ts","sourceRoot":"","sources":["../../../src/db/schema/report_stat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,mBAAmB,gBAAgB,CAAA;AAEhD,MAAM,WAAW,UAAU;IAEzB,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAGlB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAG3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,mBAAmB,CAAC,EAAE,UAAU,CAAA;CAClC,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportStatTableName = void 0;
4
+ exports.reportStatTableName = 'report_stat';
5
+ //# sourceMappingURL=report_stat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_stat.js","sourceRoot":"","sources":["../../../src/db/schema/report_stat.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAG,aAAa,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const reportStatTableName = 'report_stat'\n\nexport interface ReportStat {\n // metadata\n id: Generated<number>\n computedAt: string // When this snapshot was last computed\n\n // group\n date: string // ISO date e.g. '2026-04-15' — the calendar day this snapshot covers\n queueId: number | null // NULL = aggregate across all queues\n reportTypes: string[] | null // NULL = aggregate across all report types\n moderatorDid: string | null // NULL = aggregate, non-null = per-moderator\n\n // stats\n inboundCount: number | null // Reports received during this calendar day\n pendingCount: number | null // Reports with status != 'closed' at time of computation\n actionedCount: number | null // Reports closed during this calendar day\n escalatedCount: number | null // Reports escalated during this calendar day\n actionRate: number | null // actionedCount / inboundCount * 100\n avgHandlingTimeSec: number | null // Average time from creation/assignment to close, in seconds\n}\n\nexport type PartialDB = {\n [reportStatTableName]: ReportStat\n}\n"]}
@@ -258,6 +258,26 @@ import * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation
258
258
  import * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js';
259
259
  import * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js';
260
260
  import * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js';
261
+ import * as ToolsOzoneQueueAssignModerator from './types/tools/ozone/queue/assignModerator.js';
262
+ import * as ToolsOzoneQueueCreateQueue from './types/tools/ozone/queue/createQueue.js';
263
+ import * as ToolsOzoneQueueDeleteQueue from './types/tools/ozone/queue/deleteQueue.js';
264
+ import * as ToolsOzoneQueueGetAssignments from './types/tools/ozone/queue/getAssignments.js';
265
+ import * as ToolsOzoneQueueListQueues from './types/tools/ozone/queue/listQueues.js';
266
+ import * as ToolsOzoneQueueRouteReports from './types/tools/ozone/queue/routeReports.js';
267
+ import * as ToolsOzoneQueueUnassignModerator from './types/tools/ozone/queue/unassignModerator.js';
268
+ import * as ToolsOzoneQueueUpdateQueue from './types/tools/ozone/queue/updateQueue.js';
269
+ import * as ToolsOzoneReportAssignModerator from './types/tools/ozone/report/assignModerator.js';
270
+ import * as ToolsOzoneReportCreateActivity from './types/tools/ozone/report/createActivity.js';
271
+ import * as ToolsOzoneReportGetAssignments from './types/tools/ozone/report/getAssignments.js';
272
+ import * as ToolsOzoneReportGetHistoricalStats from './types/tools/ozone/report/getHistoricalStats.js';
273
+ import * as ToolsOzoneReportGetLatestReport from './types/tools/ozone/report/getLatestReport.js';
274
+ import * as ToolsOzoneReportGetLiveStats from './types/tools/ozone/report/getLiveStats.js';
275
+ import * as ToolsOzoneReportGetReport from './types/tools/ozone/report/getReport.js';
276
+ import * as ToolsOzoneReportListActivities from './types/tools/ozone/report/listActivities.js';
277
+ import * as ToolsOzoneReportQueryReports from './types/tools/ozone/report/queryReports.js';
278
+ import * as ToolsOzoneReportReassignQueue from './types/tools/ozone/report/reassignQueue.js';
279
+ import * as ToolsOzoneReportRefreshStats from './types/tools/ozone/report/refreshStats.js';
280
+ import * as ToolsOzoneReportUnassignModerator from './types/tools/ozone/report/unassignModerator.js';
261
281
  import * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js';
262
282
  import * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js';
263
283
  import * as ToolsOzoneSafelinkQueryRules from './types/tools/ozone/safelink/queryRules.js';
@@ -785,6 +805,8 @@ export declare class ToolsOzoneNS {
785
805
  communication: ToolsOzoneCommunicationNS;
786
806
  hosting: ToolsOzoneHostingNS;
787
807
  moderation: ToolsOzoneModerationNS;
808
+ queue: ToolsOzoneQueueNS;
809
+ report: ToolsOzoneReportNS;
788
810
  safelink: ToolsOzoneSafelinkNS;
789
811
  server: ToolsOzoneServerNS;
790
812
  set: ToolsOzoneSetNS;
@@ -826,6 +848,34 @@ export declare class ToolsOzoneModerationNS {
826
848
  scheduleAction<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneModerationScheduleAction.QueryParams, ToolsOzoneModerationScheduleAction.HandlerInput, ToolsOzoneModerationScheduleAction.HandlerOutput>): void;
827
849
  searchRepos<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneModerationSearchRepos.QueryParams, ToolsOzoneModerationSearchRepos.HandlerInput, ToolsOzoneModerationSearchRepos.HandlerOutput>): void;
828
850
  }
851
+ export declare class ToolsOzoneQueueNS {
852
+ _server: Server;
853
+ constructor(server: Server);
854
+ assignModerator<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueAssignModerator.QueryParams, ToolsOzoneQueueAssignModerator.HandlerInput, ToolsOzoneQueueAssignModerator.HandlerOutput>): void;
855
+ createQueue<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueCreateQueue.QueryParams, ToolsOzoneQueueCreateQueue.HandlerInput, ToolsOzoneQueueCreateQueue.HandlerOutput>): void;
856
+ deleteQueue<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueDeleteQueue.QueryParams, ToolsOzoneQueueDeleteQueue.HandlerInput, ToolsOzoneQueueDeleteQueue.HandlerOutput>): void;
857
+ getAssignments<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueGetAssignments.QueryParams, ToolsOzoneQueueGetAssignments.HandlerInput, ToolsOzoneQueueGetAssignments.HandlerOutput>): void;
858
+ listQueues<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueListQueues.QueryParams, ToolsOzoneQueueListQueues.HandlerInput, ToolsOzoneQueueListQueues.HandlerOutput>): void;
859
+ routeReports<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueRouteReports.QueryParams, ToolsOzoneQueueRouteReports.HandlerInput, ToolsOzoneQueueRouteReports.HandlerOutput>): void;
860
+ unassignModerator<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueUnassignModerator.QueryParams, ToolsOzoneQueueUnassignModerator.HandlerInput, ToolsOzoneQueueUnassignModerator.HandlerOutput>): void;
861
+ updateQueue<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneQueueUpdateQueue.QueryParams, ToolsOzoneQueueUpdateQueue.HandlerInput, ToolsOzoneQueueUpdateQueue.HandlerOutput>): void;
862
+ }
863
+ export declare class ToolsOzoneReportNS {
864
+ _server: Server;
865
+ constructor(server: Server);
866
+ assignModerator<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportAssignModerator.QueryParams, ToolsOzoneReportAssignModerator.HandlerInput, ToolsOzoneReportAssignModerator.HandlerOutput>): void;
867
+ createActivity<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportCreateActivity.QueryParams, ToolsOzoneReportCreateActivity.HandlerInput, ToolsOzoneReportCreateActivity.HandlerOutput>): void;
868
+ getAssignments<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportGetAssignments.QueryParams, ToolsOzoneReportGetAssignments.HandlerInput, ToolsOzoneReportGetAssignments.HandlerOutput>): void;
869
+ getHistoricalStats<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportGetHistoricalStats.QueryParams, ToolsOzoneReportGetHistoricalStats.HandlerInput, ToolsOzoneReportGetHistoricalStats.HandlerOutput>): void;
870
+ getLatestReport<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportGetLatestReport.QueryParams, ToolsOzoneReportGetLatestReport.HandlerInput, ToolsOzoneReportGetLatestReport.HandlerOutput>): void;
871
+ getLiveStats<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportGetLiveStats.QueryParams, ToolsOzoneReportGetLiveStats.HandlerInput, ToolsOzoneReportGetLiveStats.HandlerOutput>): void;
872
+ getReport<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportGetReport.QueryParams, ToolsOzoneReportGetReport.HandlerInput, ToolsOzoneReportGetReport.HandlerOutput>): void;
873
+ listActivities<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportListActivities.QueryParams, ToolsOzoneReportListActivities.HandlerInput, ToolsOzoneReportListActivities.HandlerOutput>): void;
874
+ queryReports<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportQueryReports.QueryParams, ToolsOzoneReportQueryReports.HandlerInput, ToolsOzoneReportQueryReports.HandlerOutput>): void;
875
+ reassignQueue<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportReassignQueue.QueryParams, ToolsOzoneReportReassignQueue.HandlerInput, ToolsOzoneReportReassignQueue.HandlerOutput>): void;
876
+ refreshStats<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportRefreshStats.QueryParams, ToolsOzoneReportRefreshStats.HandlerInput, ToolsOzoneReportRefreshStats.HandlerOutput>): void;
877
+ unassignModerator<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ToolsOzoneReportUnassignModerator.QueryParams, ToolsOzoneReportUnassignModerator.HandlerInput, ToolsOzoneReportUnassignModerator.HandlerOutput>): void;
878
+ }
829
879
  export declare class ToolsOzoneSafelinkNS {
830
880
  _server: Server;
831
881
  constructor(server: Server);