@atproto/ozone 0.1.175 → 0.2.0

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 (543) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/api/chat/getConvo.d.ts +4 -0
  3. package/dist/api/chat/getConvo.d.ts.map +1 -0
  4. package/dist/api/chat/getConvo.js +18 -0
  5. package/dist/api/chat/getConvo.js.map +1 -0
  6. package/dist/api/chat/getConvoMembers.d.ts +4 -0
  7. package/dist/api/chat/getConvoMembers.d.ts.map +1 -0
  8. package/dist/api/chat/getConvoMembers.js +18 -0
  9. package/dist/api/chat/getConvoMembers.js.map +1 -0
  10. package/dist/api/chat/index.d.ts.map +1 -1
  11. package/dist/api/chat/index.js +4 -0
  12. package/dist/api/chat/index.js.map +1 -1
  13. package/dist/daemon/event-reverser.d.ts.map +1 -1
  14. package/dist/daemon/event-reverser.js +1 -0
  15. package/dist/daemon/event-reverser.js.map +1 -1
  16. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.d.ts +4 -0
  17. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.d.ts.map +1 -0
  18. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.js +107 -0
  19. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.js.map +1 -0
  20. package/dist/db/migrations/index.d.ts +1 -0
  21. package/dist/db/migrations/index.d.ts.map +1 -1
  22. package/dist/db/migrations/index.js +1 -0
  23. package/dist/db/migrations/index.js.map +1 -1
  24. package/dist/db/schema/expiring_tag.d.ts +1 -0
  25. package/dist/db/schema/expiring_tag.d.ts.map +1 -1
  26. package/dist/db/schema/expiring_tag.js.map +1 -1
  27. package/dist/db/schema/moderation_event.d.ts +2 -1
  28. package/dist/db/schema/moderation_event.d.ts.map +1 -1
  29. package/dist/db/schema/moderation_event.js.map +1 -1
  30. package/dist/db/schema/moderation_subject_status.d.ts +1 -0
  31. package/dist/db/schema/moderation_subject_status.d.ts.map +1 -1
  32. package/dist/db/schema/moderation_subject_status.js.map +1 -1
  33. package/dist/db/schema/report.d.ts +1 -0
  34. package/dist/db/schema/report.d.ts.map +1 -1
  35. package/dist/db/schema/report.js.map +1 -1
  36. package/dist/lexicon/index.d.ts +21 -2
  37. package/dist/lexicon/index.d.ts.map +1 -1
  38. package/dist/lexicon/index.js +36 -2
  39. package/dist/lexicon/index.js.map +1 -1
  40. package/dist/lexicon/lexicons.d.ts +1420 -92
  41. package/dist/lexicon/lexicons.d.ts.map +1 -1
  42. package/dist/lexicon/lexicons.js +771 -44
  43. package/dist/lexicon/lexicons.js.map +1 -1
  44. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +4 -0
  45. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  46. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  47. package/dist/lexicon/types/app/bsky/embed/external.d.ts +48 -2
  48. package/dist/lexicon/types/app/bsky/embed/external.d.ts.map +1 -1
  49. package/dist/lexicon/types/app/bsky/embed/external.js +21 -0
  50. package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
  51. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.d.ts +31 -0
  52. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.d.ts.map +1 -0
  53. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.js +5 -0
  54. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.js.map +1 -0
  55. package/dist/lexicon/types/chat/bsky/actor/getStatus.d.ts +24 -0
  56. package/dist/lexicon/types/chat/bsky/actor/getStatus.d.ts.map +1 -0
  57. package/dist/lexicon/types/chat/bsky/{group/getJoinLinkPreview.js → actor/getStatus.js} +2 -2
  58. package/dist/lexicon/types/chat/bsky/actor/getStatus.js.map +1 -0
  59. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +39 -7
  60. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -1
  61. package/dist/lexicon/types/chat/bsky/convo/defs.js +21 -0
  62. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  63. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts +1 -1
  64. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts.map +1 -1
  65. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -1
  66. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts +1 -1
  67. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts.map +1 -1
  68. package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -1
  69. package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.d.ts +1 -1
  70. package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.d.ts.map +1 -1
  71. package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.js.map +1 -1
  72. package/dist/lexicon/types/chat/bsky/embed/joinLink.d.ts +19 -0
  73. package/dist/lexicon/types/chat/bsky/embed/joinLink.d.ts.map +1 -0
  74. package/dist/lexicon/types/chat/bsky/embed/joinLink.js +19 -0
  75. package/dist/lexicon/types/chat/bsky/embed/joinLink.js.map +1 -0
  76. package/dist/lexicon/types/chat/bsky/group/addMembers.d.ts +1 -1
  77. package/dist/lexicon/types/chat/bsky/group/addMembers.d.ts.map +1 -1
  78. package/dist/lexicon/types/chat/bsky/group/addMembers.js.map +1 -1
  79. package/dist/lexicon/types/chat/bsky/group/createGroup.d.ts +1 -1
  80. package/dist/lexicon/types/chat/bsky/group/createGroup.d.ts.map +1 -1
  81. package/dist/lexicon/types/chat/bsky/group/createGroup.js.map +1 -1
  82. package/dist/lexicon/types/chat/bsky/group/defs.d.ts +23 -0
  83. package/dist/lexicon/types/chat/bsky/group/defs.d.ts.map +1 -1
  84. package/dist/lexicon/types/chat/bsky/group/defs.js +14 -0
  85. package/dist/lexicon/types/chat/bsky/group/defs.js.map +1 -1
  86. package/dist/lexicon/types/chat/bsky/group/{getJoinLinkPreview.d.ts → getJoinLinkPreviews.d.ts} +3 -4
  87. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.d.ts.map +1 -0
  88. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.js +5 -0
  89. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.js.map +1 -0
  90. package/dist/lexicon/types/chat/bsky/group/listMutualGroups.d.ts +25 -0
  91. package/dist/lexicon/types/chat/bsky/group/listMutualGroups.d.ts.map +1 -0
  92. package/dist/lexicon/types/chat/bsky/group/listMutualGroups.js +5 -0
  93. package/dist/lexicon/types/chat/bsky/group/listMutualGroups.js.map +1 -0
  94. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.d.ts +24 -0
  95. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.d.ts.map +1 -0
  96. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.js +5 -0
  97. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.js.map +1 -0
  98. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.d.ts +24 -0
  99. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.d.ts.map +1 -0
  100. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.js +5 -0
  101. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.js.map +1 -0
  102. package/dist/lexicon/types/chat/bsky/moderation/defs.d.ts +42 -0
  103. package/dist/lexicon/types/chat/bsky/moderation/defs.d.ts.map +1 -0
  104. package/dist/lexicon/types/chat/bsky/moderation/defs.js +26 -0
  105. package/dist/lexicon/types/chat/bsky/moderation/defs.js.map +1 -0
  106. package/dist/lexicon/types/chat/bsky/moderation/getConvo.d.ts +23 -0
  107. package/dist/lexicon/types/chat/bsky/moderation/getConvo.d.ts.map +1 -0
  108. package/dist/lexicon/types/chat/bsky/moderation/getConvo.js +5 -0
  109. package/dist/lexicon/types/chat/bsky/moderation/getConvo.js.map +1 -0
  110. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.d.ts +26 -0
  111. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.d.ts.map +1 -0
  112. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.js +5 -0
  113. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.js.map +1 -0
  114. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts +14 -2
  115. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts.map +1 -1
  116. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js +7 -0
  117. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js.map +1 -1
  118. package/dist/lexicon/types/com/atproto/server/getServiceAuth.d.ts +1 -1
  119. package/dist/lexicon/types/com/atproto/server/getServiceAuth.d.ts.map +1 -1
  120. package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
  121. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +10 -3
  122. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  123. package/dist/lexicon/types/tools/ozone/moderation/defs.js +7 -0
  124. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  125. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts +2 -2
  126. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts.map +1 -1
  127. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
  128. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts +2 -2
  129. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts.map +1 -1
  130. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
  131. package/dist/mod-service/expiring-tags.d.ts +3 -0
  132. package/dist/mod-service/expiring-tags.d.ts.map +1 -1
  133. package/dist/mod-service/expiring-tags.js +5 -2
  134. package/dist/mod-service/expiring-tags.js.map +1 -1
  135. package/dist/mod-service/index.d.ts +3 -1
  136. package/dist/mod-service/index.d.ts.map +1 -1
  137. package/dist/mod-service/index.js +48 -10
  138. package/dist/mod-service/index.js.map +1 -1
  139. package/dist/mod-service/status.d.ts +7 -1
  140. package/dist/mod-service/status.d.ts.map +1 -1
  141. package/dist/mod-service/status.js +18 -3
  142. package/dist/mod-service/status.js.map +1 -1
  143. package/dist/mod-service/subject.d.ts +38 -2
  144. package/dist/mod-service/subject.d.ts.map +1 -1
  145. package/dist/mod-service/subject.js +67 -0
  146. package/dist/mod-service/subject.js.map +1 -1
  147. package/dist/mod-service/views.d.ts +2 -1
  148. package/dist/mod-service/views.d.ts.map +1 -1
  149. package/dist/mod-service/views.js +24 -22
  150. package/dist/mod-service/views.js.map +1 -1
  151. package/dist/queue/service.d.ts.map +1 -1
  152. package/dist/queue/service.js +7 -3
  153. package/dist/queue/service.js.map +1 -1
  154. package/dist/safelink/service.d.ts +1 -1
  155. package/package.json +9 -8
  156. package/src/api/chat/getConvo.ts +23 -0
  157. package/src/api/chat/getConvoMembers.ts +23 -0
  158. package/src/api/chat/index.ts +4 -0
  159. package/src/daemon/event-reverser.ts +1 -0
  160. package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +114 -0
  161. package/src/db/migrations/index.ts +1 -0
  162. package/src/db/schema/expiring_tag.ts +1 -0
  163. package/src/db/schema/moderation_event.ts +2 -0
  164. package/src/db/schema/moderation_subject_status.ts +4 -0
  165. package/src/db/schema/report.ts +2 -1
  166. package/src/mod-service/expiring-tags.ts +8 -2
  167. package/src/mod-service/index.ts +52 -16
  168. package/src/mod-service/status.ts +24 -2
  169. package/src/mod-service/subject.ts +79 -1
  170. package/src/mod-service/views.ts +28 -23
  171. package/src/queue/service.ts +8 -4
  172. package/tests/__snapshots__/verification.test.ts.snap +2 -0
  173. package/tests/expiring-tags.test.ts +1 -0
  174. package/tests/moderation-events.test.ts +108 -1
  175. package/tests/moderation-status-tags.test.ts +23 -0
  176. package/tests/moderation-statuses.test.ts +82 -0
  177. package/tests/moderation.test.ts +73 -0
  178. package/tests/repo-search.test.ts +1 -1
  179. package/tsconfig.build.tsbuildinfo +1 -1
  180. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreview.d.ts.map +0 -1
  181. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreview.js.map +0 -1
  182. package/src/lexicon/index.ts +0 -4502
  183. package/src/lexicon/lexicons.ts +0 -25711
  184. package/src/lexicon/types/app/bsky/actor/defs.ts +0 -716
  185. package/src/lexicon/types/app/bsky/actor/getPreferences.ts +0 -38
  186. package/src/lexicon/types/app/bsky/actor/getProfile.ts +0 -37
  187. package/src/lexicon/types/app/bsky/actor/getProfiles.ts +0 -40
  188. package/src/lexicon/types/app/bsky/actor/getSuggestions.ts +0 -46
  189. package/src/lexicon/types/app/bsky/actor/profile.ts +0 -52
  190. package/src/lexicon/types/app/bsky/actor/putPreferences.ts +0 -34
  191. package/src/lexicon/types/app/bsky/actor/searchActors.ts +0 -46
  192. package/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts +0 -44
  193. package/src/lexicon/types/app/bsky/actor/status.ts +0 -46
  194. package/src/lexicon/types/app/bsky/ageassurance/begin.ts +0 -54
  195. package/src/lexicon/types/app/bsky/ageassurance/defs.ts +0 -303
  196. package/src/lexicon/types/app/bsky/ageassurance/getConfig.ts +0 -34
  197. package/src/lexicon/types/app/bsky/ageassurance/getState.ts +0 -42
  198. package/src/lexicon/types/app/bsky/bookmark/createBookmark.ts +0 -35
  199. package/src/lexicon/types/app/bsky/bookmark/defs.ts +0 -54
  200. package/src/lexicon/types/app/bsky/bookmark/deleteBookmark.ts +0 -34
  201. package/src/lexicon/types/app/bsky/bookmark/getBookmarks.ts +0 -42
  202. package/src/lexicon/types/app/bsky/contact/defs.ts +0 -71
  203. package/src/lexicon/types/app/bsky/contact/dismissMatch.ts +0 -43
  204. package/src/lexicon/types/app/bsky/contact/getMatches.ts +0 -43
  205. package/src/lexicon/types/app/bsky/contact/getSyncStatus.ts +0 -39
  206. package/src/lexicon/types/app/bsky/contact/importContacts.ts +0 -54
  207. package/src/lexicon/types/app/bsky/contact/removeData.ts +0 -40
  208. package/src/lexicon/types/app/bsky/contact/sendNotification.ts +0 -44
  209. package/src/lexicon/types/app/bsky/contact/startPhoneVerification.ts +0 -43
  210. package/src/lexicon/types/app/bsky/contact/verifyPhone.ts +0 -53
  211. package/src/lexicon/types/app/bsky/draft/createDraft.ts +0 -46
  212. package/src/lexicon/types/app/bsky/draft/defs.ts +0 -212
  213. package/src/lexicon/types/app/bsky/draft/deleteDraft.ts +0 -33
  214. package/src/lexicon/types/app/bsky/draft/getDrafts.ts +0 -42
  215. package/src/lexicon/types/app/bsky/draft/updateDraft.ts +0 -34
  216. package/src/lexicon/types/app/bsky/embed/defs.ts +0 -32
  217. package/src/lexicon/types/app/bsky/embed/external.ts +0 -85
  218. package/src/lexicon/types/app/bsky/embed/images.ts +0 -86
  219. package/src/lexicon/types/app/bsky/embed/record.ts +0 -146
  220. package/src/lexicon/types/app/bsky/embed/recordWithMedia.ts +0 -59
  221. package/src/lexicon/types/app/bsky/embed/video.ts +0 -75
  222. package/src/lexicon/types/app/bsky/feed/defs.ts +0 -428
  223. package/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts +0 -70
  224. package/src/lexicon/types/app/bsky/feed/generator.ts +0 -51
  225. package/src/lexicon/types/app/bsky/feed/getActorFeeds.ts +0 -43
  226. package/src/lexicon/types/app/bsky/feed/getActorLikes.ts +0 -44
  227. package/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +0 -53
  228. package/src/lexicon/types/app/bsky/feed/getFeed.ts +0 -44
  229. package/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts +0 -45
  230. package/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts +0 -40
  231. package/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts +0 -47
  232. package/src/lexicon/types/app/bsky/feed/getLikes.ts +0 -65
  233. package/src/lexicon/types/app/bsky/feed/getListFeed.ts +0 -45
  234. package/src/lexicon/types/app/bsky/feed/getPostThread.ts +0 -51
  235. package/src/lexicon/types/app/bsky/feed/getPosts.ts +0 -41
  236. package/src/lexicon/types/app/bsky/feed/getQuotes.ts +0 -48
  237. package/src/lexicon/types/app/bsky/feed/getRepostedBy.ts +0 -48
  238. package/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts +0 -42
  239. package/src/lexicon/types/app/bsky/feed/getTimeline.ts +0 -44
  240. package/src/lexicon/types/app/bsky/feed/like.ts +0 -40
  241. package/src/lexicon/types/app/bsky/feed/post.ts +0 -117
  242. package/src/lexicon/types/app/bsky/feed/postgate.ts +0 -58
  243. package/src/lexicon/types/app/bsky/feed/repost.ts +0 -40
  244. package/src/lexicon/types/app/bsky/feed/searchPosts.ts +0 -66
  245. package/src/lexicon/types/app/bsky/feed/sendInteractions.ts +0 -43
  246. package/src/lexicon/types/app/bsky/feed/threadgate.ts +0 -110
  247. package/src/lexicon/types/app/bsky/graph/block.ts +0 -39
  248. package/src/lexicon/types/app/bsky/graph/defs.ts +0 -206
  249. package/src/lexicon/types/app/bsky/graph/follow.ts +0 -40
  250. package/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +0 -43
  251. package/src/lexicon/types/app/bsky/graph/getBlocks.ts +0 -42
  252. package/src/lexicon/types/app/bsky/graph/getFollowers.ts +0 -44
  253. package/src/lexicon/types/app/bsky/graph/getFollows.ts +0 -44
  254. package/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts +0 -44
  255. package/src/lexicon/types/app/bsky/graph/getList.ts +0 -45
  256. package/src/lexicon/types/app/bsky/graph/getListBlocks.ts +0 -42
  257. package/src/lexicon/types/app/bsky/graph/getListMutes.ts +0 -42
  258. package/src/lexicon/types/app/bsky/graph/getLists.ts +0 -46
  259. package/src/lexicon/types/app/bsky/graph/getListsWithMembership.ts +0 -63
  260. package/src/lexicon/types/app/bsky/graph/getMutes.ts +0 -42
  261. package/src/lexicon/types/app/bsky/graph/getRelationships.ts +0 -49
  262. package/src/lexicon/types/app/bsky/graph/getStarterPack.ts +0 -41
  263. package/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +0 -40
  264. package/src/lexicon/types/app/bsky/graph/getStarterPacksWithMembership.ts +0 -65
  265. package/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts +0 -46
  266. package/src/lexicon/types/app/bsky/graph/list.ts +0 -47
  267. package/src/lexicon/types/app/bsky/graph/listblock.ts +0 -39
  268. package/src/lexicon/types/app/bsky/graph/listitem.ts +0 -41
  269. package/src/lexicon/types/app/bsky/graph/muteActor.ts +0 -33
  270. package/src/lexicon/types/app/bsky/graph/muteActorList.ts +0 -33
  271. package/src/lexicon/types/app/bsky/graph/muteThread.ts +0 -33
  272. package/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts +0 -44
  273. package/src/lexicon/types/app/bsky/graph/starterpack.ts +0 -60
  274. package/src/lexicon/types/app/bsky/graph/unmuteActor.ts +0 -33
  275. package/src/lexicon/types/app/bsky/graph/unmuteActorList.ts +0 -33
  276. package/src/lexicon/types/app/bsky/graph/unmuteThread.ts +0 -33
  277. package/src/lexicon/types/app/bsky/graph/verification.ts +0 -44
  278. package/src/lexicon/types/app/bsky/labeler/defs.ts +0 -100
  279. package/src/lexicon/types/app/bsky/labeler/getServices.ts +0 -45
  280. package/src/lexicon/types/app/bsky/labeler/service.ts +0 -48
  281. package/src/lexicon/types/app/bsky/notification/declaration.ts +0 -38
  282. package/src/lexicon/types/app/bsky/notification/defs.ts +0 -142
  283. package/src/lexicon/types/app/bsky/notification/getPreferences.ts +0 -38
  284. package/src/lexicon/types/app/bsky/notification/getUnreadCount.ts +0 -40
  285. package/src/lexicon/types/app/bsky/notification/listActivitySubscriptions.ts +0 -42
  286. package/src/lexicon/types/app/bsky/notification/listNotifications.ts +0 -87
  287. package/src/lexicon/types/app/bsky/notification/putActivitySubscription.ts +0 -46
  288. package/src/lexicon/types/app/bsky/notification/putPreferences.ts +0 -33
  289. package/src/lexicon/types/app/bsky/notification/putPreferencesV2.ts +0 -56
  290. package/src/lexicon/types/app/bsky/notification/registerPush.ts +0 -38
  291. package/src/lexicon/types/app/bsky/notification/unregisterPush.ts +0 -36
  292. package/src/lexicon/types/app/bsky/notification/updateSeen.ts +0 -33
  293. package/src/lexicon/types/app/bsky/richtext/facet.ts +0 -97
  294. package/src/lexicon/types/app/bsky/unspecced/defs.ts +0 -250
  295. package/src/lexicon/types/app/bsky/unspecced/getAgeAssuranceState.ts +0 -34
  296. package/src/lexicon/types/app/bsky/unspecced/getConfig.ts +0 -54
  297. package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +0 -40
  298. package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts +0 -41
  299. package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts +0 -47
  300. package/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts +0 -43
  301. package/src/lexicon/types/app/bsky/unspecced/getPostThreadOtherV2.ts +0 -60
  302. package/src/lexicon/types/app/bsky/unspecced/getPostThreadV2.ts +0 -77
  303. package/src/lexicon/types/app/bsky/unspecced/getSuggestedFeeds.ts +0 -40
  304. package/src/lexicon/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts +0 -41
  305. package/src/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +0 -46
  306. package/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.ts +0 -40
  307. package/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts +0 -41
  308. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +0 -46
  309. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts +0 -42
  310. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts +0 -43
  311. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts +0 -44
  312. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts +0 -45
  313. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts +0 -44
  314. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts +0 -45
  315. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +0 -47
  316. package/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +0 -52
  317. package/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts +0 -54
  318. package/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts +0 -43
  319. package/src/lexicon/types/app/bsky/unspecced/getTrends.ts +0 -40
  320. package/src/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.ts +0 -42
  321. package/src/lexicon/types/app/bsky/unspecced/initAgeAssurance.ts +0 -48
  322. package/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts +0 -52
  323. package/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts +0 -68
  324. package/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +0 -50
  325. package/src/lexicon/types/app/bsky/video/defs.ts +0 -38
  326. package/src/lexicon/types/app/bsky/video/getJobStatus.ts +0 -40
  327. package/src/lexicon/types/app/bsky/video/getUploadLimits.ts +0 -41
  328. package/src/lexicon/types/app/bsky/video/uploadVideo.ts +0 -42
  329. package/src/lexicon/types/chat/bsky/actor/declaration.ts +0 -39
  330. package/src/lexicon/types/chat/bsky/actor/defs.ts +0 -96
  331. package/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +0 -35
  332. package/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +0 -33
  333. package/src/lexicon/types/chat/bsky/convo/acceptConvo.ts +0 -45
  334. package/src/lexicon/types/chat/bsky/convo/addReaction.ts +0 -52
  335. package/src/lexicon/types/chat/bsky/convo/defs.ts +0 -1058
  336. package/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +0 -44
  337. package/src/lexicon/types/chat/bsky/convo/getConvo.ts +0 -41
  338. package/src/lexicon/types/chat/bsky/convo/getConvoAvailability.ts +0 -41
  339. package/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +0 -46
  340. package/src/lexicon/types/chat/bsky/convo/getConvoMembers.ts +0 -44
  341. package/src/lexicon/types/chat/bsky/convo/getLog.ts +0 -70
  342. package/src/lexicon/types/chat/bsky/convo/getMessages.ts +0 -52
  343. package/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +0 -45
  344. package/src/lexicon/types/chat/bsky/convo/listConvoRequests.ts +0 -47
  345. package/src/lexicon/types/chat/bsky/convo/listConvos.ts +0 -49
  346. package/src/lexicon/types/chat/bsky/convo/lockConvo.ts +0 -45
  347. package/src/lexicon/types/chat/bsky/convo/muteConvo.ts +0 -45
  348. package/src/lexicon/types/chat/bsky/convo/removeReaction.ts +0 -51
  349. package/src/lexicon/types/chat/bsky/convo/sendMessage.ts +0 -44
  350. package/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +0 -61
  351. package/src/lexicon/types/chat/bsky/convo/unlockConvo.ts +0 -45
  352. package/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +0 -45
  353. package/src/lexicon/types/chat/bsky/convo/updateAllRead.ts +0 -44
  354. package/src/lexicon/types/chat/bsky/convo/updateRead.ts +0 -46
  355. package/src/lexicon/types/chat/bsky/group/addMembers.ts +0 -57
  356. package/src/lexicon/types/chat/bsky/group/approveJoinRequest.ts +0 -46
  357. package/src/lexicon/types/chat/bsky/group/createGroup.ts +0 -51
  358. package/src/lexicon/types/chat/bsky/group/createJoinLink.ts +0 -47
  359. package/src/lexicon/types/chat/bsky/group/defs.ts +0 -75
  360. package/src/lexicon/types/chat/bsky/group/disableJoinLink.ts +0 -45
  361. package/src/lexicon/types/chat/bsky/group/editGroup.ts +0 -46
  362. package/src/lexicon/types/chat/bsky/group/editJoinLink.ts +0 -47
  363. package/src/lexicon/types/chat/bsky/group/enableJoinLink.ts +0 -49
  364. package/src/lexicon/types/chat/bsky/group/getJoinLinkPreview.ts +0 -41
  365. package/src/lexicon/types/chat/bsky/group/listJoinRequests.ts +0 -44
  366. package/src/lexicon/types/chat/bsky/group/rejectJoinRequest.ts +0 -43
  367. package/src/lexicon/types/chat/bsky/group/removeMembers.ts +0 -46
  368. package/src/lexicon/types/chat/bsky/group/requestJoin.ts +0 -52
  369. package/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +0 -59
  370. package/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +0 -52
  371. package/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts +0 -386
  372. package/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +0 -35
  373. package/src/lexicon/types/com/atproto/admin/defs.ts +0 -106
  374. package/src/lexicon/types/com/atproto/admin/deleteAccount.ts +0 -33
  375. package/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts +0 -35
  376. package/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts +0 -34
  377. package/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts +0 -35
  378. package/src/lexicon/types/com/atproto/admin/getAccountInfo.ts +0 -36
  379. package/src/lexicon/types/com/atproto/admin/getAccountInfos.ts +0 -40
  380. package/src/lexicon/types/com/atproto/admin/getInviteCodes.ts +0 -43
  381. package/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts +0 -49
  382. package/src/lexicon/types/com/atproto/admin/searchAccounts.ts +0 -43
  383. package/src/lexicon/types/com/atproto/admin/sendEmail.ts +0 -48
  384. package/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts +0 -35
  385. package/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts +0 -34
  386. package/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts +0 -34
  387. package/src/lexicon/types/com/atproto/admin/updateAccountSigningKey.ts +0 -35
  388. package/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts +0 -56
  389. package/src/lexicon/types/com/atproto/identity/defs.ts +0 -34
  390. package/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts +0 -41
  391. package/src/lexicon/types/com/atproto/identity/refreshIdentity.ts +0 -43
  392. package/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts +0 -26
  393. package/src/lexicon/types/com/atproto/identity/resolveDid.ts +0 -42
  394. package/src/lexicon/types/com/atproto/identity/resolveHandle.ts +0 -41
  395. package/src/lexicon/types/com/atproto/identity/resolveIdentity.ts +0 -38
  396. package/src/lexicon/types/com/atproto/identity/signPlcOperation.ts +0 -49
  397. package/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts +0 -33
  398. package/src/lexicon/types/com/atproto/identity/updateHandle.ts +0 -34
  399. package/src/lexicon/types/com/atproto/label/defs.ts +0 -143
  400. package/src/lexicon/types/com/atproto/label/queryLabels.ts +0 -46
  401. package/src/lexicon/types/com/atproto/label/subscribeLabels.ts +0 -58
  402. package/src/lexicon/types/com/atproto/lexicon/resolveLexicon.ts +0 -46
  403. package/src/lexicon/types/com/atproto/lexicon/schema.ts +0 -38
  404. package/src/lexicon/types/com/atproto/moderation/createReport.ts +0 -80
  405. package/src/lexicon/types/com/atproto/moderation/defs.ts +0 -83
  406. package/src/lexicon/types/com/atproto/repo/applyWrites.ts +0 -158
  407. package/src/lexicon/types/com/atproto/repo/createRecord.ts +0 -59
  408. package/src/lexicon/types/com/atproto/repo/defs.ts +0 -31
  409. package/src/lexicon/types/com/atproto/repo/deleteRecord.ts +0 -54
  410. package/src/lexicon/types/com/atproto/repo/describeRepo.ts +0 -47
  411. package/src/lexicon/types/com/atproto/repo/getRecord.ts +0 -49
  412. package/src/lexicon/types/com/atproto/repo/importRepo.ts +0 -31
  413. package/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts +0 -57
  414. package/src/lexicon/types/com/atproto/repo/listRecords.ts +0 -65
  415. package/src/lexicon/types/com/atproto/repo/putRecord.ts +0 -61
  416. package/src/lexicon/types/com/atproto/repo/strongRef.ts +0 -31
  417. package/src/lexicon/types/com/atproto/repo/uploadBlob.ts +0 -41
  418. package/src/lexicon/types/com/atproto/server/activateAccount.ts +0 -26
  419. package/src/lexicon/types/com/atproto/server/checkAccountStatus.ts +0 -45
  420. package/src/lexicon/types/com/atproto/server/confirmEmail.ts +0 -35
  421. package/src/lexicon/types/com/atproto/server/createAccount.ts +0 -71
  422. package/src/lexicon/types/com/atproto/server/createAppPassword.ts +0 -63
  423. package/src/lexicon/types/com/atproto/server/createInviteCode.ts +0 -44
  424. package/src/lexicon/types/com/atproto/server/createInviteCodes.ts +0 -61
  425. package/src/lexicon/types/com/atproto/server/createSession.ts +0 -59
  426. package/src/lexicon/types/com/atproto/server/deactivateAccount.ts +0 -34
  427. package/src/lexicon/types/com/atproto/server/defs.ts +0 -52
  428. package/src/lexicon/types/com/atproto/server/deleteAccount.ts +0 -36
  429. package/src/lexicon/types/com/atproto/server/deleteSession.ts +0 -27
  430. package/src/lexicon/types/com/atproto/server/describeServer.ts +0 -76
  431. package/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts +0 -43
  432. package/src/lexicon/types/com/atproto/server/getServiceAuth.ts +0 -45
  433. package/src/lexicon/types/com/atproto/server/getSession.ts +0 -45
  434. package/src/lexicon/types/com/atproto/server/listAppPasswords.ts +0 -55
  435. package/src/lexicon/types/com/atproto/server/refreshSession.ts +0 -48
  436. package/src/lexicon/types/com/atproto/server/requestAccountDelete.ts +0 -26
  437. package/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts +0 -26
  438. package/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts +0 -37
  439. package/src/lexicon/types/com/atproto/server/requestPasswordReset.ts +0 -33
  440. package/src/lexicon/types/com/atproto/server/reserveSigningKey.ts +0 -45
  441. package/src/lexicon/types/com/atproto/server/resetPassword.ts +0 -35
  442. package/src/lexicon/types/com/atproto/server/revokeAppPassword.ts +0 -33
  443. package/src/lexicon/types/com/atproto/server/updateEmail.ts +0 -37
  444. package/src/lexicon/types/com/atproto/sync/defs.ts +0 -23
  445. package/src/lexicon/types/com/atproto/sync/getBlob.ts +0 -44
  446. package/src/lexicon/types/com/atproto/sync/getBlocks.ts +0 -43
  447. package/src/lexicon/types/com/atproto/sync/getCheckout.ts +0 -36
  448. package/src/lexicon/types/com/atproto/sync/getHead.ts +0 -41
  449. package/src/lexicon/types/com/atproto/sync/getHostStatus.ts +0 -47
  450. package/src/lexicon/types/com/atproto/sync/getLatestCommit.ts +0 -42
  451. package/src/lexicon/types/com/atproto/sync/getRecord.ts +0 -45
  452. package/src/lexicon/types/com/atproto/sync/getRepo.ts +0 -39
  453. package/src/lexicon/types/com/atproto/sync/getRepoStatus.ts +0 -53
  454. package/src/lexicon/types/com/atproto/sync/listBlobs.ts +0 -46
  455. package/src/lexicon/types/com/atproto/sync/listHosts.ts +0 -63
  456. package/src/lexicon/types/com/atproto/sync/listRepos.ts +0 -69
  457. package/src/lexicon/types/com/atproto/sync/listReposByCollection.ts +0 -58
  458. package/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts +0 -34
  459. package/src/lexicon/types/com/atproto/sync/requestCrawl.ts +0 -35
  460. package/src/lexicon/types/com/atproto/sync/subscribeRepos.ts +0 -179
  461. package/src/lexicon/types/com/atproto/temp/addReservedHandle.ts +0 -41
  462. package/src/lexicon/types/com/atproto/temp/checkHandleAvailability.ts +0 -99
  463. package/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts +0 -39
  464. package/src/lexicon/types/com/atproto/temp/dereferenceScope.ts +0 -42
  465. package/src/lexicon/types/com/atproto/temp/fetchLabels.ts +0 -41
  466. package/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts +0 -33
  467. package/src/lexicon/types/com/atproto/temp/revokeAccountCredentials.ts +0 -33
  468. package/src/lexicon/types/tools/ozone/communication/createTemplate.ts +0 -52
  469. package/src/lexicon/types/tools/ozone/communication/defs.ts +0 -43
  470. package/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts +0 -33
  471. package/src/lexicon/types/tools/ozone/communication/listTemplates.ts +0 -38
  472. package/src/lexicon/types/tools/ozone/communication/updateTemplate.ts +0 -55
  473. package/src/lexicon/types/tools/ozone/hosting/getAccountHistory.ts +0 -147
  474. package/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts +0 -79
  475. package/src/lexicon/types/tools/ozone/moderation/defs.ts +0 -1176
  476. package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +0 -104
  477. package/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts +0 -105
  478. package/src/lexicon/types/tools/ozone/moderation/getEvent.ts +0 -36
  479. package/src/lexicon/types/tools/ozone/moderation/getRecord.ts +0 -38
  480. package/src/lexicon/types/tools/ozone/moderation/getRecords.ts +0 -44
  481. package/src/lexicon/types/tools/ozone/moderation/getRepo.ts +0 -37
  482. package/src/lexicon/types/tools/ozone/moderation/getReporterStats.ts +0 -40
  483. package/src/lexicon/types/tools/ozone/moderation/getRepos.ts +0 -44
  484. package/src/lexicon/types/tools/ozone/moderation/getSubjects.ts +0 -40
  485. package/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts +0 -57
  486. package/src/lexicon/types/tools/ozone/moderation/queryEvents.ts +0 -86
  487. package/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +0 -121
  488. package/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts +0 -133
  489. package/src/lexicon/types/tools/ozone/moderation/searchRepos.ts +0 -45
  490. package/src/lexicon/types/tools/ozone/queue/assignModerator.ts +0 -46
  491. package/src/lexicon/types/tools/ozone/queue/createQueue.ts +0 -54
  492. package/src/lexicon/types/tools/ozone/queue/defs.ts +0 -99
  493. package/src/lexicon/types/tools/ozone/queue/deleteQueue.ts +0 -48
  494. package/src/lexicon/types/tools/ozone/queue/getAssignments.ts +0 -48
  495. package/src/lexicon/types/tools/ozone/queue/listQueues.ts +0 -50
  496. package/src/lexicon/types/tools/ozone/queue/routeReports.ts +0 -50
  497. package/src/lexicon/types/tools/ozone/queue/unassignModerator.ts +0 -37
  498. package/src/lexicon/types/tools/ozone/queue/updateQueue.ts +0 -51
  499. package/src/lexicon/types/tools/ozone/report/assignModerator.ts +0 -50
  500. package/src/lexicon/types/tools/ozone/report/createActivity.ts +0 -60
  501. package/src/lexicon/types/tools/ozone/report/defs.ts +0 -466
  502. package/src/lexicon/types/tools/ozone/report/getAssignments.ts +0 -48
  503. package/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts +0 -54
  504. package/src/lexicon/types/tools/ozone/report/getLatestReport.ts +0 -39
  505. package/src/lexicon/types/tools/ozone/report/getLiveStats.ts +0 -45
  506. package/src/lexicon/types/tools/ozone/report/getReport.ts +0 -38
  507. package/src/lexicon/types/tools/ozone/report/listActivities.ts +0 -44
  508. package/src/lexicon/types/tools/ozone/report/queryReports.ts +0 -72
  509. package/src/lexicon/types/tools/ozone/report/reassignQueue.ts +0 -55
  510. package/src/lexicon/types/tools/ozone/report/refreshStats.ts +0 -46
  511. package/src/lexicon/types/tools/ozone/report/unassignModerator.ts +0 -44
  512. package/src/lexicon/types/tools/ozone/safelink/addRule.ts +0 -51
  513. package/src/lexicon/types/tools/ozone/safelink/defs.ts +0 -76
  514. package/src/lexicon/types/tools/ozone/safelink/queryEvents.ts +0 -55
  515. package/src/lexicon/types/tools/ozone/safelink/queryRules.ts +0 -61
  516. package/src/lexicon/types/tools/ozone/safelink/removeRule.ts +0 -49
  517. package/src/lexicon/types/tools/ozone/safelink/updateRule.ts +0 -51
  518. package/src/lexicon/types/tools/ozone/server/getConfig.ts +0 -78
  519. package/src/lexicon/types/tools/ozone/set/addValues.ts +0 -36
  520. package/src/lexicon/types/tools/ozone/set/defs.ts +0 -50
  521. package/src/lexicon/types/tools/ozone/set/deleteSet.ts +0 -43
  522. package/src/lexicon/types/tools/ozone/set/deleteValues.ts +0 -37
  523. package/src/lexicon/types/tools/ozone/set/getValues.ts +0 -45
  524. package/src/lexicon/types/tools/ozone/set/querySets.ts +0 -46
  525. package/src/lexicon/types/tools/ozone/set/upsertSet.ts +0 -38
  526. package/src/lexicon/types/tools/ozone/setting/defs.ts +0 -44
  527. package/src/lexicon/types/tools/ozone/setting/listOptions.ts +0 -47
  528. package/src/lexicon/types/tools/ozone/setting/removeOptions.ts +0 -42
  529. package/src/lexicon/types/tools/ozone/setting/upsertOption.ts +0 -53
  530. package/src/lexicon/types/tools/ozone/signature/defs.ts +0 -31
  531. package/src/lexicon/types/tools/ozone/signature/findCorrelation.ts +0 -40
  532. package/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts +0 -60
  533. package/src/lexicon/types/tools/ozone/signature/searchAccounts.ts +0 -43
  534. package/src/lexicon/types/tools/ozone/team/addMember.ts +0 -49
  535. package/src/lexicon/types/tools/ozone/team/defs.ts +0 -51
  536. package/src/lexicon/types/tools/ozone/team/deleteMember.ts +0 -34
  537. package/src/lexicon/types/tools/ozone/team/listMembers.ts +0 -45
  538. package/src/lexicon/types/tools/ozone/team/updateMember.ts +0 -50
  539. package/src/lexicon/types/tools/ozone/verification/defs.ts +0 -59
  540. package/src/lexicon/types/tools/ozone/verification/grantVerifications.ts +0 -87
  541. package/src/lexicon/types/tools/ozone/verification/listVerifications.ts +0 -56
  542. package/src/lexicon/types/tools/ozone/verification/revokeVerifications.ts +0 -68
  543. package/src/lexicon/util.ts +0 -82
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/mod-service/status.ts"],"names":[],"mappings":"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","sourcesContent":["// This may require better organization but for now, just dumping functions here containing DB queries for moderation status\n\nimport { HOUR } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { isAppealReport } from '../api/util.js'\nimport { Database } from '../db/index.js'\nimport { DatabaseSchema } from '../db/schema/index.js'\nimport { jsonb } from '../db/types.js'\nimport {\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWNONE,\n REVIEWOPEN,\n} from '../lexicon/types/tools/ozone/moderation/defs.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\nconst getSubjectStatusForModerationEvent = ({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours,\n}: {\n currentStatus?: ModerationSubjectStatusRow\n action: string\n createdBy: string\n createdAt: string\n durationInHours: number | null\n}): Partial<ModerationSubjectStatusRow> => {\n const defaultReviewState = currentStatus\n ? currentStatus.reviewState\n : REVIEWNONE\n\n switch (action) {\n case 'tools.ozone.moderation.defs#modEventAcknowledge':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReport':\n return {\n reviewState: REVIEWOPEN,\n lastReportedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventEscalate':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWESCALATED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReverseTakedown':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n takendown: false,\n suspendUntil: null,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmuteReporter':\n return {\n lastReviewedBy: createdBy,\n muteReportingUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmute':\n return {\n lastReviewedBy: createdBy,\n muteUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventTakedown':\n return {\n // If we are doing a takedown, safe to move the item out of appealed state\n ...(currentStatus?.appealed ? { appealed: false } : {}),\n takendown: true,\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n suspendUntil: durationInHours\n ? new Date(Date.now() + durationInHours * HOUR).toISOString()\n : null,\n }\n case 'tools.ozone.moderation.defs#modEventMuteReporter':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteReportingUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventMute':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventComment':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventTag':\n return { tags: [], reviewState: defaultReviewState }\n case 'tools.ozone.moderation.defs#modEventResolveAppeal':\n return {\n appealed: false,\n }\n case 'tools.ozone.moderation.defs#ageAssuranceEvent':\n case 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent':\n case 'tools.ozone.moderation.defs#ageAssurancePurgeEvent':\n return {\n reviewState: defaultReviewState,\n }\n default:\n return {}\n }\n}\n\nconst hostingEvents = [\n 'tools.ozone.moderation.defs#accountEvent',\n 'tools.ozone.moderation.defs#identityEvent',\n 'tools.ozone.moderation.defs#recordEvent',\n]\n\nconst getSubjectStatusForRecordEvent = ({\n event,\n currentStatus,\n}: {\n event: ModerationEventRow\n currentStatus?: ModerationSubjectStatusRow\n}): Partial<ModerationSubjectStatusRow> => {\n const timestamp =\n typeof event.meta?.timestamp === 'string'\n ? event.meta?.timestamp\n : event.createdAt\n\n if (event.action === 'tools.ozone.moderation.defs#recordEvent') {\n if (event.meta?.op === 'delete') {\n return {\n hostingStatus: 'deleted',\n hostingDeletedAt: timestamp,\n }\n } else if (event.meta?.op === 'update') {\n return {\n hostingStatus: 'active',\n hostingUpdatedAt: timestamp,\n }\n }\n return {}\n }\n\n if (event.action === 'tools.ozone.moderation.defs#accountEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.status) {\n status.hostingStatus = `${event.meta?.status}`\n }\n\n if (event.meta?.status === 'deleted') {\n status.hostingDeletedAt = timestamp\n } else if (event.meta?.status === 'deactivated') {\n status.hostingDeactivatedAt = timestamp\n } else {\n // When deactivated accounts are re-activated, we receive the event with just the active flag set to true\n // so we want to make sure that the hostingStatus is not set to an outdated value\n if (\n currentStatus?.hostingStatus === 'deactivated' &&\n event.meta?.active\n ) {\n status.hostingStatus = 'active'\n status.hostingReactivatedAt = timestamp\n }\n }\n\n return status\n }\n\n if (event.action === 'tools.ozone.moderation.defs#identityEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.tombstone) {\n status.hostingStatus = 'tombstoned'\n status.hostingDeletedAt = timestamp\n }\n\n return status\n }\n\n return {}\n}\n\nexport const moderationSubjectStatusQueryBuilder = (db: DatabaseSchema) => {\n // @NOTE: Using select() instead of selectAll() below because the materialized\n // views might be incomplete, and we don't want the null `did` columns to\n // interfere with the (never null) `did` column from the\n // `moderation_subject_status` table in the results\n return db\n .selectFrom('moderation_subject_status')\n .selectAll('moderation_subject_status')\n .leftJoin('account_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_events_stats.takedownCount',\n 'account_events_stats.suspendCount',\n 'account_events_stats.escalateCount',\n 'account_events_stats.reportCount',\n 'account_events_stats.appealCount',\n ])\n .leftJoin('account_record_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_record_events_stats.totalReports',\n 'account_record_events_stats.reportedCount',\n 'account_record_events_stats.escalatedCount',\n 'account_record_events_stats.appealedCount',\n ])\n .leftJoin('account_record_status_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_status_stats.did',\n ),\n )\n .select([\n 'account_record_status_stats.subjectCount',\n 'account_record_status_stats.pendingCount',\n 'account_record_status_stats.processedCount',\n 'account_record_status_stats.takendownCount',\n ])\n .leftJoin('account_strike', (join) =>\n join.onRef('moderation_subject_status.did', '=', 'account_strike.did'),\n )\n .select([\n 'account_strike.activeStrikeCount as strikeCount',\n 'account_strike.totalStrikeCount',\n 'account_strike.firstStrikeAt',\n 'account_strike.lastStrikeAt',\n ])\n}\n\n// Based on a given moderation action event, this function will update the moderation status of the subject\n// If there's no existing status, it will create one\n// If the action event does not affect the status, it will do nothing\nexport const adjustModerationSubjectStatus = async (\n db: Database,\n moderationEvent: ModerationEventRow,\n blobCids?: string[],\n): Promise<ModerationSubjectStatusRow | null> => {\n const {\n action,\n subjectDid,\n subjectUri,\n subjectCid,\n createdBy,\n meta,\n addedTags,\n removedTags,\n comment,\n createdAt,\n } = moderationEvent\n\n // If subjectUri exists, it's not a repoRef so pass along the uri to get identifier back\n const identifier = getStatusIdentifierFromSubject(subjectUri || subjectDid)\n\n db.assertTransaction()\n\n const now = new Date().toISOString()\n const currentStatus = await db.db\n .selectFrom('moderation_subject_status')\n .where('did', '=', identifier.did)\n .where('recordPath', '=', identifier.recordPath)\n // Make sure we respect other updates that may be happening at the same time\n .forUpdate()\n .selectAll()\n .executeTakeFirst()\n\n if (hostingEvents.includes(action)) {\n const newStatus = getSubjectStatusForRecordEvent({\n event: moderationEvent,\n currentStatus,\n })\n if (!Object.keys(newStatus).length) {\n return currentStatus || null\n }\n\n const status = await db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n // newStatus doesn't contain a reviewState or takendown so in case this is a new entry\n // we need to set a default values so that the insert doesn't fail\n reviewState: currentStatus ? currentStatus.reviewState : REVIEWNONE,\n // @TODO: should we try to update this based on status property of account event?\n // For now we're the only one emitting takedowns so i don't think it makes too much of a difference\n takendown: currentStatus ? currentStatus.takendown : false,\n ageAssuranceState: currentStatus\n ? currentStatus.ageAssuranceState\n : 'unknown',\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...newStatus,\n updatedAt: now,\n }),\n )\n .returningAll()\n .executeTakeFirst()\n\n return status || null\n }\n\n // If reporting is muted for this reporter, we don't want to update the subject status\n if (meta?.isReporterMuted) {\n return currentStatus || null\n }\n\n const isAppealEvent =\n action === 'tools.ozone.moderation.defs#modEventReport' &&\n meta?.reportType &&\n isAppealReport(`${meta.reportType}`)\n\n const subjectStatus = getSubjectStatusForModerationEvent({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours: moderationEvent.durationInHours,\n })\n\n if (\n currentStatus?.reviewState === REVIEWESCALATED &&\n subjectStatus.reviewState !== REVIEWCLOSED\n ) {\n // If the current status is escalated only allow incoming events to move the state to\n // reviewClosed because escalated subjects should never move to any other state\n subjectStatus.reviewState = REVIEWESCALATED\n }\n\n if (currentStatus && subjectStatus.reviewState === REVIEWNONE) {\n // reviewNone is ONLY allowed when there is no current status\n // If there is a current status, it should not be allowed to move back to reviewNone\n subjectStatus.reviewState = currentStatus.reviewState\n }\n\n // Set these because we don't want to override them if they're already set\n const defaultData = {\n comment: null,\n // Defaulting reviewState to open for any event may not be the desired behavior.\n // For instance, if a subject never had any event and we just want to leave a comment to keep an eye on it\n // that shouldn't mean we want to review the subject\n reviewState: REVIEWNONE,\n recordCid: subjectCid || null,\n ageAssuranceState: currentStatus?.ageAssuranceState || 'unknown',\n }\n const newStatus = {\n ...defaultData,\n ...subjectStatus,\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventPriorityScore' &&\n typeof meta?.priorityScore === 'number'\n ) {\n newStatus.priorityScore = meta?.priorityScore\n subjectStatus.priorityScore = meta?.priorityScore\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventReverseTakedown' &&\n !subjectStatus.takendown\n ) {\n newStatus.takendown = false\n subjectStatus.takendown = false\n }\n\n if (isAppealEvent) {\n newStatus.appealed = true\n subjectStatus.appealed = true\n newStatus.lastAppealedAt = createdAt\n subjectStatus.lastAppealedAt = createdAt\n // Set reviewState to escalated when appeal events are emitted\n subjectStatus.reviewState = REVIEWESCALATED\n newStatus.reviewState = REVIEWESCALATED\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventResolveAppeal' &&\n subjectStatus.appealed\n ) {\n newStatus.appealed = false\n subjectStatus.appealed = false\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventComment' &&\n meta?.sticky\n ) {\n newStatus.comment = comment\n subjectStatus.comment = comment\n }\n\n if (action === 'tools.ozone.moderation.defs#modEventTag') {\n let tags = currentStatus?.tags || []\n if (addedTags?.length) {\n tags = tags.concat(addedTags)\n }\n if (removedTags?.length) {\n tags = tags.filter((tag) => !removedTags.includes(tag))\n }\n newStatus.tags = jsonb([...new Set(tags)]) as unknown as string[]\n subjectStatus.tags = newStatus.tags\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceEvent') {\n // Only when the last update was made by an admin AND state was set to reset user event can override final state\n if (\n currentStatus?.ageAssuranceUpdatedBy !== 'admin' ||\n currentStatus?.ageAssuranceState === 'reset'\n ) {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'user'\n subjectStatus.ageAssuranceUpdatedBy = 'user'\n }\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent') {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'admin'\n subjectStatus.ageAssuranceUpdatedBy = 'admin'\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssurancePurgeEvent') {\n newStatus.ageAssuranceState = 'unknown'\n subjectStatus.ageAssuranceState = 'unknown'\n newStatus.ageAssuranceUpdatedBy = null\n subjectStatus.ageAssuranceUpdatedBy = null\n }\n\n if (blobCids?.length) {\n const newBlobCids = jsonb(\n blobCids,\n ) as unknown as ModerationSubjectStatusRow['blobCids']\n newStatus.blobCids = newBlobCids\n subjectStatus.blobCids = newBlobCids\n }\n\n const insertQuery = db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n createdAt: now,\n updatedAt: now,\n } as ModerationSubjectStatusRow)\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...subjectStatus,\n updatedAt: now,\n }),\n )\n\n const status = await insertQuery.returningAll().executeTakeFirst()\n return status || null\n}\n\nexport const getStatusIdentifierFromSubject = (\n subject: string | AtUri,\n): { did: string; recordPath: string } => {\n const isSubjectString = typeof subject === 'string'\n if (isSubjectString && subject.startsWith('did:')) {\n return {\n did: subject,\n recordPath: '',\n }\n }\n\n if (isSubjectString && !subject.startsWith('at://')) {\n throw new Error('Subject is neither a did nor an at-uri')\n }\n\n const uri = isSubjectString ? new AtUri(subject) : subject\n return {\n did: uri.host,\n recordPath: `${uri.collection}/${uri.rkey}`,\n }\n}\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/mod-service/status.ts"],"names":[],"mappings":"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","sourcesContent":["// This may require better organization but for now, just dumping functions here containing DB queries for moderation status\n\nimport { HOUR } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { isAppealReport } from '../api/util.js'\nimport { Database } from '../db/index.js'\nimport { DatabaseSchema } from '../db/schema/index.js'\nimport { jsonb } from '../db/types.js'\nimport {\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWNONE,\n REVIEWOPEN,\n} from '../lexicon/types/tools/ozone/moderation/defs.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\nconst getSubjectStatusForModerationEvent = ({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours,\n}: {\n currentStatus?: ModerationSubjectStatusRow\n action: string\n createdBy: string\n createdAt: string\n durationInHours: number | null\n}): Partial<ModerationSubjectStatusRow> => {\n const defaultReviewState = currentStatus\n ? currentStatus.reviewState\n : REVIEWNONE\n\n switch (action) {\n case 'tools.ozone.moderation.defs#modEventAcknowledge':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReport':\n return {\n reviewState: REVIEWOPEN,\n lastReportedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventEscalate':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWESCALATED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReverseTakedown':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n takendown: false,\n suspendUntil: null,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmuteReporter':\n return {\n lastReviewedBy: createdBy,\n muteReportingUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmute':\n return {\n lastReviewedBy: createdBy,\n muteUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventTakedown':\n return {\n // If we are doing a takedown, safe to move the item out of appealed state\n ...(currentStatus?.appealed ? { appealed: false } : {}),\n takendown: true,\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n suspendUntil: durationInHours\n ? new Date(Date.now() + durationInHours * HOUR).toISOString()\n : null,\n }\n case 'tools.ozone.moderation.defs#modEventMuteReporter':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteReportingUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventMute':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventComment':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventTag':\n return { tags: [], reviewState: defaultReviewState }\n case 'tools.ozone.moderation.defs#modEventResolveAppeal':\n return {\n appealed: false,\n }\n case 'tools.ozone.moderation.defs#ageAssuranceEvent':\n case 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent':\n case 'tools.ozone.moderation.defs#ageAssurancePurgeEvent':\n return {\n reviewState: defaultReviewState,\n }\n default:\n return {}\n }\n}\n\nconst hostingEvents = [\n 'tools.ozone.moderation.defs#accountEvent',\n 'tools.ozone.moderation.defs#identityEvent',\n 'tools.ozone.moderation.defs#recordEvent',\n]\n\nconst getSubjectStatusForRecordEvent = ({\n event,\n currentStatus,\n}: {\n event: ModerationEventRow\n currentStatus?: ModerationSubjectStatusRow\n}): Partial<ModerationSubjectStatusRow> => {\n const timestamp =\n typeof event.meta?.timestamp === 'string'\n ? event.meta?.timestamp\n : event.createdAt\n\n if (event.action === 'tools.ozone.moderation.defs#recordEvent') {\n if (event.meta?.op === 'delete') {\n return {\n hostingStatus: 'deleted',\n hostingDeletedAt: timestamp,\n }\n } else if (event.meta?.op === 'update') {\n return {\n hostingStatus: 'active',\n hostingUpdatedAt: timestamp,\n }\n }\n return {}\n }\n\n if (event.action === 'tools.ozone.moderation.defs#accountEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.status) {\n status.hostingStatus = `${event.meta?.status}`\n }\n\n if (event.meta?.status === 'deleted') {\n status.hostingDeletedAt = timestamp\n } else if (event.meta?.status === 'deactivated') {\n status.hostingDeactivatedAt = timestamp\n } else {\n // When deactivated accounts are re-activated, we receive the event with just the active flag set to true\n // so we want to make sure that the hostingStatus is not set to an outdated value\n if (\n currentStatus?.hostingStatus === 'deactivated' &&\n event.meta?.active\n ) {\n status.hostingStatus = 'active'\n status.hostingReactivatedAt = timestamp\n }\n }\n\n return status\n }\n\n if (event.action === 'tools.ozone.moderation.defs#identityEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.tombstone) {\n status.hostingStatus = 'tombstoned'\n status.hostingDeletedAt = timestamp\n }\n\n return status\n }\n\n return {}\n}\n\nexport const moderationSubjectStatusQueryBuilder = (db: DatabaseSchema) => {\n // @NOTE: Using select() instead of selectAll() below because the materialized\n // views might be incomplete, and we don't want the null `did` columns to\n // interfere with the (never null) `did` column from the\n // `moderation_subject_status` table in the results\n return db\n .selectFrom('moderation_subject_status')\n .selectAll('moderation_subject_status')\n .leftJoin('account_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_events_stats.takedownCount',\n 'account_events_stats.suspendCount',\n 'account_events_stats.escalateCount',\n 'account_events_stats.reportCount',\n 'account_events_stats.appealCount',\n ])\n .leftJoin('account_record_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_record_events_stats.totalReports',\n 'account_record_events_stats.reportedCount',\n 'account_record_events_stats.escalatedCount',\n 'account_record_events_stats.appealedCount',\n ])\n .leftJoin('account_record_status_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_status_stats.did',\n ),\n )\n .select([\n 'account_record_status_stats.subjectCount',\n 'account_record_status_stats.pendingCount',\n 'account_record_status_stats.processedCount',\n 'account_record_status_stats.takendownCount',\n ])\n .leftJoin('account_strike', (join) =>\n join.onRef('moderation_subject_status.did', '=', 'account_strike.did'),\n )\n .select([\n 'account_strike.activeStrikeCount as strikeCount',\n 'account_strike.totalStrikeCount',\n 'account_strike.firstStrikeAt',\n 'account_strike.lastStrikeAt',\n ])\n}\n\n// Based on a given moderation action event, this function will update the moderation status of the subject\n// If there's no existing status, it will create one\n// If the action event does not affect the status, it will do nothing\nexport const adjustModerationSubjectStatus = async (\n db: Database,\n moderationEvent: ModerationEventRow,\n blobCids?: string[],\n): Promise<ModerationSubjectStatusRow | null> => {\n const {\n action,\n subjectDid,\n subjectUri,\n subjectCid,\n subjectConvoId,\n createdBy,\n meta,\n addedTags,\n removedTags,\n comment,\n createdAt,\n } = moderationEvent\n\n // If subjectUri exists, it's not a repoRef so pass along the uri to get identifier back\n const identifier = getStatusIdentifierFromSubject(\n subjectUri || subjectDid,\n subjectConvoId,\n )\n\n db.assertTransaction()\n\n const now = new Date().toISOString()\n const currentStatus = await db.db\n .selectFrom('moderation_subject_status')\n .where('did', '=', identifier.did)\n .where('recordPath', '=', identifier.recordPath)\n .where('convoId', '=', identifier.convoId)\n // Make sure we respect other updates that may be happening at the same time\n .forUpdate()\n .selectAll()\n .executeTakeFirst()\n\n if (hostingEvents.includes(action)) {\n const newStatus = getSubjectStatusForRecordEvent({\n event: moderationEvent,\n currentStatus,\n })\n if (!Object.keys(newStatus).length) {\n return currentStatus || null\n }\n\n const status = await db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n // newStatus doesn't contain a reviewState or takendown so in case this is a new entry\n // we need to set a default values so that the insert doesn't fail\n reviewState: currentStatus ? currentStatus.reviewState : REVIEWNONE,\n // @TODO: should we try to update this based on status property of account event?\n // For now we're the only one emitting takedowns so i don't think it makes too much of a difference\n takendown: currentStatus ? currentStatus.takendown : false,\n ageAssuranceState: currentStatus\n ? currentStatus.ageAssuranceState\n : 'unknown',\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...newStatus,\n updatedAt: now,\n }),\n )\n .returningAll()\n .executeTakeFirst()\n\n return status || null\n }\n\n // If reporting is muted for this reporter, we don't want to update the subject status\n if (meta?.isReporterMuted) {\n return currentStatus || null\n }\n\n const isAppealEvent =\n action === 'tools.ozone.moderation.defs#modEventReport' &&\n meta?.reportType &&\n isAppealReport(`${meta.reportType}`)\n\n const subjectStatus = getSubjectStatusForModerationEvent({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours: moderationEvent.durationInHours,\n })\n\n if (\n currentStatus?.reviewState === REVIEWESCALATED &&\n subjectStatus.reviewState !== REVIEWCLOSED\n ) {\n // If the current status is escalated only allow incoming events to move the state to\n // reviewClosed because escalated subjects should never move to any other state\n subjectStatus.reviewState = REVIEWESCALATED\n }\n\n if (currentStatus && subjectStatus.reviewState === REVIEWNONE) {\n // reviewNone is ONLY allowed when there is no current status\n // If there is a current status, it should not be allowed to move back to reviewNone\n subjectStatus.reviewState = currentStatus.reviewState\n }\n\n // Set these because we don't want to override them if they're already set\n const defaultData = {\n comment: null,\n // Defaulting reviewState to open for any event may not be the desired behavior.\n // For instance, if a subject never had any event and we just want to leave a comment to keep an eye on it\n // that shouldn't mean we want to review the subject\n reviewState: REVIEWNONE,\n recordCid: subjectCid || null,\n ageAssuranceState: currentStatus?.ageAssuranceState || 'unknown',\n }\n const newStatus = {\n ...defaultData,\n ...subjectStatus,\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventPriorityScore' &&\n typeof meta?.priorityScore === 'number'\n ) {\n newStatus.priorityScore = meta?.priorityScore\n subjectStatus.priorityScore = meta?.priorityScore\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventReverseTakedown' &&\n !subjectStatus.takendown\n ) {\n newStatus.takendown = false\n subjectStatus.takendown = false\n }\n\n if (isAppealEvent) {\n newStatus.appealed = true\n subjectStatus.appealed = true\n newStatus.lastAppealedAt = createdAt\n subjectStatus.lastAppealedAt = createdAt\n // Set reviewState to escalated when appeal events are emitted\n subjectStatus.reviewState = REVIEWESCALATED\n newStatus.reviewState = REVIEWESCALATED\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventResolveAppeal' &&\n subjectStatus.appealed\n ) {\n newStatus.appealed = false\n subjectStatus.appealed = false\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventComment' &&\n meta?.sticky\n ) {\n newStatus.comment = comment\n subjectStatus.comment = comment\n }\n\n if (action === 'tools.ozone.moderation.defs#modEventTag') {\n let tags = currentStatus?.tags || []\n if (addedTags?.length) {\n tags = tags.concat(addedTags)\n }\n if (removedTags?.length) {\n tags = tags.filter((tag) => !removedTags.includes(tag))\n }\n newStatus.tags = jsonb([...new Set(tags)]) as unknown as string[]\n subjectStatus.tags = newStatus.tags\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceEvent') {\n // Only when the last update was made by an admin AND state was set to reset user event can override final state\n if (\n currentStatus?.ageAssuranceUpdatedBy !== 'admin' ||\n currentStatus?.ageAssuranceState === 'reset'\n ) {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'user'\n subjectStatus.ageAssuranceUpdatedBy = 'user'\n }\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent') {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'admin'\n subjectStatus.ageAssuranceUpdatedBy = 'admin'\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssurancePurgeEvent') {\n newStatus.ageAssuranceState = 'unknown'\n subjectStatus.ageAssuranceState = 'unknown'\n newStatus.ageAssuranceUpdatedBy = null\n subjectStatus.ageAssuranceUpdatedBy = null\n }\n\n if (blobCids?.length) {\n const newBlobCids = jsonb(\n blobCids,\n ) as unknown as ModerationSubjectStatusRow['blobCids']\n newStatus.blobCids = newBlobCids\n subjectStatus.blobCids = newBlobCids\n }\n\n const insertQuery = db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n createdAt: now,\n updatedAt: now,\n } as ModerationSubjectStatusRow)\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...subjectStatus,\n updatedAt: now,\n }),\n )\n\n const status = await insertQuery.returningAll().executeTakeFirst()\n return status || null\n}\n\n/**\n * Get moderation_subject_status identifier (did, recordPath, convoId).\n * @note Supports addressing conversations explicitly (via convoId) and implicitly (via properly formed at-uri)\n */\nexport const getStatusIdentifierFromSubject = (\n subject: string | AtUri,\n convoId?: string | null,\n): { did: string; recordPath: string; convoId: string } => {\n const isSubjectString = typeof subject === 'string'\n if (isSubjectString && subject.startsWith('did:')) {\n return {\n did: subject,\n recordPath: '',\n convoId: convoId || '',\n }\n }\n\n if (isSubjectString && !subject.startsWith('at://')) {\n throw new Error('Subject is neither a did nor an at-uri')\n }\n\n const uri = isSubjectString ? new AtUri(subject) : subject\n\n // Handle conversation URIs\n if (uri.collection === 'chat.bsky.convo') {\n return {\n did: uri.host,\n recordPath: '',\n convoId: uri.rkey,\n }\n }\n\n return {\n did: uri.host,\n recordPath: `${uri.collection}/${uri.rkey}`,\n convoId: '',\n }\n}\n"]}
@@ -9,36 +9,42 @@ import { ModerationEventRow, ModerationSubjectStatusRow } from './types.js';
9
9
  type SubjectInput = ReportInput['subject'] | ActionInput['subject'];
10
10
  type StrongRef = ComAtprotoRepoStrongRef.Main;
11
11
  type MessageRef = ChatBskyConvoDefs.MessageRef;
12
+ type ConvoRef = ChatBskyConvoDefs.ConvoRef;
12
13
  export declare const subjectFromInput: (subject: SubjectInput, blobs?: string[]) => ModSubject;
13
14
  export declare const subjectFromEventRow: (row: ModerationEventRow) => ModSubject;
14
15
  export declare const subjectFromStatusRow: (row: ModerationSubjectStatusRow) => ModSubject;
15
16
  type SubjectInfo = {
16
- subjectType: 'com.atproto.admin.defs#repoRef' | 'com.atproto.repo.strongRef' | 'chat.bsky.convo.defs#messageRef';
17
+ subjectType: 'com.atproto.admin.defs#repoRef' | 'com.atproto.repo.strongRef' | 'chat.bsky.convo.defs#messageRef' | 'chat.bsky.convo.defs#convoRef';
17
18
  subjectDid: string;
18
19
  subjectUri: string | null;
19
20
  subjectCid: string | null;
20
21
  subjectBlobCids: string[] | null;
21
22
  subjectMessageId: string | null;
23
+ subjectConvoId: string | null;
22
24
  meta: Record<string, string | undefined> | null;
23
25
  };
24
26
  export interface ModSubject {
25
27
  did: string;
26
28
  recordPath: string | undefined;
29
+ convoId: string | undefined;
27
30
  blobCids?: string[];
28
31
  isRepo(): this is RepoSubject;
29
32
  isRecord(): this is RecordSubject;
30
33
  isMessage(): this is MessageSubject;
34
+ isConvo(): this is ConvoSubject;
31
35
  info(): SubjectInfo;
32
- lex(): $Typed<RepoRef> | $Typed<StrongRef> | $Typed<MessageRef>;
36
+ lex(): $Typed<RepoRef> | $Typed<StrongRef> | $Typed<MessageRef> | $Typed<ConvoRef>;
33
37
  }
34
38
  export declare class RepoSubject implements ModSubject {
35
39
  did: string;
36
40
  blobCids: undefined;
37
41
  recordPath: undefined;
42
+ convoId: undefined;
38
43
  constructor(did: string);
39
44
  isRepo(): this is RepoSubject;
40
45
  isRecord(): this is RecordSubject;
41
46
  isMessage(): this is MessageSubject;
47
+ isConvo(): this is ConvoSubject;
42
48
  info(): {
43
49
  subjectType: "com.atproto.admin.defs#repoRef";
44
50
  subjectDid: string;
@@ -46,6 +52,7 @@ export declare class RepoSubject implements ModSubject {
46
52
  subjectCid: null;
47
53
  subjectBlobCids: null;
48
54
  subjectMessageId: null;
55
+ subjectConvoId: null;
49
56
  meta: null;
50
57
  };
51
58
  lex(): $Typed<RepoRef>;
@@ -57,10 +64,12 @@ export declare class RecordSubject implements ModSubject {
57
64
  parsedUri: AtUri;
58
65
  did: string;
59
66
  recordPath: string;
67
+ convoId: undefined;
60
68
  constructor(uri: string, cid: string, blobCids?: string[] | undefined);
61
69
  isRepo(): this is RepoSubject;
62
70
  isRecord(): this is RecordSubject;
63
71
  isMessage(): this is MessageSubject;
72
+ isConvo(): this is ConvoSubject;
64
73
  info(): {
65
74
  subjectType: "com.atproto.repo.strongRef";
66
75
  subjectDid: string;
@@ -68,6 +77,7 @@ export declare class RecordSubject implements ModSubject {
68
77
  subjectCid: string;
69
78
  subjectBlobCids: string[];
70
79
  subjectMessageId: null;
80
+ subjectConvoId: null;
71
81
  meta: null;
72
82
  };
73
83
  lex(): $Typed<StrongRef>;
@@ -82,6 +92,7 @@ export declare class MessageSubject implements ModSubject {
82
92
  isRepo(): this is RepoSubject;
83
93
  isRecord(): this is RecordSubject;
84
94
  isMessage(): this is MessageSubject;
95
+ isConvo(): this is ConvoSubject;
85
96
  info(): {
86
97
  subjectType: "chat.bsky.convo.defs#messageRef";
87
98
  subjectDid: string;
@@ -89,11 +100,36 @@ export declare class MessageSubject implements ModSubject {
89
100
  subjectCid: null;
90
101
  subjectBlobCids: null;
91
102
  subjectMessageId: string;
103
+ subjectConvoId: string;
92
104
  meta: {
93
105
  convoId: string | undefined;
94
106
  };
95
107
  };
96
108
  lex(): $Typed<MessageRef>;
97
109
  }
110
+ export declare class ConvoSubject implements ModSubject {
111
+ did: string;
112
+ convoId: string;
113
+ blobCids: undefined;
114
+ recordPath: undefined;
115
+ constructor(did: string, convoId: string);
116
+ isRepo(): this is RepoSubject;
117
+ isRecord(): this is RecordSubject;
118
+ isMessage(): this is MessageSubject;
119
+ isConvo(): this is ConvoSubject;
120
+ info(): {
121
+ subjectType: "chat.bsky.convo.defs#convoRef";
122
+ subjectDid: string;
123
+ subjectUri: null;
124
+ subjectCid: null;
125
+ subjectBlobCids: null;
126
+ subjectMessageId: null;
127
+ subjectConvoId: string;
128
+ meta: {
129
+ convoId: string | undefined;
130
+ };
131
+ };
132
+ lex(): $Typed<ConvoRef>;
133
+ }
98
134
  export {};
99
135
  //# sourceMappingURL=subject.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import * as ComAtprotoRepoStrongRef from '../lexicon/types/com/atproto/repo/stro
6
6
  import { asPredicate } from '../lexicon/util.js';
7
7
  const isStrongRef = asPredicate(ComAtprotoRepoStrongRef.validateMain);
8
8
  const isValidMessageRef = asPredicate(ChatBskyConvoDefs.validateMessageRef);
9
+ const isValidConvoRef = asPredicate(ChatBskyConvoDefs.validateConvoRef);
9
10
  const isMessageRefWithoutConvoId = (subject) => subject != null &&
10
11
  typeof subject === 'object' &&
11
12
  isValidMessageRef({ convoId: '', ...subject });
@@ -24,6 +25,11 @@ export const subjectFromInput = (subject, blobs) => {
24
25
  if (isValidMessageRef(subject)) {
25
26
  return new MessageSubject(subject.did, subject.convoId, subject.messageId);
26
27
  }
28
+ // @NOTE #convoRef is a new type for reporting entire conversations.
29
+ // Similar to messageRef, we take advantage of the open union to support this.
30
+ if (isValidConvoRef(subject)) {
31
+ return new ConvoSubject(subject.did, subject.convoId);
32
+ }
27
33
  // @TODO we should start to require subject.convoId is a string in order to properly validate
28
34
  // the #messageRef. temporarily allowing it to be optional as a stopgap for rollout.
29
35
  // The next "if" can be removed once convoId is consistently provided.
@@ -43,6 +49,10 @@ export const subjectFromEventRow = (row) => {
43
49
  const convoId = typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : '';
44
50
  return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId);
45
51
  }
52
+ else if (row.subjectType === 'chat.bsky.convo.defs#convoRef' &&
53
+ row.subjectConvoId) {
54
+ return new ConvoSubject(row.subjectDid, row.subjectConvoId);
55
+ }
46
56
  else {
47
57
  return new RepoSubject(row.subjectDid);
48
58
  }
@@ -54,6 +64,10 @@ export const subjectFromStatusRow = (row) => {
54
64
  const uri = AtUri.make(row.did, ...row.recordPath.split('/')).toString();
55
65
  return new RecordSubject(uri.toString(), row.recordCid, row.blobCids ?? []);
56
66
  }
67
+ else if (row.convoId) {
68
+ // Conversation subject - restore from subject status row
69
+ return new ConvoSubject(row.did, row.convoId);
70
+ }
57
71
  else {
58
72
  return new RepoSubject(row.did);
59
73
  }
@@ -63,6 +77,7 @@ export class RepoSubject {
63
77
  this.did = did;
64
78
  this.blobCids = undefined;
65
79
  this.recordPath = undefined;
80
+ this.convoId = undefined;
66
81
  }
67
82
  isRepo() {
68
83
  return true;
@@ -73,6 +88,9 @@ export class RepoSubject {
73
88
  isMessage() {
74
89
  return false;
75
90
  }
91
+ isConvo() {
92
+ return false;
93
+ }
76
94
  info() {
77
95
  return {
78
96
  subjectType: 'com.atproto.admin.defs#repoRef',
@@ -81,6 +99,7 @@ export class RepoSubject {
81
99
  subjectCid: null,
82
100
  subjectBlobCids: null,
83
101
  subjectMessageId: null,
102
+ subjectConvoId: null,
84
103
  meta: null,
85
104
  };
86
105
  }
@@ -96,6 +115,7 @@ export class RecordSubject {
96
115
  this.uri = uri;
97
116
  this.cid = cid;
98
117
  this.blobCids = blobCids;
118
+ this.convoId = undefined;
99
119
  this.parsedUri = new AtUri(uri);
100
120
  this.did = this.parsedUri.hostname;
101
121
  this.recordPath = `${this.parsedUri.collection}/${this.parsedUri.rkey}`;
@@ -109,6 +129,9 @@ export class RecordSubject {
109
129
  isMessage() {
110
130
  return false;
111
131
  }
132
+ isConvo() {
133
+ return false;
134
+ }
112
135
  info() {
113
136
  return {
114
137
  subjectType: 'com.atproto.repo.strongRef',
@@ -117,6 +140,7 @@ export class RecordSubject {
117
140
  subjectCid: this.cid,
118
141
  subjectBlobCids: this.blobCids ?? [],
119
142
  subjectMessageId: null,
143
+ subjectConvoId: null,
120
144
  meta: null,
121
145
  };
122
146
  }
@@ -145,6 +169,9 @@ export class MessageSubject {
145
169
  isMessage() {
146
170
  return true;
147
171
  }
172
+ isConvo() {
173
+ return false;
174
+ }
148
175
  info() {
149
176
  return {
150
177
  subjectType: 'chat.bsky.convo.defs#messageRef',
@@ -153,6 +180,7 @@ export class MessageSubject {
153
180
  subjectCid: null,
154
181
  subjectBlobCids: null,
155
182
  subjectMessageId: this.messageId,
183
+ subjectConvoId: this.convoId,
156
184
  meta: { convoId: this.convoId || undefined },
157
185
  };
158
186
  }
@@ -165,4 +193,43 @@ export class MessageSubject {
165
193
  };
166
194
  }
167
195
  }
196
+ export class ConvoSubject {
197
+ constructor(did, convoId) {
198
+ this.did = did;
199
+ this.convoId = convoId;
200
+ this.blobCids = undefined;
201
+ this.recordPath = undefined;
202
+ }
203
+ isRepo() {
204
+ return false;
205
+ }
206
+ isRecord() {
207
+ return false;
208
+ }
209
+ isMessage() {
210
+ return false;
211
+ }
212
+ isConvo() {
213
+ return true;
214
+ }
215
+ info() {
216
+ return {
217
+ subjectType: 'chat.bsky.convo.defs#convoRef',
218
+ subjectDid: this.did,
219
+ subjectUri: null,
220
+ subjectCid: null,
221
+ subjectBlobCids: null,
222
+ subjectMessageId: null,
223
+ subjectConvoId: this.convoId,
224
+ meta: { convoId: this.convoId || undefined },
225
+ };
226
+ }
227
+ lex() {
228
+ return {
229
+ $type: 'chat.bsky.convo.defs#convoRef',
230
+ did: this.did,
231
+ convoId: this.convoId,
232
+ };
233
+ }
234
+ }
168
235
  //# sourceMappingURL=subject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport * as ChatBskyConvoDefs from '../lexicon/types/chat/bsky/convo/defs.js'\nimport { RepoRef, isRepoRef } from '../lexicon/types/com/atproto/admin/defs.js'\nimport { InputSchema as ReportInput } from '../lexicon/types/com/atproto/moderation/createReport.js'\nimport * as ComAtprotoRepoStrongRef from '../lexicon/types/com/atproto/repo/strongRef.js'\nimport { InputSchema as ActionInput } from '../lexicon/types/tools/ozone/moderation/emitEvent.js'\nimport { $Typed, asPredicate } from '../lexicon/util.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\ntype SubjectInput = ReportInput['subject'] | ActionInput['subject']\n\ntype StrongRef = ComAtprotoRepoStrongRef.Main\nconst isStrongRef = asPredicate(ComAtprotoRepoStrongRef.validateMain)\n\ntype MessageRef = ChatBskyConvoDefs.MessageRef\nconst isValidMessageRef = asPredicate(ChatBskyConvoDefs.validateMessageRef)\n\nconst isMessageRefWithoutConvoId = (\n subject: unknown,\n): subject is $Typed<Omit<MessageRef, 'convoId'> & { convoId?: string }> =>\n subject != null &&\n typeof subject === 'object' &&\n isValidMessageRef({ convoId: '', ...subject })\n\nexport const subjectFromInput = (\n subject: SubjectInput,\n blobs?: string[],\n): ModSubject => {\n if (isRepoRef(subject)) {\n if (blobs && blobs.length > 0) {\n throw new InvalidRequestError('Blobs do not apply to repo subjects')\n }\n return new RepoSubject(subject.did)\n }\n if (isStrongRef(subject)) {\n return new RecordSubject(subject.uri, subject.cid, blobs)\n }\n // @NOTE #messageRef is not a report input for com.atproto.moderation.createReport.\n // we are taking advantage of the open union in order for bsky.chat to interoperate here.\n if (isValidMessageRef(subject)) {\n return new MessageSubject(subject.did, subject.convoId, subject.messageId)\n }\n // @TODO we should start to require subject.convoId is a string in order to properly validate\n // the #messageRef. temporarily allowing it to be optional as a stopgap for rollout.\n // The next \"if\" can be removed once convoId is consistently provided.\n if (isMessageRefWithoutConvoId(subject)) {\n return new MessageSubject(\n subject.did,\n subject.convoId ?? '',\n subject.messageId,\n )\n }\n\n throw new InvalidRequestError('Invalid subject')\n}\n\nexport const subjectFromEventRow = (row: ModerationEventRow): ModSubject => {\n if (\n row.subjectType === 'com.atproto.repo.strongRef' &&\n row.subjectUri &&\n row.subjectCid\n ) {\n return new RecordSubject(\n row.subjectUri,\n row.subjectCid,\n row.subjectBlobCids ?? [],\n )\n } else if (\n row.subjectType === 'chat.bsky.convo.defs#messageRef' &&\n row.subjectMessageId\n ) {\n const convoId =\n typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : ''\n return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId)\n } else {\n return new RepoSubject(row.subjectDid)\n }\n}\n\nexport const subjectFromStatusRow = (\n row: ModerationSubjectStatusRow,\n): ModSubject => {\n if (row.recordPath && row.recordCid) {\n // Not too intuitive but the recordpath is basically <collection>/<rkey>\n // which is what the last 2 params of .make() arguments are\n const uri = AtUri.make(row.did, ...row.recordPath.split('/')).toString()\n return new RecordSubject(uri.toString(), row.recordCid, row.blobCids ?? [])\n } else {\n return new RepoSubject(row.did)\n }\n}\n\ntype SubjectInfo = {\n subjectType:\n | 'com.atproto.admin.defs#repoRef'\n | 'com.atproto.repo.strongRef'\n | 'chat.bsky.convo.defs#messageRef'\n subjectDid: string\n subjectUri: string | null\n subjectCid: string | null\n subjectBlobCids: string[] | null\n subjectMessageId: string | null\n meta: Record<string, string | undefined> | null\n}\n\nexport interface ModSubject {\n did: string\n recordPath: string | undefined\n blobCids?: string[]\n isRepo(): this is RepoSubject\n isRecord(): this is RecordSubject\n isMessage(): this is MessageSubject\n info(): SubjectInfo\n lex(): $Typed<RepoRef> | $Typed<StrongRef> | $Typed<MessageRef>\n}\n\nexport class RepoSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(public did: string) {}\n isRepo(): this is RepoSubject {\n return true\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.admin.defs#repoRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: null,\n meta: null,\n }\n }\n lex(): $Typed<RepoRef> {\n return {\n $type: 'com.atproto.admin.defs#repoRef',\n did: this.did,\n }\n }\n}\n\nexport class RecordSubject implements ModSubject {\n parsedUri: AtUri\n did: string\n recordPath: string\n constructor(\n public uri: string,\n public cid: string,\n public blobCids?: string[],\n ) {\n this.parsedUri = new AtUri(uri)\n this.did = this.parsedUri.hostname\n this.recordPath = `${this.parsedUri.collection}/${this.parsedUri.rkey}`\n }\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return true\n }\n isMessage(): this is MessageSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.repo.strongRef' as const,\n subjectDid: this.did,\n subjectUri: this.uri,\n subjectCid: this.cid,\n subjectBlobCids: this.blobCids ?? [],\n subjectMessageId: null,\n meta: null,\n }\n }\n lex(): $Typed<StrongRef> {\n return {\n $type: 'com.atproto.repo.strongRef',\n uri: this.uri,\n cid: this.cid,\n }\n }\n}\n\nexport class MessageSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(\n public did: string,\n public convoId: string,\n public messageId: string,\n ) {}\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return true\n }\n info() {\n return {\n subjectType: 'chat.bsky.convo.defs#messageRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: this.messageId,\n meta: { convoId: this.convoId || undefined },\n }\n }\n lex(): $Typed<MessageRef> {\n return {\n $type: 'chat.bsky.convo.defs#messageRef',\n did: this.did,\n convoId: this.convoId,\n messageId: this.messageId,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport * as ChatBskyConvoDefs from '../lexicon/types/chat/bsky/convo/defs.js'\nimport { RepoRef, isRepoRef } from '../lexicon/types/com/atproto/admin/defs.js'\nimport { InputSchema as ReportInput } from '../lexicon/types/com/atproto/moderation/createReport.js'\nimport * as ComAtprotoRepoStrongRef from '../lexicon/types/com/atproto/repo/strongRef.js'\nimport { InputSchema as ActionInput } from '../lexicon/types/tools/ozone/moderation/emitEvent.js'\nimport { $Typed, asPredicate } from '../lexicon/util.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\ntype SubjectInput = ReportInput['subject'] | ActionInput['subject']\n\ntype StrongRef = ComAtprotoRepoStrongRef.Main\nconst isStrongRef = asPredicate(ComAtprotoRepoStrongRef.validateMain)\n\ntype MessageRef = ChatBskyConvoDefs.MessageRef\nconst isValidMessageRef = asPredicate(ChatBskyConvoDefs.validateMessageRef)\n\ntype ConvoRef = ChatBskyConvoDefs.ConvoRef\nconst isValidConvoRef = asPredicate(ChatBskyConvoDefs.validateConvoRef)\n\nconst isMessageRefWithoutConvoId = (\n subject: unknown,\n): subject is $Typed<Omit<MessageRef, 'convoId'> & { convoId?: string }> =>\n subject != null &&\n typeof subject === 'object' &&\n isValidMessageRef({ convoId: '', ...subject })\n\nexport const subjectFromInput = (\n subject: SubjectInput,\n blobs?: string[],\n): ModSubject => {\n if (isRepoRef(subject)) {\n if (blobs && blobs.length > 0) {\n throw new InvalidRequestError('Blobs do not apply to repo subjects')\n }\n return new RepoSubject(subject.did)\n }\n if (isStrongRef(subject)) {\n return new RecordSubject(subject.uri, subject.cid, blobs)\n }\n // @NOTE #messageRef is not a report input for com.atproto.moderation.createReport.\n // we are taking advantage of the open union in order for bsky.chat to interoperate here.\n if (isValidMessageRef(subject)) {\n return new MessageSubject(subject.did, subject.convoId, subject.messageId)\n }\n // @NOTE #convoRef is a new type for reporting entire conversations.\n // Similar to messageRef, we take advantage of the open union to support this.\n if (isValidConvoRef(subject)) {\n return new ConvoSubject(subject.did, subject.convoId)\n }\n // @TODO we should start to require subject.convoId is a string in order to properly validate\n // the #messageRef. temporarily allowing it to be optional as a stopgap for rollout.\n // The next \"if\" can be removed once convoId is consistently provided.\n if (isMessageRefWithoutConvoId(subject)) {\n return new MessageSubject(\n subject.did,\n subject.convoId ?? '',\n subject.messageId,\n )\n }\n\n throw new InvalidRequestError('Invalid subject')\n}\n\nexport const subjectFromEventRow = (row: ModerationEventRow): ModSubject => {\n if (\n row.subjectType === 'com.atproto.repo.strongRef' &&\n row.subjectUri &&\n row.subjectCid\n ) {\n return new RecordSubject(\n row.subjectUri,\n row.subjectCid,\n row.subjectBlobCids ?? [],\n )\n } else if (\n row.subjectType === 'chat.bsky.convo.defs#messageRef' &&\n row.subjectMessageId\n ) {\n const convoId =\n typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : ''\n return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId)\n } else if (\n row.subjectType === 'chat.bsky.convo.defs#convoRef' &&\n row.subjectConvoId\n ) {\n return new ConvoSubject(row.subjectDid, row.subjectConvoId)\n } else {\n return new RepoSubject(row.subjectDid)\n }\n}\n\nexport const subjectFromStatusRow = (\n row: ModerationSubjectStatusRow,\n): ModSubject => {\n if (row.recordPath && row.recordCid) {\n // Not too intuitive but the recordpath is basically <collection>/<rkey>\n // which is what the last 2 params of .make() arguments are\n const uri = AtUri.make(row.did, ...row.recordPath.split('/')).toString()\n return new RecordSubject(uri.toString(), row.recordCid, row.blobCids ?? [])\n } else if (row.convoId) {\n // Conversation subject - restore from subject status row\n return new ConvoSubject(row.did, row.convoId)\n } else {\n return new RepoSubject(row.did)\n }\n}\n\ntype SubjectInfo = {\n subjectType:\n | 'com.atproto.admin.defs#repoRef'\n | 'com.atproto.repo.strongRef'\n | 'chat.bsky.convo.defs#messageRef'\n | 'chat.bsky.convo.defs#convoRef'\n subjectDid: string\n subjectUri: string | null\n subjectCid: string | null\n subjectBlobCids: string[] | null\n subjectMessageId: string | null\n subjectConvoId: string | null\n meta: Record<string, string | undefined> | null\n}\n\nexport interface ModSubject {\n did: string\n recordPath: string | undefined\n convoId: string | undefined\n blobCids?: string[]\n isRepo(): this is RepoSubject\n isRecord(): this is RecordSubject\n isMessage(): this is MessageSubject\n isConvo(): this is ConvoSubject\n info(): SubjectInfo\n lex():\n | $Typed<RepoRef>\n | $Typed<StrongRef>\n | $Typed<MessageRef>\n | $Typed<ConvoRef>\n}\n\nexport class RepoSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n convoId = undefined\n constructor(public did: string) {}\n isRepo(): this is RepoSubject {\n return true\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return false\n }\n isConvo(): this is ConvoSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.admin.defs#repoRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: null,\n subjectConvoId: null,\n meta: null,\n }\n }\n lex(): $Typed<RepoRef> {\n return {\n $type: 'com.atproto.admin.defs#repoRef',\n did: this.did,\n }\n }\n}\n\nexport class RecordSubject implements ModSubject {\n parsedUri: AtUri\n did: string\n recordPath: string\n convoId = undefined\n constructor(\n public uri: string,\n public cid: string,\n public blobCids?: string[],\n ) {\n this.parsedUri = new AtUri(uri)\n this.did = this.parsedUri.hostname\n this.recordPath = `${this.parsedUri.collection}/${this.parsedUri.rkey}`\n }\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return true\n }\n isMessage(): this is MessageSubject {\n return false\n }\n isConvo(): this is ConvoSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.repo.strongRef' as const,\n subjectDid: this.did,\n subjectUri: this.uri,\n subjectCid: this.cid,\n subjectBlobCids: this.blobCids ?? [],\n subjectMessageId: null,\n subjectConvoId: null,\n meta: null,\n }\n }\n lex(): $Typed<StrongRef> {\n return {\n $type: 'com.atproto.repo.strongRef',\n uri: this.uri,\n cid: this.cid,\n }\n }\n}\n\nexport class MessageSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(\n public did: string,\n public convoId: string,\n public messageId: string,\n ) {}\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return true\n }\n isConvo(): this is ConvoSubject {\n return false\n }\n info() {\n return {\n subjectType: 'chat.bsky.convo.defs#messageRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: this.messageId,\n subjectConvoId: this.convoId,\n meta: { convoId: this.convoId || undefined },\n }\n }\n lex(): $Typed<MessageRef> {\n return {\n $type: 'chat.bsky.convo.defs#messageRef',\n did: this.did,\n convoId: this.convoId,\n messageId: this.messageId,\n }\n }\n}\n\nexport class ConvoSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(\n public did: string,\n public convoId: string,\n ) {}\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return false\n }\n isConvo(): this is ConvoSubject {\n return true\n }\n info() {\n return {\n subjectType: 'chat.bsky.convo.defs#convoRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: null,\n subjectConvoId: this.convoId,\n meta: { convoId: this.convoId || undefined },\n }\n }\n lex(): $Typed<ConvoRef> {\n return {\n $type: 'chat.bsky.convo.defs#convoRef',\n did: this.did,\n convoId: this.convoId,\n }\n }\n}\n"]}
@@ -11,6 +11,7 @@ import { OutputSchema as ReportOutput } from '../lexicon/types/com/atproto/moder
11
11
  import { BlobView, ModEventView, ModEventViewDetail, RecordView, RecordViewDetail, RepoView, SubjectStatusView } from '../lexicon/types/tools/ozone/moderation/defs.js';
12
12
  import { Un$Typed } from '../lexicon/util.js';
13
13
  import { ParsedLabelers } from '../util.js';
14
+ import { ModSubject } from './subject.js';
14
15
  import { ModerationEventRowWithHandle, ModerationSubjectStatusRowWithHandle } from './types.js';
15
16
  export type AuthHeaders = {
16
17
  headers: {
@@ -44,7 +45,7 @@ export declare class ModerationViews {
44
45
  recordDetails(subjects: RecordSubject[], labelers?: ParsedLabelers): Promise<Map<string, RecordViewDetail>>;
45
46
  getExternalLabels(subjects: string[], labelers?: ParsedLabelers): Promise<Map<string, Label[]>>;
46
47
  formatReport(report: ModerationEventRowWithHandle): ReportOutput;
47
- subject(subject: string): Promise<SubjectView>;
48
+ subject(subject: ModSubject): Promise<SubjectView>;
48
49
  blob(blobs: BlobRef[]): Promise<BlobView[]>;
49
50
  labels(subjects: string[], includeNeg?: boolean): Promise<Map<string, Label[]>>;
50
51
  formatLabelAndEnsureSig(row: LabelRow): Promise<Label>;
@@ -1 +1 @@
1
- {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { isAccountEvent, isAgeAssuranceEvent, isAgeAssuranceOverrideEvent, isIde
10
10
  import { asPredicate } from '../lexicon/util.js';
11
11
  import { dbLogger, httpLogger } from '../logger.js';
12
12
  import { moderationSubjectStatusQueryBuilder } from './status.js';
13
- import { subjectFromEventRow, subjectFromStatusRow } from './subject.js';
13
+ import { subjectFromEventRow, subjectFromStatusRow, } from './subject.js';
14
14
  import { formatLabel, getPdsAgentForRepo, signLabel } from './util.js';
15
15
  const isValidSelfLabels = asPredicate(validateSelfLabels);
16
16
  const ifString = (val) => typeof val === 'string' ? val : undefined;
@@ -198,13 +198,8 @@ export class ModerationViews {
198
198
  return eventView;
199
199
  }
200
200
  async eventDetail(result) {
201
- const subjectId = result.subjectType === 'com.atproto.admin.defs#repoRef'
202
- ? result.subjectDid
203
- : result.subjectUri;
204
- if (!subjectId) {
205
- throw new Error(`Bad subject: ${result.id}`);
206
- }
207
- const subject = await this.subject(subjectId);
201
+ const modSubject = subjectFromEventRow(result);
202
+ const subject = await this.subject(modSubject);
208
203
  const eventView = this.formatEvent(result);
209
204
  const allBlobs = 'value' in subject ? findBlobRefs(subject.value) : [];
210
205
  const subjectBlobs = await this.blob(allBlobs.filter((blob) => eventView.subjectBlobCids.includes(blob.ref.toString())));
@@ -395,9 +390,16 @@ export class ModerationViews {
395
390
  }
396
391
  // Partial view for subjects
397
392
  async subject(subject) {
398
- if (subject.startsWith('did:')) {
399
- const repos = await this.repos([subject]);
400
- const repo = repos.get(subject);
393
+ if (subject.isConvo()) {
394
+ return {
395
+ $type: 'tools.ozone.moderation.defs#convoView',
396
+ did: subject.did,
397
+ convoId: subject.convoId,
398
+ };
399
+ }
400
+ else if (subject.isRepo()) {
401
+ const repos = await this.repos([subject.did]);
402
+ const repo = repos.get(subject.did);
401
403
  if (repo) {
402
404
  return {
403
405
  ...repo,
@@ -407,26 +409,25 @@ export class ModerationViews {
407
409
  else {
408
410
  return {
409
411
  $type: 'tools.ozone.moderation.defs#repoViewNotFound',
410
- did: subject,
412
+ did: subject.did,
411
413
  };
412
414
  }
413
415
  }
414
- else {
415
- const records = await this.records([{ uri: subject }]);
416
- const record = records.get(subject);
416
+ else if (subject.isRecord()) {
417
+ const uri = subject.uri;
418
+ const records = await this.records([{ uri }]);
419
+ const record = records.get(uri);
417
420
  if (record) {
418
421
  return {
419
422
  ...record,
420
423
  $type: 'tools.ozone.moderation.defs#recordView',
421
424
  };
422
425
  }
423
- else {
424
- return {
425
- $type: 'tools.ozone.moderation.defs#recordViewNotFound',
426
- uri: subject,
427
- };
428
- }
429
426
  }
427
+ return {
428
+ $type: 'tools.ozone.moderation.defs#repoViewNotFound',
429
+ did: subject.did,
430
+ };
430
431
  }
431
432
  // Partial view for blobs
432
433
  async blob(blobs) {
@@ -504,7 +505,8 @@ export class ModerationViews {
504
505
  for (const sub of parsedSubjects) {
505
506
  qb = qb.orWhere((qb) => qb
506
507
  .where('moderation_subject_status.did', '=', sub.did)
507
- .where('moderation_subject_status.recordPath', '=', sub.recordPath ?? ''));
508
+ .where('moderation_subject_status.recordPath', '=', sub.recordPath ?? '')
509
+ .where('moderation_subject_status.convoId', '=', ''));
508
510
  }
509
511
  return qb;
510
512
  });