@atproto/ozone 0.1.146 → 0.1.147

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 (566) hide show
  1. package/CHANGELOG.md +9 -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 +6 -0
  176. package/dist/lexicon/index.d.ts.map +1 -1
  177. package/dist/lexicon/index.js +12 -0
  178. package/dist/lexicon/index.js.map +1 -1
  179. package/dist/lexicon/lexicons.d.ts +835 -43
  180. package/dist/lexicon/lexicons.d.ts.map +1 -1
  181. package/dist/lexicon/lexicons.js +407 -0
  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.js.map +1 -1
  359. package/dist/lexicon/types/com/atproto/repo/applyWrites.js.map +1 -1
  360. package/dist/lexicon/types/com/atproto/repo/createRecord.js.map +1 -1
  361. package/dist/lexicon/types/com/atproto/repo/defs.js.map +1 -1
  362. package/dist/lexicon/types/com/atproto/repo/deleteRecord.js.map +1 -1
  363. package/dist/lexicon/types/com/atproto/repo/describeRepo.js.map +1 -1
  364. package/dist/lexicon/types/com/atproto/repo/getRecord.js.map +1 -1
  365. package/dist/lexicon/types/com/atproto/repo/importRepo.js.map +1 -1
  366. package/dist/lexicon/types/com/atproto/repo/listMissingBlobs.js.map +1 -1
  367. package/dist/lexicon/types/com/atproto/repo/listRecords.js.map +1 -1
  368. package/dist/lexicon/types/com/atproto/repo/putRecord.js.map +1 -1
  369. package/dist/lexicon/types/com/atproto/repo/strongRef.js.map +1 -1
  370. package/dist/lexicon/types/com/atproto/repo/uploadBlob.js.map +1 -1
  371. package/dist/lexicon/types/com/atproto/server/activateAccount.js.map +1 -1
  372. package/dist/lexicon/types/com/atproto/server/checkAccountStatus.js.map +1 -1
  373. package/dist/lexicon/types/com/atproto/server/confirmEmail.js.map +1 -1
  374. package/dist/lexicon/types/com/atproto/server/createAccount.js.map +1 -1
  375. package/dist/lexicon/types/com/atproto/server/createAppPassword.js.map +1 -1
  376. package/dist/lexicon/types/com/atproto/server/createInviteCode.js.map +1 -1
  377. package/dist/lexicon/types/com/atproto/server/createInviteCodes.js.map +1 -1
  378. package/dist/lexicon/types/com/atproto/server/createSession.js.map +1 -1
  379. package/dist/lexicon/types/com/atproto/server/deactivateAccount.js.map +1 -1
  380. package/dist/lexicon/types/com/atproto/server/defs.js.map +1 -1
  381. package/dist/lexicon/types/com/atproto/server/deleteAccount.js.map +1 -1
  382. package/dist/lexicon/types/com/atproto/server/deleteSession.js.map +1 -1
  383. package/dist/lexicon/types/com/atproto/server/describeServer.js.map +1 -1
  384. package/dist/lexicon/types/com/atproto/server/getAccountInviteCodes.js.map +1 -1
  385. package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
  386. package/dist/lexicon/types/com/atproto/server/getSession.js.map +1 -1
  387. package/dist/lexicon/types/com/atproto/server/listAppPasswords.js.map +1 -1
  388. package/dist/lexicon/types/com/atproto/server/refreshSession.js.map +1 -1
  389. package/dist/lexicon/types/com/atproto/server/requestAccountDelete.js.map +1 -1
  390. package/dist/lexicon/types/com/atproto/server/requestEmailConfirmation.js.map +1 -1
  391. package/dist/lexicon/types/com/atproto/server/requestEmailUpdate.js.map +1 -1
  392. package/dist/lexicon/types/com/atproto/server/requestPasswordReset.js.map +1 -1
  393. package/dist/lexicon/types/com/atproto/server/reserveSigningKey.js.map +1 -1
  394. package/dist/lexicon/types/com/atproto/server/resetPassword.js.map +1 -1
  395. package/dist/lexicon/types/com/atproto/server/revokeAppPassword.js.map +1 -1
  396. package/dist/lexicon/types/com/atproto/server/updateEmail.js.map +1 -1
  397. package/dist/lexicon/types/com/atproto/sync/defs.js.map +1 -1
  398. package/dist/lexicon/types/com/atproto/sync/getBlob.js.map +1 -1
  399. package/dist/lexicon/types/com/atproto/sync/getBlocks.js.map +1 -1
  400. package/dist/lexicon/types/com/atproto/sync/getCheckout.js.map +1 -1
  401. package/dist/lexicon/types/com/atproto/sync/getHead.js.map +1 -1
  402. package/dist/lexicon/types/com/atproto/sync/getHostStatus.js.map +1 -1
  403. package/dist/lexicon/types/com/atproto/sync/getLatestCommit.js.map +1 -1
  404. package/dist/lexicon/types/com/atproto/sync/getRecord.js.map +1 -1
  405. package/dist/lexicon/types/com/atproto/sync/getRepo.js.map +1 -1
  406. package/dist/lexicon/types/com/atproto/sync/getRepoStatus.js.map +1 -1
  407. package/dist/lexicon/types/com/atproto/sync/listBlobs.js.map +1 -1
  408. package/dist/lexicon/types/com/atproto/sync/listHosts.js.map +1 -1
  409. package/dist/lexicon/types/com/atproto/sync/listRepos.js.map +1 -1
  410. package/dist/lexicon/types/com/atproto/sync/listReposByCollection.js.map +1 -1
  411. package/dist/lexicon/types/com/atproto/sync/notifyOfUpdate.js.map +1 -1
  412. package/dist/lexicon/types/com/atproto/sync/requestCrawl.js.map +1 -1
  413. package/dist/lexicon/types/com/atproto/sync/subscribeRepos.js.map +1 -1
  414. package/dist/lexicon/types/com/atproto/temp/addReservedHandle.js.map +1 -1
  415. package/dist/lexicon/types/com/atproto/temp/checkHandleAvailability.js.map +1 -1
  416. package/dist/lexicon/types/com/atproto/temp/checkSignupQueue.js.map +1 -1
  417. package/dist/lexicon/types/com/atproto/temp/dereferenceScope.js.map +1 -1
  418. package/dist/lexicon/types/com/atproto/temp/fetchLabels.js.map +1 -1
  419. package/dist/lexicon/types/com/atproto/temp/requestPhoneVerification.js.map +1 -1
  420. package/dist/lexicon/types/com/atproto/temp/revokeAccountCredentials.js.map +1 -1
  421. package/dist/lexicon/types/tools/ozone/communication/createTemplate.js.map +1 -1
  422. package/dist/lexicon/types/tools/ozone/communication/defs.js.map +1 -1
  423. package/dist/lexicon/types/tools/ozone/communication/deleteTemplate.js.map +1 -1
  424. package/dist/lexicon/types/tools/ozone/communication/listTemplates.js.map +1 -1
  425. package/dist/lexicon/types/tools/ozone/communication/updateTemplate.js.map +1 -1
  426. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js.map +1 -1
  427. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts +46 -0
  428. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts.map +1 -0
  429. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js +25 -0
  430. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js.map +1 -0
  431. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +57 -2
  432. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  433. package/dist/lexicon/types/tools/ozone/moderation/defs.js +27 -0
  434. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  435. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts +1 -1
  436. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts.map +1 -1
  437. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js.map +1 -1
  438. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts +1 -1
  439. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts.map +1 -1
  440. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.js.map +1 -1
  441. package/dist/lexicon/types/tools/ozone/moderation/getEvent.js.map +1 -1
  442. package/dist/lexicon/types/tools/ozone/moderation/getRecord.js.map +1 -1
  443. package/dist/lexicon/types/tools/ozone/moderation/getRecords.js.map +1 -1
  444. package/dist/lexicon/types/tools/ozone/moderation/getRepo.js.map +1 -1
  445. package/dist/lexicon/types/tools/ozone/moderation/getReporterStats.js.map +1 -1
  446. package/dist/lexicon/types/tools/ozone/moderation/getRepos.js.map +1 -1
  447. package/dist/lexicon/types/tools/ozone/moderation/getSubjects.js.map +1 -1
  448. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts +38 -0
  449. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts.map +1 -0
  450. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js +7 -0
  451. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js.map +1 -0
  452. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
  453. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
  454. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts +75 -0
  455. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts.map +1 -0
  456. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js +43 -0
  457. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js.map +1 -0
  458. package/dist/lexicon/types/tools/ozone/moderation/searchRepos.js.map +1 -1
  459. package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
  460. package/dist/lexicon/types/tools/ozone/safelink/addRule.js.map +1 -1
  461. package/dist/lexicon/types/tools/ozone/safelink/defs.js.map +1 -1
  462. package/dist/lexicon/types/tools/ozone/safelink/queryEvents.js.map +1 -1
  463. package/dist/lexicon/types/tools/ozone/safelink/queryRules.js.map +1 -1
  464. package/dist/lexicon/types/tools/ozone/safelink/removeRule.js.map +1 -1
  465. package/dist/lexicon/types/tools/ozone/safelink/updateRule.js.map +1 -1
  466. package/dist/lexicon/types/tools/ozone/server/getConfig.js.map +1 -1
  467. package/dist/lexicon/types/tools/ozone/set/addValues.js.map +1 -1
  468. package/dist/lexicon/types/tools/ozone/set/defs.js.map +1 -1
  469. package/dist/lexicon/types/tools/ozone/set/deleteSet.js.map +1 -1
  470. package/dist/lexicon/types/tools/ozone/set/deleteValues.js.map +1 -1
  471. package/dist/lexicon/types/tools/ozone/set/getValues.js.map +1 -1
  472. package/dist/lexicon/types/tools/ozone/set/querySets.js.map +1 -1
  473. package/dist/lexicon/types/tools/ozone/set/upsertSet.js.map +1 -1
  474. package/dist/lexicon/types/tools/ozone/setting/defs.js.map +1 -1
  475. package/dist/lexicon/types/tools/ozone/setting/listOptions.js.map +1 -1
  476. package/dist/lexicon/types/tools/ozone/setting/removeOptions.js.map +1 -1
  477. package/dist/lexicon/types/tools/ozone/setting/upsertOption.js.map +1 -1
  478. package/dist/lexicon/types/tools/ozone/signature/defs.js.map +1 -1
  479. package/dist/lexicon/types/tools/ozone/signature/findCorrelation.js.map +1 -1
  480. package/dist/lexicon/types/tools/ozone/signature/findRelatedAccounts.js.map +1 -1
  481. package/dist/lexicon/types/tools/ozone/signature/searchAccounts.js.map +1 -1
  482. package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -1
  483. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -1
  484. package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -1
  485. package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -1
  486. package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -1
  487. package/dist/lexicon/types/tools/ozone/verification/defs.js.map +1 -1
  488. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js.map +1 -1
  489. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js.map +1 -1
  490. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js.map +1 -1
  491. package/dist/lexicon/util.js.map +1 -1
  492. package/dist/logger.js.map +1 -1
  493. package/dist/mod-service/index.d.ts.map +1 -1
  494. package/dist/mod-service/index.js +11 -0
  495. package/dist/mod-service/index.js.map +1 -1
  496. package/dist/mod-service/profile.js.map +1 -1
  497. package/dist/mod-service/status.d.ts +3 -0
  498. package/dist/mod-service/status.d.ts.map +1 -1
  499. package/dist/mod-service/status.js.map +1 -1
  500. package/dist/mod-service/subject.js.map +1 -1
  501. package/dist/mod-service/types.js.map +1 -1
  502. package/dist/mod-service/util.js.map +1 -1
  503. package/dist/mod-service/views.d.ts.map +1 -1
  504. package/dist/mod-service/views.js +5 -0
  505. package/dist/mod-service/views.js.map +1 -1
  506. package/dist/safelink/service.js.map +1 -1
  507. package/dist/scheduled-action/service.d.ts +39 -0
  508. package/dist/scheduled-action/service.d.ts.map +1 -0
  509. package/dist/scheduled-action/service.js +208 -0
  510. package/dist/scheduled-action/service.js.map +1 -0
  511. package/dist/scheduled-action/types.d.ts +14 -0
  512. package/dist/scheduled-action/types.d.ts.map +1 -0
  513. package/dist/scheduled-action/types.js +3 -0
  514. package/dist/scheduled-action/types.js.map +1 -0
  515. package/dist/sequencer/index.js.map +1 -1
  516. package/dist/sequencer/outbox.js.map +1 -1
  517. package/dist/sequencer/sequencer.js.map +1 -1
  518. package/dist/set/service.js.map +1 -1
  519. package/dist/setting/constants.js.map +1 -1
  520. package/dist/setting/service.js.map +1 -1
  521. package/dist/setting/types.js.map +1 -1
  522. package/dist/setting/validators.js.map +1 -1
  523. package/dist/tag-service/content-tagger.js.map +1 -1
  524. package/dist/tag-service/embed-tagger.js.map +1 -1
  525. package/dist/tag-service/index.js.map +1 -1
  526. package/dist/tag-service/language-data.js.map +1 -1
  527. package/dist/tag-service/language-tagger.js.map +1 -1
  528. package/dist/tag-service/util.js.map +1 -1
  529. package/dist/team/index.js.map +1 -1
  530. package/dist/util.js.map +1 -1
  531. package/dist/verification/issuer.js.map +1 -1
  532. package/dist/verification/service.js.map +1 -1
  533. package/dist/verification/util.js.map +1 -1
  534. package/package.json +3 -3
  535. package/src/api/index.ts +6 -0
  536. package/src/api/moderation/cancelScheduledActions.ts +72 -0
  537. package/src/api/moderation/emitEvent.ts +9 -84
  538. package/src/api/moderation/listScheduledActions.ts +45 -0
  539. package/src/api/moderation/scheduleAction.ts +129 -0
  540. package/src/api/moderation/util.ts +96 -0
  541. package/src/api/util.ts +33 -0
  542. package/src/context.ts +11 -0
  543. package/src/daemon/context.ts +21 -0
  544. package/src/daemon/index.ts +1 -0
  545. package/src/daemon/scheduled-action-processor.ts +243 -0
  546. package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +56 -0
  547. package/src/db/migrations/index.ts +2 -0
  548. package/src/db/schema/index.ts +3 -1
  549. package/src/db/schema/scheduled-action.ts +25 -0
  550. package/src/lexicon/index.ts +39 -0
  551. package/src/lexicon/lexicons.ts +430 -0
  552. package/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts +79 -0
  553. package/src/lexicon/types/tools/ozone/moderation/defs.ts +88 -0
  554. package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +2 -0
  555. package/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts +2 -0
  556. package/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts +57 -0
  557. package/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts +123 -0
  558. package/src/mod-service/index.ts +13 -0
  559. package/src/mod-service/views.ts +7 -0
  560. package/src/scheduled-action/service.ts +279 -0
  561. package/src/scheduled-action/types.ts +17 -0
  562. package/tests/__snapshots__/scheduled-action.test.ts.snap +61 -0
  563. package/tests/scheduled-action-processor.test.ts +464 -0
  564. package/tests/scheduled-action.test.ts +334 -0
  565. package/tsconfig.build.tsbuildinfo +1 -1
  566. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -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) {}
@@ -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'
@@ -3109,6 +3112,18 @@ export class ToolsOzoneModerationNS {
3109
3112
  this._server = server
3110
3113
  }
3111
3114
 
3115
+ cancelScheduledActions<A extends Auth = void>(
3116
+ cfg: MethodConfigOrHandler<
3117
+ A,
3118
+ ToolsOzoneModerationCancelScheduledActions.QueryParams,
3119
+ ToolsOzoneModerationCancelScheduledActions.HandlerInput,
3120
+ ToolsOzoneModerationCancelScheduledActions.HandlerOutput
3121
+ >,
3122
+ ) {
3123
+ const nsid = 'tools.ozone.moderation.cancelScheduledActions' // @ts-ignore
3124
+ return this._server.xrpc.method(nsid, cfg)
3125
+ }
3126
+
3112
3127
  emitEvent<A extends Auth = void>(
3113
3128
  cfg: MethodConfigOrHandler<
3114
3129
  A,
@@ -3217,6 +3232,18 @@ export class ToolsOzoneModerationNS {
3217
3232
  return this._server.xrpc.method(nsid, cfg)
3218
3233
  }
3219
3234
 
3235
+ listScheduledActions<A extends Auth = void>(
3236
+ cfg: MethodConfigOrHandler<
3237
+ A,
3238
+ ToolsOzoneModerationListScheduledActions.QueryParams,
3239
+ ToolsOzoneModerationListScheduledActions.HandlerInput,
3240
+ ToolsOzoneModerationListScheduledActions.HandlerOutput
3241
+ >,
3242
+ ) {
3243
+ const nsid = 'tools.ozone.moderation.listScheduledActions' // @ts-ignore
3244
+ return this._server.xrpc.method(nsid, cfg)
3245
+ }
3246
+
3220
3247
  queryEvents<A extends Auth = void>(
3221
3248
  cfg: MethodConfigOrHandler<
3222
3249
  A,
@@ -3241,6 +3268,18 @@ export class ToolsOzoneModerationNS {
3241
3268
  return this._server.xrpc.method(nsid, cfg)
3242
3269
  }
3243
3270
 
3271
+ scheduleAction<A extends Auth = void>(
3272
+ cfg: MethodConfigOrHandler<
3273
+ A,
3274
+ ToolsOzoneModerationScheduleAction.QueryParams,
3275
+ ToolsOzoneModerationScheduleAction.HandlerInput,
3276
+ ToolsOzoneModerationScheduleAction.HandlerOutput
3277
+ >,
3278
+ ) {
3279
+ const nsid = 'tools.ozone.moderation.scheduleAction' // @ts-ignore
3280
+ return this._server.xrpc.method(nsid, cfg)
3281
+ }
3282
+
3244
3283
  searchRepos<A extends Auth = void>(
3245
3284
  cfg: MethodConfigOrHandler<
3246
3285
  A,