@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,243 @@
1
+ import { Selectable } from 'kysely'
2
+ import { MINUTE, SECOND } from '@atproto/common'
3
+ import {
4
+ assertProtectedTagAction,
5
+ getProtectedTags,
6
+ } from '../api/moderation/util'
7
+ import { Database } from '../db'
8
+ import { ScheduledAction } from '../db/schema/scheduled-action'
9
+ import {
10
+ ModEventTakedown,
11
+ ModTool,
12
+ } from '../lexicon/types/tools/ozone/moderation/defs'
13
+ import { dbLogger } from '../logger'
14
+ import { ModerationService, ModerationServiceCreator } from '../mod-service'
15
+ import { RepoSubject } from '../mod-service/subject'
16
+ import { ModEventType } from '../mod-service/types'
17
+ import { ScheduledActionServiceCreator } from '../scheduled-action/service'
18
+ import { SettingService, SettingServiceCreator } from '../setting/service'
19
+
20
+ export class ScheduledActionProcessor {
21
+ destroyed = false
22
+ processingPromise: Promise<void> = Promise.resolve()
23
+ timer?: NodeJS.Timeout
24
+
25
+ constructor(
26
+ private db: Database,
27
+ private serviceDid: string,
28
+ private settingService: SettingServiceCreator,
29
+ private modService: ModerationServiceCreator,
30
+ private scheduledActionService: ScheduledActionServiceCreator,
31
+ ) {}
32
+
33
+ start() {
34
+ this.poll()
35
+ }
36
+
37
+ poll() {
38
+ if (this.destroyed) return
39
+ this.processingPromise = this.findAndExecuteScheduledActions()
40
+ .catch((err) =>
41
+ dbLogger.error({ err }, 'scheduled action processing errored'),
42
+ )
43
+ .finally(() => {
44
+ this.timer = setTimeout(() => this.poll(), getInterval())
45
+ })
46
+ }
47
+
48
+ async destroy() {
49
+ this.destroyed = true
50
+ if (this.timer) {
51
+ clearTimeout(this.timer)
52
+ this.timer = undefined
53
+ }
54
+ await this.processingPromise
55
+ }
56
+
57
+ async executeScheduledAction(actionId: number) {
58
+ await this.db.transaction(async (dbTxn) => {
59
+ const settingService = this.settingService(dbTxn)
60
+ const moderationTxn = this.modService(dbTxn)
61
+ const scheduledActionTxn = this.scheduledActionService(dbTxn)
62
+
63
+ try {
64
+ // maybe overfetching here to get the action again within the transaction to ensure it's still pending
65
+ const action = await dbTxn.db
66
+ .selectFrom('scheduled_action')
67
+ .selectAll()
68
+ .where('id', '=', actionId)
69
+ .where('status', '=', 'pending')
70
+ .executeTakeFirst()
71
+
72
+ if (!action) {
73
+ // already processed or cancelled
74
+ return
75
+ }
76
+
77
+ let event: ModEventType
78
+ let modTool: ModTool | undefined
79
+
80
+ // Create the appropriate moderation action based on the scheduled action type
81
+ switch (action.action) {
82
+ case 'takedown':
83
+ {
84
+ const eventData = action.eventData as ModEventTakedown & {
85
+ modTool?: ModTool
86
+ }
87
+ modTool = eventData.modTool
88
+ event = {
89
+ $type: 'tools.ozone.moderation.defs#modEventTakedown',
90
+ comment: `[SCHEDULED_ACTION] ${eventData.comment || 'Scheduled takedown executed'}`,
91
+ durationInHours: eventData.durationInHours,
92
+ acknowledgeAccountSubjects:
93
+ eventData.acknowledgeAccountSubjects,
94
+ policies: eventData.policies,
95
+ }
96
+ }
97
+ break
98
+ default:
99
+ throw new Error(
100
+ `Unsupported scheduled action type: ${action.action}`,
101
+ )
102
+ }
103
+
104
+ const moderationEvent = await this.performTakedown({
105
+ action,
106
+ event,
107
+ modTool,
108
+ moderationTxn,
109
+ settingService,
110
+ })
111
+
112
+ // Mark the scheduled action as executed
113
+ await scheduledActionTxn.markActionAsExecuted(
114
+ actionId,
115
+ moderationEvent.event.id,
116
+ )
117
+
118
+ dbLogger.info(
119
+ {
120
+ did: action.did,
121
+ scheduledActionId: actionId,
122
+ moderationEventId: moderationEvent.event.id,
123
+ },
124
+ 'executed scheduled action',
125
+ )
126
+ } catch (error) {
127
+ const errorMessage =
128
+ error instanceof Error ? error.message : 'Unknown error'
129
+
130
+ // mark as failed
131
+ await scheduledActionTxn.markActionAsFailed(actionId, errorMessage)
132
+
133
+ dbLogger.error(
134
+ {
135
+ scheduledActionId: actionId,
136
+ error: errorMessage,
137
+ },
138
+ 'failed to execute scheduled action',
139
+ )
140
+ }
141
+ })
142
+ }
143
+
144
+ async performTakedown({
145
+ action,
146
+ event,
147
+ modTool,
148
+ moderationTxn,
149
+ settingService,
150
+ }: {
151
+ action: Selectable<ScheduledAction>
152
+ event: ModEventType
153
+ modTool: ModTool | undefined
154
+
155
+ moderationTxn: ModerationService
156
+ settingService: SettingService
157
+ }) {
158
+ const subject = new RepoSubject(action.did)
159
+
160
+ const status = await moderationTxn.getStatus(subject)
161
+
162
+ if (status?.takendown) {
163
+ throw new Error(`Account is already taken down`)
164
+ }
165
+
166
+ if (status?.tags?.length) {
167
+ const protectedTags = await getProtectedTags(
168
+ settingService,
169
+ this.serviceDid,
170
+ )
171
+
172
+ if (protectedTags) {
173
+ assertProtectedTagAction({
174
+ protectedTags,
175
+ subjectTags: status.tags,
176
+ actionAuthor: action.createdBy,
177
+ isAdmin: true,
178
+ isModerator: false,
179
+ isTriage: false,
180
+ })
181
+ }
182
+ }
183
+
184
+ // log the event which also applies the necessary state changes to moderation subject
185
+ const moderationEvent = await moderationTxn.logEvent({
186
+ event,
187
+ subject,
188
+ modTool,
189
+ createdBy: action.createdBy,
190
+ })
191
+
192
+ // register the takedown in event pusher
193
+ await moderationTxn.takedownRepo(subject, moderationEvent.event.id)
194
+
195
+ return moderationEvent
196
+ }
197
+
198
+ async findAndExecuteScheduledActions() {
199
+ const scheduledActionService = this.scheduledActionService(this.db)
200
+ const now = new Date()
201
+
202
+ const actionsToExecute =
203
+ await scheduledActionService.getPendingActionsToExecute(now)
204
+
205
+ for (const action of actionsToExecute) {
206
+ // For randomized execution, check if we should execute now or wait
207
+ if (action.randomizeExecution && action.executeAfter) {
208
+ const executeAfter = new Date(action.executeAfter)
209
+ // Default to a 30 second window for execution
210
+ const executeUntil = action.executeUntil
211
+ ? new Date(action.executeUntil)
212
+ : new Date(executeAfter.getTime() + 30 * SECOND)
213
+
214
+ // Only execute if we're past the earliest time
215
+ if (now < executeAfter) {
216
+ continue
217
+ }
218
+
219
+ // For randomized scheduling, randomly decide whether to execute now
220
+ // The probability increases as we get closer to the deadline
221
+ const timeRange = executeUntil.getTime() - executeAfter.getTime()
222
+ const timeElapsed = now.getTime() - executeAfter.getTime()
223
+ const executeProb = Math.min(timeElapsed / timeRange, 1)
224
+
225
+ // Execute with increasing probability as we approach the deadline
226
+ // Always execute if we're at or past the deadline
227
+ if (now < executeUntil && Math.random() > executeProb * 0.1) {
228
+ continue
229
+ }
230
+ }
231
+
232
+ await this.executeScheduledAction(action.id)
233
+ }
234
+ }
235
+ }
236
+
237
+ const getInterval = (): number => {
238
+ // Process scheduled actions every minute
239
+ const now = Date.now()
240
+ const intervalMs = MINUTE
241
+ const nextIteration = Math.ceil(now / intervalMs)
242
+ return nextIteration * intervalMs - now
243
+ }
@@ -0,0 +1,56 @@
1
+ import { Kysely, sql } from 'kysely'
2
+
3
+ export async function up(db: Kysely<unknown>): Promise<void> {
4
+ await db.schema
5
+ .createTable('scheduled_action')
6
+ .addColumn('id', 'bigserial', (col) => col.primaryKey())
7
+ .addColumn('action', 'varchar', (col) => col.notNull())
8
+ .addColumn('eventData', 'jsonb')
9
+ .addColumn('did', 'varchar', (col) => col.notNull())
10
+ .addColumn('executeAt', 'varchar')
11
+ .addColumn('executeAfter', 'varchar')
12
+ .addColumn('executeUntil', 'varchar')
13
+ .addColumn('randomizeExecution', 'boolean', (col) =>
14
+ col.notNull().defaultTo(false),
15
+ )
16
+ .addColumn('createdBy', 'varchar', (col) => col.notNull())
17
+ .addColumn('createdAt', 'varchar', (col) => col.notNull())
18
+ .addColumn('updatedAt', 'varchar', (col) => col.notNull())
19
+ .addColumn('status', 'varchar', (col) => col.notNull().defaultTo('pending'))
20
+ .addColumn('lastExecutedAt', 'varchar')
21
+ .addColumn('lastFailureReason', 'text')
22
+ .addColumn('executionEventId', 'bigint')
23
+ .execute()
24
+
25
+ // Unique constraint to prevent multiple pending actions for the same subject
26
+ await sql`
27
+ CREATE UNIQUE INDEX scheduled_action_unique_pending_subject
28
+ ON scheduled_action (did, action)
29
+ WHERE status = 'pending'
30
+ `.execute(db)
31
+
32
+ // for task runner to query pending actions efficiently
33
+ await db.schema
34
+ .createIndex('scheduled_action_execute_time_idx')
35
+ .on('scheduled_action')
36
+ .columns(['executeAt', 'executeAfter', 'status'])
37
+ .execute()
38
+
39
+ // for querying actions by subject
40
+ await db.schema
41
+ .createIndex('scheduled_action_did_idx')
42
+ .on('scheduled_action')
43
+ .column('did')
44
+ .execute()
45
+
46
+ // we require status to be always passed when listing scheduled actions and use createdAt for pagination
47
+ await db.schema
48
+ .createIndex('scheduled_action_status_created_at_idx')
49
+ .on('scheduled_action')
50
+ .columns(['status', 'createdAt'])
51
+ .execute()
52
+ }
53
+
54
+ export async function down(db: Kysely<unknown>): Promise<void> {
55
+ await db.schema.dropTable('scheduled_action').execute()
56
+ }
@@ -30,3 +30,5 @@ export * as _20250618T180246000Z from './20250618T180246000Z-add-mod-tool-to-mod
30
30
  export * as _20250701T000000000Z from './20250701T000000000Z-add-age-assurance-state'
31
31
  export * as _20250715T000000000Z from './20250715T000000000Z-add-mod-event-external-id'
32
32
  export * as _20250718T150931000Z from './20250718T150931000Z-update-appeal-reason-stats'
33
+ export * as _20250813T000000000Z from './20250813T000000000Z-mod-tool-batch-id-index'
34
+ export * as _20250923T000000000Z from './20250923T000000000Z-scheduled-actions'
@@ -14,6 +14,7 @@ import * as recordEventsStats from './record_events_stats'
14
14
  import * as recordPushEvent from './record_push_event'
15
15
  import * as repoPushEvent from './repo_push_event'
16
16
  import * as safelink from './safelink'
17
+ import * as scheduledAction from './scheduled-action'
17
18
  import * as setting from './setting'
18
19
  import * as signingKey from './signing_key'
19
20
  import * as verification from './verification'
@@ -35,7 +36,8 @@ export type DatabaseSchemaType = modEvent.PartialDB &
35
36
  accountRecordStatusStats.PartialDB &
36
37
  verification.PartialDB &
37
38
  firehoseCursor.PartialDB &
38
- safelink.PartialDB
39
+ safelink.PartialDB &
40
+ scheduledAction.PartialDB
39
41
 
40
42
  export type DatabaseSchema = Kysely<DatabaseSchemaType>
41
43
 
@@ -0,0 +1,25 @@
1
+ import { GeneratedAlways } from 'kysely'
2
+
3
+ export const scheduledActionTableName = 'scheduled_action'
4
+
5
+ export interface ScheduledAction {
6
+ id: GeneratedAlways<number>
7
+ action: string
8
+ eventData: unknown | null
9
+ did: string
10
+ executeAt: string | null
11
+ executeAfter: string | null
12
+ executeUntil: string | null
13
+ randomizeExecution: boolean
14
+ createdBy: string
15
+ createdAt: string
16
+ updatedAt: string
17
+ status: string
18
+ lastExecutedAt: string | null
19
+ lastFailureReason: string | null
20
+ executionEventId: number | null
21
+ }
22
+
23
+ export type PartialDB = {
24
+ [scheduledActionTableName]: ScheduledAction
25
+ }
@@ -209,6 +209,7 @@ import * as ToolsOzoneCommunicationDeleteTemplate from './types/tools/ozone/comm
209
209
  import * as ToolsOzoneCommunicationListTemplates from './types/tools/ozone/communication/listTemplates.js'
210
210
  import * as ToolsOzoneCommunicationUpdateTemplate from './types/tools/ozone/communication/updateTemplate.js'
211
211
  import * as ToolsOzoneHostingGetAccountHistory from './types/tools/ozone/hosting/getAccountHistory.js'
212
+ import * as ToolsOzoneModerationCancelScheduledActions from './types/tools/ozone/moderation/cancelScheduledActions.js'
212
213
  import * as ToolsOzoneModerationEmitEvent from './types/tools/ozone/moderation/emitEvent.js'
213
214
  import * as ToolsOzoneModerationGetAccountTimeline from './types/tools/ozone/moderation/getAccountTimeline.js'
214
215
  import * as ToolsOzoneModerationGetEvent from './types/tools/ozone/moderation/getEvent.js'
@@ -218,8 +219,10 @@ import * as ToolsOzoneModerationGetRepo from './types/tools/ozone/moderation/get
218
219
  import * as ToolsOzoneModerationGetReporterStats from './types/tools/ozone/moderation/getReporterStats.js'
219
220
  import * as ToolsOzoneModerationGetRepos from './types/tools/ozone/moderation/getRepos.js'
220
221
  import * as ToolsOzoneModerationGetSubjects from './types/tools/ozone/moderation/getSubjects.js'
222
+ import * as ToolsOzoneModerationListScheduledActions from './types/tools/ozone/moderation/listScheduledActions.js'
221
223
  import * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation/queryEvents.js'
222
224
  import * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js'
225
+ import * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js'
223
226
  import * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js'
224
227
  import * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js'
225
228
  import * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js'
@@ -294,12 +297,11 @@ export const TOOLS_OZONE_MODERATION = {
294
297
  }
295
298
  export const TOOLS_OZONE_REPORT = {
296
299
  DefsReasonAppeal: 'tools.ozone.report.defs#reasonAppeal',
297
- DefsReasonViolenceAnimalWelfare:
298
- 'tools.ozone.report.defs#reasonViolenceAnimalWelfare',
300
+ DefsReasonOther: 'tools.ozone.report.defs#reasonOther',
301
+ DefsReasonViolenceAnimal: 'tools.ozone.report.defs#reasonViolenceAnimal',
299
302
  DefsReasonViolenceThreats: 'tools.ozone.report.defs#reasonViolenceThreats',
300
303
  DefsReasonViolenceGraphicContent:
301
304
  'tools.ozone.report.defs#reasonViolenceGraphicContent',
302
- DefsReasonViolenceSelfHarm: 'tools.ozone.report.defs#reasonViolenceSelfHarm',
303
305
  DefsReasonViolenceGlorification:
304
306
  'tools.ozone.report.defs#reasonViolenceGlorification',
305
307
  DefsReasonViolenceExtremistContent:
@@ -310,21 +312,16 @@ export const TOOLS_OZONE_REPORT = {
310
312
  DefsReasonSexualAbuseContent:
311
313
  'tools.ozone.report.defs#reasonSexualAbuseContent',
312
314
  DefsReasonSexualNCII: 'tools.ozone.report.defs#reasonSexualNCII',
313
- DefsReasonSexualSextortion: 'tools.ozone.report.defs#reasonSexualSextortion',
314
315
  DefsReasonSexualDeepfake: 'tools.ozone.report.defs#reasonSexualDeepfake',
315
316
  DefsReasonSexualAnimal: 'tools.ozone.report.defs#reasonSexualAnimal',
316
317
  DefsReasonSexualUnlabeled: 'tools.ozone.report.defs#reasonSexualUnlabeled',
317
318
  DefsReasonSexualOther: 'tools.ozone.report.defs#reasonSexualOther',
318
319
  DefsReasonChildSafetyCSAM: 'tools.ozone.report.defs#reasonChildSafetyCSAM',
319
320
  DefsReasonChildSafetyGroom: 'tools.ozone.report.defs#reasonChildSafetyGroom',
320
- DefsReasonChildSafetyMinorPrivacy:
321
- 'tools.ozone.report.defs#reasonChildSafetyMinorPrivacy',
322
- DefsReasonChildSafetyEndangerment:
323
- 'tools.ozone.report.defs#reasonChildSafetyEndangerment',
321
+ DefsReasonChildSafetyPrivacy:
322
+ 'tools.ozone.report.defs#reasonChildSafetyPrivacy',
324
323
  DefsReasonChildSafetyHarassment:
325
324
  'tools.ozone.report.defs#reasonChildSafetyHarassment',
326
- DefsReasonChildSafetyPromotion:
327
- 'tools.ozone.report.defs#reasonChildSafetyPromotion',
328
325
  DefsReasonChildSafetyOther: 'tools.ozone.report.defs#reasonChildSafetyOther',
329
326
  DefsReasonHarassmentTroll: 'tools.ozone.report.defs#reasonHarassmentTroll',
330
327
  DefsReasonHarassmentTargeted:
@@ -339,27 +336,20 @@ export const TOOLS_OZONE_REPORT = {
339
336
  'tools.ozone.report.defs#reasonMisleadingImpersonation',
340
337
  DefsReasonMisleadingSpam: 'tools.ozone.report.defs#reasonMisleadingSpam',
341
338
  DefsReasonMisleadingScam: 'tools.ozone.report.defs#reasonMisleadingScam',
342
- DefsReasonMisleadingSyntheticContent:
343
- 'tools.ozone.report.defs#reasonMisleadingSyntheticContent',
344
- DefsReasonMisleadingMisinformation:
345
- 'tools.ozone.report.defs#reasonMisleadingMisinformation',
339
+ DefsReasonMisleadingElections:
340
+ 'tools.ozone.report.defs#reasonMisleadingElections',
346
341
  DefsReasonMisleadingOther: 'tools.ozone.report.defs#reasonMisleadingOther',
347
342
  DefsReasonRuleSiteSecurity: 'tools.ozone.report.defs#reasonRuleSiteSecurity',
348
- DefsReasonRuleStolenContent:
349
- 'tools.ozone.report.defs#reasonRuleStolenContent',
350
343
  DefsReasonRuleProhibitedSales:
351
344
  'tools.ozone.report.defs#reasonRuleProhibitedSales',
352
345
  DefsReasonRuleBanEvasion: 'tools.ozone.report.defs#reasonRuleBanEvasion',
353
346
  DefsReasonRuleOther: 'tools.ozone.report.defs#reasonRuleOther',
354
- DefsReasonCivicElectoralProcess:
355
- 'tools.ozone.report.defs#reasonCivicElectoralProcess',
356
- DefsReasonCivicDisclosure: 'tools.ozone.report.defs#reasonCivicDisclosure',
357
- DefsReasonCivicInterference:
358
- 'tools.ozone.report.defs#reasonCivicInterference',
359
- DefsReasonCivicMisinformation:
360
- 'tools.ozone.report.defs#reasonCivicMisinformation',
361
- DefsReasonCivicImpersonation:
362
- 'tools.ozone.report.defs#reasonCivicImpersonation',
347
+ DefsReasonSelfHarmContent: 'tools.ozone.report.defs#reasonSelfHarmContent',
348
+ DefsReasonSelfHarmED: 'tools.ozone.report.defs#reasonSelfHarmED',
349
+ DefsReasonSelfHarmStunts: 'tools.ozone.report.defs#reasonSelfHarmStunts',
350
+ DefsReasonSelfHarmSubstances:
351
+ 'tools.ozone.report.defs#reasonSelfHarmSubstances',
352
+ DefsReasonSelfHarmOther: 'tools.ozone.report.defs#reasonSelfHarmOther',
363
353
  }
364
354
  export const TOOLS_OZONE_TEAM = {
365
355
  DefsRoleAdmin: 'tools.ozone.team.defs#roleAdmin',
@@ -3109,6 +3099,18 @@ export class ToolsOzoneModerationNS {
3109
3099
  this._server = server
3110
3100
  }
3111
3101
 
3102
+ cancelScheduledActions<A extends Auth = void>(
3103
+ cfg: MethodConfigOrHandler<
3104
+ A,
3105
+ ToolsOzoneModerationCancelScheduledActions.QueryParams,
3106
+ ToolsOzoneModerationCancelScheduledActions.HandlerInput,
3107
+ ToolsOzoneModerationCancelScheduledActions.HandlerOutput
3108
+ >,
3109
+ ) {
3110
+ const nsid = 'tools.ozone.moderation.cancelScheduledActions' // @ts-ignore
3111
+ return this._server.xrpc.method(nsid, cfg)
3112
+ }
3113
+
3112
3114
  emitEvent<A extends Auth = void>(
3113
3115
  cfg: MethodConfigOrHandler<
3114
3116
  A,
@@ -3217,6 +3219,18 @@ export class ToolsOzoneModerationNS {
3217
3219
  return this._server.xrpc.method(nsid, cfg)
3218
3220
  }
3219
3221
 
3222
+ listScheduledActions<A extends Auth = void>(
3223
+ cfg: MethodConfigOrHandler<
3224
+ A,
3225
+ ToolsOzoneModerationListScheduledActions.QueryParams,
3226
+ ToolsOzoneModerationListScheduledActions.HandlerInput,
3227
+ ToolsOzoneModerationListScheduledActions.HandlerOutput
3228
+ >,
3229
+ ) {
3230
+ const nsid = 'tools.ozone.moderation.listScheduledActions' // @ts-ignore
3231
+ return this._server.xrpc.method(nsid, cfg)
3232
+ }
3233
+
3220
3234
  queryEvents<A extends Auth = void>(
3221
3235
  cfg: MethodConfigOrHandler<
3222
3236
  A,
@@ -3241,6 +3255,18 @@ export class ToolsOzoneModerationNS {
3241
3255
  return this._server.xrpc.method(nsid, cfg)
3242
3256
  }
3243
3257
 
3258
+ scheduleAction<A extends Auth = void>(
3259
+ cfg: MethodConfigOrHandler<
3260
+ A,
3261
+ ToolsOzoneModerationScheduleAction.QueryParams,
3262
+ ToolsOzoneModerationScheduleAction.HandlerInput,
3263
+ ToolsOzoneModerationScheduleAction.HandlerOutput
3264
+ >,
3265
+ ) {
3266
+ const nsid = 'tools.ozone.moderation.scheduleAction' // @ts-ignore
3267
+ return this._server.xrpc.method(nsid, cfg)
3268
+ }
3269
+
3244
3270
  searchRepos<A extends Auth = void>(
3245
3271
  cfg: MethodConfigOrHandler<
3246
3272
  A,