@atproto/ozone 0.1.165 → 0.1.167

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 (65) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/api/moderation/emitEvent.d.ts.map +1 -1
  3. package/dist/api/moderation/emitEvent.js +8 -0
  4. package/dist/api/moderation/emitEvent.js.map +1 -1
  5. package/dist/api/util.d.ts +1 -1
  6. package/dist/api/util.d.ts.map +1 -1
  7. package/dist/api/util.js +1 -0
  8. package/dist/api/util.js.map +1 -1
  9. package/dist/db/schema/moderation_event.d.ts +1 -1
  10. package/dist/db/schema/moderation_event.d.ts.map +1 -1
  11. package/dist/db/schema/moderation_event.js.map +1 -1
  12. package/dist/lexicon/lexicons.d.ts +70 -6
  13. package/dist/lexicon/lexicons.d.ts.map +1 -1
  14. package/dist/lexicon/lexicons.js +35 -0
  15. package/dist/lexicon/lexicons.js.map +1 -1
  16. package/dist/lexicon/types/app/bsky/actor/getSuggestions.d.ts +3 -1
  17. package/dist/lexicon/types/app/bsky/actor/getSuggestions.d.ts.map +1 -1
  18. package/dist/lexicon/types/app/bsky/actor/getSuggestions.js.map +1 -1
  19. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.d.ts +3 -1
  20. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.d.ts.map +1 -1
  21. package/dist/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.js.map +1 -1
  22. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.d.ts +3 -1
  23. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.d.ts.map +1 -1
  24. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.js.map +1 -1
  25. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.d.ts +3 -1
  26. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.d.ts.map +1 -1
  27. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
  28. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.d.ts +3 -1
  29. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.d.ts.map +1 -1
  30. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
  31. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +10 -2
  32. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  33. package/dist/lexicon/types/tools/ozone/moderation/defs.js +9 -0
  34. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  35. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts +1 -1
  36. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.d.ts.map +1 -1
  37. package/dist/lexicon/types/tools/ozone/moderation/emitEvent.js.map +1 -1
  38. package/dist/mod-service/index.d.ts +3 -2
  39. package/dist/mod-service/index.d.ts.map +1 -1
  40. package/dist/mod-service/index.js +11 -0
  41. package/dist/mod-service/index.js.map +1 -1
  42. package/dist/mod-service/status.d.ts.map +1 -1
  43. package/dist/mod-service/status.js +7 -0
  44. package/dist/mod-service/status.js.map +1 -1
  45. package/package.json +5 -5
  46. package/src/api/moderation/emitEvent.ts +17 -1
  47. package/src/api/util.ts +1 -0
  48. package/src/db/schema/moderation_event.ts +1 -0
  49. package/src/lexicon/lexicons.ts +36 -0
  50. package/src/lexicon/types/app/bsky/actor/getSuggestions.ts +3 -1
  51. package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts +3 -1
  52. package/src/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +3 -1
  53. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +3 -1
  54. package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +3 -1
  55. package/src/lexicon/types/tools/ozone/moderation/defs.ts +19 -0
  56. package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +1 -0
  57. package/src/mod-service/index.ts +14 -0
  58. package/src/mod-service/status.ts +8 -0
  59. package/tests/__snapshots__/get-starter-pack.test.ts.snap +9 -9
  60. package/tests/__snapshots__/get-subjects.test.ts.snap +2 -2
  61. package/tests/__snapshots__/team.test.ts.snap +4 -4
  62. package/tests/__snapshots__/verification-listener.test.ts.snap +2 -2
  63. package/tests/__snapshots__/verification.test.ts.snap +3 -3
  64. package/tests/_util.ts +6 -4
  65. package/tests/age-assurance.test.ts +134 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atproto/ozone
2
2
 
3
+ ## 0.1.167
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4709](https://github.com/bluesky-social/atproto/pull/4709) [`9f9f71a`](https://github.com/bluesky-social/atproto/commit/9f9f71a6a3e58ccbd5e6d3ee079b570096cb11fa) Thanks [@foysalit](https://github.com/foysalit)! - Introduce a purge event to remove ozone's data on age assurance
8
+
9
+ - Updated dependencies [[`9f9f71a`](https://github.com/bluesky-social/atproto/commit/9f9f71a6a3e58ccbd5e6d3ee079b570096cb11fa), [`67eb0c1`](https://github.com/bluesky-social/atproto/commit/67eb0c19ac415e762e221b2ccda9f0bcf7b3dd6f)]:
10
+ - @atproto/api@0.19.4
11
+ - @atproto/syntax@0.5.1
12
+ - @atproto/xrpc-server@0.10.16
13
+
14
+ ## 0.1.166
15
+
16
+ ### Patch Changes
17
+
18
+ - [#4683](https://github.com/bluesky-social/atproto/pull/4683) [`6634140`](https://github.com/bluesky-social/atproto/commit/66341400d49d1210619b000a040852d87085c32c) Thanks [@ds-boyce](https://github.com/ds-boyce)! - Introduce recIdStr field
19
+
20
+ - Updated dependencies [[`6634140`](https://github.com/bluesky-social/atproto/commit/66341400d49d1210619b000a040852d87085c32c), [`0e5df95`](https://github.com/bluesky-social/atproto/commit/0e5df95e3a8d81931524848d301cd43d1f12fb78)]:
21
+ - @atproto/api@0.19.2
22
+
3
23
  ## 0.1.165
4
24
 
5
25
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"emitEvent.d.ts","sourceRoot":"","sources":["../../../src/api/moderation/emitEvent.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAqTtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA6CvD"}
1
+ {"version":3,"file":"emitEvent.d.ts","sourceRoot":"","sources":["../../../src/api/moderation/emitEvent.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAiUtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA6CvD"}
@@ -37,6 +37,14 @@ const handleModerationEvent = async ({ ctx, input, auth, }) => {
37
37
  throw new xrpc_server_1.AuthRequiredError('Must be a full moderator to override age assurance');
38
38
  }
39
39
  }
40
+ if ((0, defs_2.isAgeAssurancePurgeEvent)(event)) {
41
+ if (!subject.isRepo()) {
42
+ throw new xrpc_server_1.InvalidRequestError('Invalid subject type');
43
+ }
44
+ if (!auth.credentials.isModerator) {
45
+ throw new xrpc_server_1.ForbiddenError('Must be a moderator to purge age assurance events');
46
+ }
47
+ }
40
48
  if ((0, defs_2.isRevokeAccountCredentialsEvent)(event)) {
41
49
  if (!subject.isRepo()) {
42
50
  throw new xrpc_server_1.InvalidRequestError('Invalid subject type');
@@ -1 +1 @@
1
- {"version":3,"file":"emitEvent.js","sourceRoot":"","sources":["../../../src/api/moderation/emitEvent.ts"],"names":[],"mappings":"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","sourcesContent":["import { isModEventDivert } from '@atproto/api/dist/client/types/tools/ozone/moderation/defs'\nimport { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'\nimport { AdminTokenOutput, ModeratorOutput } from '../../auth-verifier'\nimport { AppContext } from '../../context'\nimport { Server } from '../../lexicon'\nimport { ids } from '../../lexicon/lexicons'\nimport {\n ModEventTag,\n isAgeAssuranceEvent,\n isAgeAssuranceOverrideEvent,\n isModEventAcknowledge,\n isModEventEmail,\n isModEventLabel,\n isModEventMuteReporter,\n isModEventReport,\n isModEventReverseTakedown,\n isModEventTag,\n isModEventTakedown,\n isModEventUnmuteReporter,\n isRevokeAccountCredentialsEvent,\n} from '../../lexicon/types/tools/ozone/moderation/defs'\nimport { HandlerInput } from '../../lexicon/types/tools/ozone/moderation/emitEvent'\nimport { httpLogger } from '../../logger'\nimport { subjectFromInput } from '../../mod-service/subject'\nimport { SettingService } from '../../setting/service'\nimport { TagService } from '../../tag-service'\nimport { getTagForReport } from '../../tag-service/util'\nimport { retryHttp } from '../../util'\nimport { getEventType } from '../util'\nimport { assertProtectedTagAction, getProtectedTags } from './util'\n\nconst handleModerationEvent = async ({\n ctx,\n input,\n auth,\n}: {\n ctx: AppContext\n input: HandlerInput\n auth: ModeratorOutput | AdminTokenOutput\n}) => {\n const access = auth.credentials\n const createdBy =\n auth.credentials.type === 'moderator'\n ? auth.credentials.iss\n : input.body.createdBy\n const db = ctx.db\n const moderationService = ctx.modService(db)\n const settingService = ctx.settingService(db)\n const { event, externalId } = input.body\n const isAcknowledgeEvent = isModEventAcknowledge(event)\n const isTakedownEvent = isModEventTakedown(event)\n const isReverseTakedownEvent = isModEventReverseTakedown(event)\n const isLabelEvent = isModEventLabel(event)\n const subject = subjectFromInput(\n input.body.subject,\n input.body.subjectBlobCids,\n )\n\n if (isAgeAssuranceEvent(event) && !subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n\n if (isAgeAssuranceOverrideEvent(event)) {\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n if (!auth.credentials.isModerator) {\n throw new AuthRequiredError(\n 'Must be a full moderator to override age assurance',\n )\n }\n }\n\n if (isRevokeAccountCredentialsEvent(event)) {\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n\n if (!auth.credentials.isAdmin) {\n throw new AuthRequiredError(\n 'Must be an admin to revoke account credentials',\n )\n }\n\n if (!ctx.pdsAgent) {\n throw new InvalidRequestError('PDS not configured')\n }\n\n await ctx.pdsAgent.com.atproto.temp.revokeAccountCredentials(\n { account: subject.did },\n await ctx.pdsAuth(ids.ComAtprotoTempRevokeAccountCredentials),\n )\n }\n\n // if less than moderator access then can only take ack and escalation actions\n if (isTakedownEvent || isReverseTakedownEvent) {\n if (!access.isModerator) {\n throw new AuthRequiredError(\n 'Must be a full moderator to take this type of action',\n )\n }\n\n // Non admins should not be able to take down feed generators\n if (\n !access.isAdmin &&\n subject.recordPath?.includes('app.bsky.feed.generator/')\n ) {\n throw new AuthRequiredError(\n 'Must be a full admin to take this type of action on feed generators',\n )\n }\n }\n // if less than moderator access then can not apply labels\n if (!access.isModerator && isLabelEvent) {\n throw new AuthRequiredError('Must be a full moderator to label content')\n }\n\n if (isLabelEvent) {\n validateLabels([\n ...(event.createLabelVals ?? []),\n ...(event.negateLabelVals ?? []),\n ])\n }\n\n const isTakedownOrReverseTakedownEvent =\n isTakedownEvent || isReverseTakedownEvent\n if (isTakedownOrReverseTakedownEvent || isLabelEvent) {\n const status = await moderationService.getStatus(subject)\n\n if (status?.takendown && isTakedownEvent) {\n throw new InvalidRequestError(`Subject is already taken down`)\n }\n\n if (!status?.takendown && isReverseTakedownEvent) {\n throw new InvalidRequestError(`Subject is not taken down`)\n }\n\n if (status?.tags?.length) {\n const protectedTags = await getProtectedTags(\n settingService,\n ctx.cfg.service.did,\n )\n\n if (protectedTags) {\n assertProtectedTagAction({\n protectedTags,\n subjectTags: status.tags,\n actionAuthor: createdBy,\n isAdmin: auth.credentials.isAdmin,\n isModerator: auth.credentials.isModerator,\n isTriage: auth.credentials.isTriage,\n })\n }\n }\n\n if (status?.takendown && isReverseTakedownEvent && subject.isRecord()) {\n // due to the way blob status is modeled, we should reverse takedown on all\n // blobs for the record being restored, which aren't taken down on another record.\n subject.blobCids = status.blobCids ?? []\n }\n }\n\n if (isModEventEmail(event) && event.content) {\n // sending email prior to logging the event to avoid a long transaction below\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Email can only be sent to a repo subject')\n }\n const { content, subjectLine } = event\n // on error, don't fail the whole event. instead, log the event data with isDelivered false\n try {\n await retryHttp(() =>\n ctx.modService(db).sendEmail({\n subject: subjectLine,\n content,\n recipientDid: subject.did,\n }),\n )\n event.isDelivered = true\n } catch (err) {\n event.isDelivered = false\n httpLogger.error({ err, event }, 'failed to send mod event email')\n }\n }\n\n if (isModEventDivert(event) && subject.isRecord()) {\n if (!ctx.blobDiverter) {\n throw new InvalidRequestError(\n 'BlobDiverter not configured for this service',\n )\n }\n await ctx.blobDiverter.uploadBlobOnService(subject.info())\n }\n\n if (\n (isModEventMuteReporter(event) || isModEventUnmuteReporter(event)) &&\n !subject.isRepo()\n ) {\n throw new InvalidRequestError('Subject must be a repo when muting reporter')\n }\n\n if (isModEventTag(event)) {\n await assertTagAuth(settingService, ctx.cfg.service.did, event, auth)\n }\n\n if (isModEventReport(event)) {\n await ctx.moderationServiceProfile().validateReasonType(event.reportType)\n }\n\n const moderationEvent = await db.transaction(async (dbTxn) => {\n const moderationTxn = ctx.modService(dbTxn)\n\n if (externalId) {\n const existingEvent = await moderationTxn.getEventByExternalId(\n getEventType(event.$type),\n externalId,\n subject,\n )\n\n if (existingEvent) {\n throw new InvalidRequestError(\n `An event with the same external ID already exists for the subject.`,\n 'DuplicateExternalId',\n )\n }\n }\n\n const result = await moderationTxn.logEvent({\n event,\n subject,\n createdBy,\n modTool: input.body.modTool,\n externalId,\n })\n\n const tagService = new TagService(\n subject,\n result.subjectStatus,\n ctx.cfg.service.did,\n moderationTxn,\n )\n\n const initialTags = isModEventReport(event)\n ? [getTagForReport(event.reportType)]\n : undefined\n await tagService.evaluateForSubject(initialTags)\n\n if (subject.isRepo()) {\n if (isTakedownEvent) {\n const isSuspend = !!result.event.durationInHours\n await moderationTxn.takedownRepo(\n subject,\n result.event.id,\n new Set(\n result.event.meta?.targetServices\n ? `${result.event.meta.targetServices}`.split(',')\n : undefined,\n ),\n isSuspend,\n )\n } else if (isReverseTakedownEvent) {\n await moderationTxn.reverseTakedownRepo(subject)\n }\n }\n\n if (subject.isRecord()) {\n if (isTakedownEvent) {\n await moderationTxn.takedownRecord(\n subject,\n result.event.id,\n new Set(\n result.event.meta?.targetServices\n ? `${result.event.meta.targetServices}`.split(',')\n : undefined,\n ),\n )\n } else if (isReverseTakedownEvent) {\n await moderationTxn.reverseTakedownRecord(subject)\n }\n }\n\n if (\n (isTakedownEvent || isAcknowledgeEvent) &&\n result.event.meta?.acknowledgeAccountSubjects\n ) {\n await moderationTxn.resolveSubjectsForAccount(\n subject.did,\n createdBy,\n result.event,\n )\n }\n\n if (isLabelEvent) {\n await moderationTxn.formatAndCreateLabels(\n result.event.subjectUri ?? result.event.subjectDid,\n result.event.subjectCid,\n {\n create: result.event.createLabelVals?.length\n ? result.event.createLabelVals.split(' ')\n : undefined,\n negate: result.event.negateLabelVals?.length\n ? result.event.negateLabelVals.split(' ')\n : undefined,\n },\n result.event.durationInHours ?? undefined,\n )\n }\n\n return result.event\n })\n\n return moderationService.views.formatEvent(moderationEvent)\n}\n\nexport default function (server: Server, ctx: AppContext) {\n server.tools.ozone.moderation.emitEvent({\n auth: ctx.authVerifier.modOrAdminToken,\n handler: async ({ input, auth }) => {\n try {\n const moderationEvent = await handleModerationEvent({\n input,\n auth,\n ctx,\n })\n\n // On divert events, we need to automatically take down the blobs\n if (isModEventDivert(input.body.event)) {\n await handleModerationEvent({\n auth,\n ctx,\n input: {\n ...input,\n body: {\n ...input.body,\n event: {\n ...input.body.event,\n $type: 'tools.ozone.moderation.defs#modEventTakedown',\n comment:\n '[DIVERT_SIDE_EFFECT]: Automatically taking down after divert event',\n },\n modTool: input.body.modTool,\n },\n },\n })\n }\n\n return {\n encoding: 'application/json',\n body: moderationEvent,\n }\n } catch (err) {\n httpLogger.error(\n { err, body: input.body },\n 'failed to emit moderation event',\n )\n throw err\n }\n },\n })\n}\n\nconst assertTagAuth = async (\n settingService: SettingService,\n serviceDid: string,\n event: ModEventTag,\n auth: ModeratorOutput | AdminTokenOutput,\n) => {\n // admins can add/remove any tag\n if (auth.credentials.isAdmin) return\n\n const protectedTags = await getProtectedTags(settingService, serviceDid)\n\n if (!protectedTags) {\n return\n }\n\n for (const tag of Object.keys(protectedTags)) {\n if (event.add.includes(tag) || event.remove.includes(tag)) {\n // if specific moderators are configured to manage this tag but the current user\n // is not one of them, then throw an error\n const configuredModerators = protectedTags[tag]?.['moderators']\n if (\n configuredModerators &&\n !configuredModerators.includes(auth.credentials.iss)\n ) {\n throw new InvalidRequestError(`Not allowed to manage tag: ${tag}`)\n }\n\n const configuredRoles = protectedTags[tag]?.['roles']\n if (configuredRoles) {\n // admins can already do everything so we only check for moderator and triage role config\n if (\n auth.credentials.isModerator &&\n !configuredRoles.includes('tools.ozone.team.defs#roleModerator')\n ) {\n throw new InvalidRequestError(\n `Can not manage tag ${tag} with moderator role`,\n )\n } else if (\n auth.credentials.isTriage &&\n !configuredRoles.includes('tools.ozone.team.defs#roleTriage')\n ) {\n throw new InvalidRequestError(\n `Can not manage tag ${tag} with triage role`,\n )\n }\n }\n }\n }\n}\n\nconst validateLabels = (labels: string[]) => {\n for (const label of labels) {\n for (const char of badChars) {\n if (label.includes(char)) {\n throw new InvalidRequestError(`Invalid label: ${label}`)\n }\n }\n }\n}\n\nconst badChars = [' ', ',', ';', `'`, `\"`]\n"]}
1
+ {"version":3,"file":"emitEvent.js","sourceRoot":"","sources":["../../../src/api/moderation/emitEvent.ts"],"names":[],"mappings":"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","sourcesContent":["import { isModEventDivert } from '@atproto/api/dist/client/types/tools/ozone/moderation/defs'\nimport {\n AuthRequiredError,\n ForbiddenError,\n InvalidRequestError,\n} from '@atproto/xrpc-server'\nimport { AdminTokenOutput, ModeratorOutput } from '../../auth-verifier'\nimport { AppContext } from '../../context'\nimport { Server } from '../../lexicon'\nimport { ids } from '../../lexicon/lexicons'\nimport {\n ModEventTag,\n isAgeAssuranceEvent,\n isAgeAssuranceOverrideEvent,\n isAgeAssurancePurgeEvent,\n isModEventAcknowledge,\n isModEventEmail,\n isModEventLabel,\n isModEventMuteReporter,\n isModEventReport,\n isModEventReverseTakedown,\n isModEventTag,\n isModEventTakedown,\n isModEventUnmuteReporter,\n isRevokeAccountCredentialsEvent,\n} from '../../lexicon/types/tools/ozone/moderation/defs'\nimport { HandlerInput } from '../../lexicon/types/tools/ozone/moderation/emitEvent'\nimport { httpLogger } from '../../logger'\nimport { subjectFromInput } from '../../mod-service/subject'\nimport { SettingService } from '../../setting/service'\nimport { TagService } from '../../tag-service'\nimport { getTagForReport } from '../../tag-service/util'\nimport { retryHttp } from '../../util'\nimport { getEventType } from '../util'\nimport { assertProtectedTagAction, getProtectedTags } from './util'\n\nconst handleModerationEvent = async ({\n ctx,\n input,\n auth,\n}: {\n ctx: AppContext\n input: HandlerInput\n auth: ModeratorOutput | AdminTokenOutput\n}) => {\n const access = auth.credentials\n const createdBy =\n auth.credentials.type === 'moderator'\n ? auth.credentials.iss\n : input.body.createdBy\n const db = ctx.db\n const moderationService = ctx.modService(db)\n const settingService = ctx.settingService(db)\n const { event, externalId } = input.body\n const isAcknowledgeEvent = isModEventAcknowledge(event)\n const isTakedownEvent = isModEventTakedown(event)\n const isReverseTakedownEvent = isModEventReverseTakedown(event)\n const isLabelEvent = isModEventLabel(event)\n const subject = subjectFromInput(\n input.body.subject,\n input.body.subjectBlobCids,\n )\n\n if (isAgeAssuranceEvent(event) && !subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n\n if (isAgeAssuranceOverrideEvent(event)) {\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n if (!auth.credentials.isModerator) {\n throw new AuthRequiredError(\n 'Must be a full moderator to override age assurance',\n )\n }\n }\n\n if (isAgeAssurancePurgeEvent(event)) {\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n if (!auth.credentials.isModerator) {\n throw new ForbiddenError(\n 'Must be a moderator to purge age assurance events',\n )\n }\n }\n\n if (isRevokeAccountCredentialsEvent(event)) {\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Invalid subject type')\n }\n\n if (!auth.credentials.isAdmin) {\n throw new AuthRequiredError(\n 'Must be an admin to revoke account credentials',\n )\n }\n\n if (!ctx.pdsAgent) {\n throw new InvalidRequestError('PDS not configured')\n }\n\n await ctx.pdsAgent.com.atproto.temp.revokeAccountCredentials(\n { account: subject.did },\n await ctx.pdsAuth(ids.ComAtprotoTempRevokeAccountCredentials),\n )\n }\n\n // if less than moderator access then can only take ack and escalation actions\n if (isTakedownEvent || isReverseTakedownEvent) {\n if (!access.isModerator) {\n throw new AuthRequiredError(\n 'Must be a full moderator to take this type of action',\n )\n }\n\n // Non admins should not be able to take down feed generators\n if (\n !access.isAdmin &&\n subject.recordPath?.includes('app.bsky.feed.generator/')\n ) {\n throw new AuthRequiredError(\n 'Must be a full admin to take this type of action on feed generators',\n )\n }\n }\n // if less than moderator access then can not apply labels\n if (!access.isModerator && isLabelEvent) {\n throw new AuthRequiredError('Must be a full moderator to label content')\n }\n\n if (isLabelEvent) {\n validateLabels([\n ...(event.createLabelVals ?? []),\n ...(event.negateLabelVals ?? []),\n ])\n }\n\n const isTakedownOrReverseTakedownEvent =\n isTakedownEvent || isReverseTakedownEvent\n if (isTakedownOrReverseTakedownEvent || isLabelEvent) {\n const status = await moderationService.getStatus(subject)\n\n if (status?.takendown && isTakedownEvent) {\n throw new InvalidRequestError(`Subject is already taken down`)\n }\n\n if (!status?.takendown && isReverseTakedownEvent) {\n throw new InvalidRequestError(`Subject is not taken down`)\n }\n\n if (status?.tags?.length) {\n const protectedTags = await getProtectedTags(\n settingService,\n ctx.cfg.service.did,\n )\n\n if (protectedTags) {\n assertProtectedTagAction({\n protectedTags,\n subjectTags: status.tags,\n actionAuthor: createdBy,\n isAdmin: auth.credentials.isAdmin,\n isModerator: auth.credentials.isModerator,\n isTriage: auth.credentials.isTriage,\n })\n }\n }\n\n if (status?.takendown && isReverseTakedownEvent && subject.isRecord()) {\n // due to the way blob status is modeled, we should reverse takedown on all\n // blobs for the record being restored, which aren't taken down on another record.\n subject.blobCids = status.blobCids ?? []\n }\n }\n\n if (isModEventEmail(event) && event.content) {\n // sending email prior to logging the event to avoid a long transaction below\n if (!subject.isRepo()) {\n throw new InvalidRequestError('Email can only be sent to a repo subject')\n }\n const { content, subjectLine } = event\n // on error, don't fail the whole event. instead, log the event data with isDelivered false\n try {\n await retryHttp(() =>\n ctx.modService(db).sendEmail({\n subject: subjectLine,\n content,\n recipientDid: subject.did,\n }),\n )\n event.isDelivered = true\n } catch (err) {\n event.isDelivered = false\n httpLogger.error({ err, event }, 'failed to send mod event email')\n }\n }\n\n if (isModEventDivert(event) && subject.isRecord()) {\n if (!ctx.blobDiverter) {\n throw new InvalidRequestError(\n 'BlobDiverter not configured for this service',\n )\n }\n await ctx.blobDiverter.uploadBlobOnService(subject.info())\n }\n\n if (\n (isModEventMuteReporter(event) || isModEventUnmuteReporter(event)) &&\n !subject.isRepo()\n ) {\n throw new InvalidRequestError('Subject must be a repo when muting reporter')\n }\n\n if (isModEventTag(event)) {\n await assertTagAuth(settingService, ctx.cfg.service.did, event, auth)\n }\n\n if (isModEventReport(event)) {\n await ctx.moderationServiceProfile().validateReasonType(event.reportType)\n }\n\n const moderationEvent = await db.transaction(async (dbTxn) => {\n const moderationTxn = ctx.modService(dbTxn)\n\n if (externalId) {\n const existingEvent = await moderationTxn.getEventByExternalId(\n getEventType(event.$type),\n externalId,\n subject,\n )\n\n if (existingEvent) {\n throw new InvalidRequestError(\n `An event with the same external ID already exists for the subject.`,\n 'DuplicateExternalId',\n )\n }\n }\n\n const result = await moderationTxn.logEvent({\n event,\n subject,\n createdBy,\n modTool: input.body.modTool,\n externalId,\n })\n\n const tagService = new TagService(\n subject,\n result.subjectStatus,\n ctx.cfg.service.did,\n moderationTxn,\n )\n\n const initialTags = isModEventReport(event)\n ? [getTagForReport(event.reportType)]\n : undefined\n await tagService.evaluateForSubject(initialTags)\n\n if (subject.isRepo()) {\n if (isTakedownEvent) {\n const isSuspend = !!result.event.durationInHours\n await moderationTxn.takedownRepo(\n subject,\n result.event.id,\n new Set(\n result.event.meta?.targetServices\n ? `${result.event.meta.targetServices}`.split(',')\n : undefined,\n ),\n isSuspend,\n )\n } else if (isReverseTakedownEvent) {\n await moderationTxn.reverseTakedownRepo(subject)\n }\n }\n\n if (subject.isRecord()) {\n if (isTakedownEvent) {\n await moderationTxn.takedownRecord(\n subject,\n result.event.id,\n new Set(\n result.event.meta?.targetServices\n ? `${result.event.meta.targetServices}`.split(',')\n : undefined,\n ),\n )\n } else if (isReverseTakedownEvent) {\n await moderationTxn.reverseTakedownRecord(subject)\n }\n }\n\n if (\n (isTakedownEvent || isAcknowledgeEvent) &&\n result.event.meta?.acknowledgeAccountSubjects\n ) {\n await moderationTxn.resolveSubjectsForAccount(\n subject.did,\n createdBy,\n result.event,\n )\n }\n\n if (isLabelEvent) {\n await moderationTxn.formatAndCreateLabels(\n result.event.subjectUri ?? result.event.subjectDid,\n result.event.subjectCid,\n {\n create: result.event.createLabelVals?.length\n ? result.event.createLabelVals.split(' ')\n : undefined,\n negate: result.event.negateLabelVals?.length\n ? result.event.negateLabelVals.split(' ')\n : undefined,\n },\n result.event.durationInHours ?? undefined,\n )\n }\n\n return result.event\n })\n\n return moderationService.views.formatEvent(moderationEvent)\n}\n\nexport default function (server: Server, ctx: AppContext) {\n server.tools.ozone.moderation.emitEvent({\n auth: ctx.authVerifier.modOrAdminToken,\n handler: async ({ input, auth }) => {\n try {\n const moderationEvent = await handleModerationEvent({\n input,\n auth,\n ctx,\n })\n\n // On divert events, we need to automatically take down the blobs\n if (isModEventDivert(input.body.event)) {\n await handleModerationEvent({\n auth,\n ctx,\n input: {\n ...input,\n body: {\n ...input.body,\n event: {\n ...input.body.event,\n $type: 'tools.ozone.moderation.defs#modEventTakedown',\n comment:\n '[DIVERT_SIDE_EFFECT]: Automatically taking down after divert event',\n },\n modTool: input.body.modTool,\n },\n },\n })\n }\n\n return {\n encoding: 'application/json',\n body: moderationEvent,\n }\n } catch (err) {\n httpLogger.error(\n { err, body: input.body },\n 'failed to emit moderation event',\n )\n throw err\n }\n },\n })\n}\n\nconst assertTagAuth = async (\n settingService: SettingService,\n serviceDid: string,\n event: ModEventTag,\n auth: ModeratorOutput | AdminTokenOutput,\n) => {\n // admins can add/remove any tag\n if (auth.credentials.isAdmin) return\n\n const protectedTags = await getProtectedTags(settingService, serviceDid)\n\n if (!protectedTags) {\n return\n }\n\n for (const tag of Object.keys(protectedTags)) {\n if (event.add.includes(tag) || event.remove.includes(tag)) {\n // if specific moderators are configured to manage this tag but the current user\n // is not one of them, then throw an error\n const configuredModerators = protectedTags[tag]?.['moderators']\n if (\n configuredModerators &&\n !configuredModerators.includes(auth.credentials.iss)\n ) {\n throw new InvalidRequestError(`Not allowed to manage tag: ${tag}`)\n }\n\n const configuredRoles = protectedTags[tag]?.['roles']\n if (configuredRoles) {\n // admins can already do everything so we only check for moderator and triage role config\n if (\n auth.credentials.isModerator &&\n !configuredRoles.includes('tools.ozone.team.defs#roleModerator')\n ) {\n throw new InvalidRequestError(\n `Can not manage tag ${tag} with moderator role`,\n )\n } else if (\n auth.credentials.isTriage &&\n !configuredRoles.includes('tools.ozone.team.defs#roleTriage')\n ) {\n throw new InvalidRequestError(\n `Can not manage tag ${tag} with triage role`,\n )\n }\n }\n }\n }\n}\n\nconst validateLabels = (labels: string[]) => {\n for (const label of labels) {\n for (const char of badChars) {\n if (label.includes(char)) {\n throw new InvalidRequestError(`Invalid label: ${label}`)\n }\n }\n }\n}\n\nconst badChars = [' ', ',', ';', `'`, `\"`]\n"]}
@@ -4,7 +4,7 @@ import { RepoView, RepoViewDetail } from '../lexicon/types/tools/ozone/moderatio
4
4
  export declare const getPdsAccountInfos: (ctx: AppContext, dids: string[]) => Promise<Map<string, AccountView | null>>;
5
5
  export declare const addAccountInfoToRepoViewDetail: (repoView: RepoView | RepoViewDetail, accountInfo: AccountView | null, includeEmail?: boolean) => RepoViewDetail;
6
6
  export declare const addAccountInfoToRepoView: (repoView: RepoView, accountInfo: AccountView | null, includeEmail?: boolean) => RepoView;
7
- export declare const getEventType: (type: string) => "tools.ozone.moderation.defs#modEventTakedown" | "tools.ozone.moderation.defs#modEventReverseTakedown" | "tools.ozone.moderation.defs#modEventComment" | "tools.ozone.moderation.defs#modEventReport" | "tools.ozone.moderation.defs#modEventLabel" | "tools.ozone.moderation.defs#modEventAcknowledge" | "tools.ozone.moderation.defs#modEventEscalate" | "tools.ozone.moderation.defs#modEventMute" | "tools.ozone.moderation.defs#modEventUnmute" | "tools.ozone.moderation.defs#modEventMuteReporter" | "tools.ozone.moderation.defs#modEventUnmuteReporter" | "tools.ozone.moderation.defs#modEventEmail" | "tools.ozone.moderation.defs#modEventResolveAppeal" | "tools.ozone.moderation.defs#modEventTag" | "tools.ozone.moderation.defs#accountEvent" | "tools.ozone.moderation.defs#identityEvent" | "tools.ozone.moderation.defs#recordEvent" | "tools.ozone.moderation.defs#modEventPriorityScore" | "tools.ozone.moderation.defs#revokeAccountCredentialsEvent" | "tools.ozone.moderation.defs#ageAssuranceEvent" | "tools.ozone.moderation.defs#ageAssuranceOverrideEvent";
7
+ export declare const getEventType: (type: string) => "tools.ozone.moderation.defs#modEventTakedown" | "tools.ozone.moderation.defs#modEventReverseTakedown" | "tools.ozone.moderation.defs#modEventComment" | "tools.ozone.moderation.defs#modEventReport" | "tools.ozone.moderation.defs#modEventLabel" | "tools.ozone.moderation.defs#modEventAcknowledge" | "tools.ozone.moderation.defs#modEventEscalate" | "tools.ozone.moderation.defs#modEventMute" | "tools.ozone.moderation.defs#modEventUnmute" | "tools.ozone.moderation.defs#modEventMuteReporter" | "tools.ozone.moderation.defs#modEventUnmuteReporter" | "tools.ozone.moderation.defs#modEventEmail" | "tools.ozone.moderation.defs#modEventResolveAppeal" | "tools.ozone.moderation.defs#modEventTag" | "tools.ozone.moderation.defs#accountEvent" | "tools.ozone.moderation.defs#identityEvent" | "tools.ozone.moderation.defs#recordEvent" | "tools.ozone.moderation.defs#modEventPriorityScore" | "tools.ozone.moderation.defs#revokeAccountCredentialsEvent" | "tools.ozone.moderation.defs#ageAssuranceEvent" | "tools.ozone.moderation.defs#ageAssuranceOverrideEvent" | "tools.ozone.moderation.defs#ageAssurancePurgeEvent";
8
8
  export declare const getReviewState: (reviewState?: string) => "tools.ozone.moderation.defs#reviewOpen" | "tools.ozone.moderation.defs#reviewEscalated" | "tools.ozone.moderation.defs#reviewClosed" | "tools.ozone.moderation.defs#reviewNone" | undefined;
9
9
  export declare const getMemberRole: (role: string) => "tools.ozone.team.defs#roleAdmin" | "tools.ozone.team.defs#roleModerator" | "tools.ozone.team.defs#roleTriage" | "tools.ozone.team.defs#roleVerifier";
10
10
  export declare const OZONE_APPEAL_REASON_TYPE = "tools.ozone.report.defs#reasonAppeal";
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAErE,OAAO,EAKL,QAAQ,EACR,cAAc,EACf,MAAM,8CAA8C,CAAA;AASrD,eAAO,MAAM,kBAAkB,GAC7B,KAAK,UAAU,EACf,MAAM,MAAM,EAAE,KACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAkBzC,CAAA;AAUD,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,GAAG,cAAc,EACnC,aAAa,WAAW,GAAG,IAAI,EAC/B,sBAAoB,KACnB,cAsCF,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,UAAU,QAAQ,EAClB,aAAa,WAAW,GAAG,IAAI,EAC/B,sBAAoB,KACnB,QAWF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,4hCAKxC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,cAAc,MAAM,iMAMlD,CAAA;AAoCD,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,0JAKzC,CAAA;AASD,eAAO,MAAM,wBAAwB,yCAAyC,CAAA;AAE9E,eAAO,MAAM,cAAc,GAAI,aAAa,MAAM,KAAG,OAEpD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,mBAKpD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,kBAKlD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,kBAKlD,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,WAAW,MAAM,KAAG,iBAKxD,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAA;AACvE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAA;AAClD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAA;AAC/D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;AAOtE,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,mBAKvD,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,KACb,qBAKF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAA;AAC5C,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,UAAU,GACV,WAAW,GACX,QAAQ,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAErE,OAAO,EAKL,QAAQ,EACR,cAAc,EACf,MAAM,8CAA8C,CAAA;AASrD,eAAO,MAAM,kBAAkB,GAC7B,KAAK,UAAU,EACf,MAAM,MAAM,EAAE,KACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAkBzC,CAAA;AAUD,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,GAAG,cAAc,EACnC,aAAa,WAAW,GAAG,IAAI,EAC/B,sBAAoB,KACnB,cAsCF,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,UAAU,QAAQ,EAClB,aAAa,WAAW,GAAG,IAAI,EAC/B,sBAAoB,KACnB,QAWF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,mlCAKxC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,cAAc,MAAM,iMAMlD,CAAA;AAqCD,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,0JAKzC,CAAA;AASD,eAAO,MAAM,wBAAwB,yCAAyC,CAAA;AAE9E,eAAO,MAAM,cAAc,GAAI,aAAa,MAAM,KAAG,OAEpD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,mBAKpD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,kBAKlD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,kBAKlD,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,WAAW,MAAM,KAAG,iBAKxD,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAA;AACvE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAA;AAClD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAA;AAC/D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;AAOtE,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,mBAKvD,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,KACb,qBAKF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAA;AAC5C,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,UAAU,GACV,WAAW,GACX,QAAQ,CAAA"}
package/dist/api/util.js CHANGED
@@ -116,6 +116,7 @@ const eventTypes = new Set([
116
116
  'tools.ozone.moderation.defs#modEventPriorityScore',
117
117
  'tools.ozone.moderation.defs#ageAssuranceEvent',
118
118
  'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',
119
+ 'tools.ozone.moderation.defs#ageAssurancePurgeEvent',
119
120
  'tools.ozone.moderation.defs#revokeAccountCredentialsEvent',
120
121
  'tools.ozone.moderation.defs#scheduleTakedownEvent',
121
122
  'tools.ozone.moderation.defs#cancelScheduledTakedownEvent',
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AppContext } from '../context'\nimport { Member } from '../db/schema/member'\nimport { ModerationEvent } from '../db/schema/moderation_event'\nimport { ids } from '../lexicon/lexicons'\nimport { AccountView } from '../lexicon/types/com/atproto/admin/defs'\nimport { REASONAPPEAL } from '../lexicon/types/com/atproto/moderation/defs'\nimport {\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWNONE,\n REVIEWOPEN,\n RepoView,\n RepoViewDetail,\n} from '../lexicon/types/tools/ozone/moderation/defs'\nimport {\n ROLEADMIN,\n ROLEMODERATOR,\n ROLETRIAGE,\n ROLEVERIFIER,\n} from '../lexicon/types/tools/ozone/team/defs'\nimport { ModerationSubjectStatusRow } from '../mod-service/types'\n\nexport const getPdsAccountInfos = async (\n ctx: AppContext,\n dids: string[],\n): Promise<Map<string, AccountView | null>> => {\n const results = new Map<string, AccountView | null>()\n\n const agent = ctx.pdsAgent\n if (!agent || !dids.length) return results\n\n const auth = await ctx.pdsAuth(ids.ComAtprotoAdminGetAccountInfos)\n if (!auth) return results\n\n try {\n const res = await agent.com.atproto.admin.getAccountInfos({ dids }, auth)\n res.data.infos.forEach((info) => {\n results.set(info.did, info)\n })\n return results\n } catch {\n return results\n }\n}\n\nfunction un$type<T extends object>(obj: T): Omit<T, '$type'> {\n if ('$type' in obj) {\n const { $type: _, ...rest } = obj\n return rest\n }\n return obj\n}\n\nexport const addAccountInfoToRepoViewDetail = (\n repoView: RepoView | RepoViewDetail,\n accountInfo: AccountView | null,\n includeEmail = false,\n): RepoViewDetail => {\n if (!accountInfo) {\n return un$type({\n ...repoView,\n moderation: un$type(repoView.moderation),\n })\n }\n\n const {\n email,\n deactivatedAt,\n emailConfirmedAt,\n inviteNote,\n invitedBy,\n invites,\n invitesDisabled,\n threatSignatures,\n // pick some duplicate/unwanted details out\n $type: _accountType,\n did: _did,\n handle: _handle,\n indexedAt: _indexedAt,\n relatedRecords: _relatedRecords,\n ...otherAccountInfo\n } = accountInfo\n return {\n ...otherAccountInfo,\n ...un$type(repoView),\n moderation: un$type(repoView.moderation),\n email: includeEmail ? email : undefined,\n invitedBy,\n invitesDisabled,\n inviteNote,\n invites,\n emailConfirmedAt,\n deactivatedAt,\n threatSignatures,\n }\n}\n\nexport const addAccountInfoToRepoView = (\n repoView: RepoView,\n accountInfo: AccountView | null,\n includeEmail = false,\n): RepoView => {\n if (!accountInfo) return repoView\n return {\n ...repoView,\n email: includeEmail ? accountInfo.email : undefined,\n invitedBy: accountInfo.invitedBy,\n invitesDisabled: accountInfo.invitesDisabled,\n inviteNote: accountInfo.inviteNote,\n deactivatedAt: accountInfo.deactivatedAt,\n threatSignatures: accountInfo.threatSignatures,\n }\n}\n\nexport const getEventType = (type: string) => {\n if (eventTypes.has(type)) {\n return type as ModerationEvent['action']\n }\n throw new InvalidRequestError('Invalid event type')\n}\n\nexport const getReviewState = (reviewState?: string) => {\n if (!reviewState) return undefined\n if (reviewStates.has(reviewState)) {\n return reviewState as ModerationSubjectStatusRow['reviewState']\n }\n throw new InvalidRequestError('Invalid review state')\n}\n\nconst reviewStates = new Set([\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWOPEN,\n REVIEWNONE,\n])\n\nconst eventTypes = new Set([\n 'tools.ozone.moderation.defs#modEventTakedown',\n 'tools.ozone.moderation.defs#modEventAcknowledge',\n 'tools.ozone.moderation.defs#modEventEscalate',\n 'tools.ozone.moderation.defs#modEventComment',\n 'tools.ozone.moderation.defs#modEventLabel',\n 'tools.ozone.moderation.defs#modEventReport',\n 'tools.ozone.moderation.defs#modEventMute',\n 'tools.ozone.moderation.defs#modEventUnmute',\n 'tools.ozone.moderation.defs#modEventMuteReporter',\n 'tools.ozone.moderation.defs#modEventUnmuteReporter',\n 'tools.ozone.moderation.defs#modEventReverseTakedown',\n 'tools.ozone.moderation.defs#modEventEmail',\n 'tools.ozone.moderation.defs#modEventResolveAppeal',\n 'tools.ozone.moderation.defs#modEventTag',\n 'tools.ozone.moderation.defs#modEventDivert',\n 'tools.ozone.moderation.defs#accountEvent',\n 'tools.ozone.moderation.defs#identityEvent',\n 'tools.ozone.moderation.defs#recordEvent',\n 'tools.ozone.moderation.defs#modEventPriorityScore',\n 'tools.ozone.moderation.defs#ageAssuranceEvent',\n 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',\n 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent',\n 'tools.ozone.moderation.defs#scheduleTakedownEvent',\n 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent',\n])\n\nexport const getMemberRole = (role: string) => {\n if (memberRoles.has(role)) {\n return role as Member['role']\n }\n throw new InvalidRequestError('Invalid member role')\n}\n\nconst memberRoles = new Set([\n ROLEADMIN,\n ROLEMODERATOR,\n ROLETRIAGE,\n ROLEVERIFIER,\n])\n\nexport const OZONE_APPEAL_REASON_TYPE = 'tools.ozone.report.defs#reasonAppeal'\nconst APPEAL_REASON_TYPES = [REASONAPPEAL, OZONE_APPEAL_REASON_TYPE]\nexport const isAppealReport = (reasonType?: string): boolean => {\n return !!reasonType && APPEAL_REASON_TYPES.includes(reasonType)\n}\n\nexport const getSafelinkPattern = (pattern: string): SafelinkPatternType => {\n if (safelinkPatterns.has(pattern)) {\n return pattern as SafelinkPatternType\n }\n throw new InvalidRequestError('Invalid safelink pattern type')\n}\n\nexport const getSafelinkAction = (action: string): SafelinkActionType => {\n if (safelinkActions.has(action)) {\n return action as SafelinkActionType\n }\n throw new InvalidRequestError('Invalid safelink action type')\n}\n\nexport const getSafelinkReason = (reason: string): SafelinkReasonType => {\n if (safelinkReasons.has(reason)) {\n return reason as SafelinkReasonType\n }\n throw new InvalidRequestError('Invalid safelink reason type')\n}\n\nexport const getSafelinkEventType = (eventType: string): SafelinkEventType => {\n if (safelinkEventTypes.has(eventType)) {\n return eventType as SafelinkEventType\n }\n throw new InvalidRequestError('Invalid safelink event type')\n}\n\nexport type SafelinkEventType = 'addRule' | 'updateRule' | 'removeRule'\nexport type SafelinkPatternType = 'domain' | 'url'\nexport type SafelinkActionType = 'block' | 'warn' | 'whitelist'\nexport type SafelinkReasonType = 'csam' | 'spam' | 'phishing' | 'none'\n\nconst safelinkPatterns = new Set(['domain', 'url'])\nconst safelinkActions = new Set(['block', 'warn', 'whitelist'])\nconst safelinkReasons = new Set(['csam', 'spam', 'phishing', 'none'])\nconst safelinkEventTypes = new Set(['addRule', 'updateRule', 'removeRule'])\n\nexport const getScheduledActionType = (action: string): ScheduledActionType => {\n if (scheduledActionTypes.has(action)) {\n return action as ScheduledActionType\n }\n throw new InvalidRequestError('Invalid scheduled action type')\n}\n\nexport const getScheduledActionStatus = (\n status: string,\n): ScheduledActionStatus => {\n if (scheduledActionStatuses.has(status)) {\n return status as ScheduledActionStatus\n }\n throw new InvalidRequestError('Invalid scheduled action status')\n}\n\nexport type ScheduledActionType = 'takedown'\nexport type ScheduledActionStatus =\n | 'pending'\n | 'executed'\n | 'cancelled'\n | 'failed'\n\nconst scheduledActionTypes = new Set(['takedown'])\nconst scheduledActionStatuses = new Set([\n 'pending',\n 'executed',\n 'cancelled',\n 'failed',\n])\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/api/util.ts"],"names":[],"mappings":";;;AAAA,sDAA0D;AAI1D,kDAAyC;AAEzC,uEAA2E;AAC3E,uEAOqD;AACrD,iEAK+C;AAGxC,MAAM,kBAAkB,GAAG,KAAK,EACrC,GAAe,EACf,IAAc,EAC4B,EAAE;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAA;IAErD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAE1C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,cAAG,CAAC,8BAA8B,CAAC,CAAA;IAClE,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAA;IAEzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;QACzE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC7B,CAAC,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC,CAAA;AArBY,QAAA,kBAAkB,sBAqB9B;AAED,SAAS,OAAO,CAAmB,GAAM;IACvC,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAA;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAEM,MAAM,8BAA8B,GAAG,CAC5C,QAAmC,EACnC,WAA+B,EAC/B,YAAY,GAAG,KAAK,EACJ,EAAE;IAClB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC;YACb,GAAG,QAAQ;YACX,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;SACzC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,EACJ,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,OAAO,EACP,eAAe,EACf,gBAAgB;IAChB,2CAA2C;IAC3C,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,UAAU,EACrB,cAAc,EAAE,eAAe,EAC/B,GAAG,gBAAgB,EACpB,GAAG,WAAW,CAAA;IACf,OAAO;QACL,GAAG,gBAAgB;QACnB,GAAG,OAAO,CAAC,QAAQ,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACvC,SAAS;QACT,eAAe;QACf,UAAU;QACV,OAAO;QACP,gBAAgB;QAChB,aAAa;QACb,gBAAgB;KACjB,CAAA;AACH,CAAC,CAAA;AA1CY,QAAA,8BAA8B,kCA0C1C;AAEM,MAAM,wBAAwB,GAAG,CACtC,QAAkB,EAClB,WAA+B,EAC/B,YAAY,GAAG,KAAK,EACV,EAAE;IACZ,IAAI,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAA;IACjC,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACnD,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,eAAe,EAAE,WAAW,CAAC,eAAe;QAC5C,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;KAC/C,CAAA;AACH,CAAC,CAAA;AAfY,QAAA,wBAAwB,4BAepC;AAEM,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;IAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAiC,CAAA;IAC1C,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,oBAAoB,CAAC,CAAA;AACrD,CAAC,CAAA;AALY,QAAA,YAAY,gBAKxB;AAEM,MAAM,cAAc,GAAG,CAAC,WAAoB,EAAE,EAAE;IACrD,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAA;IAClC,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,WAAwD,CAAA;IACjE,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,sBAAsB,CAAC,CAAA;AACvD,CAAC,CAAA;AANY,QAAA,cAAc,kBAM1B;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,mBAAY;IACZ,sBAAe;IACf,iBAAU;IACV,iBAAU;CACX,CAAC,CAAA;AAEF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,8CAA8C;IAC9C,iDAAiD;IACjD,8CAA8C;IAC9C,6CAA6C;IAC7C,2CAA2C;IAC3C,4CAA4C;IAC5C,0CAA0C;IAC1C,4CAA4C;IAC5C,kDAAkD;IAClD,oDAAoD;IACpD,qDAAqD;IACrD,2CAA2C;IAC3C,mDAAmD;IACnD,yCAAyC;IACzC,4CAA4C;IAC5C,0CAA0C;IAC1C,2CAA2C;IAC3C,yCAAyC;IACzC,mDAAmD;IACnD,+CAA+C;IAC/C,uDAAuD;IACvD,oDAAoD;IACpD,2DAA2D;IAC3D,mDAAmD;IACnD,0DAA0D;CAC3D,CAAC,CAAA;AAEK,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAsB,CAAA;IAC/B,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,qBAAqB,CAAC,CAAA;AACtD,CAAC,CAAA;AALY,QAAA,aAAa,iBAKzB;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,gBAAS;IACT,oBAAa;IACb,iBAAU;IACV,mBAAY;CACb,CAAC,CAAA;AAEW,QAAA,wBAAwB,GAAG,sCAAsC,CAAA;AAC9E,MAAM,mBAAmB,GAAG,CAAC,mBAAY,EAAE,gCAAwB,CAAC,CAAA;AAC7D,MAAM,cAAc,GAAG,CAAC,UAAmB,EAAW,EAAE;IAC7D,OAAO,CAAC,CAAC,UAAU,IAAI,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;AACjE,CAAC,CAAA;AAFY,QAAA,cAAc,kBAE1B;AAEM,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAuB,EAAE;IACzE,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,OAA8B,CAAA;IACvC,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,+BAA+B,CAAC,CAAA;AAChE,CAAC,CAAA;AALY,QAAA,kBAAkB,sBAK9B;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAsB,EAAE;IACtE,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,MAA4B,CAAA;IACrC,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,8BAA8B,CAAC,CAAA;AAC/D,CAAC,CAAA;AALY,QAAA,iBAAiB,qBAK7B;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAsB,EAAE;IACtE,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,MAA4B,CAAA;IACrC,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,8BAA8B,CAAC,CAAA;AAC/D,CAAC,CAAA;AALY,QAAA,iBAAiB,qBAK7B;AAEM,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAqB,EAAE;IAC3E,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,SAA8B,CAAA;IACvC,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,6BAA6B,CAAC,CAAA;AAC9D,CAAC,CAAA;AALY,QAAA,oBAAoB,wBAKhC;AAOD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;AACnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AAC/D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;AACrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAA;AAEpE,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAuB,EAAE;IAC5E,IAAI,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,MAA6B,CAAA;IACtC,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,+BAA+B,CAAC,CAAA;AAChE,CAAC,CAAA;AALY,QAAA,sBAAsB,0BAKlC;AAEM,MAAM,wBAAwB,GAAG,CACtC,MAAc,EACS,EAAE;IACzB,IAAI,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,OAAO,MAA+B,CAAA;IACxC,CAAC;IACD,MAAM,IAAI,iCAAmB,CAAC,iCAAiC,CAAC,CAAA;AAClE,CAAC,CAAA;AAPY,QAAA,wBAAwB,4BAOpC;AASD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;AAClD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,SAAS;IACT,UAAU;IACV,WAAW;IACX,QAAQ;CACT,CAAC,CAAA","sourcesContent":["import { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AppContext } from '../context'\nimport { Member } from '../db/schema/member'\nimport { ModerationEvent } from '../db/schema/moderation_event'\nimport { ids } from '../lexicon/lexicons'\nimport { AccountView } from '../lexicon/types/com/atproto/admin/defs'\nimport { REASONAPPEAL } from '../lexicon/types/com/atproto/moderation/defs'\nimport {\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWNONE,\n REVIEWOPEN,\n RepoView,\n RepoViewDetail,\n} from '../lexicon/types/tools/ozone/moderation/defs'\nimport {\n ROLEADMIN,\n ROLEMODERATOR,\n ROLETRIAGE,\n ROLEVERIFIER,\n} from '../lexicon/types/tools/ozone/team/defs'\nimport { ModerationSubjectStatusRow } from '../mod-service/types'\n\nexport const getPdsAccountInfos = async (\n ctx: AppContext,\n dids: string[],\n): Promise<Map<string, AccountView | null>> => {\n const results = new Map<string, AccountView | null>()\n\n const agent = ctx.pdsAgent\n if (!agent || !dids.length) return results\n\n const auth = await ctx.pdsAuth(ids.ComAtprotoAdminGetAccountInfos)\n if (!auth) return results\n\n try {\n const res = await agent.com.atproto.admin.getAccountInfos({ dids }, auth)\n res.data.infos.forEach((info) => {\n results.set(info.did, info)\n })\n return results\n } catch {\n return results\n }\n}\n\nfunction un$type<T extends object>(obj: T): Omit<T, '$type'> {\n if ('$type' in obj) {\n const { $type: _, ...rest } = obj\n return rest\n }\n return obj\n}\n\nexport const addAccountInfoToRepoViewDetail = (\n repoView: RepoView | RepoViewDetail,\n accountInfo: AccountView | null,\n includeEmail = false,\n): RepoViewDetail => {\n if (!accountInfo) {\n return un$type({\n ...repoView,\n moderation: un$type(repoView.moderation),\n })\n }\n\n const {\n email,\n deactivatedAt,\n emailConfirmedAt,\n inviteNote,\n invitedBy,\n invites,\n invitesDisabled,\n threatSignatures,\n // pick some duplicate/unwanted details out\n $type: _accountType,\n did: _did,\n handle: _handle,\n indexedAt: _indexedAt,\n relatedRecords: _relatedRecords,\n ...otherAccountInfo\n } = accountInfo\n return {\n ...otherAccountInfo,\n ...un$type(repoView),\n moderation: un$type(repoView.moderation),\n email: includeEmail ? email : undefined,\n invitedBy,\n invitesDisabled,\n inviteNote,\n invites,\n emailConfirmedAt,\n deactivatedAt,\n threatSignatures,\n }\n}\n\nexport const addAccountInfoToRepoView = (\n repoView: RepoView,\n accountInfo: AccountView | null,\n includeEmail = false,\n): RepoView => {\n if (!accountInfo) return repoView\n return {\n ...repoView,\n email: includeEmail ? accountInfo.email : undefined,\n invitedBy: accountInfo.invitedBy,\n invitesDisabled: accountInfo.invitesDisabled,\n inviteNote: accountInfo.inviteNote,\n deactivatedAt: accountInfo.deactivatedAt,\n threatSignatures: accountInfo.threatSignatures,\n }\n}\n\nexport const getEventType = (type: string) => {\n if (eventTypes.has(type)) {\n return type as ModerationEvent['action']\n }\n throw new InvalidRequestError('Invalid event type')\n}\n\nexport const getReviewState = (reviewState?: string) => {\n if (!reviewState) return undefined\n if (reviewStates.has(reviewState)) {\n return reviewState as ModerationSubjectStatusRow['reviewState']\n }\n throw new InvalidRequestError('Invalid review state')\n}\n\nconst reviewStates = new Set([\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWOPEN,\n REVIEWNONE,\n])\n\nconst eventTypes = new Set([\n 'tools.ozone.moderation.defs#modEventTakedown',\n 'tools.ozone.moderation.defs#modEventAcknowledge',\n 'tools.ozone.moderation.defs#modEventEscalate',\n 'tools.ozone.moderation.defs#modEventComment',\n 'tools.ozone.moderation.defs#modEventLabel',\n 'tools.ozone.moderation.defs#modEventReport',\n 'tools.ozone.moderation.defs#modEventMute',\n 'tools.ozone.moderation.defs#modEventUnmute',\n 'tools.ozone.moderation.defs#modEventMuteReporter',\n 'tools.ozone.moderation.defs#modEventUnmuteReporter',\n 'tools.ozone.moderation.defs#modEventReverseTakedown',\n 'tools.ozone.moderation.defs#modEventEmail',\n 'tools.ozone.moderation.defs#modEventResolveAppeal',\n 'tools.ozone.moderation.defs#modEventTag',\n 'tools.ozone.moderation.defs#modEventDivert',\n 'tools.ozone.moderation.defs#accountEvent',\n 'tools.ozone.moderation.defs#identityEvent',\n 'tools.ozone.moderation.defs#recordEvent',\n 'tools.ozone.moderation.defs#modEventPriorityScore',\n 'tools.ozone.moderation.defs#ageAssuranceEvent',\n 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent',\n 'tools.ozone.moderation.defs#ageAssurancePurgeEvent',\n 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent',\n 'tools.ozone.moderation.defs#scheduleTakedownEvent',\n 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent',\n])\n\nexport const getMemberRole = (role: string) => {\n if (memberRoles.has(role)) {\n return role as Member['role']\n }\n throw new InvalidRequestError('Invalid member role')\n}\n\nconst memberRoles = new Set([\n ROLEADMIN,\n ROLEMODERATOR,\n ROLETRIAGE,\n ROLEVERIFIER,\n])\n\nexport const OZONE_APPEAL_REASON_TYPE = 'tools.ozone.report.defs#reasonAppeal'\nconst APPEAL_REASON_TYPES = [REASONAPPEAL, OZONE_APPEAL_REASON_TYPE]\nexport const isAppealReport = (reasonType?: string): boolean => {\n return !!reasonType && APPEAL_REASON_TYPES.includes(reasonType)\n}\n\nexport const getSafelinkPattern = (pattern: string): SafelinkPatternType => {\n if (safelinkPatterns.has(pattern)) {\n return pattern as SafelinkPatternType\n }\n throw new InvalidRequestError('Invalid safelink pattern type')\n}\n\nexport const getSafelinkAction = (action: string): SafelinkActionType => {\n if (safelinkActions.has(action)) {\n return action as SafelinkActionType\n }\n throw new InvalidRequestError('Invalid safelink action type')\n}\n\nexport const getSafelinkReason = (reason: string): SafelinkReasonType => {\n if (safelinkReasons.has(reason)) {\n return reason as SafelinkReasonType\n }\n throw new InvalidRequestError('Invalid safelink reason type')\n}\n\nexport const getSafelinkEventType = (eventType: string): SafelinkEventType => {\n if (safelinkEventTypes.has(eventType)) {\n return eventType as SafelinkEventType\n }\n throw new InvalidRequestError('Invalid safelink event type')\n}\n\nexport type SafelinkEventType = 'addRule' | 'updateRule' | 'removeRule'\nexport type SafelinkPatternType = 'domain' | 'url'\nexport type SafelinkActionType = 'block' | 'warn' | 'whitelist'\nexport type SafelinkReasonType = 'csam' | 'spam' | 'phishing' | 'none'\n\nconst safelinkPatterns = new Set(['domain', 'url'])\nconst safelinkActions = new Set(['block', 'warn', 'whitelist'])\nconst safelinkReasons = new Set(['csam', 'spam', 'phishing', 'none'])\nconst safelinkEventTypes = new Set(['addRule', 'updateRule', 'removeRule'])\n\nexport const getScheduledActionType = (action: string): ScheduledActionType => {\n if (scheduledActionTypes.has(action)) {\n return action as ScheduledActionType\n }\n throw new InvalidRequestError('Invalid scheduled action type')\n}\n\nexport const getScheduledActionStatus = (\n status: string,\n): ScheduledActionStatus => {\n if (scheduledActionStatuses.has(status)) {\n return status as ScheduledActionStatus\n }\n throw new InvalidRequestError('Invalid scheduled action status')\n}\n\nexport type ScheduledActionType = 'takedown'\nexport type ScheduledActionStatus =\n | 'pending'\n | 'executed'\n | 'cancelled'\n | 'failed'\n\nconst scheduledActionTypes = new Set(['takedown'])\nconst scheduledActionStatuses = new Set([\n 'pending',\n 'executed',\n 'cancelled',\n 'failed',\n])\n"]}
@@ -2,7 +2,7 @@ import { Generated } from 'kysely';
2
2
  export declare const eventTableName = "moderation_event";
3
3
  export interface ModerationEvent {
4
4
  id: Generated<number>;
5
- action: 'tools.ozone.moderation.defs#modEventTakedown' | 'tools.ozone.moderation.defs#modEventAcknowledge' | 'tools.ozone.moderation.defs#modEventEscalate' | 'tools.ozone.moderation.defs#modEventComment' | 'tools.ozone.moderation.defs#modEventLabel' | 'tools.ozone.moderation.defs#modEventReport' | 'tools.ozone.moderation.defs#modEventMute' | 'tools.ozone.moderation.defs#modEventUnmute' | 'tools.ozone.moderation.defs#modEventMuteReporter' | 'tools.ozone.moderation.defs#modEventUnmuteReporter' | 'tools.ozone.moderation.defs#modEventReverseTakedown' | 'tools.ozone.moderation.defs#modEventEmail' | 'tools.ozone.moderation.defs#modEventResolveAppeal' | 'tools.ozone.moderation.defs#modEventTag' | 'tools.ozone.moderation.defs#accountEvent' | 'tools.ozone.moderation.defs#identityEvent' | 'tools.ozone.moderation.defs#recordEvent' | 'tools.ozone.moderation.defs#modEventPriorityScore' | 'tools.ozone.moderation.defs#ageAssuranceEvent' | 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent' | 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent';
5
+ action: 'tools.ozone.moderation.defs#modEventTakedown' | 'tools.ozone.moderation.defs#modEventAcknowledge' | 'tools.ozone.moderation.defs#modEventEscalate' | 'tools.ozone.moderation.defs#modEventComment' | 'tools.ozone.moderation.defs#modEventLabel' | 'tools.ozone.moderation.defs#modEventReport' | 'tools.ozone.moderation.defs#modEventMute' | 'tools.ozone.moderation.defs#modEventUnmute' | 'tools.ozone.moderation.defs#modEventMuteReporter' | 'tools.ozone.moderation.defs#modEventUnmuteReporter' | 'tools.ozone.moderation.defs#modEventReverseTakedown' | 'tools.ozone.moderation.defs#modEventEmail' | 'tools.ozone.moderation.defs#modEventResolveAppeal' | 'tools.ozone.moderation.defs#modEventTag' | 'tools.ozone.moderation.defs#accountEvent' | 'tools.ozone.moderation.defs#identityEvent' | 'tools.ozone.moderation.defs#recordEvent' | 'tools.ozone.moderation.defs#modEventPriorityScore' | 'tools.ozone.moderation.defs#ageAssuranceEvent' | 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent' | 'tools.ozone.moderation.defs#ageAssurancePurgeEvent' | 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent';
6
6
  subjectType: 'com.atproto.admin.defs#repoRef' | 'com.atproto.repo.strongRef' | 'chat.bsky.convo.defs#messageRef';
7
7
  subjectDid: string;
8
8
  subjectUri: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"moderation_event.d.ts","sourceRoot":"","sources":["../../../src/db/schema/moderation_event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,cAAc,qBAAqB,CAAA;AAEhD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,MAAM,EACF,8CAA8C,GAC9C,iDAAiD,GACjD,8CAA8C,GAC9C,6CAA6C,GAC7C,2CAA2C,GAC3C,4CAA4C,GAC5C,0CAA0C,GAC1C,4CAA4C,GAC5C,kDAAkD,GAClD,oDAAoD,GACpD,qDAAqD,GACrD,2CAA2C,GAC3C,mDAAmD,GACnD,yCAAyC,GACzC,0CAA0C,GAC1C,2CAA2C,GAC3C,yCAAyC,GACzC,mDAAmD,GACnD,+CAA+C,GAC/C,uDAAuD,GACvD,2DAA2D,CAAA;IAC/D,WAAW,EACP,gCAAgC,GAChC,4BAA4B,GAC5B,iCAAiC,CAAA;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,CAAA;IACtD,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;aAAG,CAAC,IAAI,MAAM,GAAG,OAAO;SAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACnE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,cAAc,CAAC,EAAE,eAAe,CAAA;CAClC,CAAA"}
1
+ {"version":3,"file":"moderation_event.d.ts","sourceRoot":"","sources":["../../../src/db/schema/moderation_event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,eAAO,MAAM,cAAc,qBAAqB,CAAA;AAEhD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,MAAM,EACF,8CAA8C,GAC9C,iDAAiD,GACjD,8CAA8C,GAC9C,6CAA6C,GAC7C,2CAA2C,GAC3C,4CAA4C,GAC5C,0CAA0C,GAC1C,4CAA4C,GAC5C,kDAAkD,GAClD,oDAAoD,GACpD,qDAAqD,GACrD,2CAA2C,GAC3C,mDAAmD,GACnD,yCAAyC,GACzC,0CAA0C,GAC1C,2CAA2C,GAC3C,yCAAyC,GACzC,mDAAmD,GACnD,+CAA+C,GAC/C,uDAAuD,GACvD,oDAAoD,GACpD,2DAA2D,CAAA;IAC/D,WAAW,EACP,gCAAgC,GAChC,4BAA4B,GAC5B,iCAAiC,CAAA;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,CAAA;IACtD,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;aAAG,CAAC,IAAI,MAAM,GAAG,OAAO;SAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACnE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,cAAc,CAAC,EAAE,eAAe,CAAA;CAClC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"moderation_event.js","sourceRoot":"","sources":["../../../src/db/schema/moderation_event.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAG,kBAAkB,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const eventTableName = 'moderation_event'\n\nexport interface ModerationEvent {\n id: Generated<number>\n action:\n | 'tools.ozone.moderation.defs#modEventTakedown'\n | 'tools.ozone.moderation.defs#modEventAcknowledge'\n | 'tools.ozone.moderation.defs#modEventEscalate'\n | 'tools.ozone.moderation.defs#modEventComment'\n | 'tools.ozone.moderation.defs#modEventLabel'\n | 'tools.ozone.moderation.defs#modEventReport'\n | 'tools.ozone.moderation.defs#modEventMute'\n | 'tools.ozone.moderation.defs#modEventUnmute'\n | 'tools.ozone.moderation.defs#modEventMuteReporter'\n | 'tools.ozone.moderation.defs#modEventUnmuteReporter'\n | 'tools.ozone.moderation.defs#modEventReverseTakedown'\n | 'tools.ozone.moderation.defs#modEventEmail'\n | 'tools.ozone.moderation.defs#modEventResolveAppeal'\n | 'tools.ozone.moderation.defs#modEventTag'\n | 'tools.ozone.moderation.defs#accountEvent'\n | 'tools.ozone.moderation.defs#identityEvent'\n | 'tools.ozone.moderation.defs#recordEvent'\n | 'tools.ozone.moderation.defs#modEventPriorityScore'\n | 'tools.ozone.moderation.defs#ageAssuranceEvent'\n | 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent'\n | 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent'\n subjectType:\n | 'com.atproto.admin.defs#repoRef'\n | 'com.atproto.repo.strongRef'\n | 'chat.bsky.convo.defs#messageRef'\n subjectDid: string\n subjectUri: string | null\n subjectCid: string | null\n subjectBlobCids: string[] | null\n subjectMessageId: string | null\n createLabelVals: string | null\n negateLabelVals: string | null\n comment: string | null\n createdAt: string\n createdBy: string\n durationInHours: number | null\n expiresAt: string | null\n meta: Record<string, string | boolean | number> | null\n addedTags: string[] | null\n removedTags: string[] | null\n legacyRefId: number | null\n modTool: { name: string; meta?: { [_ in string]: unknown } } | null\n externalId: string | null\n severityLevel: string | null\n strikeCount: number | null\n strikeExpiresAt: string | null\n}\n\nexport type PartialDB = {\n [eventTableName]: ModerationEvent\n}\n"]}
1
+ {"version":3,"file":"moderation_event.js","sourceRoot":"","sources":["../../../src/db/schema/moderation_event.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAG,kBAAkB,CAAA","sourcesContent":["import { Generated } from 'kysely'\n\nexport const eventTableName = 'moderation_event'\n\nexport interface ModerationEvent {\n id: Generated<number>\n action:\n | 'tools.ozone.moderation.defs#modEventTakedown'\n | 'tools.ozone.moderation.defs#modEventAcknowledge'\n | 'tools.ozone.moderation.defs#modEventEscalate'\n | 'tools.ozone.moderation.defs#modEventComment'\n | 'tools.ozone.moderation.defs#modEventLabel'\n | 'tools.ozone.moderation.defs#modEventReport'\n | 'tools.ozone.moderation.defs#modEventMute'\n | 'tools.ozone.moderation.defs#modEventUnmute'\n | 'tools.ozone.moderation.defs#modEventMuteReporter'\n | 'tools.ozone.moderation.defs#modEventUnmuteReporter'\n | 'tools.ozone.moderation.defs#modEventReverseTakedown'\n | 'tools.ozone.moderation.defs#modEventEmail'\n | 'tools.ozone.moderation.defs#modEventResolveAppeal'\n | 'tools.ozone.moderation.defs#modEventTag'\n | 'tools.ozone.moderation.defs#accountEvent'\n | 'tools.ozone.moderation.defs#identityEvent'\n | 'tools.ozone.moderation.defs#recordEvent'\n | 'tools.ozone.moderation.defs#modEventPriorityScore'\n | 'tools.ozone.moderation.defs#ageAssuranceEvent'\n | 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent'\n | 'tools.ozone.moderation.defs#ageAssurancePurgeEvent'\n | 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent'\n subjectType:\n | 'com.atproto.admin.defs#repoRef'\n | 'com.atproto.repo.strongRef'\n | 'chat.bsky.convo.defs#messageRef'\n subjectDid: string\n subjectUri: string | null\n subjectCid: string | null\n subjectBlobCids: string[] | null\n subjectMessageId: string | null\n createLabelVals: string | null\n negateLabelVals: string | null\n comment: string | null\n createdAt: string\n createdBy: string\n durationInHours: number | null\n expiresAt: string | null\n meta: Record<string, string | boolean | number> | null\n addedTags: string[] | null\n removedTags: string[] | null\n legacyRefId: number | null\n modTool: { name: string; meta?: { [_ in string]: unknown } } | null\n externalId: string | null\n severityLevel: string | null\n strikeCount: number | null\n strikeExpiresAt: string | null\n}\n\nexport type PartialDB = {\n [eventTableName]: ModerationEvent\n}\n"]}
@@ -959,6 +959,10 @@ export declare const schemaDict: {
959
959
  };
960
960
  readonly recId: {
961
961
  readonly type: "integer";
962
+ readonly description: "DEPRECATED: use recIdStr instead.";
963
+ };
964
+ readonly recIdStr: {
965
+ readonly type: "string";
962
966
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
963
967
  };
964
968
  };
@@ -7568,6 +7572,10 @@ export declare const schemaDict: {
7568
7572
  };
7569
7573
  };
7570
7574
  readonly recId: {
7575
+ readonly type: "string";
7576
+ readonly description: "DEPRECATED: use recIdStr instead.";
7577
+ };
7578
+ readonly recIdStr: {
7571
7579
  readonly type: "string";
7572
7580
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
7573
7581
  };
@@ -7883,6 +7891,10 @@ export declare const schemaDict: {
7883
7891
  };
7884
7892
  };
7885
7893
  readonly recId: {
7894
+ readonly type: "string";
7895
+ readonly description: "DEPRECATED: use recIdStr instead.";
7896
+ };
7897
+ readonly recIdStr: {
7886
7898
  readonly type: "string";
7887
7899
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
7888
7900
  };
@@ -8007,6 +8019,10 @@ export declare const schemaDict: {
8007
8019
  };
8008
8020
  };
8009
8021
  readonly recId: {
8022
+ readonly type: "string";
8023
+ readonly description: "DEPRECATED: use recIdStr instead.";
8024
+ };
8025
+ readonly recIdStr: {
8010
8026
  readonly type: "string";
8011
8027
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
8012
8028
  };
@@ -8057,6 +8073,10 @@ export declare const schemaDict: {
8057
8073
  };
8058
8074
  };
8059
8075
  readonly recId: {
8076
+ readonly type: "string";
8077
+ readonly description: "DEPRECATED: use recIdStr instead.";
8078
+ };
8079
+ readonly recIdStr: {
8060
8080
  readonly type: "string";
8061
8081
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
8062
8082
  };
@@ -14732,7 +14752,7 @@ export declare const schemaDict: {
14732
14752
  };
14733
14753
  readonly event: {
14734
14754
  readonly type: "union";
14735
- readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
14755
+ readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
14736
14756
  };
14737
14757
  readonly subject: {
14738
14758
  readonly type: "union";
@@ -14773,7 +14793,7 @@ export declare const schemaDict: {
14773
14793
  };
14774
14794
  readonly event: {
14775
14795
  readonly type: "union";
14776
- readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
14796
+ readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
14777
14797
  };
14778
14798
  readonly subject: {
14779
14799
  readonly type: "union";
@@ -15280,6 +15300,18 @@ export declare const schemaDict: {
15280
15300
  };
15281
15301
  };
15282
15302
  };
15303
+ readonly ageAssurancePurgeEvent: {
15304
+ readonly type: "object";
15305
+ readonly description: "Purges all age assurance events for the subject. Only works on DID subjects. Moderator-only.";
15306
+ readonly required: ["comment"];
15307
+ readonly properties: {
15308
+ readonly comment: {
15309
+ readonly type: "string";
15310
+ readonly minLength: 1;
15311
+ readonly description: "Comment describing the reason for the purge.";
15312
+ };
15313
+ };
15314
+ };
15283
15315
  readonly revokeAccountCredentialsEvent: {
15284
15316
  readonly type: "object";
15285
15317
  readonly description: "Account credentials revocation by moderators. Only works on DID subjects.";
@@ -16045,7 +16077,7 @@ export declare const schemaDict: {
16045
16077
  readonly properties: {
16046
16078
  readonly event: {
16047
16079
  readonly type: "union";
16048
- readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
16080
+ readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
16049
16081
  };
16050
16082
  readonly subject: {
16051
16083
  readonly type: "union";
@@ -19870,6 +19902,10 @@ export declare const schemas: ({
19870
19902
  };
19871
19903
  readonly recId: {
19872
19904
  readonly type: "integer";
19905
+ readonly description: "DEPRECATED: use recIdStr instead.";
19906
+ };
19907
+ readonly recIdStr: {
19908
+ readonly type: "string";
19873
19909
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
19874
19910
  };
19875
19911
  };
@@ -26368,6 +26404,10 @@ export declare const schemas: ({
26368
26404
  };
26369
26405
  };
26370
26406
  readonly recId: {
26407
+ readonly type: "string";
26408
+ readonly description: "DEPRECATED: use recIdStr instead.";
26409
+ };
26410
+ readonly recIdStr: {
26371
26411
  readonly type: "string";
26372
26412
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
26373
26413
  };
@@ -26677,6 +26717,10 @@ export declare const schemas: ({
26677
26717
  };
26678
26718
  };
26679
26719
  readonly recId: {
26720
+ readonly type: "string";
26721
+ readonly description: "DEPRECATED: use recIdStr instead.";
26722
+ };
26723
+ readonly recIdStr: {
26680
26724
  readonly type: "string";
26681
26725
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
26682
26726
  };
@@ -26798,6 +26842,10 @@ export declare const schemas: ({
26798
26842
  };
26799
26843
  };
26800
26844
  readonly recId: {
26845
+ readonly type: "string";
26846
+ readonly description: "DEPRECATED: use recIdStr instead.";
26847
+ };
26848
+ readonly recIdStr: {
26801
26849
  readonly type: "string";
26802
26850
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
26803
26851
  };
@@ -26847,6 +26895,10 @@ export declare const schemas: ({
26847
26895
  };
26848
26896
  };
26849
26897
  readonly recId: {
26898
+ readonly type: "string";
26899
+ readonly description: "DEPRECATED: use recIdStr instead.";
26900
+ };
26901
+ readonly recIdStr: {
26850
26902
  readonly type: "string";
26851
26903
  readonly description: "Snowflake for this recommendation, use when submitting recommendation events.";
26852
26904
  };
@@ -33381,7 +33433,7 @@ export declare const schemas: ({
33381
33433
  };
33382
33434
  readonly event: {
33383
33435
  readonly type: "union";
33384
- readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
33436
+ readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
33385
33437
  };
33386
33438
  readonly subject: {
33387
33439
  readonly type: "union";
@@ -33422,7 +33474,7 @@ export declare const schemas: ({
33422
33474
  };
33423
33475
  readonly event: {
33424
33476
  readonly type: "union";
33425
- readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
33477
+ readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
33426
33478
  };
33427
33479
  readonly subject: {
33428
33480
  readonly type: "union";
@@ -33929,6 +33981,18 @@ export declare const schemas: ({
33929
33981
  };
33930
33982
  };
33931
33983
  };
33984
+ readonly ageAssurancePurgeEvent: {
33985
+ readonly type: "object";
33986
+ readonly description: "Purges all age assurance events for the subject. Only works on DID subjects. Moderator-only.";
33987
+ readonly required: ["comment"];
33988
+ readonly properties: {
33989
+ readonly comment: {
33990
+ readonly type: "string";
33991
+ readonly minLength: 1;
33992
+ readonly description: "Comment describing the reason for the purge.";
33993
+ };
33994
+ };
33995
+ };
33932
33996
  readonly revokeAccountCredentialsEvent: {
33933
33997
  readonly type: "object";
33934
33998
  readonly description: "Account credentials revocation by moderators. Only works on DID subjects.";
@@ -34693,7 +34757,7 @@ export declare const schemas: ({
34693
34757
  readonly properties: {
34694
34758
  readonly event: {
34695
34759
  readonly type: "union";
34696
- readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
34760
+ readonly refs: ["lex:tools.ozone.moderation.defs#modEventTakedown", "lex:tools.ozone.moderation.defs#modEventAcknowledge", "lex:tools.ozone.moderation.defs#modEventEscalate", "lex:tools.ozone.moderation.defs#modEventComment", "lex:tools.ozone.moderation.defs#modEventLabel", "lex:tools.ozone.moderation.defs#modEventReport", "lex:tools.ozone.moderation.defs#modEventMute", "lex:tools.ozone.moderation.defs#modEventUnmute", "lex:tools.ozone.moderation.defs#modEventMuteReporter", "lex:tools.ozone.moderation.defs#modEventUnmuteReporter", "lex:tools.ozone.moderation.defs#modEventReverseTakedown", "lex:tools.ozone.moderation.defs#modEventResolveAppeal", "lex:tools.ozone.moderation.defs#modEventEmail", "lex:tools.ozone.moderation.defs#modEventDivert", "lex:tools.ozone.moderation.defs#modEventTag", "lex:tools.ozone.moderation.defs#accountEvent", "lex:tools.ozone.moderation.defs#identityEvent", "lex:tools.ozone.moderation.defs#recordEvent", "lex:tools.ozone.moderation.defs#modEventPriorityScore", "lex:tools.ozone.moderation.defs#ageAssuranceEvent", "lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent", "lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent", "lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent", "lex:tools.ozone.moderation.defs#scheduleTakedownEvent", "lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent"];
34697
34761
  };
34698
34762
  readonly subject: {
34699
34763
  readonly type: "union";