@atproto/ozone 0.1.176 → 0.2.0

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 (176) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/api/chat/getConvo.d.ts +4 -0
  3. package/dist/api/chat/getConvo.d.ts.map +1 -0
  4. package/dist/api/chat/getConvo.js +18 -0
  5. package/dist/api/chat/getConvo.js.map +1 -0
  6. package/dist/api/chat/getConvoMembers.d.ts +4 -0
  7. package/dist/api/chat/getConvoMembers.d.ts.map +1 -0
  8. package/dist/api/chat/getConvoMembers.js +18 -0
  9. package/dist/api/chat/getConvoMembers.js.map +1 -0
  10. package/dist/api/chat/index.d.ts.map +1 -1
  11. package/dist/api/chat/index.js +4 -0
  12. package/dist/api/chat/index.js.map +1 -1
  13. package/dist/daemon/event-reverser.d.ts.map +1 -1
  14. package/dist/daemon/event-reverser.js +1 -0
  15. package/dist/daemon/event-reverser.js.map +1 -1
  16. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.d.ts +4 -0
  17. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.d.ts.map +1 -0
  18. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.js +107 -0
  19. package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.js.map +1 -0
  20. package/dist/db/migrations/index.d.ts +1 -0
  21. package/dist/db/migrations/index.d.ts.map +1 -1
  22. package/dist/db/migrations/index.js +1 -0
  23. package/dist/db/migrations/index.js.map +1 -1
  24. package/dist/db/schema/expiring_tag.d.ts +1 -0
  25. package/dist/db/schema/expiring_tag.d.ts.map +1 -1
  26. package/dist/db/schema/expiring_tag.js.map +1 -1
  27. package/dist/db/schema/moderation_event.d.ts +2 -1
  28. package/dist/db/schema/moderation_event.d.ts.map +1 -1
  29. package/dist/db/schema/moderation_event.js.map +1 -1
  30. package/dist/db/schema/moderation_subject_status.d.ts +1 -0
  31. package/dist/db/schema/moderation_subject_status.d.ts.map +1 -1
  32. package/dist/db/schema/moderation_subject_status.js.map +1 -1
  33. package/dist/db/schema/report.d.ts +1 -0
  34. package/dist/db/schema/report.d.ts.map +1 -1
  35. package/dist/db/schema/report.js.map +1 -1
  36. package/dist/lexicon/index.d.ts +19 -2
  37. package/dist/lexicon/index.d.ts.map +1 -1
  38. package/dist/lexicon/index.js +32 -2
  39. package/dist/lexicon/index.js.map +1 -1
  40. package/dist/lexicon/lexicons.d.ts +1364 -132
  41. package/dist/lexicon/lexicons.d.ts.map +1 -1
  42. package/dist/lexicon/lexicons.js +721 -44
  43. package/dist/lexicon/lexicons.js.map +1 -1
  44. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +4 -0
  45. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  46. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  47. package/dist/lexicon/types/app/bsky/embed/external.d.ts +48 -2
  48. package/dist/lexicon/types/app/bsky/embed/external.d.ts.map +1 -1
  49. package/dist/lexicon/types/app/bsky/embed/external.js +21 -0
  50. package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
  51. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.d.ts +31 -0
  52. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.d.ts.map +1 -0
  53. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.js +5 -0
  54. package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.js.map +1 -0
  55. package/dist/lexicon/types/chat/bsky/actor/getStatus.d.ts +24 -0
  56. package/dist/lexicon/types/chat/bsky/actor/getStatus.d.ts.map +1 -0
  57. package/dist/lexicon/types/chat/bsky/{group/getJoinLinkPreview.js → actor/getStatus.js} +2 -2
  58. package/dist/lexicon/types/chat/bsky/actor/getStatus.js.map +1 -0
  59. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +39 -7
  60. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -1
  61. package/dist/lexicon/types/chat/bsky/convo/defs.js +21 -0
  62. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  63. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts +1 -1
  64. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts.map +1 -1
  65. package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -1
  66. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts +1 -1
  67. package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts.map +1 -1
  68. package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -1
  69. package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.d.ts +1 -1
  70. package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.d.ts.map +1 -1
  71. package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.js.map +1 -1
  72. package/dist/lexicon/types/chat/bsky/embed/joinLink.d.ts +19 -0
  73. package/dist/lexicon/types/chat/bsky/embed/joinLink.d.ts.map +1 -0
  74. package/dist/lexicon/types/chat/bsky/embed/joinLink.js +19 -0
  75. package/dist/lexicon/types/chat/bsky/embed/joinLink.js.map +1 -0
  76. package/dist/lexicon/types/chat/bsky/group/addMembers.d.ts +1 -1
  77. package/dist/lexicon/types/chat/bsky/group/addMembers.d.ts.map +1 -1
  78. package/dist/lexicon/types/chat/bsky/group/addMembers.js.map +1 -1
  79. package/dist/lexicon/types/chat/bsky/group/createGroup.d.ts +1 -1
  80. package/dist/lexicon/types/chat/bsky/group/createGroup.d.ts.map +1 -1
  81. package/dist/lexicon/types/chat/bsky/group/createGroup.js.map +1 -1
  82. package/dist/lexicon/types/chat/bsky/group/defs.d.ts +23 -0
  83. package/dist/lexicon/types/chat/bsky/group/defs.d.ts.map +1 -1
  84. package/dist/lexicon/types/chat/bsky/group/defs.js +14 -0
  85. package/dist/lexicon/types/chat/bsky/group/defs.js.map +1 -1
  86. package/dist/lexicon/types/chat/bsky/group/{getJoinLinkPreview.d.ts → getJoinLinkPreviews.d.ts} +3 -4
  87. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.d.ts.map +1 -0
  88. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.js +5 -0
  89. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.js.map +1 -0
  90. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.d.ts +24 -0
  91. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.d.ts.map +1 -0
  92. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.js +5 -0
  93. package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.js.map +1 -0
  94. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.d.ts +24 -0
  95. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.d.ts.map +1 -0
  96. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.js +5 -0
  97. package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.js.map +1 -0
  98. package/dist/lexicon/types/chat/bsky/moderation/defs.d.ts +42 -0
  99. package/dist/lexicon/types/chat/bsky/moderation/defs.d.ts.map +1 -0
  100. package/dist/lexicon/types/chat/bsky/moderation/defs.js +26 -0
  101. package/dist/lexicon/types/chat/bsky/moderation/defs.js.map +1 -0
  102. package/dist/lexicon/types/chat/bsky/moderation/getConvo.d.ts +23 -0
  103. package/dist/lexicon/types/chat/bsky/moderation/getConvo.d.ts.map +1 -0
  104. package/dist/lexicon/types/chat/bsky/moderation/getConvo.js +5 -0
  105. package/dist/lexicon/types/chat/bsky/moderation/getConvo.js.map +1 -0
  106. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.d.ts +26 -0
  107. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.d.ts.map +1 -0
  108. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.js +5 -0
  109. package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.js.map +1 -0
  110. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts +13 -1
  111. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts.map +1 -1
  112. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js +7 -0
  113. package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js.map +1 -1
  114. package/dist/lexicon/types/com/atproto/server/getServiceAuth.d.ts +1 -1
  115. package/dist/lexicon/types/com/atproto/server/getServiceAuth.d.ts.map +1 -1
  116. package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
  117. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +10 -3
  118. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  119. package/dist/lexicon/types/tools/ozone/moderation/defs.js +7 -0
  120. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  121. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts +2 -2
  122. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts.map +1 -1
  123. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
  124. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts +2 -2
  125. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts.map +1 -1
  126. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
  127. package/dist/mod-service/expiring-tags.d.ts +3 -0
  128. package/dist/mod-service/expiring-tags.d.ts.map +1 -1
  129. package/dist/mod-service/expiring-tags.js +5 -2
  130. package/dist/mod-service/expiring-tags.js.map +1 -1
  131. package/dist/mod-service/index.d.ts +3 -1
  132. package/dist/mod-service/index.d.ts.map +1 -1
  133. package/dist/mod-service/index.js +48 -10
  134. package/dist/mod-service/index.js.map +1 -1
  135. package/dist/mod-service/status.d.ts +7 -1
  136. package/dist/mod-service/status.d.ts.map +1 -1
  137. package/dist/mod-service/status.js +18 -3
  138. package/dist/mod-service/status.js.map +1 -1
  139. package/dist/mod-service/subject.d.ts +38 -2
  140. package/dist/mod-service/subject.d.ts.map +1 -1
  141. package/dist/mod-service/subject.js +67 -0
  142. package/dist/mod-service/subject.js.map +1 -1
  143. package/dist/mod-service/views.d.ts +2 -1
  144. package/dist/mod-service/views.d.ts.map +1 -1
  145. package/dist/mod-service/views.js +24 -22
  146. package/dist/mod-service/views.js.map +1 -1
  147. package/dist/queue/service.d.ts.map +1 -1
  148. package/dist/queue/service.js +7 -3
  149. package/dist/queue/service.js.map +1 -1
  150. package/dist/safelink/service.d.ts +1 -1
  151. package/package.json +5 -5
  152. package/src/api/chat/getConvo.ts +23 -0
  153. package/src/api/chat/getConvoMembers.ts +23 -0
  154. package/src/api/chat/index.ts +4 -0
  155. package/src/daemon/event-reverser.ts +1 -0
  156. package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +114 -0
  157. package/src/db/migrations/index.ts +1 -0
  158. package/src/db/schema/expiring_tag.ts +1 -0
  159. package/src/db/schema/moderation_event.ts +2 -0
  160. package/src/db/schema/moderation_subject_status.ts +4 -0
  161. package/src/db/schema/report.ts +2 -1
  162. package/src/mod-service/expiring-tags.ts +8 -2
  163. package/src/mod-service/index.ts +52 -16
  164. package/src/mod-service/status.ts +24 -2
  165. package/src/mod-service/subject.ts +79 -1
  166. package/src/mod-service/views.ts +28 -23
  167. package/src/queue/service.ts +8 -4
  168. package/tests/__snapshots__/verification.test.ts.snap +2 -0
  169. package/tests/expiring-tags.test.ts +1 -0
  170. package/tests/moderation-events.test.ts +108 -1
  171. package/tests/moderation-status-tags.test.ts +23 -0
  172. package/tests/moderation-statuses.test.ts +82 -0
  173. package/tests/moderation.test.ts +73 -0
  174. package/tsconfig.build.tsbuildinfo +1 -1
  175. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreview.d.ts.map +0 -1
  176. package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreview.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"expiring-tags.js","sourceRoot":"","sources":["../../src/mod-service/expiring-tags.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAY,EACZ,MAOC;IAED,MAAM,EAAE,CAAC,EAAE;SACR,UAAU,CAAC,cAAc,CAAC;SAC1B,MAAM,CACL,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,GAAG;QACH,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC,CACJ;SACA,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAY,EACZ,MAIC;IAED,MAAM,EAAE,CAAC,EAAE;SACR,UAAU,CAAC,cAAc,CAAC;SAC1B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;SAC7B,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;SAC3C,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;SAC/B,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAY,EACZ,GAAa;IAEb,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE;SACrB,UAAU,CAAC,cAAc,CAAC;SAC1B,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC;SAC5B,SAAS,EAAE;SACX,OAAO,EAAE,CAAA;IAEZ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAE3B,sFAAsF;IACtF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAA;IACnD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,EAAE,CAAA;QAC3D,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,IAAI,EAAE,EAAE;gBACR,GAAG,EAAE,EAAE;aACR,CAAA;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AAC9B,CAAC","sourcesContent":["import { Selectable } from 'kysely'\nimport { Database } from '../db/index.js'\nimport { ExpiringTag } from '../db/schema/expiring_tag.js'\n\nexport type ExpiringTagRow = Selectable<ExpiringTag>\n\nexport type ExpiringTagGroup = {\n did: string\n recordPath: string\n createdBy: string\n tags: string[]\n ids: number[]\n}\n\nexport async function insertExpiringTags(\n db: Database,\n params: {\n eventId: number\n did: string\n recordPath: string\n tags: string[]\n expiresAt: string\n createdBy: string\n },\n): Promise<void> {\n await db.db\n .insertInto('expiring_tag')\n .values(\n params.tags.map((tag) => ({\n eventId: params.eventId,\n did: params.did,\n recordPath: params.recordPath,\n tag,\n expiresAt: params.expiresAt,\n createdBy: params.createdBy,\n })),\n )\n .execute()\n}\n\nexport async function removeExpiringTags(\n db: Database,\n params: {\n did: string\n recordPath: string\n tags: string[]\n },\n): Promise<void> {\n await db.db\n .deleteFrom('expiring_tag')\n .where('did', '=', params.did)\n .where('recordPath', '=', params.recordPath)\n .where('tag', 'in', params.tags)\n .execute()\n}\n\nexport async function deleteExpiringTagsByIds(\n db: Database,\n ids: number[],\n): Promise<void> {\n await db.db.deleteFrom('expiring_tag').where('id', 'in', ids).execute()\n}\n\nexport async function getExpiredTags(\n db: Database,\n): Promise<ExpiringTagGroup[]> {\n const now = new Date().toISOString()\n const rows = await db.db\n .selectFrom('expiring_tag')\n .where('expiresAt', '<', now)\n .selectAll()\n .execute()\n\n if (!rows.length) return []\n\n // Group by (did, recordPath, createdBy) so each reversal event has the correct author\n const grouped = new Map<string, ExpiringTagGroup>()\n for (const row of rows) {\n const key = `${row.did}|${row.recordPath}|${row.createdBy}`\n let group = grouped.get(key)\n if (!group) {\n group = {\n did: row.did,\n recordPath: row.recordPath,\n createdBy: row.createdBy,\n tags: [],\n ids: [],\n }\n grouped.set(key, group)\n }\n if (!group.tags.includes(row.tag)) {\n group.tags.push(row.tag)\n }\n group.ids.push(row.id)\n }\n\n return [...grouped.values()]\n}\n"]}
1
+ {"version":3,"file":"expiring-tags.js","sourceRoot":"","sources":["../../src/mod-service/expiring-tags.ts"],"names":[],"mappings":"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","sourcesContent":["import { Selectable } from 'kysely'\nimport { Database } from '../db/index.js'\nimport { ExpiringTag } from '../db/schema/expiring_tag.js'\n\nexport type ExpiringTagRow = Selectable<ExpiringTag>\n\nexport type ExpiringTagGroup = {\n did: string\n recordPath: string\n convoId: string\n createdBy: string\n tags: string[]\n ids: number[]\n}\n\nexport async function insertExpiringTags(\n db: Database,\n params: {\n eventId: number\n did: string\n recordPath: string\n convoId: string\n tags: string[]\n expiresAt: string\n createdBy: string\n },\n): Promise<void> {\n await db.db\n .insertInto('expiring_tag')\n .values(\n params.tags.map((tag) => ({\n eventId: params.eventId,\n did: params.did,\n recordPath: params.recordPath,\n convoId: params.convoId,\n tag,\n expiresAt: params.expiresAt,\n createdBy: params.createdBy,\n })),\n )\n .execute()\n}\n\nexport async function removeExpiringTags(\n db: Database,\n params: {\n did: string\n recordPath: string\n convoId: string\n tags: string[]\n },\n): Promise<void> {\n await db.db\n .deleteFrom('expiring_tag')\n .where('did', '=', params.did)\n .where('recordPath', '=', params.recordPath)\n .where('convoId', '=', params.convoId)\n .where('tag', 'in', params.tags)\n .execute()\n}\n\nexport async function deleteExpiringTagsByIds(\n db: Database,\n ids: number[],\n): Promise<void> {\n await db.db.deleteFrom('expiring_tag').where('id', 'in', ids).execute()\n}\n\nexport async function getExpiredTags(\n db: Database,\n): Promise<ExpiringTagGroup[]> {\n const now = new Date().toISOString()\n const rows = await db.db\n .selectFrom('expiring_tag')\n .where('expiresAt', '<', now)\n .selectAll()\n .execute()\n\n if (!rows.length) return []\n\n // Group by (did, recordPath, convoId, createdBy) so each reversal event has the correct author\n const grouped = new Map<string, ExpiringTagGroup>()\n for (const row of rows) {\n const key = `${row.did}|${row.recordPath}|${row.convoId}|${row.createdBy}`\n let group = grouped.get(key)\n if (!group) {\n group = {\n did: row.did,\n recordPath: row.recordPath,\n convoId: row.convoId,\n createdBy: row.createdBy,\n tags: [],\n ids: [],\n }\n grouped.set(key, group)\n }\n if (!group.tags.includes(row.tag)) {\n group.tags.push(row.tag)\n }\n group.ids.push(row.id)\n }\n\n return [...grouped.values()]\n}\n"]}
@@ -100,6 +100,7 @@ export declare class ModerationService {
100
100
  hostingDeactivatedAt: string | null;
101
101
  hostingReactivatedAt: string | null;
102
102
  ageAssuranceState: string;
103
+ convoId: string;
103
104
  priorityScore: number | undefined;
104
105
  ageAssuranceUpdatedBy: string | null | undefined;
105
106
  }[]>;
@@ -119,7 +120,7 @@ export declare class ModerationService {
119
120
  getLastReversibleEventForSubject(subject: ReversalSubject): Promise<{
120
121
  id: number;
121
122
  action: "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";
122
- subjectType: "com.atproto.repo.strongRef" | "com.atproto.admin.defs#repoRef" | "chat.bsky.convo.defs#messageRef";
123
+ subjectType: "com.atproto.repo.strongRef" | "com.atproto.admin.defs#repoRef" | "chat.bsky.convo.defs#convoRef" | "chat.bsky.convo.defs#messageRef";
123
124
  subjectDid: string;
124
125
  subjectUri: string | null;
125
126
  subjectCid: string | null;
@@ -144,6 +145,7 @@ export declare class ModerationService {
144
145
  strikeCount: number | null;
145
146
  strikeExpiresAt: string | null;
146
147
  externalId: string | null;
148
+ subjectConvoId: string | null;
147
149
  } | null | undefined>;
148
150
  getSubjectsDueForReversal(): Promise<ReversalSubject[]>;
149
151
  isSubjectSuspended(did: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mod-service/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mod-service/index.ts"],"names":[],"mappings":"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"}
@@ -72,23 +72,39 @@ export class ModerationService {
72
72
  let builder = this.db.db.selectFrom('moderation_event').selectAll();
73
73
  if (subject) {
74
74
  const isSubjectAtUri = subject.startsWith('at://');
75
+ const subjectAtUri = isSubjectAtUri ? new AtUri(subject) : null;
75
76
  const subjectDid = isSubjectAtUri ? new AtUri(subject).hostname : subject;
76
77
  const subjectUri = isSubjectAtUri ? subject : null;
77
78
  // regardless of subjectUri check, we always want to query against subjectDid column since that's indexed
78
79
  builder = builder.where('subjectDid', '=', subjectDid);
79
- // if requester wants to include all user records, let's ignore matching on subjectUri
80
+ // subjectUri or subjectConvoId
80
81
  if (!includeAllUserRecords) {
81
- builder = builder
82
- .if(!subjectUri, (q) => q.where('subjectUri', 'is', null))
83
- .if(!!subjectUri, (q) => q.where('subjectUri', '=', subjectUri));
82
+ if (subjectAtUri?.collection === 'chat.bsky.convo') {
83
+ builder = builder.where('subjectConvoId', '=', subjectAtUri.rkey);
84
+ }
85
+ else if (subjectUri) {
86
+ builder = builder.where('subjectUri', '=', subjectUri);
87
+ }
88
+ else {
89
+ // Account-level: subjectUri IS NULL also matches conversation events,
90
+ // so explicitly exclude them.
91
+ builder = builder
92
+ .where('subjectUri', 'is', null)
93
+ .where('subjectConvoId', 'is', null);
94
+ }
84
95
  }
85
96
  }
86
97
  else if (subjectType === 'account') {
87
- builder = builder.where('subjectUri', 'is', null);
98
+ builder = builder
99
+ .where('subjectUri', 'is', null)
100
+ .where('subjectConvoId', 'is', null);
88
101
  }
89
102
  else if (subjectType === 'record') {
90
103
  builder = builder.where('subjectUri', 'is not', null);
91
104
  }
105
+ else if (subjectType === 'conversation') {
106
+ builder = builder.where('subjectConvoId', 'is not', null);
107
+ }
92
108
  // If subjectType is set to 'account' let that take priority and ignore collections filter
93
109
  if (collections.length && subjectType !== 'account') {
94
110
  builder = builder.where('subjectUri', 'is not', null).where((qb) => {
@@ -245,7 +261,7 @@ export class ModerationService {
245
261
  const subjectsToBeResolved = await this.db.db
246
262
  .selectFrom('moderation_subject_status')
247
263
  .where('did', '=', did)
248
- .where('recordPath', '!=', '')
264
+ .where((qb) => qb.where('recordPath', '!=', '').orWhere('convoId', '!=', ''))
249
265
  .where('reviewState', 'in', [REVIEWESCALATED, REVIEWOPEN])
250
266
  .selectAll()
251
267
  .execute();
@@ -449,6 +465,7 @@ export class ModerationService {
449
465
  subjectCid: subjectInfo.subjectCid,
450
466
  subjectBlobCids: jsonb(subjectInfo.subjectBlobCids),
451
467
  subjectMessageId: subjectInfo.subjectMessageId,
468
+ subjectConvoId: subjectInfo.subjectConvoId,
452
469
  modTool: modTool ? jsonb(modTool) : null,
453
470
  externalId: externalId ?? null,
454
471
  severityLevel,
@@ -466,6 +483,7 @@ export class ModerationService {
466
483
  eventId: modEvent.id,
467
484
  did: subjectInfo.subjectDid,
468
485
  recordPath: subjectInfo.subjectUri ?? '',
486
+ convoId: subjectInfo.subjectConvoId ?? '',
469
487
  tags: event.add,
470
488
  expiresAt,
471
489
  createdBy,
@@ -475,6 +493,7 @@ export class ModerationService {
475
493
  await removeExpiringTags(this.db, {
476
494
  did: subjectInfo.subjectDid,
477
495
  recordPath: subjectInfo.subjectUri ?? '',
496
+ convoId: subjectInfo.subjectConvoId ?? '',
478
497
  tags: event.remove,
479
498
  });
480
499
  }
@@ -551,6 +570,7 @@ export class ModerationService {
551
570
  .selectFrom('moderation_subject_status')
552
571
  .where('did', '=', did)
553
572
  .where('recordPath', '=', '')
573
+ .where('convoId', '=', '')
554
574
  .where('suspendUntil', '>', new Date().toISOString())
555
575
  .select('did')
556
576
  .limit(1)
@@ -733,17 +753,32 @@ export class ModerationService {
733
753
  const subjectInfo = getStatusIdentifierFromSubject(subject);
734
754
  builder = builder.where('moderation_subject_status.did', '=', subjectInfo.did);
735
755
  if (!includeAllUserRecords) {
736
- builder = builder.where((qb) => subjectInfo.recordPath
737
- ? qb.where('moderation_subject_status.recordPath', '=', subjectInfo.recordPath)
738
- : qb.where('moderation_subject_status.recordPath', '=', ''));
756
+ if (subjectInfo.convoId) {
757
+ builder = builder.where('moderation_subject_status.convoId', '=', subjectInfo.convoId);
758
+ }
759
+ else if (subjectInfo.recordPath) {
760
+ builder = builder.where('moderation_subject_status.recordPath', '=', subjectInfo.recordPath);
761
+ }
762
+ else {
763
+ // Account-level: recordPath = '' also matches conversation statuses,
764
+ // so explicitly exclude them.
765
+ builder = builder
766
+ .where('moderation_subject_status.recordPath', '=', '')
767
+ .where('moderation_subject_status.convoId', '=', '');
768
+ }
739
769
  }
740
770
  }
741
771
  else if (subjectType === 'account') {
742
- builder = builder.where('moderation_subject_status.recordPath', '=', '');
772
+ builder = builder
773
+ .where('moderation_subject_status.recordPath', '=', '')
774
+ .where('moderation_subject_status.convoId', '=', '');
743
775
  }
744
776
  else if (subjectType === 'record') {
745
777
  builder = builder.where('moderation_subject_status.recordPath', '!=', '');
746
778
  }
779
+ else if (subjectType === 'conversation') {
780
+ builder = builder.where('moderation_subject_status.convoId', '!=', '');
781
+ }
747
782
  // Only fetch items that belongs to the specified queue when specified
748
783
  if (!subject &&
749
784
  queueCount &&
@@ -895,6 +930,7 @@ export class ModerationService {
895
930
  .selectFrom('moderation_subject_status')
896
931
  .where('did', '=', subject.did)
897
932
  .where('recordPath', '=', subject.recordPath ?? '')
933
+ .where('convoId', '=', subject.convoId ?? '')
898
934
  .selectAll()
899
935
  .executeTakeFirst();
900
936
  return result ?? null;
@@ -906,6 +942,7 @@ export class ModerationService {
906
942
  .selectFrom('moderation_subject_status')
907
943
  .where('did', '=', did)
908
944
  .where('recordPath', '=', '')
945
+ .where('convoId', '=', '')
909
946
  .where('muteReportingUntil', '>', new Date().toISOString())
910
947
  .select(sql `true`.as('status'))
911
948
  .executeTakeFirst();
@@ -917,6 +954,7 @@ export class ModerationService {
917
954
  .selectFrom('moderation_subject_status')
918
955
  .where('did', '=', did)
919
956
  .where('recordPath', '=', '')
957
+ .where('convoId', '=', '')
920
958
  .where('muteUntil', '>', new Date().toISOString())
921
959
  .select(sql `true`.as('status'))
922
960
  .executeTakeFirst();