@atproto/ozone 0.1.145 → 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 (569) hide show
  1. package/CHANGELOG.md +16 -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 +812 -8
  180. package/dist/lexicon/lexicons.d.ts.map +1 -1
  181. package/dist/lexicon/lexicons.js +413 -0
  182. package/dist/lexicon/lexicons.js.map +1 -1
  183. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +2 -0
  184. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  185. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  186. package/dist/lexicon/types/app/bsky/actor/getPreferences.js.map +1 -1
  187. package/dist/lexicon/types/app/bsky/actor/getProfile.js.map +1 -1
  188. package/dist/lexicon/types/app/bsky/actor/getProfiles.js.map +1 -1
  189. package/dist/lexicon/types/app/bsky/actor/getSuggestions.js.map +1 -1
  190. package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
  191. package/dist/lexicon/types/app/bsky/actor/putPreferences.js.map +1 -1
  192. package/dist/lexicon/types/app/bsky/actor/searchActors.js.map +1 -1
  193. package/dist/lexicon/types/app/bsky/actor/searchActorsTypeahead.js.map +1 -1
  194. package/dist/lexicon/types/app/bsky/actor/status.js.map +1 -1
  195. package/dist/lexicon/types/app/bsky/bookmark/createBookmark.js.map +1 -1
  196. package/dist/lexicon/types/app/bsky/bookmark/defs.js.map +1 -1
  197. package/dist/lexicon/types/app/bsky/bookmark/deleteBookmark.js.map +1 -1
  198. package/dist/lexicon/types/app/bsky/bookmark/getBookmarks.js.map +1 -1
  199. package/dist/lexicon/types/app/bsky/embed/defs.js.map +1 -1
  200. package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
  201. package/dist/lexicon/types/app/bsky/embed/images.js.map +1 -1
  202. package/dist/lexicon/types/app/bsky/embed/record.js.map +1 -1
  203. package/dist/lexicon/types/app/bsky/embed/recordWithMedia.js.map +1 -1
  204. package/dist/lexicon/types/app/bsky/embed/video.js.map +1 -1
  205. package/dist/lexicon/types/app/bsky/feed/defs.js.map +1 -1
  206. package/dist/lexicon/types/app/bsky/feed/describeFeedGenerator.js.map +1 -1
  207. package/dist/lexicon/types/app/bsky/feed/generator.js.map +1 -1
  208. package/dist/lexicon/types/app/bsky/feed/getActorFeeds.js.map +1 -1
  209. package/dist/lexicon/types/app/bsky/feed/getActorLikes.js.map +1 -1
  210. package/dist/lexicon/types/app/bsky/feed/getAuthorFeed.js.map +1 -1
  211. package/dist/lexicon/types/app/bsky/feed/getFeed.js.map +1 -1
  212. package/dist/lexicon/types/app/bsky/feed/getFeedGenerator.js.map +1 -1
  213. package/dist/lexicon/types/app/bsky/feed/getFeedGenerators.js.map +1 -1
  214. package/dist/lexicon/types/app/bsky/feed/getFeedSkeleton.js.map +1 -1
  215. package/dist/lexicon/types/app/bsky/feed/getLikes.js.map +1 -1
  216. package/dist/lexicon/types/app/bsky/feed/getListFeed.js.map +1 -1
  217. package/dist/lexicon/types/app/bsky/feed/getPostThread.js.map +1 -1
  218. package/dist/lexicon/types/app/bsky/feed/getPosts.js.map +1 -1
  219. package/dist/lexicon/types/app/bsky/feed/getQuotes.js.map +1 -1
  220. package/dist/lexicon/types/app/bsky/feed/getRepostedBy.js.map +1 -1
  221. package/dist/lexicon/types/app/bsky/feed/getSuggestedFeeds.js.map +1 -1
  222. package/dist/lexicon/types/app/bsky/feed/getTimeline.js.map +1 -1
  223. package/dist/lexicon/types/app/bsky/feed/like.js.map +1 -1
  224. package/dist/lexicon/types/app/bsky/feed/post.js.map +1 -1
  225. package/dist/lexicon/types/app/bsky/feed/postgate.js.map +1 -1
  226. package/dist/lexicon/types/app/bsky/feed/repost.js.map +1 -1
  227. package/dist/lexicon/types/app/bsky/feed/searchPosts.js.map +1 -1
  228. package/dist/lexicon/types/app/bsky/feed/sendInteractions.js.map +1 -1
  229. package/dist/lexicon/types/app/bsky/feed/threadgate.js.map +1 -1
  230. package/dist/lexicon/types/app/bsky/graph/block.js.map +1 -1
  231. package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
  232. package/dist/lexicon/types/app/bsky/graph/follow.js.map +1 -1
  233. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js.map +1 -1
  234. package/dist/lexicon/types/app/bsky/graph/getBlocks.js.map +1 -1
  235. package/dist/lexicon/types/app/bsky/graph/getFollowers.js.map +1 -1
  236. package/dist/lexicon/types/app/bsky/graph/getFollows.js.map +1 -1
  237. package/dist/lexicon/types/app/bsky/graph/getKnownFollowers.js.map +1 -1
  238. package/dist/lexicon/types/app/bsky/graph/getList.js.map +1 -1
  239. package/dist/lexicon/types/app/bsky/graph/getListBlocks.js.map +1 -1
  240. package/dist/lexicon/types/app/bsky/graph/getListMutes.js.map +1 -1
  241. package/dist/lexicon/types/app/bsky/graph/getLists.js.map +1 -1
  242. package/dist/lexicon/types/app/bsky/graph/getListsWithMembership.js.map +1 -1
  243. package/dist/lexicon/types/app/bsky/graph/getMutes.js.map +1 -1
  244. package/dist/lexicon/types/app/bsky/graph/getRelationships.js.map +1 -1
  245. package/dist/lexicon/types/app/bsky/graph/getStarterPack.js.map +1 -1
  246. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js.map +1 -1
  247. package/dist/lexicon/types/app/bsky/graph/getStarterPacksWithMembership.js.map +1 -1
  248. package/dist/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.js.map +1 -1
  249. package/dist/lexicon/types/app/bsky/graph/list.js.map +1 -1
  250. package/dist/lexicon/types/app/bsky/graph/listblock.js.map +1 -1
  251. package/dist/lexicon/types/app/bsky/graph/listitem.js.map +1 -1
  252. package/dist/lexicon/types/app/bsky/graph/muteActor.js.map +1 -1
  253. package/dist/lexicon/types/app/bsky/graph/muteActorList.js.map +1 -1
  254. package/dist/lexicon/types/app/bsky/graph/muteThread.js.map +1 -1
  255. package/dist/lexicon/types/app/bsky/graph/searchStarterPacks.js.map +1 -1
  256. package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -1
  257. package/dist/lexicon/types/app/bsky/graph/unmuteActor.js.map +1 -1
  258. package/dist/lexicon/types/app/bsky/graph/unmuteActorList.js.map +1 -1
  259. package/dist/lexicon/types/app/bsky/graph/unmuteThread.js.map +1 -1
  260. package/dist/lexicon/types/app/bsky/graph/verification.js.map +1 -1
  261. package/dist/lexicon/types/app/bsky/labeler/defs.js.map +1 -1
  262. package/dist/lexicon/types/app/bsky/labeler/getServices.js.map +1 -1
  263. package/dist/lexicon/types/app/bsky/labeler/service.js.map +1 -1
  264. package/dist/lexicon/types/app/bsky/notification/declaration.js.map +1 -1
  265. package/dist/lexicon/types/app/bsky/notification/defs.js.map +1 -1
  266. package/dist/lexicon/types/app/bsky/notification/getPreferences.js.map +1 -1
  267. package/dist/lexicon/types/app/bsky/notification/getUnreadCount.js.map +1 -1
  268. package/dist/lexicon/types/app/bsky/notification/listActivitySubscriptions.js.map +1 -1
  269. package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
  270. package/dist/lexicon/types/app/bsky/notification/putActivitySubscription.js.map +1 -1
  271. package/dist/lexicon/types/app/bsky/notification/putPreferences.js.map +1 -1
  272. package/dist/lexicon/types/app/bsky/notification/putPreferencesV2.js.map +1 -1
  273. package/dist/lexicon/types/app/bsky/notification/registerPush.js.map +1 -1
  274. package/dist/lexicon/types/app/bsky/notification/unregisterPush.js.map +1 -1
  275. package/dist/lexicon/types/app/bsky/notification/updateSeen.js.map +1 -1
  276. package/dist/lexicon/types/app/bsky/richtext/facet.js.map +1 -1
  277. package/dist/lexicon/types/app/bsky/unspecced/defs.js.map +1 -1
  278. package/dist/lexicon/types/app/bsky/unspecced/getAgeAssuranceState.js.map +1 -1
  279. package/dist/lexicon/types/app/bsky/unspecced/getConfig.js.map +1 -1
  280. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js.map +1 -1
  281. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.js.map +1 -1
  282. package/dist/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.js.map +1 -1
  283. package/dist/lexicon/types/app/bsky/unspecced/getPostThreadOtherV2.js.map +1 -1
  284. package/dist/lexicon/types/app/bsky/unspecced/getPostThreadV2.js.map +1 -1
  285. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedFeeds.js.map +1 -1
  286. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.js.map +1 -1
  287. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -1
  288. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js.map +1 -1
  289. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  290. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
  291. package/dist/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.js.map +1 -1
  292. package/dist/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.js.map +1 -1
  293. package/dist/lexicon/types/app/bsky/unspecced/getTrendingTopics.js.map +1 -1
  294. package/dist/lexicon/types/app/bsky/unspecced/getTrends.js.map +1 -1
  295. package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.js.map +1 -1
  296. package/dist/lexicon/types/app/bsky/unspecced/initAgeAssurance.js.map +1 -1
  297. package/dist/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.js.map +1 -1
  298. package/dist/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.js.map +1 -1
  299. package/dist/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.js.map +1 -1
  300. package/dist/lexicon/types/app/bsky/video/defs.js.map +1 -1
  301. package/dist/lexicon/types/app/bsky/video/getJobStatus.js.map +1 -1
  302. package/dist/lexicon/types/app/bsky/video/getUploadLimits.js.map +1 -1
  303. package/dist/lexicon/types/app/bsky/video/uploadVideo.js.map +1 -1
  304. package/dist/lexicon/types/chat/bsky/actor/declaration.js.map +1 -1
  305. package/dist/lexicon/types/chat/bsky/actor/defs.js.map +1 -1
  306. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js.map +1 -1
  307. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js.map +1 -1
  308. package/dist/lexicon/types/chat/bsky/convo/acceptConvo.js.map +1 -1
  309. package/dist/lexicon/types/chat/bsky/convo/addReaction.js.map +1 -1
  310. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  311. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js.map +1 -1
  312. package/dist/lexicon/types/chat/bsky/convo/getConvo.js.map +1 -1
  313. package/dist/lexicon/types/chat/bsky/convo/getConvoAvailability.js.map +1 -1
  314. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -1
  315. package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -1
  316. package/dist/lexicon/types/chat/bsky/convo/getMessages.js.map +1 -1
  317. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js.map +1 -1
  318. package/dist/lexicon/types/chat/bsky/convo/listConvos.js.map +1 -1
  319. package/dist/lexicon/types/chat/bsky/convo/muteConvo.js.map +1 -1
  320. package/dist/lexicon/types/chat/bsky/convo/removeReaction.js.map +1 -1
  321. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -1
  322. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -1
  323. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js.map +1 -1
  324. package/dist/lexicon/types/chat/bsky/convo/updateAllRead.js.map +1 -1
  325. package/dist/lexicon/types/chat/bsky/convo/updateRead.js.map +1 -1
  326. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js.map +1 -1
  327. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js.map +1 -1
  328. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js.map +1 -1
  329. package/dist/lexicon/types/com/atproto/admin/defs.js.map +1 -1
  330. package/dist/lexicon/types/com/atproto/admin/deleteAccount.js.map +1 -1
  331. package/dist/lexicon/types/com/atproto/admin/disableAccountInvites.js.map +1 -1
  332. package/dist/lexicon/types/com/atproto/admin/disableInviteCodes.js.map +1 -1
  333. package/dist/lexicon/types/com/atproto/admin/enableAccountInvites.js.map +1 -1
  334. package/dist/lexicon/types/com/atproto/admin/getAccountInfo.js.map +1 -1
  335. package/dist/lexicon/types/com/atproto/admin/getAccountInfos.js.map +1 -1
  336. package/dist/lexicon/types/com/atproto/admin/getInviteCodes.js.map +1 -1
  337. package/dist/lexicon/types/com/atproto/admin/getSubjectStatus.js.map +1 -1
  338. package/dist/lexicon/types/com/atproto/admin/searchAccounts.js.map +1 -1
  339. package/dist/lexicon/types/com/atproto/admin/sendEmail.js.map +1 -1
  340. package/dist/lexicon/types/com/atproto/admin/updateAccountEmail.js.map +1 -1
  341. package/dist/lexicon/types/com/atproto/admin/updateAccountHandle.js.map +1 -1
  342. package/dist/lexicon/types/com/atproto/admin/updateAccountPassword.js.map +1 -1
  343. package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.js.map +1 -1
  344. package/dist/lexicon/types/com/atproto/admin/updateSubjectStatus.js.map +1 -1
  345. package/dist/lexicon/types/com/atproto/identity/defs.js.map +1 -1
  346. package/dist/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.js.map +1 -1
  347. package/dist/lexicon/types/com/atproto/identity/refreshIdentity.js.map +1 -1
  348. package/dist/lexicon/types/com/atproto/identity/requestPlcOperationSignature.js.map +1 -1
  349. package/dist/lexicon/types/com/atproto/identity/resolveDid.js.map +1 -1
  350. package/dist/lexicon/types/com/atproto/identity/resolveHandle.js.map +1 -1
  351. package/dist/lexicon/types/com/atproto/identity/resolveIdentity.js.map +1 -1
  352. package/dist/lexicon/types/com/atproto/identity/signPlcOperation.js.map +1 -1
  353. package/dist/lexicon/types/com/atproto/identity/submitPlcOperation.js.map +1 -1
  354. package/dist/lexicon/types/com/atproto/identity/updateHandle.js.map +1 -1
  355. package/dist/lexicon/types/com/atproto/label/defs.js.map +1 -1
  356. package/dist/lexicon/types/com/atproto/label/queryLabels.js.map +1 -1
  357. package/dist/lexicon/types/com/atproto/label/subscribeLabels.js.map +1 -1
  358. package/dist/lexicon/types/com/atproto/lexicon/schema.js.map +1 -1
  359. package/dist/lexicon/types/com/atproto/moderation/createReport.js.map +1 -1
  360. package/dist/lexicon/types/com/atproto/moderation/defs.js.map +1 -1
  361. package/dist/lexicon/types/com/atproto/repo/applyWrites.js.map +1 -1
  362. package/dist/lexicon/types/com/atproto/repo/createRecord.js.map +1 -1
  363. package/dist/lexicon/types/com/atproto/repo/defs.js.map +1 -1
  364. package/dist/lexicon/types/com/atproto/repo/deleteRecord.js.map +1 -1
  365. package/dist/lexicon/types/com/atproto/repo/describeRepo.js.map +1 -1
  366. package/dist/lexicon/types/com/atproto/repo/getRecord.js.map +1 -1
  367. package/dist/lexicon/types/com/atproto/repo/importRepo.js.map +1 -1
  368. package/dist/lexicon/types/com/atproto/repo/listMissingBlobs.js.map +1 -1
  369. package/dist/lexicon/types/com/atproto/repo/listRecords.js.map +1 -1
  370. package/dist/lexicon/types/com/atproto/repo/putRecord.js.map +1 -1
  371. package/dist/lexicon/types/com/atproto/repo/strongRef.js.map +1 -1
  372. package/dist/lexicon/types/com/atproto/repo/uploadBlob.js.map +1 -1
  373. package/dist/lexicon/types/com/atproto/server/activateAccount.js.map +1 -1
  374. package/dist/lexicon/types/com/atproto/server/checkAccountStatus.js.map +1 -1
  375. package/dist/lexicon/types/com/atproto/server/confirmEmail.js.map +1 -1
  376. package/dist/lexicon/types/com/atproto/server/createAccount.js.map +1 -1
  377. package/dist/lexicon/types/com/atproto/server/createAppPassword.js.map +1 -1
  378. package/dist/lexicon/types/com/atproto/server/createInviteCode.js.map +1 -1
  379. package/dist/lexicon/types/com/atproto/server/createInviteCodes.js.map +1 -1
  380. package/dist/lexicon/types/com/atproto/server/createSession.js.map +1 -1
  381. package/dist/lexicon/types/com/atproto/server/deactivateAccount.js.map +1 -1
  382. package/dist/lexicon/types/com/atproto/server/defs.js.map +1 -1
  383. package/dist/lexicon/types/com/atproto/server/deleteAccount.js.map +1 -1
  384. package/dist/lexicon/types/com/atproto/server/deleteSession.js.map +1 -1
  385. package/dist/lexicon/types/com/atproto/server/describeServer.js.map +1 -1
  386. package/dist/lexicon/types/com/atproto/server/getAccountInviteCodes.js.map +1 -1
  387. package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
  388. package/dist/lexicon/types/com/atproto/server/getSession.js.map +1 -1
  389. package/dist/lexicon/types/com/atproto/server/listAppPasswords.js.map +1 -1
  390. package/dist/lexicon/types/com/atproto/server/refreshSession.js.map +1 -1
  391. package/dist/lexicon/types/com/atproto/server/requestAccountDelete.js.map +1 -1
  392. package/dist/lexicon/types/com/atproto/server/requestEmailConfirmation.js.map +1 -1
  393. package/dist/lexicon/types/com/atproto/server/requestEmailUpdate.js.map +1 -1
  394. package/dist/lexicon/types/com/atproto/server/requestPasswordReset.js.map +1 -1
  395. package/dist/lexicon/types/com/atproto/server/reserveSigningKey.js.map +1 -1
  396. package/dist/lexicon/types/com/atproto/server/resetPassword.js.map +1 -1
  397. package/dist/lexicon/types/com/atproto/server/revokeAppPassword.js.map +1 -1
  398. package/dist/lexicon/types/com/atproto/server/updateEmail.js.map +1 -1
  399. package/dist/lexicon/types/com/atproto/sync/defs.js.map +1 -1
  400. package/dist/lexicon/types/com/atproto/sync/getBlob.js.map +1 -1
  401. package/dist/lexicon/types/com/atproto/sync/getBlocks.js.map +1 -1
  402. package/dist/lexicon/types/com/atproto/sync/getCheckout.js.map +1 -1
  403. package/dist/lexicon/types/com/atproto/sync/getHead.js.map +1 -1
  404. package/dist/lexicon/types/com/atproto/sync/getHostStatus.js.map +1 -1
  405. package/dist/lexicon/types/com/atproto/sync/getLatestCommit.js.map +1 -1
  406. package/dist/lexicon/types/com/atproto/sync/getRecord.js.map +1 -1
  407. package/dist/lexicon/types/com/atproto/sync/getRepo.js.map +1 -1
  408. package/dist/lexicon/types/com/atproto/sync/getRepoStatus.js.map +1 -1
  409. package/dist/lexicon/types/com/atproto/sync/listBlobs.js.map +1 -1
  410. package/dist/lexicon/types/com/atproto/sync/listHosts.js.map +1 -1
  411. package/dist/lexicon/types/com/atproto/sync/listRepos.js.map +1 -1
  412. package/dist/lexicon/types/com/atproto/sync/listReposByCollection.js.map +1 -1
  413. package/dist/lexicon/types/com/atproto/sync/notifyOfUpdate.js.map +1 -1
  414. package/dist/lexicon/types/com/atproto/sync/requestCrawl.js.map +1 -1
  415. package/dist/lexicon/types/com/atproto/sync/subscribeRepos.js.map +1 -1
  416. package/dist/lexicon/types/com/atproto/temp/addReservedHandle.js.map +1 -1
  417. package/dist/lexicon/types/com/atproto/temp/checkHandleAvailability.js.map +1 -1
  418. package/dist/lexicon/types/com/atproto/temp/checkSignupQueue.js.map +1 -1
  419. package/dist/lexicon/types/com/atproto/temp/dereferenceScope.js.map +1 -1
  420. package/dist/lexicon/types/com/atproto/temp/fetchLabels.js.map +1 -1
  421. package/dist/lexicon/types/com/atproto/temp/requestPhoneVerification.js.map +1 -1
  422. package/dist/lexicon/types/com/atproto/temp/revokeAccountCredentials.js.map +1 -1
  423. package/dist/lexicon/types/tools/ozone/communication/createTemplate.js.map +1 -1
  424. package/dist/lexicon/types/tools/ozone/communication/defs.js.map +1 -1
  425. package/dist/lexicon/types/tools/ozone/communication/deleteTemplate.js.map +1 -1
  426. package/dist/lexicon/types/tools/ozone/communication/listTemplates.js.map +1 -1
  427. package/dist/lexicon/types/tools/ozone/communication/updateTemplate.js.map +1 -1
  428. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js.map +1 -1
  429. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts +46 -0
  430. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.d.ts.map +1 -0
  431. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js +25 -0
  432. package/dist/lexicon/types/tools/ozone/moderation/cancelScheduledActions.js.map +1 -0
  433. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +57 -2
  434. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  435. package/dist/lexicon/types/tools/ozone/moderation/defs.js +27 -0
  436. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  437. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts +1 -1
  438. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts.map +1 -1
  439. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js.map +1 -1
  440. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts +1 -1
  441. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.d.ts.map +1 -1
  442. package/dist/lexicon/types/tools/ozone/moderation/getAccountTimeline.js.map +1 -1
  443. package/dist/lexicon/types/tools/ozone/moderation/getEvent.js.map +1 -1
  444. package/dist/lexicon/types/tools/ozone/moderation/getRecord.js.map +1 -1
  445. package/dist/lexicon/types/tools/ozone/moderation/getRecords.js.map +1 -1
  446. package/dist/lexicon/types/tools/ozone/moderation/getRepo.js.map +1 -1
  447. package/dist/lexicon/types/tools/ozone/moderation/getReporterStats.js.map +1 -1
  448. package/dist/lexicon/types/tools/ozone/moderation/getRepos.js.map +1 -1
  449. package/dist/lexicon/types/tools/ozone/moderation/getSubjects.js.map +1 -1
  450. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts +38 -0
  451. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.d.ts.map +1 -0
  452. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js +7 -0
  453. package/dist/lexicon/types/tools/ozone/moderation/listScheduledActions.js.map +1 -0
  454. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
  455. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
  456. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts +75 -0
  457. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.d.ts.map +1 -0
  458. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js +43 -0
  459. package/dist/lexicon/types/tools/ozone/moderation/scheduleAction.js.map +1 -0
  460. package/dist/lexicon/types/tools/ozone/moderation/searchRepos.js.map +1 -1
  461. package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
  462. package/dist/lexicon/types/tools/ozone/safelink/addRule.js.map +1 -1
  463. package/dist/lexicon/types/tools/ozone/safelink/defs.js.map +1 -1
  464. package/dist/lexicon/types/tools/ozone/safelink/queryEvents.js.map +1 -1
  465. package/dist/lexicon/types/tools/ozone/safelink/queryRules.js.map +1 -1
  466. package/dist/lexicon/types/tools/ozone/safelink/removeRule.js.map +1 -1
  467. package/dist/lexicon/types/tools/ozone/safelink/updateRule.js.map +1 -1
  468. package/dist/lexicon/types/tools/ozone/server/getConfig.js.map +1 -1
  469. package/dist/lexicon/types/tools/ozone/set/addValues.js.map +1 -1
  470. package/dist/lexicon/types/tools/ozone/set/defs.js.map +1 -1
  471. package/dist/lexicon/types/tools/ozone/set/deleteSet.js.map +1 -1
  472. package/dist/lexicon/types/tools/ozone/set/deleteValues.js.map +1 -1
  473. package/dist/lexicon/types/tools/ozone/set/getValues.js.map +1 -1
  474. package/dist/lexicon/types/tools/ozone/set/querySets.js.map +1 -1
  475. package/dist/lexicon/types/tools/ozone/set/upsertSet.js.map +1 -1
  476. package/dist/lexicon/types/tools/ozone/setting/defs.js.map +1 -1
  477. package/dist/lexicon/types/tools/ozone/setting/listOptions.js.map +1 -1
  478. package/dist/lexicon/types/tools/ozone/setting/removeOptions.js.map +1 -1
  479. package/dist/lexicon/types/tools/ozone/setting/upsertOption.js.map +1 -1
  480. package/dist/lexicon/types/tools/ozone/signature/defs.js.map +1 -1
  481. package/dist/lexicon/types/tools/ozone/signature/findCorrelation.js.map +1 -1
  482. package/dist/lexicon/types/tools/ozone/signature/findRelatedAccounts.js.map +1 -1
  483. package/dist/lexicon/types/tools/ozone/signature/searchAccounts.js.map +1 -1
  484. package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -1
  485. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -1
  486. package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -1
  487. package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -1
  488. package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -1
  489. package/dist/lexicon/types/tools/ozone/verification/defs.js.map +1 -1
  490. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js.map +1 -1
  491. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js.map +1 -1
  492. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js.map +1 -1
  493. package/dist/lexicon/util.js.map +1 -1
  494. package/dist/logger.js.map +1 -1
  495. package/dist/mod-service/index.d.ts.map +1 -1
  496. package/dist/mod-service/index.js +11 -0
  497. package/dist/mod-service/index.js.map +1 -1
  498. package/dist/mod-service/profile.js.map +1 -1
  499. package/dist/mod-service/status.d.ts +3 -0
  500. package/dist/mod-service/status.d.ts.map +1 -1
  501. package/dist/mod-service/status.js.map +1 -1
  502. package/dist/mod-service/subject.js.map +1 -1
  503. package/dist/mod-service/types.js.map +1 -1
  504. package/dist/mod-service/util.js.map +1 -1
  505. package/dist/mod-service/views.d.ts.map +1 -1
  506. package/dist/mod-service/views.js +5 -0
  507. package/dist/mod-service/views.js.map +1 -1
  508. package/dist/safelink/service.js.map +1 -1
  509. package/dist/scheduled-action/service.d.ts +39 -0
  510. package/dist/scheduled-action/service.d.ts.map +1 -0
  511. package/dist/scheduled-action/service.js +208 -0
  512. package/dist/scheduled-action/service.js.map +1 -0
  513. package/dist/scheduled-action/types.d.ts +14 -0
  514. package/dist/scheduled-action/types.d.ts.map +1 -0
  515. package/dist/scheduled-action/types.js +3 -0
  516. package/dist/scheduled-action/types.js.map +1 -0
  517. package/dist/sequencer/index.js.map +1 -1
  518. package/dist/sequencer/outbox.js.map +1 -1
  519. package/dist/sequencer/sequencer.js.map +1 -1
  520. package/dist/set/service.js.map +1 -1
  521. package/dist/setting/constants.js.map +1 -1
  522. package/dist/setting/service.js.map +1 -1
  523. package/dist/setting/types.js.map +1 -1
  524. package/dist/setting/validators.js.map +1 -1
  525. package/dist/tag-service/content-tagger.js.map +1 -1
  526. package/dist/tag-service/embed-tagger.js.map +1 -1
  527. package/dist/tag-service/index.js.map +1 -1
  528. package/dist/tag-service/language-data.js.map +1 -1
  529. package/dist/tag-service/language-tagger.js.map +1 -1
  530. package/dist/tag-service/util.js.map +1 -1
  531. package/dist/team/index.js.map +1 -1
  532. package/dist/util.js.map +1 -1
  533. package/dist/verification/issuer.js.map +1 -1
  534. package/dist/verification/service.js.map +1 -1
  535. package/dist/verification/util.js.map +1 -1
  536. package/package.json +3 -3
  537. package/src/api/index.ts +6 -0
  538. package/src/api/moderation/cancelScheduledActions.ts +72 -0
  539. package/src/api/moderation/emitEvent.ts +9 -84
  540. package/src/api/moderation/listScheduledActions.ts +45 -0
  541. package/src/api/moderation/scheduleAction.ts +129 -0
  542. package/src/api/moderation/util.ts +96 -0
  543. package/src/api/util.ts +33 -0
  544. package/src/context.ts +11 -0
  545. package/src/daemon/context.ts +21 -0
  546. package/src/daemon/index.ts +1 -0
  547. package/src/daemon/scheduled-action-processor.ts +243 -0
  548. package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +56 -0
  549. package/src/db/migrations/index.ts +2 -0
  550. package/src/db/schema/index.ts +3 -1
  551. package/src/db/schema/scheduled-action.ts +25 -0
  552. package/src/lexicon/index.ts +39 -0
  553. package/src/lexicon/lexicons.ts +436 -0
  554. package/src/lexicon/types/app/bsky/actor/defs.ts +2 -0
  555. package/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts +79 -0
  556. package/src/lexicon/types/tools/ozone/moderation/defs.ts +88 -0
  557. package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +2 -0
  558. package/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts +2 -0
  559. package/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts +57 -0
  560. package/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts +123 -0
  561. package/src/mod-service/index.ts +13 -0
  562. package/src/mod-service/views.ts +7 -0
  563. package/src/scheduled-action/service.ts +279 -0
  564. package/src/scheduled-action/types.ts +17 -0
  565. package/tests/__snapshots__/scheduled-action.test.ts.snap +61 -0
  566. package/tests/scheduled-action-processor.test.ts +464 -0
  567. package/tests/scheduled-action.test.ts +334 -0
  568. package/tsconfig.build.tsbuildinfo +1 -1
  569. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -46,6 +46,8 @@ export interface ModEventView {
46
46
  | $Typed<AgeAssuranceEvent>
47
47
  | $Typed<AgeAssuranceOverrideEvent>
48
48
  | $Typed<RevokeAccountCredentialsEvent>
49
+ | $Typed<ScheduleTakedownEvent>
50
+ | $Typed<CancelScheduledTakedownEvent>
49
51
  | { $type: string }
50
52
  subject:
51
53
  | $Typed<ComAtprotoAdminDefs.RepoRef>
@@ -96,6 +98,8 @@ export interface ModEventViewDetail {
96
98
  | $Typed<AgeAssuranceEvent>
97
99
  | $Typed<AgeAssuranceOverrideEvent>
98
100
  | $Typed<RevokeAccountCredentialsEvent>
101
+ | $Typed<ScheduleTakedownEvent>
102
+ | $Typed<CancelScheduledTakedownEvent>
99
103
  | { $type: string }
100
104
  subject:
101
105
  | $Typed<RepoView>
@@ -701,6 +705,45 @@ export function validateRecordEvent<V>(v: V) {
701
705
  return validate<RecordEvent & V>(v, id, hashRecordEvent)
702
706
  }
703
707
 
708
+ /** Logs a scheduled takedown action for an account. */
709
+ export interface ScheduleTakedownEvent {
710
+ $type?: 'tools.ozone.moderation.defs#scheduleTakedownEvent'
711
+ comment?: string
712
+ executeAt?: string
713
+ executeAfter?: string
714
+ executeUntil?: string
715
+ }
716
+
717
+ const hashScheduleTakedownEvent = 'scheduleTakedownEvent'
718
+
719
+ export function isScheduleTakedownEvent<V>(v: V) {
720
+ return is$typed(v, id, hashScheduleTakedownEvent)
721
+ }
722
+
723
+ export function validateScheduleTakedownEvent<V>(v: V) {
724
+ return validate<ScheduleTakedownEvent & V>(v, id, hashScheduleTakedownEvent)
725
+ }
726
+
727
+ /** Logs cancellation of a scheduled takedown action for an account. */
728
+ export interface CancelScheduledTakedownEvent {
729
+ $type?: 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent'
730
+ comment?: string
731
+ }
732
+
733
+ const hashCancelScheduledTakedownEvent = 'cancelScheduledTakedownEvent'
734
+
735
+ export function isCancelScheduledTakedownEvent<V>(v: V) {
736
+ return is$typed(v, id, hashCancelScheduledTakedownEvent)
737
+ }
738
+
739
+ export function validateCancelScheduledTakedownEvent<V>(v: V) {
740
+ return validate<CancelScheduledTakedownEvent & V>(
741
+ v,
742
+ id,
743
+ hashCancelScheduledTakedownEvent,
744
+ )
745
+ }
746
+
704
747
  export interface RepoView {
705
748
  $type?: 'tools.ozone.moderation.defs#repoView'
706
749
  did: string
@@ -1010,3 +1053,48 @@ export const TIMELINEEVENTPLCCREATE = `${id}#timelineEventPlcCreate`
1010
1053
  export const TIMELINEEVENTPLCOPERATION = `${id}#timelineEventPlcOperation`
1011
1054
  /** Moderation event timeline event for a PLC tombstone operation */
1012
1055
  export const TIMELINEEVENTPLCTOMBSTONE = `${id}#timelineEventPlcTombstone`
1056
+
1057
+ /** View of a scheduled moderation action */
1058
+ export interface ScheduledActionView {
1059
+ $type?: 'tools.ozone.moderation.defs#scheduledActionView'
1060
+ /** Auto-incrementing row ID */
1061
+ id: number
1062
+ /** Type of action to be executed */
1063
+ action: 'takedown' | (string & {})
1064
+ /** Serialized event object that will be propagated to the event when performed */
1065
+ eventData?: { [_ in string]: unknown }
1066
+ /** Subject DID for the action */
1067
+ did: string
1068
+ /** Exact time to execute the action */
1069
+ executeAt?: string
1070
+ /** Earliest time to execute the action (for randomized scheduling) */
1071
+ executeAfter?: string
1072
+ /** Latest time to execute the action (for randomized scheduling) */
1073
+ executeUntil?: string
1074
+ /** Whether execution time should be randomized within the specified range */
1075
+ randomizeExecution?: boolean
1076
+ /** DID of the user who created this scheduled action */
1077
+ createdBy: string
1078
+ /** When the scheduled action was created */
1079
+ createdAt: string
1080
+ /** When the scheduled action was last updated */
1081
+ updatedAt?: string
1082
+ /** Current status of the scheduled action */
1083
+ status: 'pending' | 'executed' | 'cancelled' | 'failed' | (string & {})
1084
+ /** When the action was last attempted to be executed */
1085
+ lastExecutedAt?: string
1086
+ /** Reason for the last execution failure */
1087
+ lastFailureReason?: string
1088
+ /** ID of the moderation event created when action was successfully executed */
1089
+ executionEventId?: number
1090
+ }
1091
+
1092
+ const hashScheduledActionView = 'scheduledActionView'
1093
+
1094
+ export function isScheduledActionView<V>(v: V) {
1095
+ return is$typed(v, id, hashScheduledActionView)
1096
+ }
1097
+
1098
+ export function validateScheduledActionView<V>(v: V) {
1099
+ return validate<ScheduledActionView & V>(v, id, hashScheduledActionView)
1100
+ }
@@ -43,6 +43,8 @@ export interface InputSchema {
43
43
  | $Typed<ToolsOzoneModerationDefs.AgeAssuranceEvent>
44
44
  | $Typed<ToolsOzoneModerationDefs.AgeAssuranceOverrideEvent>
45
45
  | $Typed<ToolsOzoneModerationDefs.RevokeAccountCredentialsEvent>
46
+ | $Typed<ToolsOzoneModerationDefs.ScheduleTakedownEvent>
47
+ | $Typed<ToolsOzoneModerationDefs.CancelScheduledTakedownEvent>
46
48
  | { $type: string }
47
49
  subject:
48
50
  | $Typed<ComAtprotoAdminDefs.RepoRef>
@@ -88,6 +88,8 @@ export interface TimelineItemSummary {
88
88
  | 'tools.ozone.hosting.getAccountHistory#emailConfirmed'
89
89
  | 'tools.ozone.hosting.getAccountHistory#passwordUpdated'
90
90
  | 'tools.ozone.hosting.getAccountHistory#handleUpdated'
91
+ | 'tools.ozone.moderation.defs#scheduleTakedownEvent'
92
+ | 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent'
91
93
  | (string & {})
92
94
  count: number
93
95
  }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { type ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { CID } from 'multiformats/cid'
6
+ import { validate as _validate } from '../../../../lexicons'
7
+ import {
8
+ type $Typed,
9
+ is$typed as _is$typed,
10
+ type OmitKey,
11
+ } from '../../../../util'
12
+ import type * as ToolsOzoneModerationDefs from './defs.js'
13
+
14
+ const is$typed = _is$typed,
15
+ validate = _validate
16
+ const id = 'tools.ozone.moderation.listScheduledActions'
17
+
18
+ export type QueryParams = {}
19
+
20
+ export interface InputSchema {
21
+ /** Filter actions scheduled to execute after this time */
22
+ startsAfter?: string
23
+ /** Filter actions scheduled to execute before this time */
24
+ endsBefore?: string
25
+ /** Filter actions for specific DID subjects */
26
+ subjects?: string[]
27
+ /** Filter actions by status */
28
+ statuses: ('pending' | 'executed' | 'cancelled' | 'failed' | (string & {}))[]
29
+ /** Maximum number of results to return */
30
+ limit: number
31
+ /** Cursor for pagination */
32
+ cursor?: string
33
+ }
34
+
35
+ export interface OutputSchema {
36
+ actions: ToolsOzoneModerationDefs.ScheduledActionView[]
37
+ /** Cursor for next page of results */
38
+ cursor?: string
39
+ }
40
+
41
+ export interface HandlerInput {
42
+ encoding: 'application/json'
43
+ body: InputSchema
44
+ }
45
+
46
+ export interface HandlerSuccess {
47
+ encoding: 'application/json'
48
+ body: OutputSchema
49
+ headers?: { [key: string]: string }
50
+ }
51
+
52
+ export interface HandlerError {
53
+ status: number
54
+ message?: string
55
+ }
56
+
57
+ export type HandlerOutput = HandlerError | HandlerSuccess
@@ -0,0 +1,123 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { type ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { CID } from 'multiformats/cid'
6
+ import { validate as _validate } from '../../../../lexicons'
7
+ import {
8
+ type $Typed,
9
+ is$typed as _is$typed,
10
+ type OmitKey,
11
+ } from '../../../../util'
12
+ import type * as ToolsOzoneModerationDefs from './defs.js'
13
+
14
+ const is$typed = _is$typed,
15
+ validate = _validate
16
+ const id = 'tools.ozone.moderation.scheduleAction'
17
+
18
+ export type QueryParams = {}
19
+
20
+ export interface InputSchema {
21
+ action: $Typed<Takedown> | { $type: string }
22
+ /** Array of DID subjects to schedule the action for */
23
+ subjects: string[]
24
+ createdBy: string
25
+ scheduling: SchedulingConfig
26
+ modTool?: ToolsOzoneModerationDefs.ModTool
27
+ }
28
+
29
+ export type OutputSchema = ScheduledActionResults
30
+
31
+ export interface HandlerInput {
32
+ encoding: 'application/json'
33
+ body: InputSchema
34
+ }
35
+
36
+ export interface HandlerSuccess {
37
+ encoding: 'application/json'
38
+ body: OutputSchema
39
+ headers?: { [key: string]: string }
40
+ }
41
+
42
+ export interface HandlerError {
43
+ status: number
44
+ message?: string
45
+ }
46
+
47
+ export type HandlerOutput = HandlerError | HandlerSuccess
48
+
49
+ /** Schedule a takedown action */
50
+ export interface Takedown {
51
+ $type?: 'tools.ozone.moderation.scheduleAction#takedown'
52
+ comment?: string
53
+ /** Indicates how long the takedown should be in effect before automatically expiring. */
54
+ durationInHours?: number
55
+ /** If true, all other reports on content authored by this account will be resolved (acknowledged). */
56
+ acknowledgeAccountSubjects?: boolean
57
+ /** Names/Keywords of the policies that drove the decision. */
58
+ policies?: string[]
59
+ }
60
+
61
+ const hashTakedown = 'takedown'
62
+
63
+ export function isTakedown<V>(v: V) {
64
+ return is$typed(v, id, hashTakedown)
65
+ }
66
+
67
+ export function validateTakedown<V>(v: V) {
68
+ return validate<Takedown & V>(v, id, hashTakedown)
69
+ }
70
+
71
+ /** Configuration for when the action should be executed */
72
+ export interface SchedulingConfig {
73
+ $type?: 'tools.ozone.moderation.scheduleAction#schedulingConfig'
74
+ /** Exact time to execute the action */
75
+ executeAt?: string
76
+ /** Earliest time to execute the action (for randomized scheduling) */
77
+ executeAfter?: string
78
+ /** Latest time to execute the action (for randomized scheduling) */
79
+ executeUntil?: string
80
+ }
81
+
82
+ const hashSchedulingConfig = 'schedulingConfig'
83
+
84
+ export function isSchedulingConfig<V>(v: V) {
85
+ return is$typed(v, id, hashSchedulingConfig)
86
+ }
87
+
88
+ export function validateSchedulingConfig<V>(v: V) {
89
+ return validate<SchedulingConfig & V>(v, id, hashSchedulingConfig)
90
+ }
91
+
92
+ export interface ScheduledActionResults {
93
+ $type?: 'tools.ozone.moderation.scheduleAction#scheduledActionResults'
94
+ succeeded: string[]
95
+ failed: FailedScheduling[]
96
+ }
97
+
98
+ const hashScheduledActionResults = 'scheduledActionResults'
99
+
100
+ export function isScheduledActionResults<V>(v: V) {
101
+ return is$typed(v, id, hashScheduledActionResults)
102
+ }
103
+
104
+ export function validateScheduledActionResults<V>(v: V) {
105
+ return validate<ScheduledActionResults & V>(v, id, hashScheduledActionResults)
106
+ }
107
+
108
+ export interface FailedScheduling {
109
+ $type?: 'tools.ozone.moderation.scheduleAction#failedScheduling'
110
+ subject: string
111
+ error: string
112
+ errorCode?: string
113
+ }
114
+
115
+ const hashFailedScheduling = 'failedScheduling'
116
+
117
+ export function isFailedScheduling<V>(v: V) {
118
+ return is$typed(v, id, hashFailedScheduling)
119
+ }
120
+
121
+ export function validateFailedScheduling<V>(v: V) {
122
+ return validate<FailedScheduling & V>(v, id, hashFailedScheduling)
123
+ }
@@ -39,6 +39,7 @@ import {
39
39
  isModEventTag,
40
40
  isModEventTakedown,
41
41
  isRecordEvent,
42
+ isScheduleTakedownEvent,
42
43
  } from '../lexicon/types/tools/ozone/moderation/defs'
43
44
  import { QueryParams as QueryStatusParams } from '../lexicon/types/tools/ozone/moderation/queryStatuses'
44
45
  import { httpLogger as log } from '../logger'
@@ -532,6 +533,18 @@ export class ModerationService {
532
533
  meta.status = event.status
533
534
  }
534
535
 
536
+ if (isScheduleTakedownEvent(event)) {
537
+ if (event.executeAfter) {
538
+ meta.executeAfter = event.executeAfter
539
+ }
540
+ if (event.executeAt) {
541
+ meta.executeAt = event.executeAt
542
+ }
543
+ if (event.executeUntil) {
544
+ meta.executeUntil = event.executeUntil
545
+ }
546
+ }
547
+
535
548
  if (
536
549
  (isModEventTakedown(event) || isModEventAcknowledge(event)) &&
537
550
  event.acknowledgeAccountSubjects
@@ -44,6 +44,7 @@ import {
44
44
  isModEventTag,
45
45
  isModEventTakedown,
46
46
  isRecordEvent,
47
+ isScheduleTakedownEvent,
47
48
  } from '../lexicon/types/tools/ozone/moderation/defs'
48
49
  import { Un$Typed, asPredicate } from '../lexicon/util'
49
50
  import { dbLogger, httpLogger } from '../logger'
@@ -262,6 +263,12 @@ export class ModerationViews {
262
263
  event.status = ifString(meta.status)!
263
264
  }
264
265
 
266
+ if (isScheduleTakedownEvent(event)) {
267
+ event.executeAt = ifString(meta.executeAt)
268
+ event.executeAfter = ifString(meta.executeAfter)
269
+ event.executeUntil = ifString(meta.executeUntil)
270
+ }
271
+
265
272
  return eventView
266
273
  }
267
274
 
@@ -0,0 +1,279 @@
1
+ import { Selectable } from 'kysely'
2
+ import { InvalidRequestError } from '@atproto/xrpc-server'
3
+ import { ScheduledActionStatus, ScheduledActionType } from '../api/util'
4
+ import { Database } from '../db'
5
+ import { ScheduledAction } from '../db/schema/scheduled-action'
6
+ import { ScheduledActionView } from '../lexicon/types/tools/ozone/moderation/defs'
7
+ import { dbLogger } from '../logger'
8
+ import { SchedulingParams } from './types'
9
+
10
+ export type ScheduledActionServiceCreator = (
11
+ db: Database,
12
+ ) => ScheduledActionService
13
+
14
+ export class ScheduledActionService {
15
+ constructor(public db: Database) {}
16
+
17
+ static creator() {
18
+ return (db: Database) => new ScheduledActionService(db)
19
+ }
20
+
21
+ formatScheduledAction(
22
+ action: Selectable<ScheduledAction>,
23
+ ): ScheduledActionView {
24
+ return {
25
+ id: action.id,
26
+ action: action.action,
27
+ eventData: action.eventData as { [x: string]: unknown } | undefined,
28
+ did: action.did,
29
+ executeAt: action.executeAt
30
+ ? new Date(action.executeAt).toISOString()
31
+ : undefined,
32
+ executeAfter: action.executeAfter
33
+ ? new Date(action.executeAfter).toISOString()
34
+ : undefined,
35
+ executeUntil: action.executeUntil
36
+ ? new Date(action.executeUntil).toISOString()
37
+ : undefined,
38
+ randomizeExecution: action.randomizeExecution,
39
+ createdBy: action.createdBy,
40
+ createdAt: new Date(action.createdAt).toISOString(),
41
+ updatedAt: new Date(action.updatedAt).toISOString(),
42
+ status: action.status,
43
+ lastExecutedAt: action.lastExecutedAt
44
+ ? new Date(action.lastExecutedAt).toISOString()
45
+ : undefined,
46
+ lastFailureReason: action.lastFailureReason || undefined,
47
+ executionEventId: action.executionEventId || undefined,
48
+ }
49
+ }
50
+
51
+ async scheduleAction(
52
+ schedulingParams: SchedulingParams,
53
+ ): Promise<Selectable<ScheduledAction>> {
54
+ const { action, eventData, did, createdBy } = schedulingParams
55
+
56
+ // Only allow one pending action at a time for a given subject and action type
57
+ const existingAction = await this.getPendingActionForSubject(did, action)
58
+ if (existingAction) {
59
+ throw new InvalidRequestError(
60
+ 'A pending scheduled action already exists for this subject',
61
+ 'ActionAlreadyExists',
62
+ )
63
+ }
64
+
65
+ // When a time-range for action is specified, ensure that the range is valid
66
+ if (
67
+ 'executeAfter' in schedulingParams &&
68
+ schedulingParams.executeAfter &&
69
+ schedulingParams.executeUntil &&
70
+ schedulingParams.executeAfter >= schedulingParams.executeUntil
71
+ ) {
72
+ throw new InvalidRequestError(
73
+ 'executeAfter must be before executeUntil',
74
+ 'InvalidScheduling',
75
+ )
76
+ }
77
+
78
+ const now = new Date().toISOString()
79
+ const randomizeExecution =
80
+ !('executeAt' in schedulingParams) && 'executeAfter' in schedulingParams
81
+
82
+ const scheduledAction = await this.db.db
83
+ .insertInto('scheduled_action')
84
+ .values({
85
+ action,
86
+ eventData: JSON.stringify(eventData),
87
+ did,
88
+ executeAt: randomizeExecution
89
+ ? null
90
+ : schedulingParams.executeAt?.toISOString(),
91
+ executeAfter: randomizeExecution
92
+ ? schedulingParams.executeAfter?.toISOString()
93
+ : null,
94
+ executeUntil: randomizeExecution
95
+ ? schedulingParams.executeUntil?.toISOString()
96
+ : null,
97
+ randomizeExecution,
98
+ createdBy,
99
+ createdAt: now,
100
+ updatedAt: now,
101
+ status: 'pending',
102
+ })
103
+ .returningAll()
104
+ .executeTakeFirstOrThrow()
105
+
106
+ return scheduledAction
107
+ }
108
+
109
+ async getPendingActionForSubject(
110
+ did: string,
111
+ action: ScheduledActionType,
112
+ ): Promise<Selectable<ScheduledAction> | null> {
113
+ const scheduledAction = await this.db.db
114
+ .selectFrom('scheduled_action')
115
+ .selectAll()
116
+ .where('did', '=', did)
117
+ .where('action', '=', action)
118
+ .where('status', '=', 'pending')
119
+ .executeTakeFirst()
120
+
121
+ return scheduledAction || null
122
+ }
123
+
124
+ async listScheduledActions({
125
+ cursor,
126
+ limit = 50,
127
+ startTime,
128
+ endTime,
129
+ subjects,
130
+ statuses = [],
131
+ direction = 'desc',
132
+ }: {
133
+ cursor?: string
134
+ limit?: number
135
+ startTime?: Date
136
+ endTime?: Date
137
+ subjects?: string[]
138
+ statuses: ScheduledActionStatus[]
139
+ direction?: 'asc' | 'desc'
140
+ }): Promise<{
141
+ actions: Selectable<ScheduledAction>[]
142
+ cursor?: string
143
+ }> {
144
+ let query = this.db.db
145
+ .selectFrom('scheduled_action')
146
+ .where('status', 'in', statuses)
147
+ .selectAll()
148
+
149
+ if (subjects && subjects.length > 0) {
150
+ query = query.where('did', 'in', subjects)
151
+ }
152
+
153
+ if (startTime) {
154
+ query = query.where((qb) => {
155
+ return qb
156
+ .orWhere('executeAt', '>=', startTime.toISOString())
157
+ .orWhere('executeAfter', '>=', startTime.toISOString())
158
+ })
159
+ }
160
+
161
+ if (endTime) {
162
+ query = query.where((qb) => {
163
+ return qb
164
+ .orWhere('executeAt', '<=', endTime.toISOString())
165
+ .orWhere('executeUntil', '<=', endTime.toISOString())
166
+ .orWhere((sqb) => {
167
+ return sqb
168
+ .where('executeUntil', 'is', null)
169
+ .where('executeAfter', '<=', endTime.toISOString())
170
+ })
171
+ })
172
+ }
173
+
174
+ if (cursor) {
175
+ query = query.where(
176
+ 'id',
177
+ direction === 'asc' ? '>' : '<',
178
+ parseInt(cursor, 10),
179
+ )
180
+ }
181
+
182
+ const actions = await query.orderBy('id', direction).limit(limit).execute()
183
+
184
+ return {
185
+ actions,
186
+ cursor: actions.at(-1)?.id?.toString(),
187
+ }
188
+ }
189
+
190
+ async cancelScheduledActions(subjects: string[]): Promise<{
191
+ succeeded: string[]
192
+ failed: { did: string; error: string; errorCode?: string }[]
193
+ }> {
194
+ const succeeded: string[] = []
195
+ const failed: { did: string; error: string; errorCode?: string }[] = []
196
+
197
+ for (const did of subjects) {
198
+ try {
199
+ const result = await this.db.db
200
+ .updateTable('scheduled_action')
201
+ .set({
202
+ status: 'cancelled',
203
+ updatedAt: new Date().toISOString(),
204
+ })
205
+ .where('did', '=', did)
206
+ .where('status', '=', 'pending')
207
+ .executeTakeFirst()
208
+
209
+ if (result.numUpdatedRows && result.numUpdatedRows > 0) {
210
+ succeeded.push(did)
211
+ } else {
212
+ failed.push({
213
+ did,
214
+ error: 'No pending scheduled actions found for subject',
215
+ errorCode: 'NoPendingActions',
216
+ })
217
+ }
218
+ } catch (err) {
219
+ dbLogger.error({ err, subjects }, 'Error cancelling scheduled action')
220
+ failed.push({
221
+ did,
222
+ error: 'Unknown error',
223
+ errorCode: 'DatabaseError',
224
+ })
225
+ }
226
+ }
227
+
228
+ return { succeeded, failed }
229
+ }
230
+
231
+ async getPendingActionsToExecute(
232
+ now: Date,
233
+ ): Promise<Selectable<ScheduledAction>[]> {
234
+ return await this.db.db
235
+ .selectFrom('scheduled_action')
236
+ .selectAll()
237
+ .where('status', '=', 'pending')
238
+ .where((qb) => {
239
+ return qb
240
+ .orWhere('executeAfter', '<=', now.toISOString())
241
+ .orWhere('executeAt', '<=', now.toISOString())
242
+ })
243
+ .execute()
244
+ }
245
+
246
+ async markActionAsExecuted(
247
+ actionId: number,
248
+ executionEventId: number,
249
+ ): Promise<void> {
250
+ const now = new Date().toISOString()
251
+ await this.db.db
252
+ .updateTable('scheduled_action')
253
+ .set({
254
+ status: 'executed',
255
+ lastExecutedAt: now,
256
+ executionEventId,
257
+ updatedAt: now,
258
+ })
259
+ .where('id', '=', actionId)
260
+ .execute()
261
+ }
262
+
263
+ async markActionAsFailed(
264
+ actionId: number,
265
+ failureReason: string,
266
+ ): Promise<void> {
267
+ const now = new Date().toISOString()
268
+ await this.db.db
269
+ .updateTable('scheduled_action')
270
+ .set({
271
+ status: 'failed',
272
+ lastExecutedAt: now,
273
+ lastFailureReason: failureReason,
274
+ updatedAt: now,
275
+ })
276
+ .where('id', '=', actionId)
277
+ .execute()
278
+ }
279
+ }
@@ -0,0 +1,17 @@
1
+ import { ScheduledActionType } from '../api/util'
2
+
3
+ export type ExecutionSchedule =
4
+ | {
5
+ executeAt: Date
6
+ }
7
+ | {
8
+ executeAfter: Date
9
+ executeUntil?: Date
10
+ }
11
+
12
+ export type SchedulingParams = {
13
+ action: ScheduledActionType
14
+ eventData: unknown
15
+ did: string
16
+ createdBy: string
17
+ } & ExecutionSchedule