@atproto/ozone 0.1.106 → 0.1.108

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 (215) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +6 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/proxied.d.ts.map +1 -1
  6. package/dist/api/proxied.js +29 -16
  7. package/dist/api/proxied.js.map +1 -1
  8. package/dist/api/server/getConfig.d.ts.map +1 -1
  9. package/dist/api/server/getConfig.js +1 -0
  10. package/dist/api/server/getConfig.js.map +1 -1
  11. package/dist/api/setting/removeOptions.d.ts.map +1 -1
  12. package/dist/api/setting/removeOptions.js +1 -0
  13. package/dist/api/setting/removeOptions.js.map +1 -1
  14. package/dist/api/setting/upsertOption.js +7 -0
  15. package/dist/api/setting/upsertOption.js.map +1 -1
  16. package/dist/api/util.d.ts +1 -1
  17. package/dist/api/util.d.ts.map +1 -1
  18. package/dist/api/util.js +6 -1
  19. package/dist/api/util.js.map +1 -1
  20. package/dist/api/verification/grantVerifications.d.ts +4 -0
  21. package/dist/api/verification/grantVerifications.d.ts.map +1 -0
  22. package/dist/api/verification/grantVerifications.js +52 -0
  23. package/dist/api/verification/grantVerifications.js.map +1 -0
  24. package/dist/api/verification/listVerifications.d.ts +4 -0
  25. package/dist/api/verification/listVerifications.d.ts.map +1 -0
  26. package/dist/api/verification/listVerifications.js +32 -0
  27. package/dist/api/verification/listVerifications.js.map +1 -0
  28. package/dist/api/verification/revokeVerifications.d.ts +4 -0
  29. package/dist/api/verification/revokeVerifications.d.ts.map +1 -0
  30. package/dist/api/verification/revokeVerifications.js +36 -0
  31. package/dist/api/verification/revokeVerifications.js.map +1 -0
  32. package/dist/auth-verifier.d.ts +4 -1
  33. package/dist/auth-verifier.d.ts.map +1 -1
  34. package/dist/auth-verifier.js +4 -3
  35. package/dist/auth-verifier.js.map +1 -1
  36. package/dist/background.d.ts +3 -1
  37. package/dist/background.d.ts.map +1 -1
  38. package/dist/background.js +3 -2
  39. package/dist/background.js.map +1 -1
  40. package/dist/config/config.d.ts +9 -0
  41. package/dist/config/config.d.ts.map +1 -1
  42. package/dist/config/config.js +10 -0
  43. package/dist/config/config.js.map +1 -1
  44. package/dist/config/env.d.ts +5 -0
  45. package/dist/config/env.d.ts.map +1 -1
  46. package/dist/config/env.js +5 -0
  47. package/dist/config/env.js.map +1 -1
  48. package/dist/context.d.ts +6 -0
  49. package/dist/context.d.ts.map +1 -1
  50. package/dist/context.js +12 -0
  51. package/dist/context.js.map +1 -1
  52. package/dist/daemon/context.d.ts +3 -0
  53. package/dist/daemon/context.d.ts.map +1 -1
  54. package/dist/daemon/context.js +11 -0
  55. package/dist/daemon/context.js.map +1 -1
  56. package/dist/daemon/verification-listener.d.ts +29 -0
  57. package/dist/daemon/verification-listener.d.ts.map +1 -0
  58. package/dist/daemon/verification-listener.js +171 -0
  59. package/dist/daemon/verification-listener.js.map +1 -0
  60. package/dist/db/migrations/20250415T201720309Z-verification.d.ts +4 -0
  61. package/dist/db/migrations/20250415T201720309Z-verification.d.ts.map +1 -0
  62. package/dist/db/migrations/20250415T201720309Z-verification.js +35 -0
  63. package/dist/db/migrations/20250415T201720309Z-verification.js.map +1 -0
  64. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.d.ts +4 -0
  65. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.d.ts.map +1 -0
  66. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.js +17 -0
  67. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.js.map +1 -0
  68. package/dist/db/migrations/index.d.ts +2 -0
  69. package/dist/db/migrations/index.d.ts.map +1 -1
  70. package/dist/db/migrations/index.js +3 -1
  71. package/dist/db/migrations/index.js.map +1 -1
  72. package/dist/db/pagination.d.ts +15 -0
  73. package/dist/db/pagination.d.ts.map +1 -1
  74. package/dist/db/pagination.js +23 -1
  75. package/dist/db/pagination.js.map +1 -1
  76. package/dist/db/schema/firehose_cursor.d.ts +11 -0
  77. package/dist/db/schema/firehose_cursor.d.ts.map +1 -0
  78. package/dist/db/schema/firehose_cursor.js +5 -0
  79. package/dist/db/schema/firehose_cursor.js.map +1 -0
  80. package/dist/db/schema/index.d.ts +3 -1
  81. package/dist/db/schema/index.d.ts.map +1 -1
  82. package/dist/db/schema/member.d.ts +1 -1
  83. package/dist/db/schema/member.d.ts.map +1 -1
  84. package/dist/db/schema/verification.d.ts +19 -0
  85. package/dist/db/schema/verification.d.ts.map +1 -0
  86. package/dist/db/schema/verification.js +5 -0
  87. package/dist/db/schema/verification.js.map +1 -0
  88. package/dist/jetstream/service.d.ts +64 -0
  89. package/dist/jetstream/service.d.ts.map +1 -0
  90. package/dist/jetstream/service.js +65 -0
  91. package/dist/jetstream/service.js.map +1 -0
  92. package/dist/lexicon/index.d.ts +19 -0
  93. package/dist/lexicon/index.d.ts.map +1 -1
  94. package/dist/lexicon/index.js +56 -1
  95. package/dist/lexicon/index.js.map +1 -1
  96. package/dist/lexicon/lexicons.d.ts +976 -80
  97. package/dist/lexicon/lexicons.d.ts.map +1 -1
  98. package/dist/lexicon/lexicons.js +485 -1
  99. package/dist/lexicon/lexicons.js.map +1 -1
  100. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts +1 -1
  101. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts.map +1 -1
  102. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.d.ts +81 -0
  103. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.d.ts.map +1 -0
  104. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js +61 -0
  105. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js.map +1 -0
  106. package/dist/lexicon/types/tools/ozone/server/getConfig.d.ts +3 -1
  107. package/dist/lexicon/types/tools/ozone/server/getConfig.d.ts.map +1 -1
  108. package/dist/lexicon/types/tools/ozone/server/getConfig.js.map +1 -1
  109. package/dist/lexicon/types/tools/ozone/setting/defs.d.ts +1 -1
  110. package/dist/lexicon/types/tools/ozone/setting/defs.d.ts.map +1 -1
  111. package/dist/lexicon/types/tools/ozone/setting/defs.js.map +1 -1
  112. package/dist/lexicon/types/tools/ozone/setting/upsertOption.d.ts +1 -1
  113. package/dist/lexicon/types/tools/ozone/setting/upsertOption.d.ts.map +1 -1
  114. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts +1 -1
  115. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts.map +1 -1
  116. package/dist/lexicon/types/tools/ozone/team/defs.d.ts +3 -1
  117. package/dist/lexicon/types/tools/ozone/team/defs.d.ts.map +1 -1
  118. package/dist/lexicon/types/tools/ozone/team/defs.js +3 -1
  119. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -1
  120. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts +1 -1
  121. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts.map +1 -1
  122. package/dist/lexicon/types/tools/ozone/verification/defs.d.ts +43 -0
  123. package/dist/lexicon/types/tools/ozone/verification/defs.d.ts.map +1 -0
  124. package/dist/lexicon/types/tools/ozone/verification/defs.js +16 -0
  125. package/dist/lexicon/types/tools/ozone/verification/defs.js.map +1 -0
  126. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.d.ts +66 -0
  127. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.d.ts.map +1 -0
  128. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js +25 -0
  129. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js.map +1 -0
  130. package/dist/lexicon/types/tools/ozone/verification/listVerifications.d.ts +52 -0
  131. package/dist/lexicon/types/tools/ozone/verification/listVerifications.d.ts.map +1 -0
  132. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js +7 -0
  133. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js.map +1 -0
  134. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.d.ts +56 -0
  135. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.d.ts.map +1 -0
  136. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js +16 -0
  137. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js.map +1 -0
  138. package/dist/logger.d.ts +1 -0
  139. package/dist/logger.d.ts.map +1 -1
  140. package/dist/logger.js +2 -1
  141. package/dist/logger.js.map +1 -1
  142. package/dist/mod-service/index.d.ts.map +1 -1
  143. package/dist/mod-service/index.js +58 -21
  144. package/dist/mod-service/index.js.map +1 -1
  145. package/dist/mod-service/status.d.ts +6 -0
  146. package/dist/mod-service/status.d.ts.map +1 -1
  147. package/dist/team/index.d.ts +1 -0
  148. package/dist/team/index.d.ts.map +1 -1
  149. package/dist/team/index.js +3 -0
  150. package/dist/team/index.js.map +1 -1
  151. package/dist/verification/issuer.d.ts +37 -0
  152. package/dist/verification/issuer.d.ts.map +1 -0
  153. package/dist/verification/issuer.js +119 -0
  154. package/dist/verification/issuer.js.map +1 -0
  155. package/dist/verification/service.d.ts +47 -0
  156. package/dist/verification/service.d.ts.map +1 -0
  157. package/dist/verification/service.js +141 -0
  158. package/dist/verification/service.js.map +1 -0
  159. package/dist/verification/util.d.ts +6 -0
  160. package/dist/verification/util.d.ts.map +1 -0
  161. package/dist/verification/util.js +32 -0
  162. package/dist/verification/util.js.map +1 -0
  163. package/package.json +5 -4
  164. package/src/api/index.ts +6 -0
  165. package/src/api/proxied.ts +39 -24
  166. package/src/api/server/getConfig.ts +1 -0
  167. package/src/api/setting/removeOptions.ts +1 -0
  168. package/src/api/setting/upsertOption.ts +7 -0
  169. package/src/api/util.ts +7 -1
  170. package/src/api/verification/grantVerifications.ts +74 -0
  171. package/src/api/verification/listVerifications.ts +44 -0
  172. package/src/api/verification/revokeVerifications.ts +43 -0
  173. package/src/auth-verifier.ts +8 -4
  174. package/src/background.ts +7 -2
  175. package/src/config/config.ts +21 -0
  176. package/src/config/env.ts +10 -0
  177. package/src/context.ts +22 -0
  178. package/src/daemon/context.ts +19 -0
  179. package/src/daemon/verification-listener.ts +164 -0
  180. package/src/db/migrations/20250415T201720309Z-verification.ts +34 -0
  181. package/src/db/migrations/20250417T201720309Z-firehose-cursor.ts +16 -0
  182. package/src/db/migrations/index.ts +2 -0
  183. package/src/db/pagination.ts +31 -0
  184. package/src/db/schema/firehose_cursor.ts +13 -0
  185. package/src/db/schema/index.ts +5 -1
  186. package/src/db/schema/member.ts +1 -0
  187. package/src/db/schema/verification.ts +21 -0
  188. package/src/jetstream/service.ts +110 -0
  189. package/src/lexicon/index.ts +69 -0
  190. package/src/lexicon/lexicons.ts +505 -1
  191. package/src/lexicon/types/chat/bsky/actor/defs.ts +1 -1
  192. package/src/lexicon/types/tools/ozone/hosting/getAccountHistory.ts +161 -0
  193. package/src/lexicon/types/tools/ozone/server/getConfig.ts +3 -0
  194. package/src/lexicon/types/tools/ozone/setting/defs.ts +1 -0
  195. package/src/lexicon/types/tools/ozone/setting/upsertOption.ts +1 -0
  196. package/src/lexicon/types/tools/ozone/team/addMember.ts +1 -0
  197. package/src/lexicon/types/tools/ozone/team/defs.ts +3 -0
  198. package/src/lexicon/types/tools/ozone/team/updateMember.ts +1 -0
  199. package/src/lexicon/types/tools/ozone/verification/defs.ts +59 -0
  200. package/src/lexicon/types/tools/ozone/verification/grantVerifications.ts +100 -0
  201. package/src/lexicon/types/tools/ozone/verification/listVerifications.ts +70 -0
  202. package/src/lexicon/types/tools/ozone/verification/revokeVerifications.ts +81 -0
  203. package/src/logger.ts +2 -0
  204. package/src/mod-service/index.ts +83 -30
  205. package/src/team/index.ts +4 -0
  206. package/src/verification/issuer.ts +135 -0
  207. package/src/verification/service.ts +208 -0
  208. package/src/verification/util.ts +50 -0
  209. package/tests/__snapshots__/verification-listener.test.ts.snap +146 -0
  210. package/tests/__snapshots__/verification.test.ts.snap +288 -0
  211. package/tests/get-reporter-stats.test.ts +24 -9
  212. package/tests/verification-listener.test.ts +102 -0
  213. package/tests/verification.test.ts +136 -0
  214. package/tsconfig.build.tsbuildinfo +1 -1
  215. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VerificationIssuer = void 0;
4
+ const api_1 = require("@atproto/api");
5
+ class VerificationIssuer {
6
+ constructor(verifierConfig) {
7
+ Object.defineProperty(this, "verifierConfig", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: verifierConfig
12
+ });
13
+ Object.defineProperty(this, "session", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: new api_1.CredentialSession(new URL(this.verifierConfig.url))
18
+ });
19
+ Object.defineProperty(this, "agent", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: new api_1.Agent(this.session)
24
+ });
25
+ }
26
+ static creator() {
27
+ return (verifierConfig) => new VerificationIssuer(verifierConfig);
28
+ }
29
+ async getAgent() {
30
+ if (!this.session.hasSession) {
31
+ await this.session.login({
32
+ identifier: this.verifierConfig.did,
33
+ password: this.verifierConfig.password,
34
+ });
35
+ }
36
+ // Trigger a test request to check if the session is still valid, if not, we will login again
37
+ try {
38
+ await this.agent.com.atproto.server.getSession();
39
+ }
40
+ catch (err) {
41
+ if (err.status === 401) {
42
+ await this.session.login({
43
+ identifier: this.verifierConfig.did,
44
+ password: this.verifierConfig.password,
45
+ });
46
+ }
47
+ }
48
+ return this.agent;
49
+ }
50
+ async verify(verifications) {
51
+ const grantedVerifications = [];
52
+ const failedVerifications = [];
53
+ const now = new Date().toISOString();
54
+ const agent = await this.getAgent();
55
+ await Promise.allSettled(verifications.map(async ({ displayName, handle, subject, createdAt }) => {
56
+ try {
57
+ const verificationRecord = {
58
+ createdAt: createdAt || now,
59
+ issuer: this.verifierConfig.did,
60
+ displayName,
61
+ handle,
62
+ subject,
63
+ };
64
+ const { data: { uri, cid }, } = await agent.com.atproto.repo.createRecord({
65
+ repo: this.verifierConfig.did,
66
+ record: verificationRecord,
67
+ collection: 'app.bsky.graph.verification',
68
+ });
69
+ grantedVerifications.push({
70
+ ...verificationRecord,
71
+ uri,
72
+ cid,
73
+ revokedAt: null,
74
+ updatedAt: now,
75
+ revokedBy: null,
76
+ revokeReason: null,
77
+ });
78
+ }
79
+ catch (err) {
80
+ failedVerifications.push({
81
+ $type: 'tools.ozone.verification.grantVerifications#grantError',
82
+ error: err.message,
83
+ subject,
84
+ });
85
+ return;
86
+ }
87
+ }));
88
+ return { grantedVerifications, failedVerifications };
89
+ }
90
+ async revoke({ uris }) {
91
+ const revokedVerifications = [];
92
+ const failedRevocations = [];
93
+ const agent = await this.getAgent();
94
+ await Promise.allSettled(uris.map(async (uri) => {
95
+ try {
96
+ const atUri = new api_1.AtUri(uri);
97
+ if (atUri.collection !== 'app.bsky.graph.verification') {
98
+ throw new Error(`Only verification records can be revoked`);
99
+ }
100
+ if (atUri.host !== this.verifierConfig.did) {
101
+ throw new Error(`Cannot revoke verification record ${uri} not issued by ${this.verifierConfig.did}`);
102
+ }
103
+ await agent.com.atproto.repo.deleteRecord({
104
+ collection: atUri.collection,
105
+ repo: this.verifierConfig.did,
106
+ rkey: atUri.rkey,
107
+ });
108
+ revokedVerifications.push(uri);
109
+ }
110
+ catch (err) {
111
+ failedRevocations.push({ uri, error: err.message });
112
+ return;
113
+ }
114
+ }));
115
+ return { revokedVerifications, failedRevocations };
116
+ }
117
+ }
118
+ exports.VerificationIssuer = VerificationIssuer;
119
+ //# sourceMappingURL=issuer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuer.js","sourceRoot":"","sources":["../../src/verification/issuer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { Selectable } from 'kysely';
2
+ import { $Typed, AppBskyActorDefs, ToolsOzoneModerationDefs, ToolsOzoneVerificationDefs } from '@atproto/api';
3
+ import { Database } from '../db';
4
+ import { Verification } from '../db/schema/verification';
5
+ export type VerificationServiceCreator = (db: Database) => VerificationService;
6
+ export declare class VerificationService {
7
+ db: Database;
8
+ constructor(db: Database);
9
+ static creator(): (db: Database) => VerificationService;
10
+ create(verifications: Pick<Verification, 'uri' | 'issuer' | 'subject' | 'handle' | 'displayName' | 'createdAt' | 'cid'>[]): Promise<Selectable<Verification>[]>;
11
+ markRevoked({ uris, revokedBy, revokedAt, revokeReason, }: {
12
+ uris: string[];
13
+ revokedBy?: string;
14
+ revokedAt?: string;
15
+ revokeReason?: string;
16
+ }): Promise<import("kysely").UpdateResult[] | undefined>;
17
+ list({ sortDirection, cursor, createdAfter, createdBefore, issuers, subjects, isRevoked, limit, }: {
18
+ sortDirection?: 'asc' | 'desc';
19
+ cursor?: string;
20
+ createdAfter?: string;
21
+ createdBefore?: string;
22
+ issuers?: string[];
23
+ subjects?: string[];
24
+ isRevoked?: boolean;
25
+ limit?: number;
26
+ }): Promise<{
27
+ verifications: {
28
+ createdAt: string;
29
+ updatedAt: string;
30
+ uri: string;
31
+ cid: string;
32
+ subject: string;
33
+ handle: string;
34
+ displayName: string;
35
+ issuer: string;
36
+ revokeReason: string | null;
37
+ revokedAt: string | null;
38
+ revokedBy: string | null;
39
+ }[];
40
+ cursor: string | undefined;
41
+ }>;
42
+ view(verifications: Selectable<Verification>[], repos: Map<string, $Typed<ToolsOzoneModerationDefs.RepoViewDetail> | $Typed<ToolsOzoneModerationDefs.RepoViewNotFound>>, profiles: Map<string, AppBskyActorDefs.ProfileViewDetailed>): $Typed<ToolsOzoneVerificationDefs.VerificationView>[];
43
+ getFirehoseCursor(): Promise<number | null>;
44
+ createFirehoseCursor(): Promise<import("kysely").InsertResult[]>;
45
+ updateFirehoseCursor(cursor: number): Promise<number | null | undefined>;
46
+ }
47
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/verification/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EACL,MAAM,EACN,gBAAgB,EAEhB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,MAAM,MAAM,0BAA0B,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,mBAAmB,CAAA;AAE9E,qBAAa,mBAAmB;IACX,EAAE,EAAE,QAAQ;gBAAZ,EAAE,EAAE,QAAQ;IAE/B,MAAM,CAAC,OAAO,KACJ,IAAI,QAAQ;IAGhB,MAAM,CACV,aAAa,EAAE,IAAI,CACjB,YAAY,EACV,KAAK,GACL,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,aAAa,GACb,WAAW,GACX,KAAK,CACR,EAAE;IAYC,WAAW,CAAC,EAChB,IAAI,EACJ,SAAS,EACT,SAAS,EACT,YAAY,GACb,EAAE;QACD,IAAI,EAAE,MAAM,EAAE,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB;IAoBK,IAAI,CAAC,EACT,aAAa,EACb,MAAM,EACN,YAAY,EACZ,aAAa,EACb,OAAY,EACZ,QAAa,EACb,SAAS,EACT,KAAW,GACZ,EAAE;QACD,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf;;;;;;;;;;;;;;;;IAsCD,IAAI,CACF,aAAa,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,EACzC,KAAK,EAAE,GAAG,CACR,MAAM,EACJ,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC,GAC/C,MAAM,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CACpD,EACD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,GAC1D,MAAM,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,EAAE;IAoClD,iBAAiB;IAUvB,oBAAoB;IAWd,oBAAoB,CAAC,MAAM,EAAE,MAAM;CAa1C"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VerificationService = void 0;
4
+ const api_1 = require("@atproto/api");
5
+ const pagination_1 = require("../db/pagination");
6
+ class VerificationService {
7
+ constructor(db) {
8
+ Object.defineProperty(this, "db", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: db
13
+ });
14
+ }
15
+ static creator() {
16
+ return (db) => new VerificationService(db);
17
+ }
18
+ async create(verifications) {
19
+ return this.db.transaction(async (tx) => {
20
+ return tx.db
21
+ .insertInto('verification')
22
+ .values(verifications)
23
+ .onConflict((oc) => oc.doNothing())
24
+ .returningAll()
25
+ .execute();
26
+ });
27
+ }
28
+ async markRevoked({ uris, revokedBy, revokedAt, revokeReason, }) {
29
+ const now = new Date().toISOString();
30
+ return this.db.transaction(async (tx) => {
31
+ for (const uri of uris) {
32
+ return tx.db
33
+ .updateTable('verification')
34
+ .set({
35
+ revokeReason,
36
+ updatedAt: now,
37
+ revokedAt: revokedAt || now,
38
+ // Allow setting revokedBy to a moderator/verifier DID and if it isn't set, default to the author of the verification record
39
+ revokedBy: revokedBy || new api_1.AtUri(uri).host,
40
+ })
41
+ .where('uri', '=', uri)
42
+ .where('revokedAt', 'is', null)
43
+ .execute();
44
+ }
45
+ });
46
+ }
47
+ async list({ sortDirection, cursor, createdAfter, createdBefore, issuers = [], subjects = [], isRevoked, limit = 100, }) {
48
+ const { ref } = this.db.db.dynamic;
49
+ let qb = this.db.db.selectFrom('verification').selectAll();
50
+ if (issuers.length) {
51
+ qb = qb.where('issuer', 'in', issuers);
52
+ }
53
+ if (isRevoked !== undefined) {
54
+ qb = qb.where('revokedAt', isRevoked ? 'is not' : 'is', null);
55
+ }
56
+ if (subjects.length) {
57
+ qb = qb.where('subject', 'in', subjects);
58
+ }
59
+ if (createdAfter) {
60
+ qb = qb.where('createdAt', '>=', createdAfter);
61
+ }
62
+ if (createdBefore) {
63
+ qb = qb.where('createdAt', '<=', createdBefore);
64
+ }
65
+ const keyset = new pagination_1.CreatedAtUriKeyset(ref(`createdAt`), ref('uri'));
66
+ const paginatedBuilder = (0, pagination_1.paginate)(qb, {
67
+ limit,
68
+ cursor,
69
+ keyset,
70
+ tryIndex: true,
71
+ direction: sortDirection === 'desc' ? 'desc' : 'asc',
72
+ });
73
+ const result = await paginatedBuilder.execute();
74
+ return { verifications: result, cursor: keyset.packFromResult(result) };
75
+ }
76
+ view(verifications, repos, profiles) {
77
+ return verifications.map((verification) => {
78
+ const issuerRepo = repos.get(verification.issuer);
79
+ const subjectRepo = repos.get(verification.subject);
80
+ const subjectProfile = profiles.get(verification.subject);
81
+ const issuerProfile = profiles.get(verification.issuer);
82
+ return {
83
+ $type: 'tools.ozone.verification.defs#verificationView',
84
+ uri: verification.uri,
85
+ issuer: verification.issuer,
86
+ subject: verification.subject,
87
+ createdAt: verification.createdAt,
88
+ displayName: verification.displayName,
89
+ handle: verification.handle,
90
+ updatedAt: verification.updatedAt || undefined,
91
+ revokedAt: verification.revokedAt || undefined,
92
+ revokedBy: verification.revokedBy || undefined,
93
+ revokeReason: verification.revokeReason || undefined,
94
+ issuerRepo,
95
+ subjectRepo,
96
+ subjectProfile: subjectProfile
97
+ ? {
98
+ $type: 'app.bsky.actor.defs#profileViewDetailed',
99
+ ...subjectProfile,
100
+ }
101
+ : undefined,
102
+ issuerProfile: issuerProfile
103
+ ? {
104
+ $type: 'app.bsky.actor.defs#profileViewDetailed',
105
+ ...issuerProfile,
106
+ }
107
+ : undefined,
108
+ };
109
+ });
110
+ }
111
+ async getFirehoseCursor() {
112
+ const entry = await this.db.db
113
+ .selectFrom('firehose_cursor')
114
+ .select('cursor')
115
+ .where('service', '=', 'verification')
116
+ .executeTakeFirst();
117
+ return entry?.cursor || null;
118
+ }
119
+ createFirehoseCursor() {
120
+ return this.db.db
121
+ .insertInto('firehose_cursor')
122
+ .values({
123
+ service: 'verification',
124
+ cursor: null,
125
+ })
126
+ .onConflict((oc) => oc.doNothing())
127
+ .execute();
128
+ }
129
+ async updateFirehoseCursor(cursor) {
130
+ const updated = await this.db.db
131
+ .updateTable('firehose_cursor')
132
+ .set({ cursor })
133
+ .where('service', '=', 'verification')
134
+ .where((qb) => qb.where('cursor', '<', cursor).orWhere('cursor', 'is', null))
135
+ .returningAll()
136
+ .executeTakeFirst();
137
+ return updated?.cursor;
138
+ }
139
+ }
140
+ exports.VerificationService = VerificationService;
141
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/verification/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { $Typed, ToolsOzoneModerationDefs } from '@atproto/api';
2
+ import { AppContext } from '../context';
3
+ import { ModerationService } from '../mod-service';
4
+ import { ParsedLabelers } from '../util';
5
+ export declare const getReposForVerifications: (ctx: AppContext, labelers: ParsedLabelers, modService: ModerationService, dids: string[], isModerator: boolean) => Promise<Map<string, $Typed<ToolsOzoneModerationDefs.RepoViewDetail> | $Typed<ToolsOzoneModerationDefs.RepoViewNotFound>>>;
6
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/verification/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAExC,eAAO,MAAM,wBAAwB,GACnC,KAAK,UAAU,EACf,UAAU,cAAc,EACxB,YAAY,iBAAiB,EAC7B,MAAM,MAAM,EAAE,EACd,aAAa,OAAO,8HAsCrB,CAAA"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getReposForVerifications = void 0;
4
+ const util_1 = require("../api/util");
5
+ const getReposForVerifications = async (ctx, labelers, modService, dids, isModerator) => {
6
+ const [partialRepos, accountInfo] = await Promise.all([
7
+ modService.views.repoDetails(dids, labelers),
8
+ (0, util_1.getPdsAccountInfos)(ctx, dids),
9
+ ]);
10
+ const repos = new Map(dids.map((did) => {
11
+ const partialRepo = partialRepos.get(did);
12
+ if (!partialRepo) {
13
+ return [
14
+ did,
15
+ {
16
+ did,
17
+ $type: 'tools.ozone.moderation.defs#repoViewNotFound',
18
+ },
19
+ ];
20
+ }
21
+ return [
22
+ did,
23
+ {
24
+ ...(0, util_1.addAccountInfoToRepoViewDetail)(partialRepo, accountInfo.get(did) || null, isModerator),
25
+ $type: 'tools.ozone.moderation.defs#repoViewDetail',
26
+ },
27
+ ];
28
+ }));
29
+ return repos;
30
+ };
31
+ exports.getReposForVerifications = getReposForVerifications;
32
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/verification/util.ts"],"names":[],"mappings":";;;AACA,sCAAgF;AAKzE,MAAM,wBAAwB,GAAG,KAAK,EAC3C,GAAe,EACf,QAAwB,EACxB,UAA6B,EAC7B,IAAc,EACd,WAAoB,EACpB,EAAE;IACF,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpD,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5C,IAAA,yBAAkB,EAAC,GAAG,EAAE,IAAI,CAAC;KAC9B,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,IAAI,GAAG,CAKnB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;gBACL,GAAG;gBACH;oBACE,GAAG;oBACH,KAAK,EAAE,8CAA8C;iBACtD;aACF,CAAA;QACH,CAAC;QACD,OAAO;YACL,GAAG;YACH;gBACE,GAAG,IAAA,qCAA8B,EAC/B,WAAW,EACX,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAC5B,WAAW,CACZ;gBACD,KAAK,EAAE,4CAA4C;aACpD;SACF,CAAA;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AA3CY,QAAA,wBAAwB,4BA2CpC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/ozone",
3
- "version": "0.1.106",
3
+ "version": "0.1.108",
4
4
  "license": "MIT",
5
5
  "description": "Backend service for moderating the Bluesky network.",
6
6
  "keywords": [
@@ -34,14 +34,15 @@
34
34
  "typed-emitter": "^2.1.0",
35
35
  "uint8arrays": "3.0.0",
36
36
  "undici": "^6.14.1",
37
- "@atproto/api": "^0.15.3",
37
+ "ws": "^8.12.0",
38
+ "@atproto/api": "^0.15.5",
38
39
  "@atproto/common": "^0.4.10",
39
40
  "@atproto/crypto": "^0.4.4",
40
41
  "@atproto/identity": "^0.4.7",
41
42
  "@atproto/lexicon": "^0.4.10",
42
43
  "@atproto/syntax": "^0.4.0",
43
44
  "@atproto/xrpc": "^0.6.12",
44
- "@atproto/xrpc-server": "^0.7.15"
45
+ "@atproto/xrpc-server": "^0.7.17"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@did-plc/server": "^0.0.1",
@@ -54,7 +55,7 @@
54
55
  "ts-node": "^10.8.2",
55
56
  "typescript": "^5.6.3",
56
57
  "@atproto/lex-cli": "^0.8.0",
57
- "@atproto/pds": "^0.4.131"
58
+ "@atproto/pds": "^0.4.134"
58
59
  },
59
60
  "scripts": {
60
61
  "codegen": "lex gen-server --yes ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*",
package/src/api/index.ts CHANGED
@@ -35,6 +35,9 @@ import addMember from './team/addMember'
35
35
  import deleteMember from './team/deleteMember'
36
36
  import listMembers from './team/listMembers'
37
37
  import updateMember from './team/updateMember'
38
+ import grantVerifications from './verification/grantVerifications'
39
+ import listVerifications from './verification/listVerifications'
40
+ import revokeVerifications from './verification/revokeVerifications'
38
41
 
39
42
  export * as health from './health'
40
43
 
@@ -76,5 +79,8 @@ export default function (server: Server, ctx: AppContext) {
76
79
  removeOptions(server, ctx)
77
80
  getReporterStats(server, ctx)
78
81
  getSubjects(server, ctx)
82
+ grantVerifications(server, ctx)
83
+ revokeVerifications(server, ctx)
84
+ listVerifications(server, ctx)
79
85
  return server
80
86
  }
@@ -6,7 +6,7 @@ export default function (server: Server, ctx: AppContext) {
6
6
  server.app.bsky.actor.getProfile({
7
7
  auth: ctx.authVerifier.moderator,
8
8
  handler: async (request) => {
9
- const res = await ctx.appviewAgent.api.app.bsky.actor.getProfile(
9
+ const res = await ctx.appviewAgent.app.bsky.actor.getProfile(
10
10
  request.params,
11
11
  await ctx.appviewAuth(ids.AppBskyActorGetProfile),
12
12
  )
@@ -20,7 +20,7 @@ export default function (server: Server, ctx: AppContext) {
20
20
  server.app.bsky.actor.getProfiles({
21
21
  auth: ctx.authVerifier.modOrAdminToken,
22
22
  handler: async (request) => {
23
- const res = await ctx.appviewAgent.api.app.bsky.actor.getProfiles(
23
+ const res = await ctx.appviewAgent.app.bsky.actor.getProfiles(
24
24
  request.params,
25
25
  await ctx.appviewAuth(ids.AppBskyActorGetProfiles),
26
26
  )
@@ -34,7 +34,7 @@ export default function (server: Server, ctx: AppContext) {
34
34
  server.app.bsky.feed.getAuthorFeed({
35
35
  auth: ctx.authVerifier.modOrAdminToken,
36
36
  handler: async (request) => {
37
- const res = await ctx.appviewAgent.api.app.bsky.feed.getAuthorFeed(
37
+ const res = await ctx.appviewAgent.app.bsky.feed.getAuthorFeed(
38
38
  request.params,
39
39
  await ctx.appviewAuth(ids.AppBskyFeedGetAuthorFeed),
40
40
  )
@@ -48,7 +48,7 @@ export default function (server: Server, ctx: AppContext) {
48
48
  server.app.bsky.feed.searchPosts({
49
49
  auth: ctx.authVerifier.moderator,
50
50
  handler: async (request) => {
51
- const res = await ctx.appviewAgent.api.app.bsky.feed.searchPosts(
51
+ const res = await ctx.appviewAgent.app.bsky.feed.searchPosts(
52
52
  request.params,
53
53
  await ctx.appviewAuth(ids.AppBskyFeedSearchPosts),
54
54
  )
@@ -62,7 +62,7 @@ export default function (server: Server, ctx: AppContext) {
62
62
  server.app.bsky.feed.getPostThread({
63
63
  auth: ctx.authVerifier.modOrAdminToken,
64
64
  handler: async (request) => {
65
- const res = await ctx.appviewAgent.api.app.bsky.feed.getPostThread(
65
+ const res = await ctx.appviewAgent.app.bsky.feed.getPostThread(
66
66
  request.params,
67
67
  await ctx.appviewAuth(ids.AppBskyFeedGetPostThread),
68
68
  )
@@ -76,7 +76,7 @@ export default function (server: Server, ctx: AppContext) {
76
76
  server.app.bsky.feed.getFeedGenerator({
77
77
  auth: ctx.authVerifier.moderator,
78
78
  handler: async (request) => {
79
- const res = await ctx.appviewAgent.api.app.bsky.feed.getFeedGenerator(
79
+ const res = await ctx.appviewAgent.app.bsky.feed.getFeedGenerator(
80
80
  request.params,
81
81
  await ctx.appviewAuth(ids.AppBskyFeedGetFeedGenerator),
82
82
  )
@@ -90,7 +90,7 @@ export default function (server: Server, ctx: AppContext) {
90
90
  server.app.bsky.graph.getFollows({
91
91
  auth: ctx.authVerifier.modOrAdminToken,
92
92
  handler: async (request) => {
93
- const res = await ctx.appviewAgent.api.app.bsky.graph.getFollows(
93
+ const res = await ctx.appviewAgent.app.bsky.graph.getFollows(
94
94
  request.params,
95
95
  await ctx.appviewAuth(ids.AppBskyGraphGetFollows),
96
96
  )
@@ -104,7 +104,7 @@ export default function (server: Server, ctx: AppContext) {
104
104
  server.app.bsky.graph.getFollowers({
105
105
  auth: ctx.authVerifier.modOrAdminToken,
106
106
  handler: async (request) => {
107
- const res = await ctx.appviewAgent.api.app.bsky.graph.getFollowers(
107
+ const res = await ctx.appviewAgent.app.bsky.graph.getFollowers(
108
108
  request.params,
109
109
  await ctx.appviewAuth(ids.AppBskyGraphGetFollowers),
110
110
  )
@@ -118,7 +118,7 @@ export default function (server: Server, ctx: AppContext) {
118
118
  server.app.bsky.graph.getList({
119
119
  auth: ctx.authVerifier.modOrAdminToken,
120
120
  handler: async (request) => {
121
- const res = await ctx.appviewAgent.api.app.bsky.graph.getList(
121
+ const res = await ctx.appviewAgent.app.bsky.graph.getList(
122
122
  request.params,
123
123
  await ctx.appviewAuth(ids.AppBskyGraphGetList),
124
124
  )
@@ -132,7 +132,7 @@ export default function (server: Server, ctx: AppContext) {
132
132
  server.app.bsky.graph.getLists({
133
133
  auth: ctx.authVerifier.modOrAdminToken,
134
134
  handler: async (request) => {
135
- const res = await ctx.appviewAgent.api.app.bsky.graph.getLists(
135
+ const res = await ctx.appviewAgent.app.bsky.graph.getLists(
136
136
  request.params,
137
137
  await ctx.appviewAuth(ids.AppBskyGraphGetLists),
138
138
  )
@@ -149,7 +149,7 @@ export default function (server: Server, ctx: AppContext) {
149
149
  if (!ctx.pdsAgent) {
150
150
  throw new Error('PDS not configured')
151
151
  }
152
- const res = await ctx.pdsAgent.api.com.atproto.admin.searchAccounts(
152
+ const res = await ctx.pdsAgent.com.atproto.admin.searchAccounts(
153
153
  request.params,
154
154
  await ctx.pdsAuth(ids.ComAtprotoAdminSearchAccounts),
155
155
  )
@@ -160,6 +160,23 @@ export default function (server: Server, ctx: AppContext) {
160
160
  },
161
161
  })
162
162
 
163
+ server.tools.ozone.hosting.getAccountHistory({
164
+ auth: ctx.authVerifier.moderator,
165
+ handler: async (request) => {
166
+ if (!ctx.pdsAgent) {
167
+ throw new Error('PDS not configured')
168
+ }
169
+ const res = await ctx.pdsAgent.tools.ozone.hosting.getAccountHistory(
170
+ request.params,
171
+ await ctx.pdsAuth(ids.ToolsOzoneHostingGetAccountHistory),
172
+ )
173
+ return {
174
+ encoding: 'application/json',
175
+ body: res.data,
176
+ }
177
+ },
178
+ })
179
+
163
180
  server.tools.ozone.signature.findRelatedAccounts({
164
181
  auth: ctx.authVerifier.moderator,
165
182
  handler: async (request) => {
@@ -228,7 +245,7 @@ export default function (server: Server, ctx: AppContext) {
228
245
  server.app.bsky.graph.getStarterPacks({
229
246
  auth: ctx.authVerifier.modOrAdminToken,
230
247
  handler: async (request) => {
231
- const res = await ctx.appviewAgent.api.app.bsky.graph.getStarterPacks(
248
+ const res = await ctx.appviewAgent.app.bsky.graph.getStarterPacks(
232
249
  request.params,
233
250
  await ctx.appviewAuth(ids.AppBskyGraphGetStarterPacks),
234
251
  )
@@ -242,11 +259,10 @@ export default function (server: Server, ctx: AppContext) {
242
259
  server.app.bsky.graph.getActorStarterPacks({
243
260
  auth: ctx.authVerifier.modOrAdminToken,
244
261
  handler: async (request) => {
245
- const res =
246
- await ctx.appviewAgent.api.app.bsky.graph.getActorStarterPacks(
247
- request.params,
248
- await ctx.appviewAuth(ids.AppBskyGraphGetActorStarterPacks),
249
- )
262
+ const res = await ctx.appviewAgent.app.bsky.graph.getActorStarterPacks(
263
+ request.params,
264
+ await ctx.appviewAuth(ids.AppBskyGraphGetActorStarterPacks),
265
+ )
250
266
  return {
251
267
  encoding: 'application/json',
252
268
  body: res.data,
@@ -257,7 +273,7 @@ export default function (server: Server, ctx: AppContext) {
257
273
  server.app.bsky.feed.getLikes({
258
274
  auth: ctx.authVerifier.modOrAdminToken,
259
275
  handler: async (request) => {
260
- const res = await ctx.appviewAgent.api.app.bsky.feed.getLikes(
276
+ const res = await ctx.appviewAgent.app.bsky.feed.getLikes(
261
277
  request.params,
262
278
  await ctx.appviewAuth(ids.AppBskyFeedGetLikes),
263
279
  )
@@ -271,7 +287,7 @@ export default function (server: Server, ctx: AppContext) {
271
287
  server.app.bsky.feed.getRepostedBy({
272
288
  auth: ctx.authVerifier.moderator,
273
289
  handler: async (request) => {
274
- const res = await ctx.appviewAgent.api.app.bsky.feed.getRepostedBy(
290
+ const res = await ctx.appviewAgent.app.bsky.feed.getRepostedBy(
275
291
  request.params,
276
292
  await ctx.appviewAuth(ids.AppBskyFeedGetRepostedBy),
277
293
  )
@@ -285,11 +301,10 @@ export default function (server: Server, ctx: AppContext) {
285
301
  server.app.bsky.actor.searchActorsTypeahead({
286
302
  auth: ctx.authVerifier.moderator,
287
303
  handler: async (request) => {
288
- const res =
289
- await ctx.appviewAgent.api.app.bsky.actor.searchActorsTypeahead(
290
- request.params,
291
- await ctx.appviewAuth(ids.AppBskyActorSearchActorsTypeahead),
292
- )
304
+ const res = await ctx.appviewAgent.app.bsky.actor.searchActorsTypeahead(
305
+ request.params,
306
+ await ctx.appviewAuth(ids.AppBskyActorSearchActorsTypeahead),
307
+ )
293
308
  return {
294
309
  encoding: 'application/json',
295
310
  body: res.data,
@@ -27,6 +27,7 @@ export default function (server: Server, ctx: AppContext) {
27
27
  ? TOOLS_OZONE_TEAM.DefsRoleModerator
28
28
  : TOOLS_OZONE_TEAM.DefsRoleTriage,
29
29
  },
30
+ verifierDid: ctx.cfg.verifier?.did || undefined,
30
31
  },
31
32
  }
32
33
  },
@@ -32,6 +32,7 @@ export default function (server: Server, ctx: AppContext) {
32
32
  'tools.ozone.team.defs#roleModerator',
33
33
  'tools.ozone.team.defs#roleTriage',
34
34
  'tools.ozone.team.defs#roleAdmin',
35
+ 'tools.ozone.team.defs#roleVerifier',
35
36
  ]
36
37
 
37
38
  if (access.type !== 'admin_token' && !access.isAdmin) {
@@ -118,6 +118,7 @@ const getRolesForInstanceOption = (
118
118
  ToolsOzoneTeamDefs.ROLEADMIN,
119
119
  ToolsOzoneTeamDefs.ROLEMODERATOR,
120
120
  ToolsOzoneTeamDefs.ROLETRIAGE,
121
+ ToolsOzoneTeamDefs.ROLEVERIFIER,
121
122
  ]
122
123
  if (access.type === 'admin_token') {
123
124
  return fullPermission
@@ -131,6 +132,10 @@ const getRolesForInstanceOption = (
131
132
  return [ToolsOzoneTeamDefs.ROLEMODERATOR, ToolsOzoneTeamDefs.ROLETRIAGE]
132
133
  }
133
134
 
135
+ if (access.isVerifier) {
136
+ return [ToolsOzoneTeamDefs.ROLEVERIFIER]
137
+ }
138
+
134
139
  return [ToolsOzoneTeamDefs.ROLETRIAGE]
135
140
  }
136
141
 
@@ -143,6 +148,8 @@ const getManagerRole = (role?: string) => {
143
148
  managerRole = ToolsOzoneTeamDefs.ROLEMODERATOR
144
149
  } else if (role === ToolsOzoneTeamDefs.ROLETRIAGE) {
145
150
  managerRole = ToolsOzoneTeamDefs.ROLETRIAGE
151
+ } else if (role === ToolsOzoneTeamDefs.ROLEVERIFIER) {
152
+ managerRole = ToolsOzoneTeamDefs.ROLEVERIFIER
146
153
  }
147
154
 
148
155
  return managerRole