@atproto/ozone 0.2.8 → 0.2.11

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 (306) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/package.json +25 -21
  3. package/bin/migration-create.ts +0 -38
  4. package/jest.config.cjs +0 -22
  5. package/src/api/chat/getActorMetadata.ts +0 -23
  6. package/src/api/chat/getConvo.ts +0 -23
  7. package/src/api/chat/getConvoMembers.ts +0 -23
  8. package/src/api/chat/getConvos.ts +0 -23
  9. package/src/api/chat/getMessageContext.ts +0 -42
  10. package/src/api/chat/index.ts +0 -16
  11. package/src/api/communication/createTemplate.ts +0 -51
  12. package/src/api/communication/deleteTemplate.ts +0 -23
  13. package/src/api/communication/listTemplates.ts +0 -31
  14. package/src/api/communication/updateTemplate.ts +0 -51
  15. package/src/api/health.ts +0 -27
  16. package/src/api/index.ts +0 -146
  17. package/src/api/label/fetchLabels.ts +0 -32
  18. package/src/api/label/queryLabels.ts +0 -57
  19. package/src/api/label/subscribeLabels.ts +0 -25
  20. package/src/api/moderation/cancelScheduledActions.ts +0 -72
  21. package/src/api/moderation/emitEvent.ts +0 -475
  22. package/src/api/moderation/getAccountTimeline.ts +0 -160
  23. package/src/api/moderation/getEvent.ts +0 -19
  24. package/src/api/moderation/getRecord.ts +0 -40
  25. package/src/api/moderation/getRecords.ts +0 -50
  26. package/src/api/moderation/getRepo.ts +0 -34
  27. package/src/api/moderation/getReporterStats.ts +0 -18
  28. package/src/api/moderation/getRepos.ts +0 -41
  29. package/src/api/moderation/getSubjects.ts +0 -101
  30. package/src/api/moderation/listScheduledActions.ts +0 -45
  31. package/src/api/moderation/queryEvents.ts +0 -72
  32. package/src/api/moderation/queryStatuses.ts +0 -23
  33. package/src/api/moderation/scheduleAction.ts +0 -129
  34. package/src/api/moderation/searchRepos.ts +0 -46
  35. package/src/api/moderation/util.ts +0 -96
  36. package/src/api/proxied.ts +0 -327
  37. package/src/api/queue/assignModerator.ts +0 -31
  38. package/src/api/queue/createQueue.ts +0 -62
  39. package/src/api/queue/deleteQueue.ts +0 -56
  40. package/src/api/queue/getAssignments.ts +0 -19
  41. package/src/api/queue/listQueues.ts +0 -39
  42. package/src/api/queue/routeReports.ts +0 -44
  43. package/src/api/queue/unassignModerator.ts +0 -26
  44. package/src/api/queue/updateQueue.ts +0 -54
  45. package/src/api/report/assignModerator.ts +0 -36
  46. package/src/api/report/createActivity.ts +0 -57
  47. package/src/api/report/createReport.ts +0 -93
  48. package/src/api/report/getAssignments.ts +0 -20
  49. package/src/api/report/getHistoricalStats.ts +0 -41
  50. package/src/api/report/getLatestReport.ts +0 -44
  51. package/src/api/report/getLiveStats.ts +0 -26
  52. package/src/api/report/getReport.ts +0 -55
  53. package/src/api/report/listActivities.ts +0 -37
  54. package/src/api/report/queryActivities.ts +0 -64
  55. package/src/api/report/queryReports.ts +0 -44
  56. package/src/api/report/reassignQueue.ts +0 -68
  57. package/src/api/report/refreshStats.ts +0 -27
  58. package/src/api/report/unassignModerator.ts +0 -21
  59. package/src/api/safelink/addRule.ts +0 -48
  60. package/src/api/safelink/queryEvents.ts +0 -32
  61. package/src/api/safelink/queryRules.ts +0 -58
  62. package/src/api/safelink/removeRule.ts +0 -42
  63. package/src/api/safelink/updateRule.ts +0 -48
  64. package/src/api/server/getConfig.ts +0 -35
  65. package/src/api/set/addValues.ts +0 -28
  66. package/src/api/set/deleteSet.ts +0 -34
  67. package/src/api/set/deleteValues.ts +0 -31
  68. package/src/api/set/getValues.ts +0 -42
  69. package/src/api/set/querySets.ts +0 -36
  70. package/src/api/set/upsertSet.ts +0 -38
  71. package/src/api/setting/listOptions.ts +0 -44
  72. package/src/api/setting/removeOptions.ts +0 -64
  73. package/src/api/setting/upsertOption.ts +0 -156
  74. package/src/api/team/addMember.ts +0 -51
  75. package/src/api/team/deleteMember.ts +0 -29
  76. package/src/api/team/listMembers.ts +0 -20
  77. package/src/api/team/updateMember.ts +0 -47
  78. package/src/api/util.ts +0 -265
  79. package/src/api/verification/grantVerifications.ts +0 -90
  80. package/src/api/verification/listVerifications.ts +0 -44
  81. package/src/api/verification/revokeVerifications.ts +0 -43
  82. package/src/api/well-known.ts +0 -46
  83. package/src/assignment/index.ts +0 -728
  84. package/src/auth-verifier.ts +0 -227
  85. package/src/background.ts +0 -183
  86. package/src/communication-service/template.ts +0 -110
  87. package/src/communication-service/util.ts +0 -8
  88. package/src/config/config.ts +0 -211
  89. package/src/config/env.ts +0 -95
  90. package/src/config/index.ts +0 -3
  91. package/src/config/secrets.ts +0 -17
  92. package/src/context.ts +0 -399
  93. package/src/daemon/blob-diverter.ts +0 -186
  94. package/src/daemon/context.ts +0 -247
  95. package/src/daemon/event-pusher.ts +0 -363
  96. package/src/daemon/event-reverser.ts +0 -128
  97. package/src/daemon/index.ts +0 -33
  98. package/src/daemon/job-cursor.ts +0 -33
  99. package/src/daemon/materialized-view-refresher.ts +0 -33
  100. package/src/daemon/queue-router.ts +0 -101
  101. package/src/daemon/scheduled-action-processor.ts +0 -304
  102. package/src/daemon/stats-computer.ts +0 -101
  103. package/src/daemon/strike-expiry-processor.ts +0 -95
  104. package/src/daemon/team-profile-synchronizer.ts +0 -15
  105. package/src/daemon/verification-listener.ts +0 -169
  106. package/src/db/index.ts +0 -203
  107. package/src/db/migrations/20231219T205730722Z-init.ts +0 -170
  108. package/src/db/migrations/20240116T085607200Z-communication-template.ts +0 -23
  109. package/src/db/migrations/20240201T051104136Z-mod-event-blobs.ts +0 -15
  110. package/src/db/migrations/20240208T213404429Z-add-tags-column-to-moderation-subject.ts +0 -31
  111. package/src/db/migrations/20240228T003647759Z-add-label-sigs.ts +0 -25
  112. package/src/db/migrations/20240408T192432676Z-mute-reporting.ts +0 -15
  113. package/src/db/migrations/20240506T225055595Z-message-subject.ts +0 -21
  114. package/src/db/migrations/20240521T211332580Z-member.ts +0 -17
  115. package/src/db/migrations/20240814T003647759Z-event-created-at-index.ts +0 -13
  116. package/src/db/migrations/20240903T205730722Z-add-template-lang.ts +0 -12
  117. package/src/db/migrations/20240904T205730722Z-add-subject-did-index.ts +0 -13
  118. package/src/db/migrations/20241001T205730722Z-subject-status-review-state-index.ts +0 -15
  119. package/src/db/migrations/20241008T205730722Z-sets.ts +0 -53
  120. package/src/db/migrations/20241018T205730722Z-setting.ts +0 -27
  121. package/src/db/migrations/20241026T205730722Z-add-hosting-status-to-subject-status.ts +0 -57
  122. package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +0 -215
  123. package/src/db/migrations/20250204T003647759Z-add-subject-priority-score.ts +0 -22
  124. package/src/db/migrations/20250211T003647759Z-add-reporter-stats-index.ts +0 -38
  125. package/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts +0 -26
  126. package/src/db/migrations/20250221T132135150Z-member-details.ts +0 -14
  127. package/src/db/migrations/20250404T201720309Z-subject-status-sort-idxs.ts +0 -18
  128. package/src/db/migrations/20250415T201720309Z-verification.ts +0 -34
  129. package/src/db/migrations/20250417T201720309Z-firehose-cursor.ts +0 -16
  130. package/src/db/migrations/20250609T110704000Z-safelink.ts +0 -53
  131. package/src/db/migrations/20250618T180246000Z-add-mod-tool-to-moderation-event.ts +0 -18
  132. package/src/db/migrations/20250701T000000000Z-add-age-assurance-state.ts +0 -25
  133. package/src/db/migrations/20250715T000000000Z-add-mod-event-external-id.ts +0 -15
  134. package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +0 -310
  135. package/src/db/migrations/20250813T000000000Z-mod-tool-batch-id-index.ts +0 -14
  136. package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +0 -56
  137. package/src/db/migrations/20251008T120000000Z-add-strike-system.ts +0 -87
  138. package/src/db/migrations/20260210T154806448Z-mod-event-created-by-indexes.ts +0 -22
  139. package/src/db/migrations/20260219T164523000Z-create-report-table.ts +0 -155
  140. package/src/db/migrations/20260219T165302248Z-moderator-assignment.ts +0 -42
  141. package/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts +0 -41
  142. package/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts +0 -48
  143. package/src/db/migrations/20260318T152058935Z-add-report-stat.ts +0 -35
  144. package/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts +0 -32
  145. package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +0 -114
  146. package/src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts +0 -17
  147. package/src/db/migrations/index.ts +0 -44
  148. package/src/db/migrations/provider.ts +0 -26
  149. package/src/db/pagination.ts +0 -335
  150. package/src/db/schema/account_events_stats.ts +0 -16
  151. package/src/db/schema/account_record_events_stats.ts +0 -15
  152. package/src/db/schema/account_record_status_stats.ts +0 -15
  153. package/src/db/schema/account_strike.ts +0 -13
  154. package/src/db/schema/blob_push_event.ts +0 -21
  155. package/src/db/schema/communication_template.ts +0 -19
  156. package/src/db/schema/expiring_tag.ts +0 -18
  157. package/src/db/schema/firehose_cursor.ts +0 -13
  158. package/src/db/schema/index.ts +0 -60
  159. package/src/db/schema/job_cursor.ts +0 -13
  160. package/src/db/schema/label.ts +0 -22
  161. package/src/db/schema/member.ts +0 -22
  162. package/src/db/schema/moderation_event.ts +0 -61
  163. package/src/db/schema/moderation_subject_status.ts +0 -52
  164. package/src/db/schema/moderator_assignment.ts +0 -16
  165. package/src/db/schema/ozone_set.ts +0 -24
  166. package/src/db/schema/record_events_stats.ts +0 -15
  167. package/src/db/schema/record_push_event.ts +0 -21
  168. package/src/db/schema/repo_push_event.ts +0 -19
  169. package/src/db/schema/report.ts +0 -28
  170. package/src/db/schema/report_activity.ts +0 -22
  171. package/src/db/schema/report_queue.ts +0 -21
  172. package/src/db/schema/report_stat.ts +0 -27
  173. package/src/db/schema/safelink.ts +0 -39
  174. package/src/db/schema/scheduled-action.ts +0 -25
  175. package/src/db/schema/setting.ts +0 -24
  176. package/src/db/schema/signing_key.ts +0 -10
  177. package/src/db/schema/verification.ts +0 -21
  178. package/src/db/types.ts +0 -24
  179. package/src/error.ts +0 -12
  180. package/src/image-invalidator.ts +0 -7
  181. package/src/index.ts +0 -154
  182. package/src/jetstream/service.ts +0 -107
  183. package/src/logger.ts +0 -29
  184. package/src/mod-service/expiring-tags.ts +0 -104
  185. package/src/mod-service/index.ts +0 -1842
  186. package/src/mod-service/profile.ts +0 -139
  187. package/src/mod-service/report.ts +0 -429
  188. package/src/mod-service/status.ts +0 -549
  189. package/src/mod-service/strike.ts +0 -96
  190. package/src/mod-service/subject.ts +0 -311
  191. package/src/mod-service/types.ts +0 -96
  192. package/src/mod-service/util.ts +0 -99
  193. package/src/mod-service/views.ts +0 -912
  194. package/src/queue/service.ts +0 -603
  195. package/src/report/activity.ts +0 -281
  196. package/src/report/handle-report-update.ts +0 -209
  197. package/src/report/reassign.ts +0 -109
  198. package/src/report/stats.ts +0 -852
  199. package/src/report/views.ts +0 -239
  200. package/src/safelink/service.ts +0 -304
  201. package/src/scheduled-action/service.ts +0 -281
  202. package/src/scheduled-action/types.ts +0 -17
  203. package/src/sequencer/index.ts +0 -2
  204. package/src/sequencer/outbox.ts +0 -123
  205. package/src/sequencer/sequencer.ts +0 -147
  206. package/src/set/service.ts +0 -230
  207. package/src/setting/constants.ts +0 -3
  208. package/src/setting/service.ts +0 -148
  209. package/src/setting/types.ts +0 -3
  210. package/src/setting/validators.ts +0 -333
  211. package/src/tag-service/content-tagger.ts +0 -30
  212. package/src/tag-service/embed-tagger.ts +0 -70
  213. package/src/tag-service/index.ts +0 -70
  214. package/src/tag-service/language-data.ts +0 -561
  215. package/src/tag-service/language-tagger.ts +0 -101
  216. package/src/tag-service/util.ts +0 -13
  217. package/src/team/index.ts +0 -296
  218. package/src/util.ts +0 -230
  219. package/src/verification/issuer.ts +0 -146
  220. package/src/verification/service.ts +0 -208
  221. package/src/verification/util.ts +0 -53
  222. package/test.env +0 -2
  223. package/tests/3p-labeler.test.ts +0 -288
  224. package/tests/__snapshots__/account-strikes.test.ts.snap +0 -159
  225. package/tests/__snapshots__/age-assurance.test.ts.snap +0 -66
  226. package/tests/__snapshots__/blob-divert.test.ts.snap +0 -219
  227. package/tests/__snapshots__/get-account-timeline.test.ts.snap +0 -36
  228. package/tests/__snapshots__/get-record.test.ts.snap +0 -271
  229. package/tests/__snapshots__/get-records.test.ts.snap +0 -175
  230. package/tests/__snapshots__/get-repo.test.ts.snap +0 -91
  231. package/tests/__snapshots__/get-repos.test.ts.snap +0 -127
  232. package/tests/__snapshots__/get-starter-pack.test.ts.snap +0 -535
  233. package/tests/__snapshots__/get-subjects.test.ts.snap +0 -529
  234. package/tests/__snapshots__/moderation-events.test.ts.snap +0 -347
  235. package/tests/__snapshots__/moderation-statuses.test.ts.snap +0 -276
  236. package/tests/__snapshots__/moderation.test.ts.snap +0 -85
  237. package/tests/__snapshots__/report-reason.test.ts.snap +0 -14
  238. package/tests/__snapshots__/safelink.test.ts.snap +0 -179
  239. package/tests/__snapshots__/scheduled-action.test.ts.snap +0 -61
  240. package/tests/__snapshots__/sets.test.ts.snap +0 -46
  241. package/tests/__snapshots__/settings.test.ts.snap +0 -52
  242. package/tests/__snapshots__/team.test.ts.snap +0 -374
  243. package/tests/__snapshots__/verification-listener.test.ts.snap +0 -152
  244. package/tests/__snapshots__/verification.test.ts.snap +0 -302
  245. package/tests/_util.ts +0 -242
  246. package/tests/account-strikes.test.ts +0 -184
  247. package/tests/ack-all-subjects-of-account.test.ts +0 -177
  248. package/tests/age-assurance.test.ts +0 -372
  249. package/tests/blob-divert.test.ts +0 -106
  250. package/tests/communication-templates.test.ts +0 -149
  251. package/tests/content-tagger.test.ts +0 -170
  252. package/tests/db.test.ts +0 -184
  253. package/tests/expiring-label.test.ts +0 -72
  254. package/tests/expiring-tags.test.ts +0 -232
  255. package/tests/get-account-timeline.test.ts +0 -85
  256. package/tests/get-config.test.ts +0 -55
  257. package/tests/get-lists.test.ts +0 -111
  258. package/tests/get-profiles.test.ts +0 -70
  259. package/tests/get-record.test.ts +0 -130
  260. package/tests/get-records.test.ts +0 -91
  261. package/tests/get-repo.test.ts +0 -171
  262. package/tests/get-report.test.ts +0 -136
  263. package/tests/get-reporter-stats.test.ts +0 -132
  264. package/tests/get-repos.test.ts +0 -91
  265. package/tests/get-starter-pack.test.ts +0 -115
  266. package/tests/get-subjects.test.ts +0 -81
  267. package/tests/mod-tool.test.ts +0 -268
  268. package/tests/moderation-appeals.test.ts +0 -260
  269. package/tests/moderation-events.test.ts +0 -756
  270. package/tests/moderation-status-tags.test.ts +0 -140
  271. package/tests/moderation-statuses.test.ts +0 -495
  272. package/tests/moderation.test.ts +0 -992
  273. package/tests/protected-tags.test.ts +0 -218
  274. package/tests/query-labels.test.ts +0 -238
  275. package/tests/query-reports.test.ts +0 -608
  276. package/tests/queue-assignment.test.ts +0 -428
  277. package/tests/queue-router.test.ts +0 -306
  278. package/tests/queues.test.ts +0 -690
  279. package/tests/record-and-account-events.test.ts +0 -197
  280. package/tests/repo-search.test.ts +0 -136
  281. package/tests/report-action.test.ts +0 -308
  282. package/tests/report-activity.test.ts +0 -711
  283. package/tests/report-assignment.test.ts +0 -517
  284. package/tests/report-muting.test.ts +0 -100
  285. package/tests/report-reason.test.ts +0 -154
  286. package/tests/report-reassign-queue.test.ts +0 -340
  287. package/tests/report-routing.test.ts +0 -245
  288. package/tests/report-stats.test.ts +0 -545
  289. package/tests/revoke-account-credentials.test.ts +0 -54
  290. package/tests/safelink.test.ts +0 -534
  291. package/tests/scheduled-action-processor.test.ts +0 -488
  292. package/tests/scheduled-action.test.ts +0 -334
  293. package/tests/sequencer.test.ts +0 -227
  294. package/tests/server.test.ts +0 -62
  295. package/tests/sets.test.ts +0 -246
  296. package/tests/settings.test.ts +0 -308
  297. package/tests/strike-expiry-processor.test.ts +0 -299
  298. package/tests/subject-priority-score.test.ts +0 -96
  299. package/tests/takedown.test.ts +0 -105
  300. package/tests/team.test.ts +0 -216
  301. package/tests/verification-listener.test.ts +0 -129
  302. package/tests/verification.test.ts +0 -186
  303. package/tsconfig.build.json +0 -9
  304. package/tsconfig.build.tsbuildinfo +0 -1
  305. package/tsconfig.json +0 -7
  306. package/tsconfig.tests.json +0 -8
@@ -1,52 +0,0 @@
1
- import { Generated } from 'kysely'
2
- import {
3
- REVIEWCLOSED,
4
- REVIEWESCALATED,
5
- REVIEWNONE,
6
- REVIEWOPEN,
7
- } from '../../lexicon/types/tools/ozone/moderation/defs.js'
8
-
9
- export const subjectStatusTableName = 'moderation_subject_status'
10
-
11
- export interface ModerationSubjectStatus {
12
- id: Generated<number>
13
-
14
- // unique columns
15
- did: string
16
- recordPath: string
17
- convoId: string
18
-
19
- recordCid: string | null
20
- blobCids: string[] | null
21
- reviewState:
22
- | typeof REVIEWCLOSED
23
- | typeof REVIEWOPEN
24
- | typeof REVIEWESCALATED
25
- | typeof REVIEWNONE
26
- createdAt: string
27
- updatedAt: string
28
- lastReviewedBy: string | null
29
- lastReviewedAt: string | null
30
- lastReportedAt: string | null
31
- lastAppealedAt: string | null
32
- hostingUpdatedAt: string | null
33
- hostingDeletedAt: string | null
34
- hostingCreatedAt: string | null
35
- hostingDeactivatedAt: string | null
36
- hostingReactivatedAt: string | null
37
- hostingStatus: string | null
38
- muteUntil: string | null
39
- muteReportingUntil: string | null
40
- suspendUntil: string | null
41
- takendown: boolean
42
- appealed: boolean | null
43
- comment: string | null
44
- tags: string[] | null
45
- priorityScore?: number
46
- ageAssuranceState: string
47
- ageAssuranceUpdatedBy?: string | null
48
- }
49
-
50
- export type PartialDB = {
51
- [subjectStatusTableName]: ModerationSubjectStatus
52
- }
@@ -1,16 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const moderatorAssignmentTableName = 'moderator_assignment'
4
-
5
- export interface ModeratorAssignment {
6
- id: Generated<number>
7
- did: string
8
- reportId: number | null
9
- queueId: number | null
10
- startAt: string
11
- endAt: string | null
12
- }
13
-
14
- export type PartialDB = {
15
- [moderatorAssignmentTableName]: ModeratorAssignment
16
- }
@@ -1,24 +0,0 @@
1
- import { Generated, GeneratedAlways } from 'kysely'
2
-
3
- export const ozoneSetTableName = 'set_detail'
4
- export const ozoneSetValueTableName = 'set_value'
5
-
6
- export interface SetDetail {
7
- id: GeneratedAlways<number>
8
- name: string
9
- description: string | null
10
- createdAt: Generated<Date>
11
- updatedAt: Generated<Date>
12
- }
13
-
14
- export interface SetValue {
15
- id: GeneratedAlways<number>
16
- setId: number
17
- value: string
18
- createdAt: Generated<Date>
19
- }
20
-
21
- export type PartialDB = {
22
- [ozoneSetTableName]: SetDetail
23
- [ozoneSetValueTableName]: SetValue
24
- }
@@ -1,15 +0,0 @@
1
- import { GeneratedAlways, Selectable } from 'kysely'
2
-
3
- export const tableName = 'record_events_stats'
4
-
5
- export type RecordEventsStats = {
6
- subjectDid: GeneratedAlways<string>
7
- subjectUri: GeneratedAlways<string>
8
- escalateCount: GeneratedAlways<number>
9
- reportCount: GeneratedAlways<number>
10
- appealCount: GeneratedAlways<number>
11
- }
12
-
13
- export type RecordEventsStatsRow = Selectable<RecordEventsStats>
14
-
15
- export type PartialDB = { [tableName]: RecordEventsStats }
@@ -1,21 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const eventTableName = 'record_push_event'
4
-
5
- export type RecordPushEventType = 'pds_takedown' | 'appview_takedown'
6
-
7
- export interface RecordPushEvent {
8
- id: Generated<number>
9
- eventType: RecordPushEventType
10
- subjectDid: string
11
- subjectUri: string
12
- subjectCid: string
13
- takedownRef: string | null
14
- confirmedAt: Date | null
15
- lastAttempted: Date | null
16
- attempts: Generated<number>
17
- }
18
-
19
- export type PartialDB = {
20
- [eventTableName]: RecordPushEvent
21
- }
@@ -1,19 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const eventTableName = 'repo_push_event'
4
-
5
- export type RepoPushEventType = 'pds_takedown' | 'appview_takedown'
6
-
7
- export interface RepoPushEvent {
8
- id: Generated<number>
9
- eventType: RepoPushEventType
10
- subjectDid: string
11
- takedownRef: string | null
12
- confirmedAt: Date | null
13
- lastAttempted: Date | null
14
- attempts: Generated<number>
15
- }
16
-
17
- export type PartialDB = {
18
- [eventTableName]: RepoPushEvent
19
- }
@@ -1,28 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const reportTableName = 'report'
4
-
5
- export interface Report {
6
- id: Generated<number>
7
- eventId: number // References moderation_event.id
8
- queueId: number | null // NULL = not yet assigned, -1 = no matching queue
9
- queuedAt: string | null
10
- actionEventIds: number[] | null // Array of event IDs, sorted DESC [newest, ..., oldest]
11
- actionNote: string | null
12
- isMuted: boolean
13
- status: string // 'open', 'closed', 'escalated', 'queued', 'assigned'
14
- reportType: string // Denormalized from moderation_event.meta.reportType
15
- did: string // Denormalized from moderation_event.subjectDid
16
- recordPath: string // '' = account/message/conversation, 'collection/rkey' = record
17
- subjectMessageId: string | null // Denormalized from moderation_event.subjectMessageId
18
- subjectConvoId: string | null // Denormalized from moderation_event.subjectConvoId
19
- createdAt: string
20
- updatedAt: string
21
- assignedTo: string | null // DID of permanently assigned moderator, null if unassigned
22
- assignedAt: string | null // When the permanent assignment was created
23
- closedAt: string | null
24
- }
25
-
26
- export type PartialDB = {
27
- [reportTableName]: Report
28
- }
@@ -1,22 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const reportActivityTableName = 'report_activity'
4
-
5
- export interface ReportActivity {
6
- id: Generated<number>
7
- reportId: number
8
- // One of: queueActivity | assignmentActivity | escalationActivity
9
- // | closeActivity | internalNoteActivity | publicNoteActivity
10
- activityType: string
11
- previousStatus: string | null // report status before this activity; null for note-only types
12
- internalNote: string | null // moderator-only note
13
- publicNote: string | null // potentially reporter-visible note
14
- meta: unknown | null // loose activity-specific metadata (e.g. { assignmentId: 42 })
15
- isAutomated: boolean
16
- createdBy: string // DID of actor (or service DID for automated activities)
17
- createdAt: string // ISO string
18
- }
19
-
20
- export type PartialDB = {
21
- [reportActivityTableName]: ReportActivity
22
- }
@@ -1,21 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const reportQueueTableName = 'report_queue'
4
-
5
- export interface ReportQueue {
6
- id: Generated<number>
7
- name: string
8
- subjectTypes: string[] // ['account'] or ['record'] or ['account', 'record']
9
- collection: string | null // Collection name (e.g., 'app.bsky.feed.post'), NULL for accounts
10
- reportTypes: string[] // Array of report reason types (fully qualified NSIDs)
11
- description: string | null // Optional description of the queue
12
- createdBy: string // DID of moderator who created this queue
13
- createdAt: string
14
- updatedAt: string
15
- enabled: boolean
16
- deletedAt: string | null // NULL = active, timestamp = soft-deleted
17
- }
18
-
19
- export type PartialDB = {
20
- [reportQueueTableName]: ReportQueue
21
- }
@@ -1,27 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const reportStatTableName = 'report_stat'
4
-
5
- export interface ReportStat {
6
- // metadata
7
- id: Generated<number>
8
- computedAt: string // When this snapshot was last computed
9
-
10
- // group
11
- date: string // ISO date e.g. '2026-04-15' — the calendar day this snapshot covers
12
- queueId: number | null // NULL = aggregate across all queues
13
- reportTypes: string[] | null // NULL = aggregate across all report types
14
- moderatorDid: string | null // NULL = aggregate, non-null = per-moderator
15
-
16
- // stats
17
- inboundCount: number | null // Reports received during this calendar day
18
- pendingCount: number | null // Reports with status != 'closed' at time of computation
19
- actionedCount: number | null // Reports closed during this calendar day
20
- escalatedCount: number | null // Reports escalated during this calendar day
21
- actionRate: number | null // actionedCount / inboundCount * 100
22
- avgHandlingTimeSec: number | null // Average time from creation/assignment to close, in seconds
23
- }
24
-
25
- export type PartialDB = {
26
- [reportStatTableName]: ReportStat
27
- }
@@ -1,39 +0,0 @@
1
- import { GeneratedAlways } from 'kysely'
2
- import {
3
- SafelinkActionType,
4
- SafelinkEventType,
5
- SafelinkPatternType,
6
- SafelinkReasonType,
7
- } from '../../api/util.js'
8
-
9
- export const safelinkRuleTableName = 'safelink_rule'
10
- export const safelinkEventTableName = 'safelink_event'
11
-
12
- export interface SafelinkRule {
13
- id: GeneratedAlways<number>
14
- url: string
15
- pattern: SafelinkPatternType
16
- action: SafelinkActionType
17
- reason: SafelinkReasonType
18
- createdBy: string
19
- createdAt: string
20
- updatedAt: string
21
- comment: string | null
22
- }
23
-
24
- export interface SafelinkEvent {
25
- id: GeneratedAlways<number>
26
- eventType: SafelinkEventType
27
- url: string
28
- pattern: SafelinkPatternType
29
- action: SafelinkActionType
30
- reason: SafelinkReasonType
31
- createdBy: string
32
- createdAt: string
33
- comment: string | null
34
- }
35
-
36
- export type PartialDB = {
37
- [safelinkRuleTableName]: SafelinkRule
38
- [safelinkEventTableName]: SafelinkEvent
39
- }
@@ -1,25 +0,0 @@
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
- }
@@ -1,24 +0,0 @@
1
- import { Generated, GeneratedAlways } from 'kysely'
2
- import { Member } from './member.js'
3
-
4
- export const settingTableName = 'setting'
5
-
6
- export type SettingScope = 'personal' | 'instance'
7
-
8
- export interface Setting {
9
- id: GeneratedAlways<number>
10
- key: string
11
- value: Record<string, unknown>
12
- managerRole: Member['role'] | null
13
- description: string | null
14
- did: string
15
- scope: SettingScope
16
- lastUpdatedBy: string
17
- createdBy: string
18
- createdAt: Generated<Date>
19
- updatedAt: Generated<Date>
20
- }
21
-
22
- export type PartialDB = {
23
- [settingTableName]: Setting
24
- }
@@ -1,10 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const tableName = 'signing_key'
4
-
5
- export interface SigningKey {
6
- id: Generated<number>
7
- key: string
8
- }
9
-
10
- export type PartialDB = { [tableName]: SigningKey }
@@ -1,21 +0,0 @@
1
- import { Generated } from 'kysely'
2
-
3
- export const verificationTableName = 'verification'
4
-
5
- export interface Verification {
6
- uri: string
7
- cid: string
8
- issuer: string
9
- subject: string
10
- handle: string
11
- displayName: string
12
- revokeReason: string | null
13
- revokedBy: string | null
14
- revokedAt: string | null
15
- createdAt: string
16
- updatedAt: Generated<string>
17
- }
18
-
19
- export type PartialDB = {
20
- [verificationTableName]: Verification
21
- }
package/src/db/types.ts DELETED
@@ -1,24 +0,0 @@
1
- import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely'
2
- // eslint-disable-next-line import/default
3
- import pg from 'pg'
4
- type PgPool = pg.Pool
5
-
6
- export type DbRef =
7
- | RawBuilder<unknown>
8
- | ReturnType<DynamicModule<unknown>['ref']>
9
-
10
- export type AnyQb = SelectQueryBuilder<any, any, any>
11
-
12
- export type PgOptions = {
13
- url: string
14
- pool?: PgPool
15
- schema?: string
16
- poolSize?: number
17
- poolMaxUses?: number
18
- poolIdleTimeoutMs?: number
19
- }
20
-
21
- export const jsonb = <T>(val: T) => {
22
- if (val === null) return sql<T>`null`
23
- return sql<T>`${JSON.stringify(val)}::jsonb`
24
- }
package/src/error.ts DELETED
@@ -1,12 +0,0 @@
1
- import { ErrorRequestHandler } from 'express'
2
- import { XRPCError } from '@atproto/xrpc-server'
3
- import { httpLogger as log } from './logger.js'
4
-
5
- export const handler: ErrorRequestHandler = (err, _req, res, next) => {
6
- log.error({ err }, 'unexpected internal server error')
7
- if (res.headersSent) {
8
- return next(err)
9
- }
10
- const serverError = XRPCError.fromError(err)
11
- res.status(serverError.type).json(serverError.payload)
12
- }
@@ -1,7 +0,0 @@
1
- // Invalidation is a general interface for propagating an image blob
2
- // takedown through any caches where a representation of it may be stored.
3
- // @NOTE this does not remove the blob from storage: just invalidates it from caches.
4
- // @NOTE keep in sync with same interface in aws/src/cloudfront.ts
5
- export interface ImageInvalidator {
6
- invalidate(subject: string, paths: string[]): Promise<void>
7
- }
package/src/index.ts DELETED
@@ -1,154 +0,0 @@
1
- import events from 'node:events'
2
- import http from 'node:http'
3
- import { AddressInfo } from 'node:net'
4
- import compression from 'compression'
5
- import cors from 'cors'
6
- import express from 'express'
7
- // eslint-disable-next-line import/default
8
- import httpTerminator from 'http-terminator'
9
- import { DAY, SECOND } from '@atproto/common'
10
- import API, { health, wellKnown } from './api/index.js'
11
- import { OzoneConfig, OzoneSecrets } from './config/index.js'
12
- import { AppContext, AppContextOptions } from './context.js'
13
- import { Member } from './db/schema/member.js'
14
- import * as error from './error.js'
15
- import { createServer } from './lexicon/index.js'
16
- import { dbLogger, loggerMiddleware } from './logger.js'
17
-
18
- export * from './config/index.js'
19
- export { type ImageInvalidator } from './image-invalidator.js'
20
- export { Database } from './db/index.js'
21
- export { EventPusher, EventReverser, OzoneDaemon } from './daemon/index.js'
22
- export { AppContext } from './context.js'
23
- export { httpLogger } from './logger.js'
24
-
25
- export class OzoneService {
26
- public ctx: AppContext
27
- public app: express.Application
28
- public server?: http.Server
29
- private terminator?: httpTerminator.HttpTerminator
30
- private dbStatsInterval?: NodeJS.Timeout
31
-
32
- constructor(opts: { ctx: AppContext; app: express.Application }) {
33
- this.ctx = opts.ctx
34
- this.app = opts.app
35
- }
36
-
37
- static async create(
38
- cfg: OzoneConfig,
39
- secrets: OzoneSecrets,
40
- overrides?: Partial<AppContextOptions>,
41
- ): Promise<OzoneService> {
42
- const app = express()
43
- app.set('trust proxy', true)
44
- app.use(cors({ maxAge: DAY / SECOND }))
45
- app.use(loggerMiddleware)
46
- app.use(compression())
47
-
48
- const ctx = await AppContext.fromConfig(cfg, secrets, overrides)
49
-
50
- let server = createServer({
51
- validateResponse: false,
52
- payload: {
53
- jsonLimit: 100 * 1024, // 100kb
54
- textLimit: 100 * 1024, // 100kb
55
- blobLimit: 5 * 1024 * 1024, // 5mb
56
- },
57
- })
58
-
59
- server = API(server, ctx)
60
-
61
- app.use(health.createRouter(ctx))
62
- app.use(wellKnown.createRouter(ctx))
63
- app.use(server.xrpc.router)
64
- app.use(error.handler)
65
-
66
- return new OzoneService({ ctx, app })
67
- }
68
-
69
- async seedInitialMembers() {
70
- const members: Array<{ role: Member['role']; did: string }> = []
71
- this.ctx.cfg.access.admins.forEach((did) =>
72
- members.push({
73
- role: 'tools.ozone.team.defs#roleAdmin',
74
- did,
75
- }),
76
- )
77
- this.ctx.cfg.access.triage.forEach((did) =>
78
- members.push({
79
- role: 'tools.ozone.team.defs#roleTriage',
80
- did,
81
- }),
82
- )
83
- this.ctx.cfg.access.moderators.forEach((did) =>
84
- members.push({
85
- role: 'tools.ozone.team.defs#roleModerator',
86
- did,
87
- }),
88
- )
89
-
90
- for (const member of members) {
91
- const service = this.ctx.teamService(this.ctx.db)
92
- await service.upsert({
93
- ...member,
94
- lastUpdatedBy: this.ctx.cfg.service.did,
95
- })
96
- }
97
- }
98
-
99
- async start(): Promise<http.Server> {
100
- if (this.dbStatsInterval) {
101
- throw new Error(`${this.constructor.name} already started`)
102
- }
103
-
104
- // Any moderator that are configured via env var may not exist in the database
105
- // so we need to sync them from env var to the database
106
- await this.seedInitialMembers()
107
-
108
- this.dbStatsInterval = setInterval(() => {
109
- dbLogger.info(
110
- {
111
- idleCount: this.ctx.db.pool.idleCount,
112
- totalCount: this.ctx.db.pool.totalCount,
113
- waitingCount: this.ctx.db.pool.waitingCount,
114
- },
115
- 'db pool stats',
116
- )
117
- dbLogger.info(
118
- this.ctx.backgroundQueue.getStats(),
119
- 'background queue stats',
120
- )
121
- }, 10000)
122
- await this.ctx.sequencer.start()
123
- const server = this.app.listen(this.ctx.cfg.service.port)
124
- this.server = server
125
- server.keepAliveTimeout = 90000
126
- this.terminator = httpTerminator.createHttpTerminator({ server })
127
- await events.once(server, 'listening')
128
- const { port } = server.address() as AddressInfo
129
- this.ctx.assignPort(port)
130
- return server
131
- }
132
-
133
- async destroy(): Promise<void> {
134
- clearInterval(this.dbStatsInterval)
135
- this.dbStatsInterval = undefined
136
-
137
- // @TODO Use a disposable stack when Node24 becomes the min supported version
138
- try {
139
- await this.terminator?.terminate()
140
- } finally {
141
- try {
142
- await this.ctx.backgroundQueue.destroy()
143
- } finally {
144
- try {
145
- await this.ctx.sequencer.destroy()
146
- } finally {
147
- await this.ctx.db.close()
148
- }
149
- }
150
- }
151
- }
152
- }
153
-
154
- export default OzoneService