@atproto/ozone 0.1.14 → 0.1.15

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 (182) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/api/chat/getActorMetadata.d.ts +4 -0
  3. package/dist/api/chat/getActorMetadata.d.ts.map +1 -0
  4. package/dist/api/chat/getActorMetadata.js +20 -0
  5. package/dist/api/chat/getActorMetadata.js.map +1 -0
  6. package/dist/api/chat/getMessageContext.d.ts +4 -0
  7. package/dist/api/chat/getMessageContext.d.ts.map +1 -0
  8. package/dist/api/chat/getMessageContext.js +34 -0
  9. package/dist/api/chat/getMessageContext.js.map +1 -0
  10. package/dist/api/chat/index.d.ts +4 -0
  11. package/dist/api/chat/index.d.ts.map +1 -0
  12. package/dist/api/chat/index.js +14 -0
  13. package/dist/api/chat/index.js.map +1 -0
  14. package/dist/api/index.d.ts.map +1 -1
  15. package/dist/api/index.js +2 -0
  16. package/dist/api/index.js.map +1 -1
  17. package/dist/api/moderation/emitEvent.d.ts.map +1 -1
  18. package/dist/api/moderation/emitEvent.js +22 -0
  19. package/dist/api/moderation/emitEvent.js.map +1 -1
  20. package/dist/api/util.js +1 -0
  21. package/dist/api/util.js.map +1 -1
  22. package/dist/config/config.d.ts +5 -0
  23. package/dist/config/config.d.ts.map +1 -1
  24. package/dist/config/config.js +9 -0
  25. package/dist/config/config.js.map +1 -1
  26. package/dist/config/env.d.ts +2 -0
  27. package/dist/config/env.d.ts.map +1 -1
  28. package/dist/config/env.js +2 -0
  29. package/dist/config/env.js.map +1 -1
  30. package/dist/context.d.ts +7 -0
  31. package/dist/context.d.ts.map +1 -1
  32. package/dist/context.js +13 -0
  33. package/dist/context.js.map +1 -1
  34. package/dist/db/migrations/20240506T225055595Z-message-subject.d.ts +4 -0
  35. package/dist/db/migrations/20240506T225055595Z-message-subject.d.ts.map +1 -0
  36. package/dist/db/migrations/20240506T225055595Z-message-subject.js +24 -0
  37. package/dist/db/migrations/20240506T225055595Z-message-subject.js.map +1 -0
  38. package/dist/db/migrations/index.d.ts +1 -0
  39. package/dist/db/migrations/index.d.ts.map +1 -1
  40. package/dist/db/migrations/index.js +2 -1
  41. package/dist/db/migrations/index.js.map +1 -1
  42. package/dist/db/schema/moderation_event.d.ts +2 -1
  43. package/dist/db/schema/moderation_event.d.ts.map +1 -1
  44. package/dist/lexicon/index.d.ts +59 -0
  45. package/dist/lexicon/index.d.ts.map +1 -1
  46. package/dist/lexicon/index.js +164 -1
  47. package/dist/lexicon/index.js.map +1 -1
  48. package/dist/lexicon/lexicons.d.ts +898 -0
  49. package/dist/lexicon/lexicons.d.ts.map +1 -1
  50. package/dist/lexicon/lexicons.js +924 -0
  51. package/dist/lexicon/lexicons.js.map +1 -1
  52. package/dist/lexicon/types/chat/bsky/actor/declaration.d.ts +11 -0
  53. package/dist/lexicon/types/chat/bsky/actor/declaration.d.ts.map +1 -0
  54. package/dist/lexicon/types/chat/bsky/actor/declaration.js +17 -0
  55. package/dist/lexicon/types/chat/bsky/actor/declaration.js.map +1 -0
  56. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts +21 -0
  57. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts.map +1 -0
  58. package/dist/lexicon/types/chat/bsky/actor/defs.js +16 -0
  59. package/dist/lexicon/types/chat/bsky/actor/defs.js.map +1 -0
  60. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.d.ts +33 -0
  61. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.d.ts.map +1 -0
  62. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js +3 -0
  63. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js.map +1 -0
  64. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.d.ts +32 -0
  65. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.d.ts.map +1 -0
  66. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js +3 -0
  67. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js.map +1 -0
  68. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +109 -0
  69. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -0
  70. package/dist/lexicon/types/chat/bsky/convo/defs.js +106 -0
  71. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -0
  72. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.d.ts +39 -0
  73. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.d.ts.map +1 -0
  74. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js +3 -0
  75. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js.map +1 -0
  76. package/dist/lexicon/types/chat/bsky/convo/getConvo.d.ts +36 -0
  77. package/dist/lexicon/types/chat/bsky/convo/getConvo.d.ts.map +1 -0
  78. package/dist/lexicon/types/chat/bsky/convo/getConvo.js +3 -0
  79. package/dist/lexicon/types/chat/bsky/convo/getConvo.js.map +1 -0
  80. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts +36 -0
  81. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts.map +1 -0
  82. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js +3 -0
  83. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -0
  84. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts +40 -0
  85. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts.map +1 -0
  86. package/dist/lexicon/types/chat/bsky/convo/getLog.js +3 -0
  87. package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -0
  88. package/dist/lexicon/types/chat/bsky/convo/getMessages.d.ts +42 -0
  89. package/dist/lexicon/types/chat/bsky/convo/getMessages.d.ts.map +1 -0
  90. package/dist/lexicon/types/chat/bsky/convo/getMessages.js +3 -0
  91. package/dist/lexicon/types/chat/bsky/convo/getMessages.js.map +1 -0
  92. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.d.ts +41 -0
  93. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.d.ts.map +1 -0
  94. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js +3 -0
  95. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js.map +1 -0
  96. package/dist/lexicon/types/chat/bsky/convo/listConvos.d.ts +38 -0
  97. package/dist/lexicon/types/chat/bsky/convo/listConvos.d.ts.map +1 -0
  98. package/dist/lexicon/types/chat/bsky/convo/listConvos.js +3 -0
  99. package/dist/lexicon/types/chat/bsky/convo/listConvos.js.map +1 -0
  100. package/dist/lexicon/types/chat/bsky/convo/muteConvo.d.ts +41 -0
  101. package/dist/lexicon/types/chat/bsky/convo/muteConvo.d.ts.map +1 -0
  102. package/dist/lexicon/types/chat/bsky/convo/muteConvo.js +3 -0
  103. package/dist/lexicon/types/chat/bsky/convo/muteConvo.js.map +1 -0
  104. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts +39 -0
  105. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts.map +1 -0
  106. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js +3 -0
  107. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -0
  108. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts +49 -0
  109. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts.map +1 -0
  110. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js +16 -0
  111. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -0
  112. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.d.ts +41 -0
  113. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.d.ts.map +1 -0
  114. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js +3 -0
  115. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js.map +1 -0
  116. package/dist/lexicon/types/chat/bsky/convo/updateRead.d.ts +42 -0
  117. package/dist/lexicon/types/chat/bsky/convo/updateRead.d.ts.map +1 -0
  118. package/dist/lexicon/types/chat/bsky/convo/updateRead.js +3 -0
  119. package/dist/lexicon/types/chat/bsky/convo/updateRead.js.map +1 -0
  120. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.d.ts +47 -0
  121. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.d.ts.map +1 -0
  122. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js +16 -0
  123. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js.map +1 -0
  124. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.d.ts +43 -0
  125. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.d.ts.map +1 -0
  126. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js +3 -0
  127. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js.map +1 -0
  128. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.d.ts +31 -0
  129. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.d.ts.map +1 -0
  130. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js +3 -0
  131. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js.map +1 -0
  132. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +2 -1
  133. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  134. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  135. package/dist/mod-service/index.d.ts +2 -1
  136. package/dist/mod-service/index.d.ts.map +1 -1
  137. package/dist/mod-service/index.js +2 -1
  138. package/dist/mod-service/index.js.map +1 -1
  139. package/dist/mod-service/subject.d.ts +35 -2
  140. package/dist/mod-service/subject.d.ts.map +1 -1
  141. package/dist/mod-service/subject.js +85 -1
  142. package/dist/mod-service/subject.js.map +1 -1
  143. package/package.json +4 -4
  144. package/src/api/chat/getActorMetadata.ts +22 -0
  145. package/src/api/chat/getMessageContext.ts +39 -0
  146. package/src/api/chat/index.ts +10 -0
  147. package/src/api/index.ts +2 -0
  148. package/src/api/moderation/emitEvent.ts +31 -0
  149. package/src/api/util.ts +1 -0
  150. package/src/config/config.ts +16 -0
  151. package/src/config/env.ts +4 -0
  152. package/src/context.ts +16 -0
  153. package/src/db/migrations/20240506T225055595Z-message-subject.ts +21 -0
  154. package/src/db/migrations/index.ts +1 -0
  155. package/src/db/schema/moderation_event.ts +5 -1
  156. package/src/lexicon/index.ts +254 -0
  157. package/src/lexicon/lexicons.ts +926 -0
  158. package/src/lexicon/types/chat/bsky/actor/declaration.ts +25 -0
  159. package/src/lexicon/types/chat/bsky/actor/defs.ts +34 -0
  160. package/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +42 -0
  161. package/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +38 -0
  162. package/src/lexicon/types/chat/bsky/convo/defs.ts +215 -0
  163. package/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +48 -0
  164. package/src/lexicon/types/chat/bsky/convo/getConvo.ts +46 -0
  165. package/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +46 -0
  166. package/src/lexicon/types/chat/bsky/convo/getLog.ts +53 -0
  167. package/src/lexicon/types/chat/bsky/convo/getMessages.ts +53 -0
  168. package/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +50 -0
  169. package/src/lexicon/types/chat/bsky/convo/listConvos.ts +48 -0
  170. package/src/lexicon/types/chat/bsky/convo/muteConvo.ts +50 -0
  171. package/src/lexicon/types/chat/bsky/convo/sendMessage.ts +48 -0
  172. package/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +68 -0
  173. package/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +50 -0
  174. package/src/lexicon/types/chat/bsky/convo/updateRead.ts +51 -0
  175. package/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +67 -0
  176. package/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +54 -0
  177. package/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +40 -0
  178. package/src/lexicon/types/tools/ozone/moderation/defs.ts +2 -0
  179. package/src/mod-service/index.ts +2 -2
  180. package/src/mod-service/subject.ts +73 -2
  181. package/tests/__snapshots__/moderation.test.ts.snap +30 -0
  182. package/tests/moderation.test.ts +39 -0
@@ -0,0 +1,39 @@
1
+ import { Server } from '../../lexicon'
2
+ import AppContext from '../../context'
3
+ import { InvalidRequestError } from '@atproto/xrpc-server'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.chat.bsky.moderation.getMessageContext({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ params, auth }) => {
9
+ if (!ctx.chatAgent) {
10
+ throw new InvalidRequestError('No chat agent configured')
11
+ }
12
+ const maxWindowSize = auth.credentials.isModerator ? 5 : 0
13
+ const before = Math.min(maxWindowSize, params.before)
14
+ const after = Math.min(maxWindowSize, params.after)
15
+
16
+ // Ensure that the requested message was actually reported to prevent arbitrary lookups
17
+ const found = await ctx.db.db
18
+ .selectFrom('moderation_event')
19
+ .select('id')
20
+ .where('subjectMessageId', '=', params.messageId)
21
+ .where('action', '=', 'tools.ozone.moderation.defs#modEventReport')
22
+ .limit(1)
23
+ .executeTakeFirst()
24
+ if (!found) {
25
+ throw new InvalidRequestError('No report for requested message')
26
+ }
27
+
28
+ const res =
29
+ await ctx.chatAgent.api.chat.bsky.moderation.getMessageContext(
30
+ { ...params, before, after },
31
+ await ctx.chatAuth(),
32
+ )
33
+ return {
34
+ encoding: 'application/json',
35
+ body: res.data,
36
+ }
37
+ },
38
+ })
39
+ }
@@ -0,0 +1,10 @@
1
+ import { Server } from '../../lexicon'
2
+ import AppContext from '../../context'
3
+ import getActorMetadata from './getActorMetadata'
4
+ import getMessageContext from './getMessageContext'
5
+
6
+ export default function (server: Server, ctx: AppContext) {
7
+ getActorMetadata(server, ctx)
8
+ getMessageContext(server, ctx)
9
+ return server
10
+ }
package/src/api/index.ts CHANGED
@@ -15,6 +15,7 @@ import createTemplate from './communication/createTemplate'
15
15
  import updateTemplate from './communication/updateTemplate'
16
16
  import deleteTemplate from './communication/deleteTemplate'
17
17
  import listTemplates from './communication/listTemplates'
18
+ import chat from './chat'
18
19
  import proxied from './proxied'
19
20
 
20
21
  export * as health from './health'
@@ -37,6 +38,7 @@ export default function (server: Server, ctx: AppContext) {
37
38
  createTemplate(server, ctx)
38
39
  updateTemplate(server, ctx)
39
40
  deleteTemplate(server, ctx)
41
+ chat(server, ctx)
40
42
  proxied(server, ctx)
41
43
  return server
42
44
  }
@@ -7,8 +7,10 @@ import {
7
7
  isModEventLabel,
8
8
  isModEventMuteReporter,
9
9
  isModEventReverseTakedown,
10
+ isModEventTag,
10
11
  isModEventTakedown,
11
12
  isModEventUnmuteReporter,
13
+ ModEventTag,
12
14
  } from '../../lexicon/types/tools/ozone/moderation/defs'
13
15
  import { HandlerInput } from '../../lexicon/types/tools/ozone/moderation/emitEvent'
14
16
  import { subjectFromInput } from '../../mod-service/subject'
@@ -122,6 +124,10 @@ const handleModerationEvent = async ({
122
124
  throw new InvalidRequestError('Subject must be a repo when muting reporter')
123
125
  }
124
126
 
127
+ if (isModEventTag(event)) {
128
+ assertTagAuth(event, auth)
129
+ }
130
+
125
131
  const moderationEvent = await db.transaction(async (dbTxn) => {
126
132
  const moderationTxn = ctx.modService(dbTxn)
127
133
 
@@ -214,6 +220,31 @@ export default function (server: Server, ctx: AppContext) {
214
220
  })
215
221
  }
216
222
 
223
+ const TAG_AUTH: Record<string, 'triage' | 'moderator' | 'admin'> = {
224
+ 'chat-disabled': 'moderator',
225
+ }
226
+
227
+ const assertTagAuth = (
228
+ event: ModEventTag,
229
+ auth: ModeratorOutput | AdminTokenOutput,
230
+ ) => {
231
+ // admins can add/remove any tag
232
+ if (auth.credentials.isAdmin) return
233
+
234
+ for (const tag of Object.keys(TAG_AUTH)) {
235
+ if (event.add.includes(tag) || event.remove.includes(tag)) {
236
+ if (TAG_AUTH[tag] === 'admin' && !auth.credentials.isAdmin) {
237
+ throw new Error(`Must be an admin to add tag: ${tag}`)
238
+ } else if (
239
+ TAG_AUTH[tag] === 'moderator' &&
240
+ !auth.credentials.isModerator
241
+ ) {
242
+ throw new Error(`Must be a full moderator to add tag: ${tag}`)
243
+ }
244
+ }
245
+ }
246
+ }
247
+
217
248
  const validateLabels = (labels: string[]) => {
218
249
  for (const label of labels) {
219
250
  for (const char of badChars) {
package/src/api/util.ts CHANGED
@@ -118,4 +118,5 @@ const eventTypes = new Set([
118
118
  'tools.ozone.moderation.defs#modEventEmail',
119
119
  'tools.ozone.moderation.defs#modEventResolveAppeal',
120
120
  'tools.ozone.moderation.defs#modEventTag',
121
+ 'tools.ozone.moderation.defs#modEventDivert',
121
122
  ])
@@ -41,6 +41,15 @@ export const envToCfg = (env: OzoneEnvironment): OzoneConfig => {
41
41
  }
42
42
  }
43
43
 
44
+ let chatCfg: OzoneConfig['chat'] = null
45
+ if (env.chatUrl || env.chatDid) {
46
+ assert(env.chatUrl && env.chatDid)
47
+ chatCfg = {
48
+ url: env.chatUrl,
49
+ did: env.chatDid,
50
+ }
51
+ }
52
+
44
53
  const cdnCfg: OzoneConfig['cdn'] = {
45
54
  paths: env.cdnPaths,
46
55
  }
@@ -68,6 +77,7 @@ export const envToCfg = (env: OzoneEnvironment): OzoneConfig => {
68
77
  db: dbCfg,
69
78
  appview: appviewCfg,
70
79
  pds: pdsCfg,
80
+ chat: chatCfg,
71
81
  cdn: cdnCfg,
72
82
  identity: identityCfg,
73
83
  blobDivert: blobDivertServiceCfg,
@@ -80,6 +90,7 @@ export type OzoneConfig = {
80
90
  db: DatabaseConfig
81
91
  appview: AppviewConfig
82
92
  pds: PdsConfig | null
93
+ chat: ChatConfig | null
83
94
  cdn: CdnConfig
84
95
  identity: IdentityConfig
85
96
  blobDivert: BlobDivertConfig | null
@@ -118,6 +129,11 @@ export type PdsConfig = {
118
129
  did: string
119
130
  }
120
131
 
132
+ export type ChatConfig = {
133
+ url: string
134
+ did: string
135
+ }
136
+
121
137
  export type CdnConfig = {
122
138
  paths?: string[]
123
139
  }
package/src/config/env.ts CHANGED
@@ -13,6 +13,8 @@ export const readEnv = (): OzoneEnvironment => {
13
13
  appviewPushEvents: envBool('OZONE_APPVIEW_PUSH_EVENTS'),
14
14
  pdsUrl: envStr('OZONE_PDS_URL'),
15
15
  pdsDid: envStr('OZONE_PDS_DID'),
16
+ chatUrl: envStr('OZONE_CHAT_URL'),
17
+ chatDid: envStr('OZONE_CHAT_DID'),
16
18
  dbPostgresUrl: envStr('OZONE_DB_POSTGRES_URL'),
17
19
  dbPostgresSchema: envStr('OZONE_DB_POSTGRES_SCHEMA'),
18
20
  dbPoolSize: envInt('OZONE_DB_POOL_SIZE'),
@@ -42,6 +44,8 @@ export type OzoneEnvironment = {
42
44
  appviewPushEvents?: boolean
43
45
  pdsUrl?: string
44
46
  pdsDid?: string
47
+ chatUrl?: string
48
+ chatDid?: string
45
49
  dbPostgresUrl?: string
46
50
  dbPostgresSchema?: string
47
51
  dbPoolSize?: number
package/src/context.ts CHANGED
@@ -26,6 +26,7 @@ export type AppContextOptions = {
26
26
  communicationTemplateService: CommunicationTemplateServiceCreator
27
27
  appviewAgent: AtpAgent
28
28
  pdsAgent: AtpAgent | undefined
29
+ chatAgent: AtpAgent | undefined
29
30
  blobDiverter?: BlobDiverter
30
31
  signingKey: Keypair
31
32
  signingKeyId: number
@@ -60,6 +61,9 @@ export class AppContext {
60
61
  const pdsAgent = cfg.pds
61
62
  ? new AtpAgent({ service: cfg.pds.url })
62
63
  : undefined
64
+ const chatAgent = cfg.chat
65
+ ? new AtpAgent({ service: cfg.chat.url })
66
+ : undefined
63
67
 
64
68
  const idResolver = new IdResolver({
65
69
  plcUrl: cfg.identity.plcUrl,
@@ -115,6 +119,7 @@ export class AppContext {
115
119
  communicationTemplateService,
116
120
  appviewAgent,
117
121
  pdsAgent,
122
+ chatAgent,
118
123
  signingKey,
119
124
  signingKeyId,
120
125
  idResolver,
@@ -164,6 +169,10 @@ export class AppContext {
164
169
  return this.opts.pdsAgent
165
170
  }
166
171
 
172
+ get chatAgent(): AtpAgent | undefined {
173
+ return this.opts.chatAgent
174
+ }
175
+
167
176
  get signingKey(): Keypair {
168
177
  return this.opts.signingKey
169
178
  }
@@ -212,6 +221,13 @@ export class AppContext {
212
221
  return this.serviceAuthHeaders(this.cfg.appview.did)
213
222
  }
214
223
 
224
+ async chatAuth() {
225
+ if (!this.cfg.chat) {
226
+ throw new Error('No chat service configured')
227
+ }
228
+ return this.serviceAuthHeaders(this.cfg.chat.did)
229
+ }
230
+
215
231
  devOverride(overrides: Partial<AppContextOptions>) {
216
232
  this.opts = {
217
233
  ...this.opts,
@@ -0,0 +1,21 @@
1
+ import { Kysely } from 'kysely'
2
+
3
+ export async function up(db: Kysely<unknown>): Promise<void> {
4
+ await db.schema
5
+ .alterTable('moderation_event')
6
+ .addColumn('subjectMessageId', 'varchar')
7
+ .execute()
8
+ // support lookup for chat.bsky.moderation.getMessageContext
9
+ await db.schema
10
+ .createIndex('moderation_event_message_id_index')
11
+ .on('moderation_event')
12
+ .column('subjectMessageId')
13
+ .execute()
14
+ }
15
+
16
+ export async function down(db: Kysely<unknown>): Promise<void> {
17
+ await db.schema
18
+ .alterTable('moderation_event')
19
+ .dropColumn('subjectMessageId')
20
+ .execute()
21
+ }
@@ -8,3 +8,4 @@ export * as _20240201T051104136Z from './20240201T051104136Z-mod-event-blobs'
8
8
  export * as _20240208T213404429Z from './20240208T213404429Z-add-tags-column-to-moderation-subject'
9
9
  export * as _20240228T003647759Z from './20240228T003647759Z-add-label-sigs'
10
10
  export * as _20240408T192432676Z from './20240408T192432676Z-mute-reporting'
11
+ export * as _20240506T225055595Z from './20240506T225055595Z-message-subject'
@@ -19,11 +19,15 @@ export interface ModerationEvent {
19
19
  | 'tools.ozone.moderation.defs#modEventEmail'
20
20
  | 'tools.ozone.moderation.defs#modEventResolveAppeal'
21
21
  | 'tools.ozone.moderation.defs#modEventTag'
22
- subjectType: 'com.atproto.admin.defs#repoRef' | 'com.atproto.repo.strongRef'
22
+ subjectType:
23
+ | 'com.atproto.admin.defs#repoRef'
24
+ | 'com.atproto.repo.strongRef'
25
+ | 'chat.bsky.convo.defs#messageRef'
23
26
  subjectDid: string
24
27
  subjectUri: string | null
25
28
  subjectCid: string | null
26
29
  subjectBlobCids: string[] | null
30
+ subjectMessageId: string | null
27
31
  createLabelVals: string | null
28
32
  negateLabelVals: string | null
29
33
  comment: string | null
@@ -129,6 +129,23 @@ import * as AppBskyUnspeccedGetSuggestionsSkeleton from './types/app/bsky/unspec
129
129
  import * as AppBskyUnspeccedGetTaggedSuggestions from './types/app/bsky/unspecced/getTaggedSuggestions'
130
130
  import * as AppBskyUnspeccedSearchActorsSkeleton from './types/app/bsky/unspecced/searchActorsSkeleton'
131
131
  import * as AppBskyUnspeccedSearchPostsSkeleton from './types/app/bsky/unspecced/searchPostsSkeleton'
132
+ import * as ChatBskyActorDeleteAccount from './types/chat/bsky/actor/deleteAccount'
133
+ import * as ChatBskyActorExportAccountData from './types/chat/bsky/actor/exportAccountData'
134
+ import * as ChatBskyConvoDeleteMessageForSelf from './types/chat/bsky/convo/deleteMessageForSelf'
135
+ import * as ChatBskyConvoGetConvo from './types/chat/bsky/convo/getConvo'
136
+ import * as ChatBskyConvoGetConvoForMembers from './types/chat/bsky/convo/getConvoForMembers'
137
+ import * as ChatBskyConvoGetLog from './types/chat/bsky/convo/getLog'
138
+ import * as ChatBskyConvoGetMessages from './types/chat/bsky/convo/getMessages'
139
+ import * as ChatBskyConvoLeaveConvo from './types/chat/bsky/convo/leaveConvo'
140
+ import * as ChatBskyConvoListConvos from './types/chat/bsky/convo/listConvos'
141
+ import * as ChatBskyConvoMuteConvo from './types/chat/bsky/convo/muteConvo'
142
+ import * as ChatBskyConvoSendMessage from './types/chat/bsky/convo/sendMessage'
143
+ import * as ChatBskyConvoSendMessageBatch from './types/chat/bsky/convo/sendMessageBatch'
144
+ import * as ChatBskyConvoUnmuteConvo from './types/chat/bsky/convo/unmuteConvo'
145
+ import * as ChatBskyConvoUpdateRead from './types/chat/bsky/convo/updateRead'
146
+ import * as ChatBskyModerationGetActorMetadata from './types/chat/bsky/moderation/getActorMetadata'
147
+ import * as ChatBskyModerationGetMessageContext from './types/chat/bsky/moderation/getMessageContext'
148
+ import * as ChatBskyModerationUpdateActorAccess from './types/chat/bsky/moderation/updateActorAccess'
132
149
  import * as ToolsOzoneCommunicationCreateTemplate from './types/tools/ozone/communication/createTemplate'
133
150
  import * as ToolsOzoneCommunicationDeleteTemplate from './types/tools/ozone/communication/deleteTemplate'
134
151
  import * as ToolsOzoneCommunicationListTemplates from './types/tools/ozone/communication/listTemplates'
@@ -183,12 +200,14 @@ export class Server {
183
200
  xrpc: XrpcServer
184
201
  com: ComNS
185
202
  app: AppNS
203
+ chat: ChatNS
186
204
  tools: ToolsNS
187
205
 
188
206
  constructor(options?: XrpcOptions) {
189
207
  this.xrpc = createXrpcServer(schemas, options)
190
208
  this.com = new ComNS(this)
191
209
  this.app = new AppNS(this)
210
+ this.chat = new ChatNS(this)
192
211
  this.tools = new ToolsNS(this)
193
212
  }
194
213
  }
@@ -1713,6 +1732,241 @@ export class AppBskyUnspeccedNS {
1713
1732
  }
1714
1733
  }
1715
1734
 
1735
+ export class ChatNS {
1736
+ _server: Server
1737
+ bsky: ChatBskyNS
1738
+
1739
+ constructor(server: Server) {
1740
+ this._server = server
1741
+ this.bsky = new ChatBskyNS(server)
1742
+ }
1743
+ }
1744
+
1745
+ export class ChatBskyNS {
1746
+ _server: Server
1747
+ actor: ChatBskyActorNS
1748
+ convo: ChatBskyConvoNS
1749
+ moderation: ChatBskyModerationNS
1750
+
1751
+ constructor(server: Server) {
1752
+ this._server = server
1753
+ this.actor = new ChatBskyActorNS(server)
1754
+ this.convo = new ChatBskyConvoNS(server)
1755
+ this.moderation = new ChatBskyModerationNS(server)
1756
+ }
1757
+ }
1758
+
1759
+ export class ChatBskyActorNS {
1760
+ _server: Server
1761
+
1762
+ constructor(server: Server) {
1763
+ this._server = server
1764
+ }
1765
+
1766
+ deleteAccount<AV extends AuthVerifier>(
1767
+ cfg: ConfigOf<
1768
+ AV,
1769
+ ChatBskyActorDeleteAccount.Handler<ExtractAuth<AV>>,
1770
+ ChatBskyActorDeleteAccount.HandlerReqCtx<ExtractAuth<AV>>
1771
+ >,
1772
+ ) {
1773
+ const nsid = 'chat.bsky.actor.deleteAccount' // @ts-ignore
1774
+ return this._server.xrpc.method(nsid, cfg)
1775
+ }
1776
+
1777
+ exportAccountData<AV extends AuthVerifier>(
1778
+ cfg: ConfigOf<
1779
+ AV,
1780
+ ChatBskyActorExportAccountData.Handler<ExtractAuth<AV>>,
1781
+ ChatBskyActorExportAccountData.HandlerReqCtx<ExtractAuth<AV>>
1782
+ >,
1783
+ ) {
1784
+ const nsid = 'chat.bsky.actor.exportAccountData' // @ts-ignore
1785
+ return this._server.xrpc.method(nsid, cfg)
1786
+ }
1787
+ }
1788
+
1789
+ export class ChatBskyConvoNS {
1790
+ _server: Server
1791
+
1792
+ constructor(server: Server) {
1793
+ this._server = server
1794
+ }
1795
+
1796
+ deleteMessageForSelf<AV extends AuthVerifier>(
1797
+ cfg: ConfigOf<
1798
+ AV,
1799
+ ChatBskyConvoDeleteMessageForSelf.Handler<ExtractAuth<AV>>,
1800
+ ChatBskyConvoDeleteMessageForSelf.HandlerReqCtx<ExtractAuth<AV>>
1801
+ >,
1802
+ ) {
1803
+ const nsid = 'chat.bsky.convo.deleteMessageForSelf' // @ts-ignore
1804
+ return this._server.xrpc.method(nsid, cfg)
1805
+ }
1806
+
1807
+ getConvo<AV extends AuthVerifier>(
1808
+ cfg: ConfigOf<
1809
+ AV,
1810
+ ChatBskyConvoGetConvo.Handler<ExtractAuth<AV>>,
1811
+ ChatBskyConvoGetConvo.HandlerReqCtx<ExtractAuth<AV>>
1812
+ >,
1813
+ ) {
1814
+ const nsid = 'chat.bsky.convo.getConvo' // @ts-ignore
1815
+ return this._server.xrpc.method(nsid, cfg)
1816
+ }
1817
+
1818
+ getConvoForMembers<AV extends AuthVerifier>(
1819
+ cfg: ConfigOf<
1820
+ AV,
1821
+ ChatBskyConvoGetConvoForMembers.Handler<ExtractAuth<AV>>,
1822
+ ChatBskyConvoGetConvoForMembers.HandlerReqCtx<ExtractAuth<AV>>
1823
+ >,
1824
+ ) {
1825
+ const nsid = 'chat.bsky.convo.getConvoForMembers' // @ts-ignore
1826
+ return this._server.xrpc.method(nsid, cfg)
1827
+ }
1828
+
1829
+ getLog<AV extends AuthVerifier>(
1830
+ cfg: ConfigOf<
1831
+ AV,
1832
+ ChatBskyConvoGetLog.Handler<ExtractAuth<AV>>,
1833
+ ChatBskyConvoGetLog.HandlerReqCtx<ExtractAuth<AV>>
1834
+ >,
1835
+ ) {
1836
+ const nsid = 'chat.bsky.convo.getLog' // @ts-ignore
1837
+ return this._server.xrpc.method(nsid, cfg)
1838
+ }
1839
+
1840
+ getMessages<AV extends AuthVerifier>(
1841
+ cfg: ConfigOf<
1842
+ AV,
1843
+ ChatBskyConvoGetMessages.Handler<ExtractAuth<AV>>,
1844
+ ChatBskyConvoGetMessages.HandlerReqCtx<ExtractAuth<AV>>
1845
+ >,
1846
+ ) {
1847
+ const nsid = 'chat.bsky.convo.getMessages' // @ts-ignore
1848
+ return this._server.xrpc.method(nsid, cfg)
1849
+ }
1850
+
1851
+ leaveConvo<AV extends AuthVerifier>(
1852
+ cfg: ConfigOf<
1853
+ AV,
1854
+ ChatBskyConvoLeaveConvo.Handler<ExtractAuth<AV>>,
1855
+ ChatBskyConvoLeaveConvo.HandlerReqCtx<ExtractAuth<AV>>
1856
+ >,
1857
+ ) {
1858
+ const nsid = 'chat.bsky.convo.leaveConvo' // @ts-ignore
1859
+ return this._server.xrpc.method(nsid, cfg)
1860
+ }
1861
+
1862
+ listConvos<AV extends AuthVerifier>(
1863
+ cfg: ConfigOf<
1864
+ AV,
1865
+ ChatBskyConvoListConvos.Handler<ExtractAuth<AV>>,
1866
+ ChatBskyConvoListConvos.HandlerReqCtx<ExtractAuth<AV>>
1867
+ >,
1868
+ ) {
1869
+ const nsid = 'chat.bsky.convo.listConvos' // @ts-ignore
1870
+ return this._server.xrpc.method(nsid, cfg)
1871
+ }
1872
+
1873
+ muteConvo<AV extends AuthVerifier>(
1874
+ cfg: ConfigOf<
1875
+ AV,
1876
+ ChatBskyConvoMuteConvo.Handler<ExtractAuth<AV>>,
1877
+ ChatBskyConvoMuteConvo.HandlerReqCtx<ExtractAuth<AV>>
1878
+ >,
1879
+ ) {
1880
+ const nsid = 'chat.bsky.convo.muteConvo' // @ts-ignore
1881
+ return this._server.xrpc.method(nsid, cfg)
1882
+ }
1883
+
1884
+ sendMessage<AV extends AuthVerifier>(
1885
+ cfg: ConfigOf<
1886
+ AV,
1887
+ ChatBskyConvoSendMessage.Handler<ExtractAuth<AV>>,
1888
+ ChatBskyConvoSendMessage.HandlerReqCtx<ExtractAuth<AV>>
1889
+ >,
1890
+ ) {
1891
+ const nsid = 'chat.bsky.convo.sendMessage' // @ts-ignore
1892
+ return this._server.xrpc.method(nsid, cfg)
1893
+ }
1894
+
1895
+ sendMessageBatch<AV extends AuthVerifier>(
1896
+ cfg: ConfigOf<
1897
+ AV,
1898
+ ChatBskyConvoSendMessageBatch.Handler<ExtractAuth<AV>>,
1899
+ ChatBskyConvoSendMessageBatch.HandlerReqCtx<ExtractAuth<AV>>
1900
+ >,
1901
+ ) {
1902
+ const nsid = 'chat.bsky.convo.sendMessageBatch' // @ts-ignore
1903
+ return this._server.xrpc.method(nsid, cfg)
1904
+ }
1905
+
1906
+ unmuteConvo<AV extends AuthVerifier>(
1907
+ cfg: ConfigOf<
1908
+ AV,
1909
+ ChatBskyConvoUnmuteConvo.Handler<ExtractAuth<AV>>,
1910
+ ChatBskyConvoUnmuteConvo.HandlerReqCtx<ExtractAuth<AV>>
1911
+ >,
1912
+ ) {
1913
+ const nsid = 'chat.bsky.convo.unmuteConvo' // @ts-ignore
1914
+ return this._server.xrpc.method(nsid, cfg)
1915
+ }
1916
+
1917
+ updateRead<AV extends AuthVerifier>(
1918
+ cfg: ConfigOf<
1919
+ AV,
1920
+ ChatBskyConvoUpdateRead.Handler<ExtractAuth<AV>>,
1921
+ ChatBskyConvoUpdateRead.HandlerReqCtx<ExtractAuth<AV>>
1922
+ >,
1923
+ ) {
1924
+ const nsid = 'chat.bsky.convo.updateRead' // @ts-ignore
1925
+ return this._server.xrpc.method(nsid, cfg)
1926
+ }
1927
+ }
1928
+
1929
+ export class ChatBskyModerationNS {
1930
+ _server: Server
1931
+
1932
+ constructor(server: Server) {
1933
+ this._server = server
1934
+ }
1935
+
1936
+ getActorMetadata<AV extends AuthVerifier>(
1937
+ cfg: ConfigOf<
1938
+ AV,
1939
+ ChatBskyModerationGetActorMetadata.Handler<ExtractAuth<AV>>,
1940
+ ChatBskyModerationGetActorMetadata.HandlerReqCtx<ExtractAuth<AV>>
1941
+ >,
1942
+ ) {
1943
+ const nsid = 'chat.bsky.moderation.getActorMetadata' // @ts-ignore
1944
+ return this._server.xrpc.method(nsid, cfg)
1945
+ }
1946
+
1947
+ getMessageContext<AV extends AuthVerifier>(
1948
+ cfg: ConfigOf<
1949
+ AV,
1950
+ ChatBskyModerationGetMessageContext.Handler<ExtractAuth<AV>>,
1951
+ ChatBskyModerationGetMessageContext.HandlerReqCtx<ExtractAuth<AV>>
1952
+ >,
1953
+ ) {
1954
+ const nsid = 'chat.bsky.moderation.getMessageContext' // @ts-ignore
1955
+ return this._server.xrpc.method(nsid, cfg)
1956
+ }
1957
+
1958
+ updateActorAccess<AV extends AuthVerifier>(
1959
+ cfg: ConfigOf<
1960
+ AV,
1961
+ ChatBskyModerationUpdateActorAccess.Handler<ExtractAuth<AV>>,
1962
+ ChatBskyModerationUpdateActorAccess.HandlerReqCtx<ExtractAuth<AV>>
1963
+ >,
1964
+ ) {
1965
+ const nsid = 'chat.bsky.moderation.updateActorAccess' // @ts-ignore
1966
+ return this._server.xrpc.method(nsid, cfg)
1967
+ }
1968
+ }
1969
+
1716
1970
  export class ToolsNS {
1717
1971
  _server: Server
1718
1972
  ozone: ToolsOzoneNS