@atproto/ozone 0.1.13 → 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 (187) hide show
  1. package/CHANGELOG.md +14 -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 +912 -0
  49. package/dist/lexicon/lexicons.d.ts.map +1 -1
  50. package/dist/lexicon/lexicons.js +938 -0
  51. package/dist/lexicon/lexicons.js.map +1 -1
  52. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +7 -0
  53. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  54. package/dist/lexicon/types/app/bsky/actor/defs.js +11 -1
  55. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  56. package/dist/lexicon/types/chat/bsky/actor/declaration.d.ts +11 -0
  57. package/dist/lexicon/types/chat/bsky/actor/declaration.d.ts.map +1 -0
  58. package/dist/lexicon/types/chat/bsky/actor/declaration.js +17 -0
  59. package/dist/lexicon/types/chat/bsky/actor/declaration.js.map +1 -0
  60. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts +21 -0
  61. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts.map +1 -0
  62. package/dist/lexicon/types/chat/bsky/actor/defs.js +16 -0
  63. package/dist/lexicon/types/chat/bsky/actor/defs.js.map +1 -0
  64. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.d.ts +33 -0
  65. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.d.ts.map +1 -0
  66. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js +3 -0
  67. package/dist/lexicon/types/chat/bsky/actor/deleteAccount.js.map +1 -0
  68. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.d.ts +32 -0
  69. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.d.ts.map +1 -0
  70. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js +3 -0
  71. package/dist/lexicon/types/chat/bsky/actor/exportAccountData.js.map +1 -0
  72. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +109 -0
  73. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -0
  74. package/dist/lexicon/types/chat/bsky/convo/defs.js +106 -0
  75. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -0
  76. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.d.ts +39 -0
  77. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.d.ts.map +1 -0
  78. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js +3 -0
  79. package/dist/lexicon/types/chat/bsky/convo/deleteMessageForSelf.js.map +1 -0
  80. package/dist/lexicon/types/chat/bsky/convo/getConvo.d.ts +36 -0
  81. package/dist/lexicon/types/chat/bsky/convo/getConvo.d.ts.map +1 -0
  82. package/dist/lexicon/types/chat/bsky/convo/getConvo.js +3 -0
  83. package/dist/lexicon/types/chat/bsky/convo/getConvo.js.map +1 -0
  84. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts +36 -0
  85. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts.map +1 -0
  86. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js +3 -0
  87. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -0
  88. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts +40 -0
  89. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts.map +1 -0
  90. package/dist/lexicon/types/chat/bsky/convo/getLog.js +3 -0
  91. package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -0
  92. package/dist/lexicon/types/chat/bsky/convo/getMessages.d.ts +42 -0
  93. package/dist/lexicon/types/chat/bsky/convo/getMessages.d.ts.map +1 -0
  94. package/dist/lexicon/types/chat/bsky/convo/getMessages.js +3 -0
  95. package/dist/lexicon/types/chat/bsky/convo/getMessages.js.map +1 -0
  96. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.d.ts +41 -0
  97. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.d.ts.map +1 -0
  98. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js +3 -0
  99. package/dist/lexicon/types/chat/bsky/convo/leaveConvo.js.map +1 -0
  100. package/dist/lexicon/types/chat/bsky/convo/listConvos.d.ts +38 -0
  101. package/dist/lexicon/types/chat/bsky/convo/listConvos.d.ts.map +1 -0
  102. package/dist/lexicon/types/chat/bsky/convo/listConvos.js +3 -0
  103. package/dist/lexicon/types/chat/bsky/convo/listConvos.js.map +1 -0
  104. package/dist/lexicon/types/chat/bsky/convo/muteConvo.d.ts +41 -0
  105. package/dist/lexicon/types/chat/bsky/convo/muteConvo.d.ts.map +1 -0
  106. package/dist/lexicon/types/chat/bsky/convo/muteConvo.js +3 -0
  107. package/dist/lexicon/types/chat/bsky/convo/muteConvo.js.map +1 -0
  108. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts +39 -0
  109. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts.map +1 -0
  110. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js +3 -0
  111. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -0
  112. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts +49 -0
  113. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts.map +1 -0
  114. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js +16 -0
  115. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -0
  116. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.d.ts +41 -0
  117. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.d.ts.map +1 -0
  118. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js +3 -0
  119. package/dist/lexicon/types/chat/bsky/convo/unmuteConvo.js.map +1 -0
  120. package/dist/lexicon/types/chat/bsky/convo/updateRead.d.ts +42 -0
  121. package/dist/lexicon/types/chat/bsky/convo/updateRead.d.ts.map +1 -0
  122. package/dist/lexicon/types/chat/bsky/convo/updateRead.js +3 -0
  123. package/dist/lexicon/types/chat/bsky/convo/updateRead.js.map +1 -0
  124. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.d.ts +47 -0
  125. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.d.ts.map +1 -0
  126. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js +16 -0
  127. package/dist/lexicon/types/chat/bsky/moderation/getActorMetadata.js.map +1 -0
  128. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.d.ts +43 -0
  129. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.d.ts.map +1 -0
  130. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js +3 -0
  131. package/dist/lexicon/types/chat/bsky/moderation/getMessageContext.js.map +1 -0
  132. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.d.ts +31 -0
  133. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.d.ts.map +1 -0
  134. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js +3 -0
  135. package/dist/lexicon/types/chat/bsky/moderation/updateActorAccess.js.map +1 -0
  136. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +2 -1
  137. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  138. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  139. package/dist/mod-service/index.d.ts +2 -1
  140. package/dist/mod-service/index.d.ts.map +1 -1
  141. package/dist/mod-service/index.js +2 -1
  142. package/dist/mod-service/index.js.map +1 -1
  143. package/dist/mod-service/subject.d.ts +35 -2
  144. package/dist/mod-service/subject.d.ts.map +1 -1
  145. package/dist/mod-service/subject.js +85 -1
  146. package/dist/mod-service/subject.js.map +1 -1
  147. package/package.json +4 -4
  148. package/src/api/chat/getActorMetadata.ts +22 -0
  149. package/src/api/chat/getMessageContext.ts +39 -0
  150. package/src/api/chat/index.ts +10 -0
  151. package/src/api/index.ts +2 -0
  152. package/src/api/moderation/emitEvent.ts +31 -0
  153. package/src/api/util.ts +1 -0
  154. package/src/config/config.ts +16 -0
  155. package/src/config/env.ts +4 -0
  156. package/src/context.ts +16 -0
  157. package/src/db/migrations/20240506T225055595Z-message-subject.ts +21 -0
  158. package/src/db/migrations/index.ts +1 -0
  159. package/src/db/schema/moderation_event.ts +5 -1
  160. package/src/lexicon/index.ts +254 -0
  161. package/src/lexicon/lexicons.ts +940 -0
  162. package/src/lexicon/types/app/bsky/actor/defs.ts +20 -0
  163. package/src/lexicon/types/chat/bsky/actor/declaration.ts +25 -0
  164. package/src/lexicon/types/chat/bsky/actor/defs.ts +34 -0
  165. package/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +42 -0
  166. package/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +38 -0
  167. package/src/lexicon/types/chat/bsky/convo/defs.ts +215 -0
  168. package/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +48 -0
  169. package/src/lexicon/types/chat/bsky/convo/getConvo.ts +46 -0
  170. package/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +46 -0
  171. package/src/lexicon/types/chat/bsky/convo/getLog.ts +53 -0
  172. package/src/lexicon/types/chat/bsky/convo/getMessages.ts +53 -0
  173. package/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +50 -0
  174. package/src/lexicon/types/chat/bsky/convo/listConvos.ts +48 -0
  175. package/src/lexicon/types/chat/bsky/convo/muteConvo.ts +50 -0
  176. package/src/lexicon/types/chat/bsky/convo/sendMessage.ts +48 -0
  177. package/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +68 -0
  178. package/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +50 -0
  179. package/src/lexicon/types/chat/bsky/convo/updateRead.ts +51 -0
  180. package/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +67 -0
  181. package/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +54 -0
  182. package/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +40 -0
  183. package/src/lexicon/types/tools/ozone/moderation/defs.ts +2 -0
  184. package/src/mod-service/index.ts +2 -2
  185. package/src/mod-service/subject.ts +73 -2
  186. package/tests/__snapshots__/moderation.test.ts.snap +30 -0
  187. package/tests/moderation.test.ts +39 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RecordSubject = exports.RepoSubject = exports.subjectFromStatusRow = exports.subjectFromEventRow = exports.subjectFromInput = void 0;
3
+ exports.MessageSubject = exports.RecordSubject = exports.RepoSubject = exports.subjectFromStatusRow = exports.subjectFromEventRow = exports.subjectFromInput = void 0;
4
4
  const syntax_1 = require("@atproto/syntax");
5
5
  const xrpc_server_1 = require("@atproto/xrpc-server");
6
6
  const subjectFromInput = (subject, blobs) => {
@@ -16,6 +16,12 @@ const subjectFromInput = (subject, blobs) => {
16
16
  typeof subject.cid === 'string') {
17
17
  return new RecordSubject(subject.uri, subject.cid, blobs);
18
18
  }
19
+ if (subject.$type === 'chat.bsky.convo.defs#messageRef' &&
20
+ typeof subject.did === 'string' &&
21
+ typeof subject.convoId === 'string' &&
22
+ typeof subject.messageId === 'string') {
23
+ return new MessageSubject(subject.did, subject.convoId, subject.messageId);
24
+ }
19
25
  throw new xrpc_server_1.InvalidRequestError('Invalid subject');
20
26
  };
21
27
  exports.subjectFromInput = subjectFromInput;
@@ -25,6 +31,11 @@ const subjectFromEventRow = (row) => {
25
31
  row.subjectCid) {
26
32
  return new RecordSubject(row.subjectUri, row.subjectCid, row.subjectBlobCids ?? []);
27
33
  }
34
+ else if (row.subjectType === 'chat.bsky.convo.defs#messageRef' &&
35
+ row.subjectMessageId) {
36
+ const convoId = typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : '';
37
+ return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId);
38
+ }
28
39
  else {
29
40
  return new RepoSubject(row.subjectDid);
30
41
  }
@@ -69,6 +80,9 @@ class RepoSubject {
69
80
  isRecord() {
70
81
  return false;
71
82
  }
83
+ isMessage() {
84
+ return false;
85
+ }
72
86
  info() {
73
87
  return {
74
88
  subjectType: 'com.atproto.admin.defs#repoRef',
@@ -76,6 +90,8 @@ class RepoSubject {
76
90
  subjectUri: null,
77
91
  subjectCid: null,
78
92
  subjectBlobCids: null,
93
+ subjectMessageId: null,
94
+ meta: null,
79
95
  };
80
96
  }
81
97
  lex() {
@@ -134,6 +150,9 @@ class RecordSubject {
134
150
  isRecord() {
135
151
  return true;
136
152
  }
153
+ isMessage() {
154
+ return false;
155
+ }
137
156
  info() {
138
157
  return {
139
158
  subjectType: 'com.atproto.repo.strongRef',
@@ -141,6 +160,8 @@ class RecordSubject {
141
160
  subjectUri: this.uri,
142
161
  subjectCid: this.cid,
143
162
  subjectBlobCids: this.blobCids ?? [],
163
+ subjectMessageId: null,
164
+ meta: null,
144
165
  };
145
166
  }
146
167
  lex() {
@@ -152,4 +173,67 @@ class RecordSubject {
152
173
  }
153
174
  }
154
175
  exports.RecordSubject = RecordSubject;
176
+ class MessageSubject {
177
+ constructor(did, convoId, messageId) {
178
+ Object.defineProperty(this, "did", {
179
+ enumerable: true,
180
+ configurable: true,
181
+ writable: true,
182
+ value: did
183
+ });
184
+ Object.defineProperty(this, "convoId", {
185
+ enumerable: true,
186
+ configurable: true,
187
+ writable: true,
188
+ value: convoId
189
+ });
190
+ Object.defineProperty(this, "messageId", {
191
+ enumerable: true,
192
+ configurable: true,
193
+ writable: true,
194
+ value: messageId
195
+ });
196
+ Object.defineProperty(this, "blobCids", {
197
+ enumerable: true,
198
+ configurable: true,
199
+ writable: true,
200
+ value: undefined
201
+ });
202
+ Object.defineProperty(this, "recordPath", {
203
+ enumerable: true,
204
+ configurable: true,
205
+ writable: true,
206
+ value: undefined
207
+ });
208
+ }
209
+ isRepo() {
210
+ return false;
211
+ }
212
+ isRecord() {
213
+ return false;
214
+ }
215
+ isMessage() {
216
+ return true;
217
+ }
218
+ info() {
219
+ return {
220
+ subjectType: 'chat.bsky.convo.defs#messageRef',
221
+ subjectDid: this.did,
222
+ subjectUri: null,
223
+ subjectCid: null,
224
+ subjectBlobCids: null,
225
+ subjectMessageId: this.messageId,
226
+ meta: { convoId: this.convoId },
227
+ };
228
+ }
229
+ lex() {
230
+ return {
231
+ $type: 'chat.bsky.convo.defs#messageRef',
232
+ did: this.did,
233
+ convoId: this.convoId,
234
+ messageId: this.messageId,
235
+ };
236
+ }
237
+ }
238
+ exports.MessageSubject = MessageSubject;
155
239
  //# sourceMappingURL=subject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/ozone",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "license": "MIT",
5
5
  "description": "Backend service for moderating the Bluesky network.",
6
6
  "keywords": [
@@ -31,7 +31,7 @@
31
31
  "pino-http": "^8.2.1",
32
32
  "typed-emitter": "^2.1.0",
33
33
  "uint8arrays": "3.0.0",
34
- "@atproto/api": "^0.12.9",
34
+ "@atproto/api": "^0.12.11",
35
35
  "@atproto/common": "^0.4.0",
36
36
  "@atproto/crypto": "^0.4.0",
37
37
  "@atproto/identity": "^0.4.0",
@@ -51,10 +51,10 @@
51
51
  "jest": "^28.1.2",
52
52
  "ts-node": "^10.8.2",
53
53
  "@atproto/lex-cli": "^0.4.0",
54
- "@atproto/pds": "^0.4.20"
54
+ "@atproto/pds": "^0.4.23"
55
55
  },
56
56
  "scripts": {
57
- "codegen": "lex gen-server ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/tools/ozone/*/*",
57
+ "codegen": "lex gen-server ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*",
58
58
  "build": "tsc --build tsconfig.build.json",
59
59
  "start": "node --enable-source-maps dist/bin.js",
60
60
  "test": "../dev-infra/with-test-redis-and-db.sh jest",
@@ -0,0 +1,22 @@
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.getActorMetadata({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ params }) => {
9
+ if (!ctx.chatAgent) {
10
+ throw new InvalidRequestError('No chat agent configured')
11
+ }
12
+ const res = await ctx.chatAgent.api.chat.bsky.moderation.getActorMetadata(
13
+ params,
14
+ await ctx.chatAuth(),
15
+ )
16
+ return {
17
+ encoding: 'application/json',
18
+ body: res.data,
19
+ }
20
+ },
21
+ })
22
+ }
@@ -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