@atproto/bsky 0.0.37 → 0.0.38

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 (138) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/api/app/bsky/feed/getAuthorFeed.d.ts +2 -3
  3. package/dist/api/app/bsky/feed/getListFeed.d.ts +2 -2
  4. package/dist/api/app/bsky/feed/getTimeline.d.ts +4 -2
  5. package/dist/api/app/bsky/labeler/getServices.d.ts +3 -0
  6. package/dist/api/util.d.ts +9 -2
  7. package/dist/auth-verifier.d.ts +1 -1
  8. package/dist/context.d.ts +3 -0
  9. package/dist/data-plane/server/db/database-schema.d.ts +2 -2
  10. package/dist/data-plane/server/db/migrations/20240226T225725627Z-labelers.d.ts +3 -0
  11. package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
  12. package/dist/data-plane/server/db/tables/labeler.d.ts +13 -0
  13. package/dist/data-plane/server/indexing/index.d.ts +2 -0
  14. package/dist/data-plane/server/indexing/plugins/labeler.d.ts +10 -0
  15. package/dist/data-plane/server/util.d.ts +6 -6
  16. package/dist/hydration/actor.d.ts +3 -0
  17. package/dist/hydration/hydrator.d.ts +27 -22
  18. package/dist/hydration/label.d.ts +23 -9
  19. package/dist/index.js +4068 -4641
  20. package/dist/index.js.map +3 -3
  21. package/dist/lexicon/index.d.ts +7 -27
  22. package/dist/lexicon/lexicons.d.ts +507 -1467
  23. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +23 -1
  24. package/dist/lexicon/types/app/bsky/embed/record.d.ts +2 -1
  25. package/dist/lexicon/types/app/bsky/feed/defs.d.ts +1 -0
  26. package/dist/lexicon/types/app/bsky/graph/defs.d.ts +3 -0
  27. package/dist/lexicon/types/app/bsky/labeler/defs.d.ts +41 -0
  28. package/dist/lexicon/types/{com/atproto/admin/searchRepos.d.ts → app/bsky/labeler/getServices.d.ts} +7 -7
  29. package/dist/lexicon/types/app/bsky/labeler/service.d.ts +14 -0
  30. package/dist/lexicon/types/com/atproto/admin/defs.d.ts +0 -304
  31. package/dist/lexicon/types/com/atproto/label/defs.d.ts +23 -0
  32. package/dist/proto/bsky_connect.d.ts +7 -1
  33. package/dist/proto/bsky_pb.d.ts +25 -0
  34. package/dist/util.d.ts +7 -0
  35. package/dist/views/index.d.ts +3 -0
  36. package/dist/views/types.d.ts +2 -1
  37. package/package.json +14 -13
  38. package/proto/bsky.proto +12 -0
  39. package/src/api/app/bsky/actor/getProfile.ts +21 -17
  40. package/src/api/app/bsky/actor/getProfiles.ts +16 -7
  41. package/src/api/app/bsky/actor/getSuggestions.ts +18 -13
  42. package/src/api/app/bsky/actor/searchActors.ts +9 -5
  43. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +12 -5
  44. package/src/api/app/bsky/feed/getActorFeeds.ts +16 -6
  45. package/src/api/app/bsky/feed/getActorLikes.ts +18 -8
  46. package/src/api/app/bsky/feed/getAuthorFeed.ts +18 -19
  47. package/src/api/app/bsky/feed/getFeed.ts +14 -7
  48. package/src/api/app/bsky/feed/getFeedGenerator.ts +8 -2
  49. package/src/api/app/bsky/feed/getFeedGenerators.ts +16 -5
  50. package/src/api/app/bsky/feed/getLikes.ts +13 -6
  51. package/src/api/app/bsky/feed/getListFeed.ts +13 -7
  52. package/src/api/app/bsky/feed/getPostThread.ts +15 -8
  53. package/src/api/app/bsky/feed/getPosts.ts +14 -5
  54. package/src/api/app/bsky/feed/getRepostedBy.ts +13 -6
  55. package/src/api/app/bsky/feed/getSuggestedFeeds.ts +8 -2
  56. package/src/api/app/bsky/feed/getTimeline.ts +14 -8
  57. package/src/api/app/bsky/feed/searchPosts.ts +9 -5
  58. package/src/api/app/bsky/graph/getBlocks.ts +10 -9
  59. package/src/api/app/bsky/graph/getFollowers.ts +23 -15
  60. package/src/api/app/bsky/graph/getFollows.ts +23 -15
  61. package/src/api/app/bsky/graph/getList.ts +14 -8
  62. package/src/api/app/bsky/graph/getListBlocks.ts +10 -7
  63. package/src/api/app/bsky/graph/getListMutes.ts +10 -7
  64. package/src/api/app/bsky/graph/getLists.ts +9 -7
  65. package/src/api/app/bsky/graph/getMutes.ts +10 -8
  66. package/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +10 -7
  67. package/src/api/app/bsky/graph/muteActor.ts +1 -1
  68. package/src/api/app/bsky/labeler/getServices.ts +46 -0
  69. package/src/api/app/bsky/notification/listNotifications.ts +12 -8
  70. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +6 -3
  71. package/src/api/com/atproto/admin/getAccountInfos.ts +10 -3
  72. package/src/api/index.ts +2 -0
  73. package/src/api/util.ts +19 -4
  74. package/src/auth-verifier.ts +2 -2
  75. package/src/context.ts +20 -0
  76. package/src/data-plane/server/db/database-schema.ts +4 -4
  77. package/src/data-plane/server/db/migrations/20240226T225725627Z-labelers.ts +27 -0
  78. package/src/data-plane/server/db/migrations/index.ts +1 -0
  79. package/src/data-plane/server/db/tables/labeler.ts +16 -0
  80. package/src/data-plane/server/indexing/index.ts +4 -0
  81. package/src/data-plane/server/indexing/plugins/labeler.ts +77 -0
  82. package/src/data-plane/server/routes/interactions.ts +17 -1
  83. package/src/data-plane/server/routes/profile.ts +15 -1
  84. package/src/data-plane/server/routes/records.ts +1 -0
  85. package/src/hydration/actor.ts +6 -0
  86. package/src/hydration/hydrator.ts +171 -97
  87. package/src/hydration/label.ts +106 -20
  88. package/src/index.ts +1 -3
  89. package/src/lexicon/index.ts +22 -137
  90. package/src/lexicon/lexicons.ts +502 -1598
  91. package/src/lexicon/types/app/bsky/actor/defs.ts +57 -1
  92. package/src/lexicon/types/app/bsky/embed/record.ts +2 -0
  93. package/src/lexicon/types/app/bsky/feed/defs.ts +1 -0
  94. package/src/lexicon/types/app/bsky/graph/defs.ts +3 -0
  95. package/src/lexicon/types/app/bsky/labeler/defs.ts +93 -0
  96. package/src/lexicon/types/{com/atproto/admin/searchRepos.ts → app/bsky/labeler/getServices.ts} +8 -8
  97. package/src/lexicon/types/app/bsky/labeler/service.ts +31 -0
  98. package/src/lexicon/types/com/atproto/admin/defs.ts +0 -694
  99. package/src/lexicon/types/com/atproto/label/defs.ts +78 -0
  100. package/src/proto/bsky_connect.ts +11 -0
  101. package/src/proto/bsky_pb.ts +146 -0
  102. package/src/util.ts +44 -0
  103. package/src/views/index.ts +76 -7
  104. package/src/views/types.ts +6 -3
  105. package/tests/__snapshots__/feed-generation.test.ts.snap +12 -0
  106. package/tests/_util.ts +21 -0
  107. package/tests/data-plane/__snapshots__/indexing.test.ts.snap +20 -0
  108. package/tests/label-hydration.test.ts +162 -0
  109. package/tests/views/__snapshots__/block-lists.test.ts.snap +7 -0
  110. package/tests/views/__snapshots__/labeler-service.test.ts.snap +160 -0
  111. package/tests/views/__snapshots__/mute-lists.test.ts.snap +10 -0
  112. package/tests/views/__snapshots__/profile.test.ts.snap +40 -0
  113. package/tests/views/__snapshots__/threadgating.test.ts.snap +2 -0
  114. package/tests/views/labeler-service.test.ts +156 -0
  115. package/tests/views/takedown-labels.test.ts +133 -0
  116. package/tests/views/timeline.test.ts +7 -2
  117. package/dist/data-plane/server/db/tables/moderation.d.ts +0 -42
  118. package/dist/lexicon/types/com/atproto/admin/createCommunicationTemplate.d.ts +0 -37
  119. package/dist/lexicon/types/com/atproto/admin/deleteCommunicationTemplate.d.ts +0 -25
  120. package/dist/lexicon/types/com/atproto/admin/emitModerationEvent.d.ts +0 -45
  121. package/dist/lexicon/types/com/atproto/admin/getModerationEvent.d.ts +0 -29
  122. package/dist/lexicon/types/com/atproto/admin/getRecord.d.ts +0 -31
  123. package/dist/lexicon/types/com/atproto/admin/getRepo.d.ts +0 -30
  124. package/dist/lexicon/types/com/atproto/admin/listCommunicationTemplates.d.ts +0 -31
  125. package/dist/lexicon/types/com/atproto/admin/queryModerationEvents.d.ts +0 -48
  126. package/dist/lexicon/types/com/atproto/admin/queryModerationStatuses.d.ts +0 -50
  127. package/dist/lexicon/types/com/atproto/admin/updateCommunicationTemplate.d.ts +0 -39
  128. package/src/data-plane/server/db/tables/moderation.ts +0 -59
  129. package/src/lexicon/types/com/atproto/admin/createCommunicationTemplate.ts +0 -54
  130. package/src/lexicon/types/com/atproto/admin/deleteCommunicationTemplate.ts +0 -38
  131. package/src/lexicon/types/com/atproto/admin/emitModerationEvent.ts +0 -67
  132. package/src/lexicon/types/com/atproto/admin/getModerationEvent.ts +0 -41
  133. package/src/lexicon/types/com/atproto/admin/getRecord.ts +0 -43
  134. package/src/lexicon/types/com/atproto/admin/getRepo.ts +0 -42
  135. package/src/lexicon/types/com/atproto/admin/listCommunicationTemplates.ts +0 -44
  136. package/src/lexicon/types/com/atproto/admin/queryModerationEvents.ts +0 -73
  137. package/src/lexicon/types/com/atproto/admin/queryModerationStatuses.ts +0 -74
  138. package/src/lexicon/types/com/atproto/admin/updateCommunicationTemplate.ts +0 -57
@@ -3,6 +3,11 @@
3
3
  exports[`indexing indexRepo updates indexes when records change. 1`] = `
4
4
  Array [
5
5
  Object {
6
+ "associated": Object {
7
+ "feedgens": 0,
8
+ "labeler": false,
9
+ "lists": 0,
10
+ },
6
11
  "description": "freshening things up",
7
12
  "did": "user(0)",
8
13
  "followersCount": 2,
@@ -620,6 +625,11 @@ Object {
620
625
 
621
626
  exports[`indexing indexes profiles. 1`] = `
622
627
  Object {
628
+ "associated": Object {
629
+ "feedgens": 0,
630
+ "labeler": false,
631
+ "lists": 0,
632
+ },
623
633
  "did": "user(0)",
624
634
  "displayName": "dan",
625
635
  "followersCount": 0,
@@ -637,6 +647,11 @@ Object {
637
647
 
638
648
  exports[`indexing indexes profiles. 2`] = `
639
649
  Object {
650
+ "associated": Object {
651
+ "feedgens": 0,
652
+ "labeler": false,
653
+ "lists": 0,
654
+ },
640
655
  "did": "user(0)",
641
656
  "displayName": "danny",
642
657
  "followersCount": 0,
@@ -654,6 +669,11 @@ Object {
654
669
 
655
670
  exports[`indexing indexes profiles. 3`] = `
656
671
  Object {
672
+ "associated": Object {
673
+ "feedgens": 0,
674
+ "labeler": false,
675
+ "lists": 0,
676
+ },
657
677
  "did": "user(0)",
658
678
  "followersCount": 0,
659
679
  "followsCount": 0,
@@ -0,0 +1,162 @@
1
+ import { AtpAgent } from '@atproto/api'
2
+ import { TestNetwork, SeedClient, basicSeed } from '@atproto/dev-env'
3
+ import axios from 'axios'
4
+
5
+ describe('label hydration', () => {
6
+ let network: TestNetwork
7
+ let pdsAgent: AtpAgent
8
+ let sc: SeedClient
9
+
10
+ let alice: string
11
+ let bob: string
12
+ let carol: string
13
+ let labelerDid: string
14
+
15
+ beforeAll(async () => {
16
+ network = await TestNetwork.create({
17
+ dbPostgresSchema: 'bsky_label_hydration',
18
+ })
19
+ pdsAgent = network.pds.getClient()
20
+ sc = network.getSeedClient()
21
+ await basicSeed(sc)
22
+ alice = sc.dids.alice
23
+ bob = sc.dids.bob
24
+ carol = sc.dids.carol
25
+ labelerDid = network.bsky.ctx.cfg.labelsFromIssuerDids[0]
26
+ await createLabel({ src: alice, uri: carol, cid: '', val: 'spam' })
27
+ await createLabel({ src: bob, uri: carol, cid: '', val: 'impersonation' })
28
+ await createLabel({
29
+ src: labelerDid,
30
+ uri: carol,
31
+ cid: '',
32
+ val: 'misleading',
33
+ })
34
+ await network.processAll()
35
+ })
36
+
37
+ afterAll(async () => {
38
+ await network.close()
39
+ })
40
+
41
+ it('hydrates labels based on a supplied labeler header', async () => {
42
+ AtpAgent.configure({ appLabelers: [alice] })
43
+ pdsAgent.configureLabelersHeader([])
44
+ const res = await pdsAgent.api.app.bsky.actor.getProfile(
45
+ { actor: carol },
46
+ {
47
+ headers: sc.getHeaders(bob),
48
+ },
49
+ )
50
+ expect(res.data.labels?.length).toBe(1)
51
+ expect(res.data.labels?.[0].src).toBe(alice)
52
+ expect(res.data.labels?.[0].val).toBe('spam')
53
+ expect(res.headers['atproto-content-labelers']).toEqual(`${alice};redact`)
54
+ })
55
+
56
+ it('hydrates labels based on multiple a supplied labelers', async () => {
57
+ AtpAgent.configure({ appLabelers: [bob] })
58
+ pdsAgent.configureLabelersHeader([alice, labelerDid])
59
+
60
+ const res = await pdsAgent.api.app.bsky.actor.getProfile(
61
+ { actor: carol },
62
+ {
63
+ headers: sc.getHeaders(bob),
64
+ },
65
+ )
66
+ expect(res.data.labels?.length).toBe(3)
67
+ expect(res.data.labels?.find((l) => l.src === alice)?.val).toEqual('spam')
68
+ expect(res.data.labels?.find((l) => l.src === bob)?.val).toEqual(
69
+ 'impersonation',
70
+ )
71
+ expect(res.data.labels?.find((l) => l.src === labelerDid)?.val).toEqual(
72
+ 'misleading',
73
+ )
74
+ const labelerHeaderDids = res.headers['atproto-content-labelers'].split(',')
75
+ expect(labelerHeaderDids.sort()).toEqual(
76
+ [alice, `${bob};redact`, labelerDid].sort(),
77
+ )
78
+ })
79
+
80
+ it('defaults to service labels when no labeler header is provided', async () => {
81
+ const res = await axios.get(
82
+ `${network.pds.url}/xrpc/app.bsky.actor.getProfile?actor=${carol}`,
83
+ { headers: sc.getHeaders(bob) },
84
+ )
85
+ expect(res.data.labels?.length).toBe(1)
86
+ expect(res.data.labels?.[0].src).toBe(labelerDid)
87
+ expect(res.data.labels?.[0].val).toBe('misleading')
88
+
89
+ expect(res.headers['atproto-content-labelers']).toEqual(
90
+ network.bsky.ctx.cfg.labelsFromIssuerDids
91
+ .map((did) => `${did};redact`)
92
+ .join(','),
93
+ )
94
+ })
95
+
96
+ it('hydrates labels onto list views.', async () => {
97
+ AtpAgent.configure({ appLabelers: [labelerDid] })
98
+ pdsAgent.configureLabelersHeader([])
99
+
100
+ const list = await pdsAgent.api.app.bsky.graph.list.create(
101
+ { repo: alice },
102
+ {
103
+ name: "alice's modlist",
104
+ purpose: 'app.bsky.graph.defs#modlist',
105
+ createdAt: new Date().toISOString(),
106
+ },
107
+ sc.getHeaders(alice),
108
+ )
109
+ await network.processAll()
110
+ await createLabel({ uri: list.uri, cid: list.cid, val: 'spam' })
111
+ const res = await pdsAgent.api.app.bsky.graph.getList(
112
+ { list: list.uri },
113
+ { headers: sc.getHeaders(alice) },
114
+ )
115
+ const [label, ...others] = res.data.list.labels ?? []
116
+ expect(label?.src).toBe(labelerDid)
117
+ expect(label?.val).toBe('spam')
118
+ expect(others.length).toBe(0)
119
+ })
120
+
121
+ it('hydrates labels onto feed generator views.', async () => {
122
+ const feedgen = await pdsAgent.api.app.bsky.feed.generator.create(
123
+ { repo: alice },
124
+ {
125
+ displayName: "alice's feedgen",
126
+ did: alice,
127
+ createdAt: new Date().toISOString(),
128
+ },
129
+ sc.getHeaders(alice),
130
+ )
131
+ await network.processAll()
132
+ await createLabel({ uri: feedgen.uri, cid: feedgen.cid, val: 'spam' })
133
+ const res = await pdsAgent.api.app.bsky.feed.getFeedGenerators(
134
+ { feeds: [feedgen.uri] },
135
+ { headers: sc.getHeaders(alice) },
136
+ )
137
+ expect(res.data.feeds.length).toBe(1)
138
+ const [label, ...others] = res.data.feeds[0].labels ?? []
139
+ expect(label?.src).toBe(labelerDid)
140
+ expect(label?.val).toBe('spam')
141
+ expect(others.length).toBe(0)
142
+ })
143
+
144
+ const createLabel = async (opts: {
145
+ src?: string
146
+ uri: string
147
+ cid: string
148
+ val: string
149
+ }) => {
150
+ await network.bsky.db.db
151
+ .insertInto('label')
152
+ .values({
153
+ uri: opts.uri,
154
+ cid: opts.cid,
155
+ val: opts.val,
156
+ cts: new Date().toISOString(),
157
+ neg: false,
158
+ src: opts.src ?? labelerDid,
159
+ })
160
+ .execute()
161
+ }
162
+ })
@@ -325,6 +325,7 @@ Object {
325
325
  },
326
326
  "description": "blah blah",
327
327
  "indexedAt": "1970-01-01T00:00:00.000Z",
328
+ "labels": Array [],
328
329
  "name": "new list",
329
330
  "purpose": "app.bsky.graph.defs#modlist",
330
331
  "uri": "record(0)",
@@ -369,6 +370,7 @@ Object {
369
370
  },
370
371
  "description": "big list of blocks",
371
372
  "indexedAt": "1970-01-01T00:00:00.000Z",
373
+ "labels": Array [],
372
374
  "name": "alice blocks",
373
375
  "purpose": "app.bsky.graph.defs#modlist",
374
376
  "uri": "record(4)",
@@ -420,6 +422,7 @@ Object {
420
422
  },
421
423
  "description": "blah blah",
422
424
  "indexedAt": "1970-01-01T00:00:00.000Z",
425
+ "labels": Array [],
423
426
  "name": "new list",
424
427
  "purpose": "app.bsky.graph.defs#modlist",
425
428
  "uri": "record(0)",
@@ -463,6 +466,7 @@ Object {
463
466
  },
464
467
  "description": "big list of blocks",
465
468
  "indexedAt": "1970-01-01T00:00:00.000Z",
469
+ "labels": Array [],
466
470
  "name": "alice blocks",
467
471
  "purpose": "app.bsky.graph.defs#modlist",
468
472
  "uri": "record(3)",
@@ -503,6 +507,7 @@ Object {
503
507
  "avatar": "https://bsky.public.url/img/avatar/plain/user(0)/cids(1)@jpeg",
504
508
  "cid": "cids(0)",
505
509
  "indexedAt": "1970-01-01T00:00:00.000Z",
510
+ "labels": Array [],
506
511
  "name": "alice blocks",
507
512
  "purpose": "app.bsky.graph.defs#modlist",
508
513
  "uri": "record(0)",
@@ -532,6 +537,7 @@ Object {
532
537
  "avatar": "https://bsky.public.url/img/avatar/plain/user(0)/cids(1)@jpeg",
533
538
  "cid": "cids(0)",
534
539
  "indexedAt": "1970-01-01T00:00:00.000Z",
540
+ "labels": Array [],
535
541
  "name": "alice blocks",
536
542
  "purpose": "app.bsky.graph.defs#modlist",
537
543
  "uri": "record(0)",
@@ -582,6 +588,7 @@ Object {
582
588
  },
583
589
  "description": "big list of blocks",
584
590
  "indexedAt": "1970-01-01T00:00:00.000Z",
591
+ "labels": Array [],
585
592
  "name": "alice blocks",
586
593
  "purpose": "app.bsky.graph.defs#modlist",
587
594
  "uri": "record(0)",
@@ -0,0 +1,160 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`labeler service views fetches labelers 1`] = `
4
+ Object {
5
+ "views": Array [
6
+ Object {
7
+ "$type": "app.bsky.labeler.defs#labelerView",
8
+ "cid": "cids(0)",
9
+ "creator": Object {
10
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
11
+ "description": "its me!",
12
+ "did": "user(0)",
13
+ "displayName": "ali",
14
+ "handle": "alice.test",
15
+ "indexedAt": "1970-01-01T00:00:00.000Z",
16
+ "labels": Array [
17
+ Object {
18
+ "cid": "cids(2)",
19
+ "cts": "1970-01-01T00:00:00.000Z",
20
+ "neg": false,
21
+ "src": "user(0)",
22
+ "uri": "record(3)",
23
+ "val": "self-label-a",
24
+ },
25
+ Object {
26
+ "cid": "cids(2)",
27
+ "cts": "1970-01-01T00:00:00.000Z",
28
+ "neg": false,
29
+ "src": "user(0)",
30
+ "uri": "record(3)",
31
+ "val": "self-label-b",
32
+ },
33
+ ],
34
+ "viewer": Object {
35
+ "blockedBy": false,
36
+ "followedBy": "record(2)",
37
+ "following": "record(1)",
38
+ "muted": false,
39
+ },
40
+ },
41
+ "indexedAt": "1970-01-01T00:00:00.000Z",
42
+ "labels": Array [],
43
+ "likeCount": 1,
44
+ "uri": "record(0)",
45
+ "viewer": Object {
46
+ "like": "record(4)",
47
+ },
48
+ },
49
+ Object {
50
+ "$type": "app.bsky.labeler.defs#labelerView",
51
+ "cid": "cids(3)",
52
+ "creator": Object {
53
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(1)@jpeg",
54
+ "description": "hi im bob label_me",
55
+ "did": "user(2)",
56
+ "displayName": "bobby",
57
+ "handle": "bob.test",
58
+ "indexedAt": "1970-01-01T00:00:00.000Z",
59
+ "labels": Array [],
60
+ "viewer": Object {
61
+ "blockedBy": false,
62
+ "muted": false,
63
+ },
64
+ },
65
+ "indexedAt": "1970-01-01T00:00:00.000Z",
66
+ "labels": Array [],
67
+ "likeCount": 0,
68
+ "uri": "record(5)",
69
+ "viewer": Object {},
70
+ },
71
+ ],
72
+ }
73
+ `;
74
+
75
+ exports[`labeler service views fetches labelers detailed 1`] = `
76
+ Object {
77
+ "views": Array [
78
+ Object {
79
+ "$type": "app.bsky.labeler.defs#labelerViewDetailed",
80
+ "cid": "cids(0)",
81
+ "creator": Object {
82
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
83
+ "description": "its me!",
84
+ "did": "user(0)",
85
+ "displayName": "ali",
86
+ "handle": "alice.test",
87
+ "indexedAt": "1970-01-01T00:00:00.000Z",
88
+ "labels": Array [
89
+ Object {
90
+ "cid": "cids(2)",
91
+ "cts": "1970-01-01T00:00:00.000Z",
92
+ "neg": false,
93
+ "src": "user(0)",
94
+ "uri": "record(3)",
95
+ "val": "self-label-a",
96
+ },
97
+ Object {
98
+ "cid": "cids(2)",
99
+ "cts": "1970-01-01T00:00:00.000Z",
100
+ "neg": false,
101
+ "src": "user(0)",
102
+ "uri": "record(3)",
103
+ "val": "self-label-b",
104
+ },
105
+ ],
106
+ "viewer": Object {
107
+ "blockedBy": false,
108
+ "followedBy": "record(2)",
109
+ "following": "record(1)",
110
+ "muted": false,
111
+ },
112
+ },
113
+ "indexedAt": "1970-01-01T00:00:00.000Z",
114
+ "labels": Array [],
115
+ "likeCount": 1,
116
+ "policies": Object {
117
+ "labelValues": Array [
118
+ "spam",
119
+ "!hide",
120
+ "scam",
121
+ "impersonation",
122
+ ],
123
+ },
124
+ "uri": "record(0)",
125
+ "viewer": Object {
126
+ "like": "record(4)",
127
+ },
128
+ },
129
+ Object {
130
+ "$type": "app.bsky.labeler.defs#labelerViewDetailed",
131
+ "cid": "cids(3)",
132
+ "creator": Object {
133
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(1)@jpeg",
134
+ "description": "hi im bob label_me",
135
+ "did": "user(2)",
136
+ "displayName": "bobby",
137
+ "handle": "bob.test",
138
+ "indexedAt": "1970-01-01T00:00:00.000Z",
139
+ "labels": Array [],
140
+ "viewer": Object {
141
+ "blockedBy": false,
142
+ "muted": false,
143
+ },
144
+ },
145
+ "indexedAt": "1970-01-01T00:00:00.000Z",
146
+ "labels": Array [],
147
+ "likeCount": 0,
148
+ "policies": Object {
149
+ "labelValues": Array [
150
+ "nudity",
151
+ "sexual",
152
+ "porn",
153
+ ],
154
+ },
155
+ "uri": "record(5)",
156
+ "viewer": Object {},
157
+ },
158
+ ],
159
+ }
160
+ `;
@@ -68,6 +68,7 @@ Object {
68
68
  },
69
69
  "description": "new descript",
70
70
  "indexedAt": "1970-01-01T00:00:00.000Z",
71
+ "labels": Array [],
71
72
  "name": "updated alice mutes",
72
73
  "purpose": "app.bsky.graph.defs#modlist",
73
74
  "uri": "record(2)",
@@ -165,6 +166,7 @@ Object {
165
166
  "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
166
167
  "cid": "cids(4)",
167
168
  "indexedAt": "1970-01-01T00:00:00.000Z",
169
+ "labels": Array [],
168
170
  "name": "alice mutes",
169
171
  "purpose": "app.bsky.graph.defs#modlist",
170
172
  "uri": "record(6)",
@@ -216,6 +218,7 @@ Object {
216
218
  "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
217
219
  "cid": "cids(4)",
218
220
  "indexedAt": "1970-01-01T00:00:00.000Z",
221
+ "labels": Array [],
219
222
  "name": "alice mutes",
220
223
  "purpose": "app.bsky.graph.defs#modlist",
221
224
  "uri": "record(6)",
@@ -336,6 +339,7 @@ Object {
336
339
  },
337
340
  "description": "blah blah",
338
341
  "indexedAt": "1970-01-01T00:00:00.000Z",
342
+ "labels": Array [],
339
343
  "name": "new list",
340
344
  "purpose": "app.bsky.graph.defs#modlist",
341
345
  "uri": "record(0)",
@@ -379,6 +383,7 @@ Object {
379
383
  },
380
384
  "description": "big list of mutes",
381
385
  "indexedAt": "1970-01-01T00:00:00.000Z",
386
+ "labels": Array [],
382
387
  "name": "alice mutes",
383
388
  "purpose": "app.bsky.graph.defs#modlist",
384
389
  "uri": "record(3)",
@@ -429,6 +434,7 @@ Object {
429
434
  },
430
435
  "description": "blah blah",
431
436
  "indexedAt": "1970-01-01T00:00:00.000Z",
437
+ "labels": Array [],
432
438
  "name": "new list",
433
439
  "purpose": "app.bsky.graph.defs#modlist",
434
440
  "uri": "record(0)",
@@ -472,6 +478,7 @@ Object {
472
478
  },
473
479
  "description": "big list of mutes",
474
480
  "indexedAt": "1970-01-01T00:00:00.000Z",
481
+ "labels": Array [],
475
482
  "name": "alice mutes",
476
483
  "purpose": "app.bsky.graph.defs#modlist",
477
484
  "uri": "record(3)",
@@ -512,6 +519,7 @@ Object {
512
519
  "avatar": "https://bsky.public.url/img/avatar/plain/user(0)/cids(1)@jpeg",
513
520
  "cid": "cids(0)",
514
521
  "indexedAt": "1970-01-01T00:00:00.000Z",
522
+ "labels": Array [],
515
523
  "name": "alice mutes",
516
524
  "purpose": "app.bsky.graph.defs#modlist",
517
525
  "uri": "record(0)",
@@ -540,6 +548,7 @@ Object {
540
548
  "avatar": "https://bsky.public.url/img/avatar/plain/user(0)/cids(1)@jpeg",
541
549
  "cid": "cids(0)",
542
550
  "indexedAt": "1970-01-01T00:00:00.000Z",
551
+ "labels": Array [],
543
552
  "name": "alice mutes",
544
553
  "purpose": "app.bsky.graph.defs#modlist",
545
554
  "uri": "record(0)",
@@ -588,6 +597,7 @@ Object {
588
597
  },
589
598
  "description": "big list of mutes",
590
599
  "indexedAt": "1970-01-01T00:00:00.000Z",
600
+ "labels": Array [],
591
601
  "name": "alice mutes",
592
602
  "purpose": "app.bsky.graph.defs#modlist",
593
603
  "uri": "record(0)",
@@ -3,6 +3,11 @@
3
3
  exports[`pds profile views fetches multiple profiles 1`] = `
4
4
  Array [
5
5
  Object {
6
+ "associated": Object {
7
+ "feedgens": 0,
8
+ "labeler": false,
9
+ "lists": 0,
10
+ },
6
11
  "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
7
12
  "description": "its me!",
8
13
  "did": "user(0)",
@@ -38,6 +43,11 @@ Array [
38
43
  },
39
44
  },
40
45
  Object {
46
+ "associated": Object {
47
+ "feedgens": 0,
48
+ "labeler": false,
49
+ "lists": 0,
50
+ },
41
51
  "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(0)@jpeg",
42
52
  "description": "hi im bob label_me",
43
53
  "did": "user(2)",
@@ -54,6 +64,11 @@ Array [
54
64
  },
55
65
  },
56
66
  Object {
67
+ "associated": Object {
68
+ "feedgens": 0,
69
+ "labeler": false,
70
+ "lists": 0,
71
+ },
57
72
  "did": "user(4)",
58
73
  "followersCount": 2,
59
74
  "followsCount": 1,
@@ -67,6 +82,11 @@ Array [
67
82
  },
68
83
  },
69
84
  Object {
85
+ "associated": Object {
86
+ "feedgens": 0,
87
+ "labeler": false,
88
+ "lists": 0,
89
+ },
70
90
  "did": "user(5)",
71
91
  "followersCount": 1,
72
92
  "followsCount": 1,
@@ -84,6 +104,11 @@ Array [
84
104
 
85
105
  exports[`pds profile views fetches other's profile, with a follow 1`] = `
86
106
  Object {
107
+ "associated": Object {
108
+ "feedgens": 0,
109
+ "labeler": false,
110
+ "lists": 0,
111
+ },
87
112
  "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
88
113
  "description": "its me!",
89
114
  "did": "user(0)",
@@ -122,6 +147,11 @@ Object {
122
147
 
123
148
  exports[`pds profile views fetches other's profile, without a follow 1`] = `
124
149
  Object {
150
+ "associated": Object {
151
+ "feedgens": 0,
152
+ "labeler": false,
153
+ "lists": 0,
154
+ },
125
155
  "did": "user(0)",
126
156
  "followersCount": 1,
127
157
  "followsCount": 1,
@@ -138,6 +168,11 @@ Object {
138
168
 
139
169
  exports[`pds profile views fetches own profile 1`] = `
140
170
  Object {
171
+ "associated": Object {
172
+ "feedgens": 0,
173
+ "labeler": false,
174
+ "lists": 0,
175
+ },
141
176
  "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
142
177
  "description": "its me!",
143
178
  "did": "user(0)",
@@ -174,6 +209,11 @@ Object {
174
209
 
175
210
  exports[`pds profile views presents avatars & banners 1`] = `
176
211
  Object {
212
+ "associated": Object {
213
+ "feedgens": 0,
214
+ "labeler": false,
215
+ "lists": 0,
216
+ },
177
217
  "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(0)@jpeg",
178
218
  "banner": "https://bsky.public.url/img/banner/plain/user(1)/cids(1)@jpeg",
179
219
  "description": "new descript",
@@ -41,6 +41,7 @@ Object {
41
41
  Object {
42
42
  "cid": "cids(1)",
43
43
  "indexedAt": "1970-01-01T00:00:00.000Z",
44
+ "labels": Array [],
44
45
  "name": "list a",
45
46
  "purpose": "app.bsky.graph.defs#modlist",
46
47
  "uri": "record(2)",
@@ -51,6 +52,7 @@ Object {
51
52
  Object {
52
53
  "cid": "cids(2)",
53
54
  "indexedAt": "1970-01-01T00:00:00.000Z",
55
+ "labels": Array [],
54
56
  "name": "list b",
55
57
  "purpose": "app.bsky.graph.defs#modlist",
56
58
  "uri": "record(3)",