@atproto/ozone 0.1.146 → 0.1.148

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 (577) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/api/chat/getActorMetadata.js.map +1 -1
  3. package/dist/api/chat/getMessageContext.js.map +1 -1
  4. package/dist/api/chat/index.js.map +1 -1
  5. package/dist/api/communication/createTemplate.js.map +1 -1
  6. package/dist/api/communication/deleteTemplate.js.map +1 -1
  7. package/dist/api/communication/listTemplates.js.map +1 -1
  8. package/dist/api/communication/updateTemplate.js.map +1 -1
  9. package/dist/api/health.js.map +1 -1
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/api/index.js +6 -0
  12. package/dist/api/index.js.map +1 -1
  13. package/dist/api/label/fetchLabels.js.map +1 -1
  14. package/dist/api/label/queryLabels.js.map +1 -1
  15. package/dist/api/label/subscribeLabels.js.map +1 -1
  16. package/dist/api/moderation/cancelScheduledActions.d.ts +4 -0
  17. package/dist/api/moderation/cancelScheduledActions.d.ts.map +1 -0
  18. package/dist/api/moderation/cancelScheduledActions.js +62 -0
  19. package/dist/api/moderation/cancelScheduledActions.js.map +1 -0
  20. package/dist/api/moderation/emitEvent.d.ts.map +1 -1
  21. package/dist/api/moderation/emitEvent.js +11 -47
  22. package/dist/api/moderation/emitEvent.js.map +1 -1
  23. package/dist/api/moderation/getAccountTimeline.js.map +1 -1
  24. package/dist/api/moderation/getEvent.js.map +1 -1
  25. package/dist/api/moderation/getRecord.js.map +1 -1
  26. package/dist/api/moderation/getRecords.js.map +1 -1
  27. package/dist/api/moderation/getRepo.js.map +1 -1
  28. package/dist/api/moderation/getReporterStats.js.map +1 -1
  29. package/dist/api/moderation/getRepos.js.map +1 -1
  30. package/dist/api/moderation/getSubjects.js.map +1 -1
  31. package/dist/api/moderation/listScheduledActions.d.ts +4 -0
  32. package/dist/api/moderation/listScheduledActions.d.ts.map +1 -0
  33. package/dist/api/moderation/listScheduledActions.js +31 -0
  34. package/dist/api/moderation/listScheduledActions.js.map +1 -0
  35. package/dist/api/moderation/queryEvents.js.map +1 -1
  36. package/dist/api/moderation/queryStatuses.js.map +1 -1
  37. package/dist/api/moderation/scheduleAction.d.ts +4 -0
  38. package/dist/api/moderation/scheduleAction.d.ts.map +1 -0
  39. package/dist/api/moderation/scheduleAction.js +115 -0
  40. package/dist/api/moderation/scheduleAction.js.map +1 -0
  41. package/dist/api/moderation/searchRepos.js.map +1 -1
  42. package/dist/api/moderation/util.d.ts +13 -0
  43. package/dist/api/moderation/util.d.ts.map +1 -0
  44. package/dist/api/moderation/util.js +52 -0
  45. package/dist/api/moderation/util.js.map +1 -0
  46. package/dist/api/proxied.js.map +1 -1
  47. package/dist/api/report/createReport.js.map +1 -1
  48. package/dist/api/safelink/addRule.js.map +1 -1
  49. package/dist/api/safelink/queryEvents.js.map +1 -1
  50. package/dist/api/safelink/queryRules.js.map +1 -1
  51. package/dist/api/safelink/removeRule.js.map +1 -1
  52. package/dist/api/safelink/updateRule.js.map +1 -1
  53. package/dist/api/server/getConfig.js.map +1 -1
  54. package/dist/api/set/addValues.js.map +1 -1
  55. package/dist/api/set/deleteSet.js.map +1 -1
  56. package/dist/api/set/deleteValues.js.map +1 -1
  57. package/dist/api/set/getValues.js.map +1 -1
  58. package/dist/api/set/querySets.js.map +1 -1
  59. package/dist/api/set/upsertSet.js.map +1 -1
  60. package/dist/api/setting/listOptions.js.map +1 -1
  61. package/dist/api/setting/removeOptions.js.map +1 -1
  62. package/dist/api/setting/upsertOption.js.map +1 -1
  63. package/dist/api/team/addMember.js.map +1 -1
  64. package/dist/api/team/deleteMember.js.map +1 -1
  65. package/dist/api/team/listMembers.js.map +1 -1
  66. package/dist/api/team/updateMember.js.map +1 -1
  67. package/dist/api/util.d.ts +4 -0
  68. package/dist/api/util.d.ts.map +1 -1
  69. package/dist/api/util.js +24 -1
  70. package/dist/api/util.js.map +1 -1
  71. package/dist/api/verification/grantVerifications.js.map +1 -1
  72. package/dist/api/verification/listVerifications.js.map +1 -1
  73. package/dist/api/verification/revokeVerifications.js.map +1 -1
  74. package/dist/api/well-known.js.map +1 -1
  75. package/dist/auth-verifier.js.map +1 -1
  76. package/dist/background.js.map +1 -1
  77. package/dist/communication-service/template.js.map +1 -1
  78. package/dist/communication-service/util.js.map +1 -1
  79. package/dist/config/config.js.map +1 -1
  80. package/dist/config/env.js.map +1 -1
  81. package/dist/config/index.js.map +1 -1
  82. package/dist/config/secrets.js.map +1 -1
  83. package/dist/context.d.ts +3 -0
  84. package/dist/context.d.ts.map +1 -1
  85. package/dist/context.js +12 -6
  86. package/dist/context.js.map +1 -1
  87. package/dist/daemon/blob-diverter.js.map +1 -1
  88. package/dist/daemon/context.d.ts +3 -0
  89. package/dist/daemon/context.d.ts.map +1 -1
  90. package/dist/daemon/context.js +12 -0
  91. package/dist/daemon/context.js.map +1 -1
  92. package/dist/daemon/event-pusher.js.map +1 -1
  93. package/dist/daemon/event-reverser.js.map +1 -1
  94. package/dist/daemon/index.d.ts +1 -0
  95. package/dist/daemon/index.d.ts.map +1 -1
  96. package/dist/daemon/index.js +3 -1
  97. package/dist/daemon/index.js.map +1 -1
  98. package/dist/daemon/materialized-view-refresher.js.map +1 -1
  99. package/dist/daemon/scheduled-action-processor.d.ts +35 -0
  100. package/dist/daemon/scheduled-action-processor.d.ts.map +1 -0
  101. package/dist/daemon/scheduled-action-processor.js +211 -0
  102. package/dist/daemon/scheduled-action-processor.js.map +1 -0
  103. package/dist/daemon/team-profile-synchronizer.js.map +1 -1
  104. package/dist/daemon/verification-listener.js.map +1 -1
  105. package/dist/db/index.js.map +1 -1
  106. package/dist/db/migrations/20231219T205730722Z-init.js.map +1 -1
  107. package/dist/db/migrations/20240116T085607200Z-communication-template.js.map +1 -1
  108. package/dist/db/migrations/20240201T051104136Z-mod-event-blobs.js.map +1 -1
  109. package/dist/db/migrations/20240208T213404429Z-add-tags-column-to-moderation-subject.js.map +1 -1
  110. package/dist/db/migrations/20240228T003647759Z-add-label-sigs.js.map +1 -1
  111. package/dist/db/migrations/20240408T192432676Z-mute-reporting.js.map +1 -1
  112. package/dist/db/migrations/20240506T225055595Z-message-subject.js.map +1 -1
  113. package/dist/db/migrations/20240521T211332580Z-member.js.map +1 -1
  114. package/dist/db/migrations/20240814T003647759Z-event-created-at-index.js.map +1 -1
  115. package/dist/db/migrations/20240903T205730722Z-add-template-lang.js.map +1 -1
  116. package/dist/db/migrations/20240904T205730722Z-add-subject-did-index.js.map +1 -1
  117. package/dist/db/migrations/20241001T205730722Z-subject-status-review-state-index.js.map +1 -1
  118. package/dist/db/migrations/20241008T205730722Z-sets.js.map +1 -1
  119. package/dist/db/migrations/20241018T205730722Z-setting.js.map +1 -1
  120. package/dist/db/migrations/20241026T205730722Z-add-hosting-status-to-subject-status.js.map +1 -1
  121. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.js.map +1 -1
  122. package/dist/db/migrations/20250204T003647759Z-add-subject-priority-score.js.map +1 -1
  123. package/dist/db/migrations/20250211T003647759Z-add-reporter-stats-index.js.map +1 -1
  124. package/dist/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.js.map +1 -1
  125. package/dist/db/migrations/20250221T132135150Z-member-details.js.map +1 -1
  126. package/dist/db/migrations/20250404T201720309Z-subject-status-sort-idxs.js.map +1 -1
  127. package/dist/db/migrations/20250415T201720309Z-verification.js.map +1 -1
  128. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.js.map +1 -1
  129. package/dist/db/migrations/20250609T110704000Z-safelink.js.map +1 -1
  130. package/dist/db/migrations/20250618T180246000Z-add-mod-tool-to-moderation-event.js.map +1 -1
  131. package/dist/db/migrations/20250701T000000000Z-add-age-assurance-state.js.map +1 -1
  132. package/dist/db/migrations/20250715T000000000Z-add-mod-event-external-id.js.map +1 -1
  133. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.js.map +1 -1
  134. package/dist/db/migrations/20250813T000000000Z-mod-tool-batch-id-index.js.map +1 -1
  135. package/dist/db/migrations/20250923T000000000Z-scheduled-actions.d.ts +4 -0
  136. package/dist/db/migrations/20250923T000000000Z-scheduled-actions.d.ts.map +1 -0
  137. package/dist/db/migrations/20250923T000000000Z-scheduled-actions.js +53 -0
  138. package/dist/db/migrations/20250923T000000000Z-scheduled-actions.js.map +1 -0
  139. package/dist/db/migrations/index.d.ts +2 -0
  140. package/dist/db/migrations/index.d.ts.map +1 -1
  141. package/dist/db/migrations/index.js +3 -1
  142. package/dist/db/migrations/index.js.map +1 -1
  143. package/dist/db/migrations/provider.js.map +1 -1
  144. package/dist/db/pagination.js.map +1 -1
  145. package/dist/db/schema/account_events_stats.js.map +1 -1
  146. package/dist/db/schema/account_record_events_stats.js.map +1 -1
  147. package/dist/db/schema/account_record_status_stats.js.map +1 -1
  148. package/dist/db/schema/blob_push_event.js.map +1 -1
  149. package/dist/db/schema/communication_template.js.map +1 -1
  150. package/dist/db/schema/firehose_cursor.js.map +1 -1
  151. package/dist/db/schema/index.d.ts +2 -1
  152. package/dist/db/schema/index.d.ts.map +1 -1
  153. package/dist/db/schema/index.js.map +1 -1
  154. package/dist/db/schema/label.js.map +1 -1
  155. package/dist/db/schema/member.js.map +1 -1
  156. package/dist/db/schema/moderation_event.js.map +1 -1
  157. package/dist/db/schema/moderation_subject_status.js.map +1 -1
  158. package/dist/db/schema/ozone_set.js.map +1 -1
  159. package/dist/db/schema/record_events_stats.js.map +1 -1
  160. package/dist/db/schema/record_push_event.js.map +1 -1
  161. package/dist/db/schema/repo_push_event.js.map +1 -1
  162. package/dist/db/schema/safelink.js.map +1 -1
  163. package/dist/db/schema/scheduled-action.d.ts +23 -0
  164. package/dist/db/schema/scheduled-action.d.ts.map +1 -0
  165. package/dist/db/schema/scheduled-action.js +5 -0
  166. package/dist/db/schema/scheduled-action.js.map +1 -0
  167. package/dist/db/schema/setting.js.map +1 -1
  168. package/dist/db/schema/signing_key.js.map +1 -1
  169. package/dist/db/schema/verification.js.map +1 -1
  170. package/dist/db/types.js.map +1 -1
  171. package/dist/error.js.map +1 -1
  172. package/dist/image-invalidator.js.map +1 -1
  173. package/dist/index.js.map +1 -1
  174. package/dist/jetstream/service.js.map +1 -1
  175. package/dist/lexicon/index.d.ts +15 -14
  176. package/dist/lexicon/index.d.ts.map +1 -1
  177. package/dist/lexicon/index.js +21 -14
  178. package/dist/lexicon/index.js.map +1 -1
  179. package/dist/lexicon/lexicons.d.ts +877 -125
  180. package/dist/lexicon/lexicons.d.ts.map +1 -1
  181. package/dist/lexicon/lexicons.js +444 -67
  182. package/dist/lexicon/lexicons.js.map +1 -1
  183. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  184. package/dist/lexicon/types/app/bsky/actor/getPreferences.js.map +1 -1
  185. package/dist/lexicon/types/app/bsky/actor/getProfile.js.map +1 -1
  186. package/dist/lexicon/types/app/bsky/actor/getProfiles.js.map +1 -1
  187. package/dist/lexicon/types/app/bsky/actor/getSuggestions.js.map +1 -1
  188. package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
  189. package/dist/lexicon/types/app/bsky/actor/putPreferences.js.map +1 -1
  190. package/dist/lexicon/types/app/bsky/actor/searchActors.js.map +1 -1
  191. package/dist/lexicon/types/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
  192. package/dist/lexicon/types/app/bsky/actor/status.js.map +1 -1
  193. package/dist/lexicon/types/app/bsky/bookmark/createBookmark.js.map +1 -1
  194. package/dist/lexicon/types/app/bsky/bookmark/defs.js.map +1 -1
  195. package/dist/lexicon/types/app/bsky/bookmark/deleteBookmark.js.map +1 -1
  196. package/dist/lexicon/types/app/bsky/bookmark/getBookmarks.js.map +1 -1
  197. package/dist/lexicon/types/app/bsky/embed/defs.js.map +1 -1
  198. package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
  199. package/dist/lexicon/types/app/bsky/embed/images.js.map +1 -1
  200. package/dist/lexicon/types/app/bsky/embed/record.js.map +1 -1
  201. package/dist/lexicon/types/app/bsky/embed/recordWithMedia.js.map +1 -1
  202. package/dist/lexicon/types/app/bsky/embed/video.js.map +1 -1
  203. package/dist/lexicon/types/app/bsky/feed/defs.js.map +1 -1
  204. package/dist/lexicon/types/app/bsky/feed/describeFeedGenerator.js.map +1 -1
  205. package/dist/lexicon/types/app/bsky/feed/generator.js.map +1 -1
  206. package/dist/lexicon/types/app/bsky/feed/getActorFeeds.js.map +1 -1
  207. package/dist/lexicon/types/app/bsky/feed/getActorLikes.js.map +1 -1
  208. package/dist/lexicon/types/app/bsky/feed/getAuthorFeed.js.map +1 -1
  209. package/dist/lexicon/types/app/bsky/feed/getFeed.js.map +1 -1
  210. package/dist/lexicon/types/app/bsky/feed/getFeedGenerator.js.map +1 -1
  211. package/dist/lexicon/types/app/bsky/feed/getFeedGenerators.js.map +1 -1
  212. package/dist/lexicon/types/app/bsky/feed/getFeedSkeleton.js.map +1 -1
  213. package/dist/lexicon/types/app/bsky/feed/getLikes.js.map +1 -1
  214. package/dist/lexicon/types/app/bsky/feed/getListFeed.js.map +1 -1
  215. package/dist/lexicon/types/app/bsky/feed/getPostThread.js.map +1 -1
  216. package/dist/lexicon/types/app/bsky/feed/getPosts.js.map +1 -1
  217. package/dist/lexicon/types/app/bsky/feed/getQuotes.js.map +1 -1
  218. package/dist/lexicon/types/app/bsky/feed/getRepostedBy.js.map +1 -1
  219. package/dist/lexicon/types/app/bsky/feed/getSuggestedFeeds.js.map +1 -1
  220. package/dist/lexicon/types/app/bsky/feed/getTimeline.js.map +1 -1
  221. package/dist/lexicon/types/app/bsky/feed/like.js.map +1 -1
  222. package/dist/lexicon/types/app/bsky/feed/post.js.map +1 -1
  223. package/dist/lexicon/types/app/bsky/feed/postgate.js.map +1 -1
  224. package/dist/lexicon/types/app/bsky/feed/repost.js.map +1 -1
  225. package/dist/lexicon/types/app/bsky/feed/searchPosts.js.map +1 -1
  226. package/dist/lexicon/types/app/bsky/feed/sendInteractions.js.map +1 -1
  227. package/dist/lexicon/types/app/bsky/feed/threadgate.js.map +1 -1
  228. package/dist/lexicon/types/app/bsky/graph/block.js.map +1 -1
  229. package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
  230. package/dist/lexicon/types/app/bsky/graph/follow.js.map +1 -1
  231. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js.map +1 -1
  232. package/dist/lexicon/types/app/bsky/graph/getBlocks.js.map +1 -1
  233. package/dist/lexicon/types/app/bsky/graph/getFollowers.js.map +1 -1
  234. package/dist/lexicon/types/app/bsky/graph/getFollows.js.map +1 -1
  235. package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.js.map +1 -1
  236. package/dist/lexicon/types/app/bsky/graph/getList.js.map +1 -1
  237. package/dist/lexicon/types/app/bsky/graph/getListBlocks.js.map +1 -1
  238. package/dist/lexicon/types/app/bsky/graph/getListMutes.js.map +1 -1
  239. package/dist/lexicon/types/app/bsky/graph/getLists.js.map +1 -1
  240. package/dist/lexicon/types/app/bsky/graph/getListsWithMembership.js.map +1 -1
  241. package/dist/lexicon/types/app/bsky/graph/getMutes.js.map +1 -1
  242. package/dist/lexicon/types/app/bsky/graph/getRelationships.js.map +1 -1
  243. package/dist/lexicon/types/app/bsky/graph/getStarterPack.js.map +1 -1
  244. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js.map +1 -1
  245. package/dist/lexicon/types/app/bsky/graph/getStarterPacksWithMembership.js.map +1 -1
  246. package/dist/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
  247. package/dist/lexicon/types/app/bsky/graph/list.js.map +1 -1
  248. package/dist/lexicon/types/app/bsky/graph/listblock.js.map +1 -1
  249. package/dist/lexicon/types/app/bsky/graph/listitem.js.map +1 -1
  250. package/dist/lexicon/types/app/bsky/graph/muteActor.js.map +1 -1
  251. package/dist/lexicon/types/app/bsky/graph/muteActorList.js.map +1 -1
  252. package/dist/lexicon/types/app/bsky/graph/muteThread.js.map +1 -1
  253. package/dist/lexicon/types/app/bsky/graph/searchStarterPacks.js.map +1 -1
  254. package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -1
  255. package/dist/lexicon/types/app/bsky/graph/unmuteActor.js.map +1 -1
  256. package/dist/lexicon/types/app/bsky/graph/unmuteActorList.js.map +1 -1
  257. package/dist/lexicon/types/app/bsky/graph/unmuteThread.js.map +1 -1
  258. package/dist/lexicon/types/app/bsky/graph/verification.js.map +1 -1
  259. package/dist/lexicon/types/app/bsky/labeler/defs.js.map +1 -1
  260. package/dist/lexicon/types/app/bsky/labeler/getServices.js.map +1 -1
  261. package/dist/lexicon/types/app/bsky/labeler/service.js.map +1 -1
  262. package/dist/lexicon/types/app/bsky/notification/declaration.js.map +1 -1
  263. package/dist/lexicon/types/app/bsky/notification/defs.js.map +1 -1
  264. package/dist/lexicon/types/app/bsky/notification/getPreferences.js.map +1 -1
  265. package/dist/lexicon/types/app/bsky/notification/getUnreadCount.js.map +1 -1
  266. package/dist/lexicon/types/app/bsky/notification/listActivitySubscriptions.js.map +1 -1
  267. package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
  268. package/dist/lexicon/types/app/bsky/notification/putActivitySubscription.js.map +1 -1
  269. package/dist/lexicon/types/app/bsky/notification/putPreferences.js.map +1 -1
  270. package/dist/lexicon/types/app/bsky/notification/putPreferencesV2.js.map +1 -1
  271. package/dist/lexicon/types/app/bsky/notification/registerPush.js.map +1 -1
  272. package/dist/lexicon/types/app/bsky/notification/unregisterPush.js.map +1 -1
  273. package/dist/lexicon/types/app/bsky/notification/updateSeen.js.map +1 -1
  274. package/dist/lexicon/types/app/bsky/richtext/facet.js.map +1 -1
  275. package/dist/lexicon/types/app/bsky/unspecced/defs.js.map +1 -1
  276. package/dist/lexicon/types/app/bsky/unspecced/getAgeAssuranceState.js.map +1 -1
  277. package/dist/lexicon/types/app/bsky/unspecced/getConfig.js.map +1 -1
  278. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
  279. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.js.map +1 -1
  280. package/dist/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
  281. package/dist/lexicon/types/app/bsky/unspecced/getPostThreadOtherV2.js.map +1 -1
  282. package/dist/lexicon/types/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
  283. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
  284. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.js.map +1 -1
  285. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
  286. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js.map +1 -1
  287. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  288. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
  289. package/dist/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.js.map +1 -1
  290. package/dist/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.js.map +1 -1
  291. package/dist/lexicon/types/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
  292. package/dist/lexicon/types/app/bsky/unspecced/getTrends.js.map +1 -1
  293. package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.js.map +1 -1
  294. package/dist/lexicon/types/app/bsky/unspecced/initAgeAssurance.js.map +1 -1
  295. package/dist/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.js.map +1 -1
  296. package/dist/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.js.map +1 -1
  297. package/dist/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.js.map +1 -1
  298. package/dist/lexicon/types/app/bsky/video/defs.js.map +1 -1
  299. package/dist/lexicon/types/app/bsky/video/getJobStatus.js.map +1 -1
  300. package/dist/lexicon/types/app/bsky/video/getUploadLimits.js.map +1 -1
  301. package/dist/lexicon/types/app/bsky/video/uploadVideo.js.map +1 -1
  302. package/dist/lexicon/types/chat/bsky/actor/declaration.js.map +1 -1
  303. package/dist/lexicon/types/chat/bsky/actor/defs.js.map +1 -1
  304. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js.map +1 -1
  305. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js.map +1 -1
  306. package/dist/lexicon/types/chat/bsky/convo/acceptConvo.js.map +1 -1
  307. package/dist/lexicon/types/chat/bsky/convo/addReaction.js.map +1 -1
  308. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  309. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js.map +1 -1
  310. package/dist/lexicon/types/chat/bsky/convo/getConvo.js.map +1 -1
  311. package/dist/lexicon/types/chat/bsky/convo/getConvoAvailability.js.map +1 -1
  312. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -1
  313. package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -1
  314. package/dist/lexicon/types/chat/bsky/convo/getMessages.js.map +1 -1
  315. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js.map +1 -1
  316. package/dist/lexicon/types/chat/bsky/convo/listConvos.js.map +1 -1
  317. package/dist/lexicon/types/chat/bsky/convo/muteConvo.js.map +1 -1
  318. package/dist/lexicon/types/chat/bsky/convo/removeReaction.js.map +1 -1
  319. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -1
  320. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -1
  321. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js.map +1 -1
  322. package/dist/lexicon/types/chat/bsky/convo/updateAllRead.js.map +1 -1
  323. package/dist/lexicon/types/chat/bsky/convo/updateRead.js.map +1 -1
  324. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js.map +1 -1
  325. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js.map +1 -1
  326. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js.map +1 -1
  327. package/dist/lexicon/types/com/atproto/admin/defs.js.map +1 -1
  328. package/dist/lexicon/types/com/atproto/admin/deleteAccount.js.map +1 -1
  329. package/dist/lexicon/types/com/atproto/admin/disableAccountInvites.js.map +1 -1
  330. package/dist/lexicon/types/com/atproto/admin/disableInviteCodes.js.map +1 -1
  331. package/dist/lexicon/types/com/atproto/admin/enableAccountInvites.js.map +1 -1
  332. package/dist/lexicon/types/com/atproto/admin/getAccountInfo.js.map +1 -1
  333. package/dist/lexicon/types/com/atproto/admin/getAccountInfos.js.map +1 -1
  334. package/dist/lexicon/types/com/atproto/admin/getInviteCodes.js.map +1 -1
  335. package/dist/lexicon/types/com/atproto/admin/getSubjectStatus.js.map +1 -1
  336. package/dist/lexicon/types/com/atproto/admin/searchAccounts.js.map +1 -1
  337. package/dist/lexicon/types/com/atproto/admin/sendEmail.js.map +1 -1
  338. package/dist/lexicon/types/com/atproto/admin/updateAccountEmail.js.map +1 -1
  339. package/dist/lexicon/types/com/atproto/admin/updateAccountHandle.js.map +1 -1
  340. package/dist/lexicon/types/com/atproto/admin/updateAccountPassword.js.map +1 -1
  341. package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.js.map +1 -1
  342. package/dist/lexicon/types/com/atproto/admin/updateSubjectStatus.js.map +1 -1
  343. package/dist/lexicon/types/com/atproto/identity/defs.js.map +1 -1
  344. package/dist/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.js.map +1 -1
  345. package/dist/lexicon/types/com/atproto/identity/refreshIdentity.js.map +1 -1
  346. package/dist/lexicon/types/com/atproto/identity/requestPlcOperationSignature.js.map +1 -1
  347. package/dist/lexicon/types/com/atproto/identity/resolveDid.js.map +1 -1
  348. package/dist/lexicon/types/com/atproto/identity/resolveHandle.js.map +1 -1
  349. package/dist/lexicon/types/com/atproto/identity/resolveIdentity.js.map +1 -1
  350. package/dist/lexicon/types/com/atproto/identity/signPlcOperation.js.map +1 -1
  351. package/dist/lexicon/types/com/atproto/identity/submitPlcOperation.js.map +1 -1
  352. package/dist/lexicon/types/com/atproto/identity/updateHandle.js.map +1 -1
  353. package/dist/lexicon/types/com/atproto/label/defs.js.map +1 -1
  354. package/dist/lexicon/types/com/atproto/label/queryLabels.js.map +1 -1
  355. package/dist/lexicon/types/com/atproto/label/subscribeLabels.js.map +1 -1
  356. package/dist/lexicon/types/com/atproto/lexicon/schema.js.map +1 -1
  357. package/dist/lexicon/types/com/atproto/moderation/createReport.js.map +1 -1
  358. package/dist/lexicon/types/com/atproto/moderation/defs.d.ts +2 -2
  359. package/dist/lexicon/types/com/atproto/moderation/defs.d.ts.map +1 -1
  360. package/dist/lexicon/types/com/atproto/moderation/defs.js +1 -1
  361. package/dist/lexicon/types/com/atproto/moderation/defs.js.map +1 -1
  362. package/dist/lexicon/types/com/atproto/repo/applyWrites.js.map +1 -1
  363. package/dist/lexicon/types/com/atproto/repo/createRecord.js.map +1 -1
  364. package/dist/lexicon/types/com/atproto/repo/defs.js.map +1 -1
  365. package/dist/lexicon/types/com/atproto/repo/deleteRecord.js.map +1 -1
  366. package/dist/lexicon/types/com/atproto/repo/describeRepo.js.map +1 -1
  367. package/dist/lexicon/types/com/atproto/repo/getRecord.js.map +1 -1
  368. package/dist/lexicon/types/com/atproto/repo/importRepo.js.map +1 -1
  369. package/dist/lexicon/types/com/atproto/repo/listMissingBlobs.js.map +1 -1
  370. package/dist/lexicon/types/com/atproto/repo/listRecords.js.map +1 -1
  371. package/dist/lexicon/types/com/atproto/repo/putRecord.js.map +1 -1
  372. package/dist/lexicon/types/com/atproto/repo/strongRef.js.map +1 -1
  373. package/dist/lexicon/types/com/atproto/repo/uploadBlob.js.map +1 -1
  374. package/dist/lexicon/types/com/atproto/server/activateAccount.js.map +1 -1
  375. package/dist/lexicon/types/com/atproto/server/checkAccountStatus.js.map +1 -1
  376. package/dist/lexicon/types/com/atproto/server/confirmEmail.js.map +1 -1
  377. package/dist/lexicon/types/com/atproto/server/createAccount.js.map +1 -1
  378. package/dist/lexicon/types/com/atproto/server/createAppPassword.js.map +1 -1
  379. package/dist/lexicon/types/com/atproto/server/createInviteCode.js.map +1 -1
  380. package/dist/lexicon/types/com/atproto/server/createInviteCodes.js.map +1 -1
  381. package/dist/lexicon/types/com/atproto/server/createSession.js.map +1 -1
  382. package/dist/lexicon/types/com/atproto/server/deactivateAccount.js.map +1 -1
  383. package/dist/lexicon/types/com/atproto/server/defs.js.map +1 -1
  384. package/dist/lexicon/types/com/atproto/server/deleteAccount.js.map +1 -1
  385. package/dist/lexicon/types/com/atproto/server/deleteSession.js.map +1 -1
  386. package/dist/lexicon/types/com/atproto/server/describeServer.js.map +1 -1
  387. package/dist/lexicon/types/com/atproto/server/getAccountInviteCodes.js.map +1 -1
  388. package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
  389. package/dist/lexicon/types/com/atproto/server/getSession.js.map +1 -1
  390. package/dist/lexicon/types/com/atproto/server/listAppPasswords.js.map +1 -1
  391. package/dist/lexicon/types/com/atproto/server/refreshSession.js.map +1 -1
  392. package/dist/lexicon/types/com/atproto/server/requestAccountDelete.js.map +1 -1
  393. package/dist/lexicon/types/com/atproto/server/requestEmailConfirmation.js.map +1 -1
  394. package/dist/lexicon/types/com/atproto/server/requestEmailUpdate.js.map +1 -1
  395. package/dist/lexicon/types/com/atproto/server/requestPasswordReset.js.map +1 -1
  396. package/dist/lexicon/types/com/atproto/server/reserveSigningKey.js.map +1 -1
  397. package/dist/lexicon/types/com/atproto/server/resetPassword.js.map +1 -1
  398. package/dist/lexicon/types/com/atproto/server/revokeAppPassword.js.map +1 -1
  399. package/dist/lexicon/types/com/atproto/server/updateEmail.js.map +1 -1
  400. package/dist/lexicon/types/com/atproto/sync/defs.js.map +1 -1
  401. package/dist/lexicon/types/com/atproto/sync/getBlob.js.map +1 -1
  402. package/dist/lexicon/types/com/atproto/sync/getBlocks.js.map +1 -1
  403. package/dist/lexicon/types/com/atproto/sync/getCheckout.js.map +1 -1
  404. package/dist/lexicon/types/com/atproto/sync/getHead.js.map +1 -1
  405. package/dist/lexicon/types/com/atproto/sync/getHostStatus.js.map +1 -1
  406. package/dist/lexicon/types/com/atproto/sync/getLatestCommit.js.map +1 -1
  407. package/dist/lexicon/types/com/atproto/sync/getRecord.js.map +1 -1
  408. package/dist/lexicon/types/com/atproto/sync/getRepo.js.map +1 -1
  409. package/dist/lexicon/types/com/atproto/sync/getRepoStatus.js.map +1 -1
  410. package/dist/lexicon/types/com/atproto/sync/listBlobs.js.map +1 -1
  411. package/dist/lexicon/types/com/atproto/sync/listHosts.js.map +1 -1
  412. package/dist/lexicon/types/com/atproto/sync/listRepos.js.map +1 -1
  413. package/dist/lexicon/types/com/atproto/sync/listReposByCollection.js.map +1 -1
  414. package/dist/lexicon/types/com/atproto/sync/notifyOfUpdate.js.map +1 -1
  415. package/dist/lexicon/types/com/atproto/sync/requestCrawl.js.map +1 -1
  416. package/dist/lexicon/types/com/atproto/sync/subscribeRepos.js.map +1 -1
  417. package/dist/lexicon/types/com/atproto/temp/addReservedHandle.js.map +1 -1
  418. package/dist/lexicon/types/com/atproto/temp/checkHandleAvailability.js.map +1 -1
  419. package/dist/lexicon/types/com/atproto/temp/checkSignupQueue.js.map +1 -1
  420. package/dist/lexicon/types/com/atproto/temp/dereferenceScope.js.map +1 -1
  421. package/dist/lexicon/types/com/atproto/temp/fetchLabels.js.map +1 -1
  422. package/dist/lexicon/types/com/atproto/temp/requestPhoneVerification.js.map +1 -1
  423. package/dist/lexicon/types/com/atproto/temp/revokeAccountCredentials.js.map +1 -1
  424. package/dist/lexicon/types/tools/ozone/communication/createTemplate.js.map +1 -1
  425. package/dist/lexicon/types/tools/ozone/communication/defs.js.map +1 -1
  426. package/dist/lexicon/types/tools/ozone/communication/deleteTemplate.js.map +1 -1
  427. package/dist/lexicon/types/tools/ozone/communication/listTemplates.js.map +1 -1
  428. package/dist/lexicon/types/tools/ozone/communication/updateTemplate.js.map +1 -1
  429. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js.map +1 -1
  430. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts +46 -0
  431. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts.map +1 -0
  432. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js +25 -0
  433. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js.map +1 -0
  434. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +57 -2
  435. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  436. package/dist/lexicon/types/tools/ozone/moderation/defs.js +27 -0
  437. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  438. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts +1 -1
  439. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts.map +1 -1
  440. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js.map +1 -1
  441. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts +1 -1
  442. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts.map +1 -1
  443. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.js.map +1 -1
  444. package/dist/lexicon/types/tools/ozone/moderation/getEvent.js.map +1 -1
  445. package/dist/lexicon/types/tools/ozone/moderation/getRecord.js.map +1 -1
  446. package/dist/lexicon/types/tools/ozone/moderation/getRecords.js.map +1 -1
  447. package/dist/lexicon/types/tools/ozone/moderation/getRepo.js.map +1 -1
  448. package/dist/lexicon/types/tools/ozone/moderation/getReporterStats.js.map +1 -1
  449. package/dist/lexicon/types/tools/ozone/moderation/getRepos.js.map +1 -1
  450. package/dist/lexicon/types/tools/ozone/moderation/getSubjects.js.map +1 -1
  451. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts +38 -0
  452. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts.map +1 -0
  453. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js +7 -0
  454. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js.map +1 -0
  455. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
  456. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
  457. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts +75 -0
  458. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts.map +1 -0
  459. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js +43 -0
  460. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js.map +1 -0
  461. package/dist/lexicon/types/tools/ozone/moderation/searchRepos.js.map +1 -1
  462. package/dist/lexicon/types/tools/ozone/report/defs.d.ts +17 -27
  463. package/dist/lexicon/types/tools/ozone/report/defs.d.ts.map +1 -1
  464. package/dist/lexicon/types/tools/ozone/report/defs.js +17 -27
  465. package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
  466. package/dist/lexicon/types/tools/ozone/safelink/addRule.js.map +1 -1
  467. package/dist/lexicon/types/tools/ozone/safelink/defs.js.map +1 -1
  468. package/dist/lexicon/types/tools/ozone/safelink/queryEvents.js.map +1 -1
  469. package/dist/lexicon/types/tools/ozone/safelink/queryRules.js.map +1 -1
  470. package/dist/lexicon/types/tools/ozone/safelink/removeRule.js.map +1 -1
  471. package/dist/lexicon/types/tools/ozone/safelink/updateRule.js.map +1 -1
  472. package/dist/lexicon/types/tools/ozone/server/getConfig.js.map +1 -1
  473. package/dist/lexicon/types/tools/ozone/set/addValues.js.map +1 -1
  474. package/dist/lexicon/types/tools/ozone/set/defs.js.map +1 -1
  475. package/dist/lexicon/types/tools/ozone/set/deleteSet.js.map +1 -1
  476. package/dist/lexicon/types/tools/ozone/set/deleteValues.js.map +1 -1
  477. package/dist/lexicon/types/tools/ozone/set/getValues.js.map +1 -1
  478. package/dist/lexicon/types/tools/ozone/set/querySets.js.map +1 -1
  479. package/dist/lexicon/types/tools/ozone/set/upsertSet.js.map +1 -1
  480. package/dist/lexicon/types/tools/ozone/setting/defs.js.map +1 -1
  481. package/dist/lexicon/types/tools/ozone/setting/listOptions.js.map +1 -1
  482. package/dist/lexicon/types/tools/ozone/setting/removeOptions.js.map +1 -1
  483. package/dist/lexicon/types/tools/ozone/setting/upsertOption.js.map +1 -1
  484. package/dist/lexicon/types/tools/ozone/signature/defs.js.map +1 -1
  485. package/dist/lexicon/types/tools/ozone/signature/findCorrelation.js.map +1 -1
  486. package/dist/lexicon/types/tools/ozone/signature/findRelatedAccounts.js.map +1 -1
  487. package/dist/lexicon/types/tools/ozone/signature/searchAccounts.js.map +1 -1
  488. package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -1
  489. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -1
  490. package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -1
  491. package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -1
  492. package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -1
  493. package/dist/lexicon/types/tools/ozone/verification/defs.js.map +1 -1
  494. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js.map +1 -1
  495. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js.map +1 -1
  496. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js.map +1 -1
  497. package/dist/lexicon/util.js.map +1 -1
  498. package/dist/logger.js.map +1 -1
  499. package/dist/mod-service/index.d.ts.map +1 -1
  500. package/dist/mod-service/index.js +11 -0
  501. package/dist/mod-service/index.js.map +1 -1
  502. package/dist/mod-service/profile.d.ts.map +1 -1
  503. package/dist/mod-service/profile.js +14 -26
  504. package/dist/mod-service/profile.js.map +1 -1
  505. package/dist/mod-service/status.d.ts +3 -0
  506. package/dist/mod-service/status.d.ts.map +1 -1
  507. package/dist/mod-service/status.js.map +1 -1
  508. package/dist/mod-service/subject.js.map +1 -1
  509. package/dist/mod-service/types.js.map +1 -1
  510. package/dist/mod-service/util.js.map +1 -1
  511. package/dist/mod-service/views.d.ts.map +1 -1
  512. package/dist/mod-service/views.js +5 -0
  513. package/dist/mod-service/views.js.map +1 -1
  514. package/dist/safelink/service.js.map +1 -1
  515. package/dist/scheduled-action/service.d.ts +39 -0
  516. package/dist/scheduled-action/service.d.ts.map +1 -0
  517. package/dist/scheduled-action/service.js +208 -0
  518. package/dist/scheduled-action/service.js.map +1 -0
  519. package/dist/scheduled-action/types.d.ts +14 -0
  520. package/dist/scheduled-action/types.d.ts.map +1 -0
  521. package/dist/scheduled-action/types.js +3 -0
  522. package/dist/scheduled-action/types.js.map +1 -0
  523. package/dist/sequencer/index.js.map +1 -1
  524. package/dist/sequencer/outbox.js.map +1 -1
  525. package/dist/sequencer/sequencer.js.map +1 -1
  526. package/dist/set/service.js.map +1 -1
  527. package/dist/setting/constants.js.map +1 -1
  528. package/dist/setting/service.js.map +1 -1
  529. package/dist/setting/types.js.map +1 -1
  530. package/dist/setting/validators.js.map +1 -1
  531. package/dist/tag-service/content-tagger.js.map +1 -1
  532. package/dist/tag-service/embed-tagger.js.map +1 -1
  533. package/dist/tag-service/index.js.map +1 -1
  534. package/dist/tag-service/language-data.js.map +1 -1
  535. package/dist/tag-service/language-tagger.js.map +1 -1
  536. package/dist/tag-service/util.js.map +1 -1
  537. package/dist/team/index.js.map +1 -1
  538. package/dist/util.js.map +1 -1
  539. package/dist/verification/issuer.js.map +1 -1
  540. package/dist/verification/service.js.map +1 -1
  541. package/dist/verification/util.js.map +1 -1
  542. package/package.json +3 -3
  543. package/src/api/index.ts +6 -0
  544. package/src/api/moderation/cancelScheduledActions.ts +72 -0
  545. package/src/api/moderation/emitEvent.ts +9 -84
  546. package/src/api/moderation/listScheduledActions.ts +45 -0
  547. package/src/api/moderation/scheduleAction.ts +129 -0
  548. package/src/api/moderation/util.ts +96 -0
  549. package/src/api/util.ts +33 -0
  550. package/src/context.ts +11 -0
  551. package/src/daemon/context.ts +21 -0
  552. package/src/daemon/index.ts +1 -0
  553. package/src/daemon/scheduled-action-processor.ts +243 -0
  554. package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +56 -0
  555. package/src/db/migrations/index.ts +2 -0
  556. package/src/db/schema/index.ts +3 -1
  557. package/src/db/schema/scheduled-action.ts +25 -0
  558. package/src/lexicon/index.ts +51 -25
  559. package/src/lexicon/lexicons.ts +467 -69
  560. package/src/lexicon/types/com/atproto/moderation/defs.ts +10 -15
  561. package/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts +79 -0
  562. package/src/lexicon/types/tools/ozone/moderation/defs.ts +88 -0
  563. package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +2 -0
  564. package/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts +2 -0
  565. package/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts +57 -0
  566. package/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts +123 -0
  567. package/src/lexicon/types/tools/ozone/report/defs.ts +25 -40
  568. package/src/mod-service/index.ts +13 -0
  569. package/src/mod-service/profile.ts +22 -26
  570. package/src/mod-service/views.ts +7 -0
  571. package/src/scheduled-action/service.ts +279 -0
  572. package/src/scheduled-action/types.ts +17 -0
  573. package/tests/__snapshots__/scheduled-action.test.ts.snap +61 -0
  574. package/tests/scheduled-action-processor.test.ts +464 -0
  575. package/tests/scheduled-action.test.ts +334 -0
  576. package/tsconfig.build.tsbuildinfo +1 -1
  577. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -0,0 +1,72 @@
1
+ import { AuthRequiredError } from '@atproto/xrpc-server'
2
+ import { AppContext } from '../../context'
3
+ import { Server } from '../../lexicon'
4
+ import { subjectFromInput } from '../../mod-service/subject'
5
+ import { ScheduledTakedownTag } from './util'
6
+
7
+ export default function (server: Server, ctx: AppContext) {
8
+ server.tools.ozone.moderation.cancelScheduledActions({
9
+ auth: ctx.authVerifier.modOrAdminToken,
10
+ handler: async ({ input, auth }) => {
11
+ const access = auth.credentials
12
+ const db = ctx.db
13
+ const { subjects, comment } = input.body
14
+
15
+ if (!access.isModerator) {
16
+ throw new AuthRequiredError(
17
+ 'Must be a moderator to cancel scheduled actions',
18
+ )
19
+ }
20
+
21
+ const createdBy =
22
+ access.type === 'admin_token' ? ctx.cfg.service.did : access.iss
23
+ const now = new Date()
24
+
25
+ const result = await db.transaction(async (tx) => {
26
+ const scheduledActionService = ctx.scheduledActionService(tx)
27
+ const modService = ctx.modService(tx)
28
+
29
+ const cancellations =
30
+ await scheduledActionService.cancelScheduledActions(subjects)
31
+
32
+ for (const subject of cancellations.succeeded) {
33
+ await modService.logEvent({
34
+ event: {
35
+ $type: 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent',
36
+ comment,
37
+ },
38
+ subject: subjectFromInput({
39
+ did: subject,
40
+ $type: 'com.atproto.admin.defs#repoRef',
41
+ }),
42
+ createdBy,
43
+ createdAt: now,
44
+ })
45
+ await modService.logEvent({
46
+ event: {
47
+ $type: 'tools.ozone.moderation.defs#modEventTag',
48
+ remove: [ScheduledTakedownTag],
49
+ add: [],
50
+ },
51
+ subject: subjectFromInput({
52
+ did: subject,
53
+ $type: 'com.atproto.admin.defs#repoRef',
54
+ }),
55
+ createdBy,
56
+ createdAt: now,
57
+ })
58
+ }
59
+
60
+ return cancellations
61
+ })
62
+
63
+ return {
64
+ encoding: 'application/json',
65
+ body: {
66
+ succeeded: result.succeeded,
67
+ failed: result.failed,
68
+ },
69
+ }
70
+ },
71
+ })
72
+ }
@@ -21,13 +21,12 @@ import {
21
21
  } from '../../lexicon/types/tools/ozone/moderation/defs'
22
22
  import { HandlerInput } from '../../lexicon/types/tools/ozone/moderation/emitEvent'
23
23
  import { subjectFromInput } from '../../mod-service/subject'
24
- import { ProtectedTagSettingKey } from '../../setting/constants'
25
24
  import { SettingService } from '../../setting/service'
26
- import { ProtectedTagSetting } from '../../setting/types'
27
25
  import { TagService } from '../../tag-service'
28
26
  import { getTagForReport } from '../../tag-service/util'
29
27
  import { retryHttp } from '../../util'
30
28
  import { getEventType } from '../util'
29
+ import { assertProtectedTagAction, getProtectedTags } from './util'
31
30
 
32
31
  const handleModerationEvent = async ({
33
32
  ctx,
@@ -140,7 +139,14 @@ const handleModerationEvent = async ({
140
139
  )
141
140
 
142
141
  if (protectedTags) {
143
- assertProtectedTagAction(protectedTags, status.tags, createdBy, auth)
142
+ assertProtectedTagAction({
143
+ protectedTags,
144
+ subjectTags: status.tags,
145
+ actionAuthor: createdBy,
146
+ isAdmin: auth.credentials.isAdmin,
147
+ isModerator: auth.credentials.isModerator,
148
+ isTriage: auth.credentials.isTriage,
149
+ })
144
150
  }
145
151
  }
146
152
 
@@ -317,68 +323,6 @@ export default function (server: Server, ctx: AppContext) {
317
323
  })
318
324
  }
319
325
 
320
- const assertProtectedTagAction = (
321
- protectedTags: ProtectedTagSetting,
322
- subjectTags: string[],
323
- actionAuthor: string,
324
- auth: ModeratorOutput | AdminTokenOutput,
325
- ) => {
326
- subjectTags.forEach((tag) => {
327
- if (!Object.hasOwn(protectedTags, tag)) return
328
- if (
329
- protectedTags[tag]['moderators'] &&
330
- !protectedTags[tag]['moderators'].includes(actionAuthor)
331
- ) {
332
- throw new InvalidRequestError(
333
- `Not allowed to action on protected tag: ${tag}`,
334
- )
335
- }
336
-
337
- if (protectedTags[tag]['roles']) {
338
- if (auth.credentials.isAdmin) {
339
- if (
340
- protectedTags[tag]['roles'].includes(
341
- 'tools.ozone.team.defs#roleAdmin',
342
- )
343
- ) {
344
- return
345
- }
346
- throw new InvalidRequestError(
347
- `Not allowed to action on protected tag: ${tag}`,
348
- )
349
- }
350
-
351
- if (auth.credentials.isModerator) {
352
- if (
353
- protectedTags[tag]['roles'].includes(
354
- 'tools.ozone.team.defs#roleModerator',
355
- )
356
- ) {
357
- return
358
- }
359
-
360
- throw new InvalidRequestError(
361
- `Not allowed to action on protected tag: ${tag}`,
362
- )
363
- }
364
-
365
- if (auth.credentials.isTriage) {
366
- if (
367
- protectedTags[tag]['roles'].includes(
368
- 'tools.ozone.team.defs#roleTriage',
369
- )
370
- ) {
371
- return
372
- }
373
-
374
- throw new InvalidRequestError(
375
- `Not allowed to action on protected tag: ${tag}`,
376
- )
377
- }
378
- }
379
- })
380
- }
381
-
382
326
  const assertTagAuth = async (
383
327
  settingService: SettingService,
384
328
  serviceDid: string,
@@ -429,25 +373,6 @@ const assertTagAuth = async (
429
373
  }
430
374
  }
431
375
 
432
- const getProtectedTags = async (
433
- settingService: SettingService,
434
- serviceDid: string,
435
- ) => {
436
- const protectedTagSetting = await settingService.query({
437
- keys: [ProtectedTagSettingKey],
438
- scope: 'instance',
439
- did: serviceDid,
440
- limit: 1,
441
- })
442
-
443
- // if no protected tags are configured, then no need to do further check
444
- if (!protectedTagSetting.options.length) {
445
- return
446
- }
447
-
448
- return protectedTagSetting.options[0].value as ProtectedTagSetting
449
- }
450
-
451
376
  const validateLabels = (labels: string[]) => {
452
377
  for (const label of labels) {
453
378
  for (const char of badChars) {
@@ -0,0 +1,45 @@
1
+ import { AppContext } from '../../context'
2
+ import { Server } from '../../lexicon'
3
+ import { getScheduledActionStatus } from '../util'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.moderation.listScheduledActions({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ input }) => {
9
+ const db = ctx.db
10
+ const {
11
+ startsAfter,
12
+ endsBefore,
13
+ subjects,
14
+ statuses,
15
+ limit = 50,
16
+ cursor,
17
+ } = input.body
18
+
19
+ const scheduledActionService = ctx.scheduledActionService(db)
20
+
21
+ const parsedStatuses = statuses.map((status) =>
22
+ getScheduledActionStatus(status),
23
+ )
24
+
25
+ const result = await scheduledActionService.listScheduledActions({
26
+ cursor,
27
+ limit,
28
+ startTime: startsAfter ? new Date(startsAfter) : undefined,
29
+ endTime: endsBefore ? new Date(endsBefore) : undefined,
30
+ subjects,
31
+ statuses: parsedStatuses,
32
+ })
33
+
34
+ return {
35
+ encoding: 'application/json',
36
+ body: {
37
+ actions: result.actions.map((action) =>
38
+ scheduledActionService.formatScheduledAction(action),
39
+ ),
40
+ cursor: result.cursor,
41
+ },
42
+ }
43
+ },
44
+ })
45
+ }
@@ -0,0 +1,129 @@
1
+ import { ToolsOzoneModerationScheduleAction } from '@atproto/api'
2
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
3
+ import { AppContext } from '../../context'
4
+ import { Server } from '../../lexicon'
5
+ import { subjectFromInput } from '../../mod-service/subject'
6
+ import { ExecutionSchedule } from '../../scheduled-action/types'
7
+ import { getScheduledActionType } from '../util'
8
+ import { ScheduledTakedownTag } from './util'
9
+
10
+ export default function (server: Server, ctx: AppContext) {
11
+ server.tools.ozone.moderation.scheduleAction({
12
+ auth: ctx.authVerifier.modOrAdminToken,
13
+ handler: async ({ input, auth }) => {
14
+ const access = auth.credentials
15
+ const db = ctx.db
16
+ const { action, subjects, createdBy, scheduling, modTool } = input.body
17
+
18
+ if (!access.isModerator) {
19
+ throw new AuthRequiredError('Must be a moderator to schedule actions')
20
+ }
21
+
22
+ if (access.type === 'admin_token' && !createdBy) {
23
+ throw new AuthRequiredError(
24
+ 'Must specify createdBy when using admin auth',
25
+ )
26
+ }
27
+
28
+ const actionType = getScheduledActionType(
29
+ action.$type?.split('#')[1] || '',
30
+ )
31
+
32
+ const succeeded: string[] = []
33
+ const failed: ToolsOzoneModerationScheduleAction.FailedScheduling[] = []
34
+
35
+ // Defining alternatively required fields is not supported by lexicons so we need to manually validate here
36
+ if (!scheduling.executeAt && !scheduling.executeAfter) {
37
+ throw new InvalidRequestError('Must specify an execution schedule')
38
+ }
39
+
40
+ const executionSchedule: ExecutionSchedule = scheduling.executeAt
41
+ ? { executeAt: new Date(scheduling.executeAt) }
42
+ : {
43
+ executeAfter: new Date(scheduling.executeAfter!),
44
+ executeUntil: scheduling.executeUntil
45
+ ? new Date(scheduling.executeUntil)
46
+ : undefined,
47
+ }
48
+
49
+ const eventData = { ...action, modTool }
50
+ const actualCreatedBy =
51
+ access.type === 'admin_token' ? createdBy : access.iss
52
+
53
+ const now = new Date()
54
+ for (const subject of subjects) {
55
+ try {
56
+ await db.transaction(async (tx) => {
57
+ const modService = ctx.modService(tx)
58
+ const scheduledActionService = ctx.scheduledActionService(tx)
59
+ // register the action in database
60
+ await scheduledActionService.scheduleAction({
61
+ action: actionType,
62
+ eventData,
63
+ did: subject,
64
+ createdBy: actualCreatedBy,
65
+ ...executionSchedule,
66
+ })
67
+ // log an event in the mod event stream
68
+ if (ToolsOzoneModerationScheduleAction.isTakedown(action)) {
69
+ await modService.logEvent({
70
+ event: {
71
+ $type: 'tools.ozone.moderation.defs#scheduleTakedownEvent',
72
+ executeAfter: scheduling.executeAfter,
73
+ executeUntil: scheduling.executeUntil,
74
+ executeAt: scheduling.executeAt,
75
+ comment: action.comment,
76
+ },
77
+ subject: subjectFromInput({
78
+ did: subject,
79
+ $type: 'com.atproto.admin.defs#repoRef',
80
+ }),
81
+ createdBy: actualCreatedBy,
82
+ createdAt: now,
83
+ modTool,
84
+ })
85
+ await modService.logEvent({
86
+ event: {
87
+ $type: 'tools.ozone.moderation.defs#modEventTag',
88
+ add: [ScheduledTakedownTag],
89
+ remove: [],
90
+ },
91
+ subject: subjectFromInput({
92
+ did: subject,
93
+ $type: 'com.atproto.admin.defs#repoRef',
94
+ }),
95
+ createdBy,
96
+ createdAt: now,
97
+ })
98
+ }
99
+ succeeded.push(subject)
100
+ })
101
+ } catch (error) {
102
+ let errorMessage = 'Unknown error'
103
+ let errorCode: string | undefined
104
+
105
+ if (error instanceof InvalidRequestError) {
106
+ errorMessage = error.message
107
+ errorCode = 'InvalidRequest'
108
+ } else if (error instanceof Error) {
109
+ errorMessage = error.message
110
+ }
111
+
112
+ failed.push({
113
+ subject,
114
+ error: errorMessage,
115
+ errorCode,
116
+ })
117
+ }
118
+ }
119
+
120
+ return {
121
+ encoding: 'application/json',
122
+ body: {
123
+ succeeded,
124
+ failed,
125
+ },
126
+ }
127
+ },
128
+ })
129
+ }
@@ -0,0 +1,96 @@
1
+ import { InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { ProtectedTagSettingKey } from '../../setting/constants'
3
+ import { SettingService } from '../../setting/service'
4
+ import { ProtectedTagSetting } from '../../setting/types'
5
+
6
+ export const getProtectedTags = async (
7
+ settingService: SettingService,
8
+ serviceDid: string,
9
+ ) => {
10
+ const protectedTagSetting = await settingService.query({
11
+ keys: [ProtectedTagSettingKey],
12
+ scope: 'instance',
13
+ did: serviceDid,
14
+ limit: 1,
15
+ })
16
+
17
+ // if no protected tags are configured, then no need to do further check
18
+ if (!protectedTagSetting.options.length) {
19
+ return
20
+ }
21
+
22
+ return protectedTagSetting.options[0].value as ProtectedTagSetting
23
+ }
24
+
25
+ export const assertProtectedTagAction = ({
26
+ protectedTags,
27
+ subjectTags,
28
+ actionAuthor,
29
+ isModerator,
30
+ isAdmin,
31
+ isTriage,
32
+ }: {
33
+ protectedTags: ProtectedTagSetting
34
+ subjectTags: string[]
35
+ actionAuthor: string
36
+ isModerator: boolean
37
+ isAdmin: boolean
38
+ isTriage: boolean
39
+ }) => {
40
+ subjectTags.forEach((tag) => {
41
+ if (!Object.hasOwn(protectedTags, tag)) return
42
+ if (
43
+ protectedTags[tag]['moderators'] &&
44
+ !protectedTags[tag]['moderators'].includes(actionAuthor)
45
+ ) {
46
+ throw new InvalidRequestError(
47
+ `Not allowed to action on protected tag: ${tag}`,
48
+ )
49
+ }
50
+
51
+ if (protectedTags[tag]['roles']) {
52
+ if (isAdmin) {
53
+ if (
54
+ protectedTags[tag]['roles'].includes(
55
+ 'tools.ozone.team.defs#roleAdmin',
56
+ )
57
+ ) {
58
+ return
59
+ }
60
+ throw new InvalidRequestError(
61
+ `Not allowed to action on protected tag: ${tag}`,
62
+ )
63
+ }
64
+
65
+ if (isModerator) {
66
+ if (
67
+ protectedTags[tag]['roles'].includes(
68
+ 'tools.ozone.team.defs#roleModerator',
69
+ )
70
+ ) {
71
+ return
72
+ }
73
+
74
+ throw new InvalidRequestError(
75
+ `Not allowed to action on protected tag: ${tag}`,
76
+ )
77
+ }
78
+
79
+ if (isTriage) {
80
+ if (
81
+ protectedTags[tag]['roles'].includes(
82
+ 'tools.ozone.team.defs#roleTriage',
83
+ )
84
+ ) {
85
+ return
86
+ }
87
+
88
+ throw new InvalidRequestError(
89
+ `Not allowed to action on protected tag: ${tag}`,
90
+ )
91
+ }
92
+ }
93
+ })
94
+ }
95
+
96
+ export const ScheduledTakedownTag = 'scheduled-takedown'
package/src/api/util.ts CHANGED
@@ -152,6 +152,8 @@ const eventTypes = new Set([
152
152
  'tools.ozone.moderation.defs#ageAssuranceEvent',
153
153
  'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
154
154
  'tools.ozone.moderation.defs#revokeAccountCredentialsEvent',
155
+ 'tools.ozone.moderation.defs#scheduleTakedownEvent',
156
+ 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent',
155
157
  ])
156
158
 
157
159
  export const getMemberRole = (role: string) => {
@@ -211,3 +213,34 @@ const safelinkPatterns = new Set(['domain', 'url'])
211
213
  const safelinkActions = new Set(['block', 'warn', 'whitelist'])
212
214
  const safelinkReasons = new Set(['csam', 'spam', 'phishing', 'none'])
213
215
  const safelinkEventTypes = new Set(['addRule', 'updateRule', 'removeRule'])
216
+
217
+ export const getScheduledActionType = (action: string): ScheduledActionType => {
218
+ if (scheduledActionTypes.has(action)) {
219
+ return action as ScheduledActionType
220
+ }
221
+ throw new InvalidRequestError('Invalid scheduled action type')
222
+ }
223
+
224
+ export const getScheduledActionStatus = (
225
+ status: string,
226
+ ): ScheduledActionStatus => {
227
+ if (scheduledActionStatuses.has(status)) {
228
+ return status as ScheduledActionStatus
229
+ }
230
+ throw new InvalidRequestError('Invalid scheduled action status')
231
+ }
232
+
233
+ export type ScheduledActionType = 'takedown'
234
+ export type ScheduledActionStatus =
235
+ | 'pending'
236
+ | 'executed'
237
+ | 'cancelled'
238
+ | 'failed'
239
+
240
+ const scheduledActionTypes = new Set(['takedown'])
241
+ const scheduledActionStatuses = new Set([
242
+ 'pending',
243
+ 'executed',
244
+ 'cancelled',
245
+ 'failed',
246
+ ])
package/src/context.ts CHANGED
@@ -25,6 +25,10 @@ import {
25
25
  SafelinkRuleService,
26
26
  SafelinkRuleServiceCreator,
27
27
  } from './safelink/service'
28
+ import {
29
+ ScheduledActionService,
30
+ ScheduledActionServiceCreator,
31
+ } from './scheduled-action/service'
28
32
  import { Sequencer } from './sequencer/sequencer'
29
33
  import { SetService, SetServiceCreator } from './set/service'
30
34
  import { SettingService, SettingServiceCreator } from './setting/service'
@@ -52,6 +56,7 @@ export type AppContextOptions = {
52
56
  moderationServiceProfile: ModerationServiceProfileCreator
53
57
  communicationTemplateService: CommunicationTemplateServiceCreator
54
58
  safelinkRuleService: SafelinkRuleServiceCreator
59
+ scheduledActionService: ScheduledActionServiceCreator
55
60
  setService: SetServiceCreator
56
61
  settingService: SettingServiceCreator
57
62
  teamService: TeamServiceCreator
@@ -141,6 +146,7 @@ export class AppContext {
141
146
 
142
147
  const communicationTemplateService = CommunicationTemplateService.creator()
143
148
  const safelinkRuleService = SafelinkRuleService.creator()
149
+ const scheduledActionService = ScheduledActionService.creator()
144
150
  const teamService = TeamService.creator(
145
151
  appviewAgent,
146
152
  cfg.appview.did,
@@ -171,6 +177,7 @@ export class AppContext {
171
177
  moderationServiceProfile,
172
178
  communicationTemplateService,
173
179
  safelinkRuleService,
180
+ scheduledActionService,
174
181
  teamService,
175
182
  setService,
176
183
  settingService,
@@ -225,6 +232,10 @@ export class AppContext {
225
232
  return this.opts.safelinkRuleService
226
233
  }
227
234
 
235
+ get scheduledActionService(): ScheduledActionServiceCreator {
236
+ return this.opts.scheduledActionService
237
+ }
238
+
228
239
  get teamService(): TeamServiceCreator {
229
240
  return this.opts.teamService
230
241
  }
@@ -7,11 +7,14 @@ import { BackgroundQueue } from '../background'
7
7
  import { OzoneConfig, OzoneSecrets } from '../config'
8
8
  import { Database } from '../db'
9
9
  import { ModerationService } from '../mod-service'
10
+ import { ScheduledActionService } from '../scheduled-action/service'
11
+ import { SettingService } from '../setting/service'
10
12
  import { TeamService } from '../team'
11
13
  import { getSigningKeyId } from '../util'
12
14
  import { EventPusher } from './event-pusher'
13
15
  import { EventReverser } from './event-reverser'
14
16
  import { MaterializedViewRefresher } from './materialized-view-refresher'
17
+ import { ScheduledActionProcessor } from './scheduled-action-processor'
15
18
  import { TeamProfileSynchronizer } from './team-profile-synchronizer'
16
19
  import { VerificationListener } from './verification-listener'
17
20
 
@@ -24,6 +27,7 @@ export type DaemonContextOptions = {
24
27
  eventReverser: EventReverser
25
28
  materializedViewRefresher: MaterializedViewRefresher
26
29
  teamProfileSynchronizer: TeamProfileSynchronizer
30
+ scheduledActionProcessor: ScheduledActionProcessor
27
31
  verificationListener?: VerificationListener
28
32
  }
29
33
 
@@ -72,6 +76,8 @@ export class DaemonContext {
72
76
  appviewAgent,
73
77
  createAuthHeaders,
74
78
  )
79
+ const settingService = SettingService.creator()
80
+ const scheduledActionService = ScheduledActionService.creator()
75
81
  const teamService = TeamService.creator(
76
82
  appviewAgent,
77
83
  cfg.appview.did,
@@ -90,6 +96,14 @@ export class DaemonContext {
90
96
  cfg.db.materializedViewRefreshIntervalMs,
91
97
  )
92
98
 
99
+ const scheduledActionProcessor = new ScheduledActionProcessor(
100
+ db,
101
+ cfg.service.did,
102
+ settingService,
103
+ modService,
104
+ scheduledActionService,
105
+ )
106
+
93
107
  // Only spawn the listener if verifier config exists and a jetstream URL is provided
94
108
  const verificationListener =
95
109
  cfg.verifier && cfg.jetstreamUrl
@@ -109,6 +123,7 @@ export class DaemonContext {
109
123
  eventReverser,
110
124
  materializedViewRefresher,
111
125
  teamProfileSynchronizer,
126
+ scheduledActionProcessor,
112
127
  verificationListener,
113
128
  ...(overrides ?? {}),
114
129
  })
@@ -142,6 +157,10 @@ export class DaemonContext {
142
157
  return this.opts.teamProfileSynchronizer
143
158
  }
144
159
 
160
+ get scheduledActionProcessor(): ScheduledActionProcessor {
161
+ return this.opts.scheduledActionProcessor
162
+ }
163
+
145
164
  get verificationListener(): VerificationListener | undefined {
146
165
  return this.opts.verificationListener
147
166
  }
@@ -151,6 +170,7 @@ export class DaemonContext {
151
170
  this.eventReverser.start()
152
171
  this.materializedViewRefresher.start()
153
172
  this.teamProfileSynchronizer.start()
173
+ this.scheduledActionProcessor.start()
154
174
  this.verificationListener?.start()
155
175
  }
156
176
 
@@ -168,6 +188,7 @@ export class DaemonContext {
168
188
  this.eventPusher.destroy(),
169
189
  this.materializedViewRefresher.destroy(),
170
190
  this.teamProfileSynchronizer.destroy(),
191
+ this.scheduledActionProcessor.destroy(),
171
192
  this.verificationListener?.stop(),
172
193
  ])
173
194
  } finally {
@@ -5,6 +5,7 @@ import { DaemonContext } from './context'
5
5
  export { EventPusher } from './event-pusher'
6
6
  export { BlobDiverter } from './blob-diverter'
7
7
  export { EventReverser } from './event-reverser'
8
+ export { ScheduledActionProcessor } from './scheduled-action-processor'
8
9
 
9
10
  export class OzoneDaemon {
10
11
  constructor(public ctx: DaemonContext) {}