Compare commits

...

187 Commits

Author SHA1 Message Date
f7c3f9afd9 filter youtube tracking parameter 2025-04-17 03:44:37 -04:00
rafael
688268b6a5
Delegated verification (#3761)
Co-authored-by: Eric Bailey <git@esb.lol>
2025-04-16 19:38:16 -03:00
Matthieu Sieben
cf7227f8a1
Update messages.po files (#3759)
messages
2025-04-16 16:41:18 +02:00
Matthieu Sieben
0f3899dd52
Minor UI/UX tweaks (#3758)
* Minor UI/UX tweaks

* Update packages/oauth/oauth-provider-frontend/src/components/Avatar.tsx

Co-authored-by: futur <me@futuristick.ca>

---------

Co-authored-by: futur <me@futuristick.ca>
2025-04-16 16:39:50 +02:00
github-actions[bot]
b53e2c5d77
Version packages (#3756)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-16 14:37:20 +02:00
Roscoe Rubin-Rottenberg
23462184dc
fix lex-cli record name conflicts (#3715)
* fix lex-cli record name conflicts

* bumps
2025-04-16 12:45:22 +02:00
github-actions[bot]
231eb48265
Version packages (#3753)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-16 10:45:52 +02:00
Matthieu Sieben
1e461eab03
Fix missing dist files from @atproto/oauth-provider-ui (#3754)
* Remove reference to missing "bin" executable

* Remove "dependency" on `rollup-plugin-bundle-manifest`

* Fix dependencies

* Explicit exported package `files`

* Update pnpm lock
2025-04-16 10:25:29 +02:00
devin ivy
0759f0feed
Ozone: add metadata endpoint (#3735)
* ozone: add well-known metadata endpoint

* ozone changeset
2025-04-15 21:17:33 -04:00
rafael
3fcd221111
Fix dependency (#3752) 2025-04-15 16:30:52 -03:00
github-actions[bot]
bf0faed1f8
Version packages (#3748)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-15 17:35:49 +02:00
Matthieu Sieben
5720b644af
Fix build of PDS docker image (#3749) 2025-04-15 17:27:23 +02:00
Matthieu Sieben
371e04aad2
Account management page (#3659)
---------

Co-authored-by: Eric Bailey <git@esb.lol>
2025-04-15 17:15:27 +02:00
Matthieu Sieben
8b98fec885
Hide client id pathname if it is exaclty /oauth-client-metadata.json (#3667) 2025-04-15 16:00:50 +02:00
devin ivy
26a0777167
Oauth: fix typo in jwk error (#3747)
* oauth: fix typo in jwk error

* changeset

---------

Co-authored-by: Matthieu Sieben <matthieu.sieben@gmail.com>
2025-04-15 15:59:09 +02:00
github-actions[bot]
3496935e72
Version packages (#3734)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-11 16:55:58 -03:00
rafael
ca07871c48
Update DM reaction length on chat lexicon (#3741) 2025-04-11 16:48:18 -03:00
Ryan Barrett
a4af3494bd
fix a couple typos in the PLC code email template (#3730)
recieved => received
2025-04-10 23:27:30 -04:00
devin ivy
388e5d3d2b
Appview: skip actor cache for viewer (#3733)
* appview: skip actor cache for viewer

* appview: rename getActors cache control arg, convenience on hydration ctx
2025-04-10 21:30:02 -04:00
bnewbold
fc61662d7b
new host status com.atproto.sync lexicons (#3714)
* new host status com.atproto.sync lexicons

* add description

* add specific error response from request crawl if host is banned

* lint

* break out hostStatus to com.atproto.sync.defs

* add a changeset

* codegen
2025-04-09 14:40:49 -07:00
github-actions[bot]
f329c56454
Version packages (#3725)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-08 10:19:52 -07:00
Hailey
8b7bf7e8f0
use full profile in suggested users response (#3724)
* use full profile in suggested users response

* Codegen

* Changeset

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2025-04-07 18:30:10 -07:00
Daniel Holmgren
01f2bd13eb
Ozone: add sort idx to moderation_subject_status (#3191)
* add sort idx

* awaits

* fix syntax err
2025-04-04 16:51:39 -05:00
github-actions[bot]
e1eeef7025
Version packages (#3717)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-04 09:31:40 -07:00
Hailey
0e681d3036
add getSuggestedUsers (#3713)
* add lex

* Fix syntax errors

* Fix typo

* Make category optional

* Codegen

* setup endpoint

* nits

* changeset

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2025-04-04 09:22:59 -07:00
github-actions[bot]
6bc8355c40
Version packages (#3710)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-02 18:38:47 -05:00
Hailey
efb302db1a
unspecced getSuggestedFeeds (#3680)
* Reapply "add codegen"

This reverts commit 620b10954af90f53e1692c3fd7451c675f1e9956.

* add pipethrough

* pipethrough header

* fix descriptions

* rm

* codgen/build

* suggested starterpacks pipethrough

* Reapply "add codegen"

This reverts commit 620b10954af90f53e1692c3fd7451c675f1e9956.

* add pipethrough

* pipethrough header

* fix descriptions

* rm

* codgen/build

* add hot

* Codegen

* Hotter

* Category as optional open string

* Format

* Run codegen for reaction lexicon changes (#3674)

* codegen main

* changeset

* Version packages (#3675)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* add hot

* Codegen

* Hotter

* Category as optional open string

* Format

* codegen

* tidy

* required array

* getSuggestedFeeds codegen

* add pipethrough

* add route

* update comment

* use right viewer

* update comment

* Feedback

* Changset

* Format

---------

Co-authored-by: Eric Bailey <git@esb.lol>
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-02 17:36:30 -05:00
Daniel Holmgren
4db923ca1c
Rewrite CAR implementation (#3672)
* use hand-written car writer

* tidy

* initial impl

* fix bug & compiler errors

* remove dependency

* refactor & tidy

* del old util test

* simple test fixtures

* changesets

* propagate termination

* pr feedback

* support async & sync iterables

* add dump methohd to iterator

* build branch

* fix import

* dont build branch
2025-04-02 16:57:32 -05:00
github-actions[bot]
02bc8e60c5
Version packages (#3707)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-01 16:13:43 -05:00
Eric Bailey
04b6230cd2
Return StarterPackView instead of StarterPackViewBasic from getSuggestedStarterPacks (#3706) 2025-04-01 15:58:55 -05:00
github-actions[bot]
a26813da21
Version packages (#3703)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-01 15:30:27 -05:00
Hailey
0eea698bef
suggested starterpacks pipethrough (#3677)
* Reapply "add codegen"

This reverts commit 620b10954af90f53e1692c3fd7451c675f1e9956.

* add pipethrough

* pipethrough header

* fix descriptions

* rm

* codgen/build

* suggested starterpacks pipethrough

* Reapply "add codegen"

This reverts commit 620b10954af90f53e1692c3fd7451c675f1e9956.

* add pipethrough

* pipethrough header

* fix descriptions

* rm

* codgen/build

* add hot

* Codegen

* Hotter

* Category as optional open string

* Format

* Run codegen for reaction lexicon changes (#3674)

* codegen main

* changeset

* Version packages (#3675)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* add hot

* Codegen

* Hotter

* Category as optional open string

* Format

* codegen

* tidy

* required array

* add route

* update lex

* use right viewer

* use right viewer

* remove viewer property

* lex codegen

* update comment

* Changeset

* Add test

---------

Co-authored-by: Eric Bailey <git@esb.lol>
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-04-01 14:18:13 -05:00
Daniel Holmgren
b0a0f14843
Fix codegen (#3705)
* fix codegen

* changeset
2025-04-01 13:19:19 -05:00
Hailey
2b7efb6cb1
v2 trends endpoint (#3673)
* Reapply "add codegen"

This reverts commit 620b10954af90f53e1692c3fd7451c675f1e9956.

* add pipethrough

* pipethrough header

* fix descriptions

* rm

* codgen/build

* add hot

* Codegen

* Hotter

* Category as optional open string

* Format

* required array

* update lex

* use right viewer

* lex codegen

* update comment

* codegen

* Add basic test

* Format

* Changeset

---------

Co-authored-by: Eric Bailey <git@esb.lol>
Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-04-01 12:44:18 -05:00
Daniel Holmgren
bdbd3c3e3f
Sequencer recovery (#2519)
* wip

* flesh out recoverer

* basic tests + handle uncreated repos

* add key recovery when keys are lost

* schemas

* tidy recoverer

* tidy & comment test

* work into script framework

* use account evt instead of tombstone

* add flag for updating keys

* add log

* rotate keys script

* pr feedback

* build branch

* use exact commit data from sequencer to restore

* fixing up key rotation script

* add onIdle

* build branch

* track blobs

* fix types

* fix blob tracking

* patches

* publish identity script

* fix build err

* wip

* build err

* wip

* recovery db + fix some errors

* refactor & add repair script

* dont run script

* fix test

* tidy scripts

* tidy

* change publish identity recoveyr method to rotate keys

* tidy

* pr feedback

* simple readme

* changesets
2025-03-31 17:02:11 -05:00
github-actions[bot]
713a52d4dc
Version packages (#3696)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-28 17:35:02 -03:00
rafael
6528943080
Fix last reaction lexicon (#3695)
* Fix last reaction lexicon

* Changeset
2025-03-28 17:28:17 -03:00
github-actions[bot]
c16492f253
Version packages (#3693)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-28 14:53:46 +01:00
Matthieu Sieben
9b28184cb9
Expose hcaptcha tokens in hook and errors (#3690)
* Expose hcaptcha tokens in hook and errors

* remove hostname check in hcaptcha
2025-03-28 14:37:39 +01:00
Matthieu Sieben
b4ab5011bc
Support more ways to instantiate an Agent (#3692) 2025-03-28 14:30:22 +01:00
github-actions[bot]
571164100f
Version packages (#3689)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-28 11:08:04 +01:00
Matthieu Sieben
98d8a677ca
Add OAuth HCaptcha hooks (#3688) 2025-03-28 11:04:12 +01:00
github-actions[bot]
be8f5d48e0
Version packages (#3686)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-27 18:29:04 -03:00
rafael
9a05892f6f
Update chat reaction lexicon (#3685)
* Update chat reaction lexicon

* Changeset

* Update chat reaction lexicon
2025-03-27 18:21:39 -03:00
Foysal Ahamed
ac6b604e7a
🐛 Pass auth headers when fetching profiles for ozone subjects (#3683)
* 🐛 Pass auth headers when fetching profiles for ozone subjects

*  Update snapshot
2025-03-27 17:07:05 -04:00
github-actions[bot]
01c5e636e3
Version packages (#3682)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-27 17:03:04 +01:00
Matthieu Sieben
a5a760c1f0
Allow null hostname in hcaptcha result (#3681) 2025-03-27 16:46:21 +01:00
github-actions[bot]
d0747e8373
Version packages (#3679)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-27 16:32:00 +01:00
Foysal Ahamed
076c2f9872
Add getSubjects endpoint to ozone for full view of subjects (#3651)
*  Add getSubjects endpoint to ozone for full view of subjects

* 📝 Better lexicon description

* 📝 Add changeset

*  Add subject to subject view

*  Update snapshot

* :rotating_lights: Fix lint issue

*  Make subject required in subjectView

* 🐛 Add subject check before attempting to run queries

*  Keed the order of subjects from the request in the responding array

*  Use a union for profile field

* 🐛 Remove minLength and address profile value

* 📝 Bring back minLength
2025-03-27 10:50:44 -04:00
github-actions[bot]
e3969b03f2
Version packages (#3675)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-26 12:12:07 -07:00
Samuel Newman
44f5c3639f
Run codegen for reaction lexicon changes (#3674)
* codegen main

* changeset
2025-03-26 12:08:06 -07:00
Hailey
620b10954a Revert "add codegen"
This reverts commit 00b409567271d5b1b27a40f8c8e8ad020967781b.
2025-03-26 11:50:32 -07:00
Hailey
00b4095672 add codegen 2025-03-26 11:50:01 -07:00
github-actions[bot]
ff581e1e0b
Version packages (#3671)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-26 14:45:09 -03:00
rafael
d87ffc7bfe
Update chat lexicons for reactions (#3670)
* Update chat lexicons for reactions

* changeset
2025-03-26 14:33:32 -03:00
github-actions[bot]
03ca772612
Version packages (#3658)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-21 09:46:44 +01:00
Johannes Andersen
42807cad56
fix(oauth-provider): hCaptcha error codes should be optional (#3656)
* fix(oauth-provider): hCaptcha error codes should be optional

* fix: hostname can be nullable

* fix: add changesets
2025-03-21 09:17:51 +01:00
github-actions[bot]
c777ba6d68
Version packages (#3631)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-20 15:21:15 +01:00
Matthieu Sieben
49528e83da
OAuth: Allow onSignedUp hook to access hcaptcha result data (#3645)
* OAuth: Allow `onSignedUp` hook to access hcaptcha result data

* OAuth hcatpcha fixes

* Update .changeset/slimy-flowers-punch.md

Co-authored-by: devin ivy <devinivy@gmail.com>

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-03-20 14:57:54 +01:00
Matthieu Sieben
c20a3f0685 fix pds image build 2025-03-19 16:52:41 +01:00
Matthieu Sieben
cc4122652e
Split OAuth Provider's ui into its own package (#3640)
* Split OAuth Provider's ui into its own package

* Create distinct entry files for authorization and error pages
2025-03-19 09:19:27 +01:00
Matthieu Sieben
03fc0aa270 Improve password reset error reporting during OAuth 2025-03-19 08:42:45 +01:00
bnewbold
670b6b5de2
add missing changeset (#3635) 2025-03-12 10:17:10 -07:00
bnewbold
a07aca9737
syntax: update to allow non-leading digits in NSID 'name' part (#3633)
* syntax: allow non-leading digits in NSID 'name' part

* update (copied) interop tests

* prettier
2025-03-11 18:04:14 -07:00
Matthieu Sieben
9332c0f315
Set COEP header to "unsafe-none" when hcaptcha is enabled (#3627)
* Set "Cross-Origin-Embedder-Policy" header to "unsafe-none" when hcaptcha is enabled

Fixes #3625

* tidy

* tidy
2025-03-11 13:32:53 -04:00
github-actions[bot]
48f194ffa2
Version packages (#3623)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-10 17:30:48 -04:00
Timothy Cyrus
c501715b0d
lex-cli: Fix TS Errors with codegen (#3282)
Co-authored-by: Timothy Cyrus <4201229+tcyrus@users.noreply.github.com>
Co-authored-by: Matthieu Sieben <matthieu.sieben@gmail.com>
2025-03-10 16:47:27 +01:00
Matthieu Sieben
5ada66ceb9
OAuth sign-up fixes (#3621)
Allow invite codes in any format
2025-03-10 15:43:11 +01:00
Matthieu Sieben
0ae7f416e8
Emit "sync" event on account creation through OAuth (#3624) 2025-03-10 15:19:25 +01:00
Matthieu Sieben
9e3eace8f9
Validate OAuth sign-up handle using @atproto/syntax (#3622)
* Validate OAuth sign-up handle using @atproto/syntax

Fixes #3619

* Improve input validation
2025-03-10 14:58:35 +01:00
Foysal Ahamed
7a7f2c43aa
🐛 include takendown list members for admins (#3609) 2025-03-09 16:21:32 +00:00
github-actions[bot]
72a5265e05
Version packages (#3613)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-07 18:21:03 -05:00
Samuel Newman
b20907a705
[sync] Fix types for Firehose options (#3599)
* add @types/ws to sync

* changeset

* fix typo
2025-03-07 18:16:07 -05:00
Devin Ivy
d96b03956d changeset 2025-03-07 18:13:47 -05:00
Foysal Ahamed
18fbfa0005
Add team member handle and displayName (#3587)
*  Add team member handle and displayName

*  Add periodic profile details sync

* 📝 Add changeset

*  Update team service instantiation

* 🐛 Cleanup

* 🧹 Cleanup unnecessary index
2025-03-07 23:00:25 +00:00
devin ivy
eab9c003f8
Sync event handling (#3612)
* pds: add sync event to account creation

* changeset

* fix bsky subscription handler

* add sync events to @atproto/sync package

* more sync package fixup

* fix sequencer test

* fix sync tests

* clarify firehose event type

---------

Co-authored-by: dholms <dtholmgren@gmail.com>
2025-03-07 15:35:57 -06:00
Matthieu Sieben
8827ff433a
Improve parsing of colors (#3614)
* improve branding parsing

* Fix build

* tidy
2025-03-07 20:46:15 +01:00
Matthieu Sieben
c01d7f5d15
Make branding colors optional (#3611) 2025-03-07 14:08:52 -05:00
github-actions[bot]
f46554bcb8
Version packages (#3591)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-03-07 11:03:00 -05:00
Matthieu Sieben
80c4bb51f6
"no-unused-vars" now causes errors (#3608) 2025-03-07 15:17:07 +01:00
Matthieu Sieben
850e39843c
OAuth: Reset password & Sign-up (#2945)
* Adds "password reset" during OAuth flows
* Adds "Sign up" during OAuth flows
* Adds support for multiple languages in the OAuth flow
* Adds "fr" translation for the OAuth flow

Co-authored-by: devin ivy <devinivy@gmail.com>
Co-authored-by: Eric Bailey <git@esb.lol>
2025-03-07 09:41:06 +01:00
devin ivy
442fcce308
PDS: allow admins to update to any valid handle (#3603)
on admin.updateAccountHandle, permit any valid handle as break glass measure
2025-03-03 18:48:08 -05:00
devin ivy
6bcbb6d8cd
app.bsky: permit 100mb video uploads (#3602)
* app.bsky: permit 100mb videos.

* codegen

* changeset

* app.bsky: add description to video embed blob field.
2025-03-03 18:25:10 -05:00
rafael
98aa023420
Make random test fail less often (#3597) 2025-03-03 00:33:56 -05:00
Daniel Holmgren
38320191e5
Wrap sync semantics (#3585)
* deprecate blobs & tooBig

* add sync event, deprecate handle & tombstone

* fix up tests

* small tidy

* add test for sync account on account activation

* use new sync event in another place

* remove deprecated events from lexicons

* formatting

* pr cleanup

* changeset
2025-02-28 17:19:18 -06:00
rafael
be800369c5
Notification cursor delay (#3573)
* Use ISO 8601 datetime string as notif list cursor

* Refactor pagination functions to methods

* Implement configurable notification delay

* Add comment

* Apply PR suggestions

* Implement suggestions

* Properly synchronize notification delay test

* Simplify date validation logic
2025-02-28 17:35:43 -03:00
bnewbold
dc6e4ecb0e
lex: add more identity helpers (#2264)
* lex: add more identity helpers

* lex: update identity helpers

* make fmt

* fix typo in 'id'

* add errors; add resolveDid; more descriptions

* lint

* fix 'identifier' field names

* identity: rename def; DID deactivation as error, not flag; require handle+doc

* update again, to 'identityInfo'

* codegen

* changeset
2025-02-26 14:36:58 -08:00
devin ivy
48b0a6f7b9
Appview: etcd-backed dataplane host list (#3586)
* appview: setup etcd-based dataplane host list

* appview: remove old file

* appview: tidy etcd host list functionality and add tests

* appview: add config and lifecycle for etcd-based dataplane host list

* tidy

* tidy

* appview: tidy config and dataplane client types

* build
2025-02-26 11:20:07 -05:00
github-actions[bot]
e5d72e8d1c
Version packages (#3584)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-26 10:12:09 -06:00
Eric Bailey
11d8d21bea
[APP-1072] Support labeler declaration fields on app view responses (#3579)
* Mirror new fields on labelerViewDetailed

(cherry picked from commit 33fdceec26c189995936129355135fdb1480a738)
(cherry picked from commit fe5626639e2d9d03448d8a7e829ad4d8b5e54ec3)

* Mirror new labeler service record properties on labelerViewDetailed lexicons

(cherry picked from commit 6a490f83232c258ac4cc2cd46379048195c4710f)

* Include new labeler service record properties on the labelerViewDetailed reponse from the app view.

(cherry picked from commit 279ed6472d370a61bf669656fda2fddaf2f88621)

* Format

(cherry picked from commit 620346d1e15d130e11fea45cf05d12d246b8e605)

* Fix up bad conflict resolution in test suite

(cherry picked from commit efa04cf592088be0bb8c7c96eb2d45ecbc1a2ea4)

* Import order

(cherry picked from commit 82567caaf53daa09951f71704827ff8d48f1bcc3)
2025-02-26 09:00:57 -06:00
bnewbold
27b0a7be1e
remove deprecated sync fields (#2506)
* lex: remove deprecated sync fields

* codegen field removals

* remove deprecated fields from code

* changeset
2025-02-25 12:32:22 -06:00
Daniel Holmgren
d4e14b7bdc
Move sequenceCommit into actor store transaction (#3580)
* serialize sequencing by moving sequenceCommit into actor store transaction

* do not throw on updateRepoRoot failure

* build branch

* changset

* dont build branch
2025-02-25 11:07:49 -06:00
devin ivy
5cce766705
Add x-forwarded-for to PDS-proxied requests to entryway (#3553)
* add x-forward-for to pds proxied requests to entryway

* pds: pull entryway auth/passthru headers into own methods, adjust forwarding

* tidy

* changeset

* pds: switch back to forward just first untrusted ips, trust local ips
2025-02-25 11:11:53 -05:00
bnewbold
99e2809ca2
[APP-1072] Add labeler declaration lexicons (#3521)
* updates to com.atproto.moderation.* for report routing

* updates to labeler service declaration; and new reason types

* Apply suggestions from code review

Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>

* remove dupe reasonAppeal

* iterate on labeler declaration lexicons

* Makefile: fast helper for formatting just lex json

* external, not link

* change default when subjectCollections is not defined

* remove 'example reason' disclaimers

* simplify lex report proposal: just labeler declartions

* missed knownValues list

* Codegen, changeset

---------

Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
Co-authored-by: Eric Bailey <git@esb.lol>
2025-02-25 09:46:12 -06:00
Brian Olson
e40758c36a
nobody uses notifyOfUpdate, deprecate (#3574) 2025-02-25 10:36:16 -05:00
github-actions[bot]
78caefd7d4
Version packages (#3578)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-24 17:47:09 -05:00
Matthieu Sieben
82d5a2d361
OAuthProvider: Update "trustProxy" options to allow function (#3557)
* OAuthProvider: Update "trustProxy" options to allow function

* DeviceManager options can now be passed as argument to the OAuthProvider constructor

* Only trust one level of proxying when computing IP during OAuthFlows

* Prevent invalid use of trustProxy config

* tidy

* make the code compliant with legacy behavior
2025-02-24 17:12:16 -05:00
github-actions[bot]
43d2703742
Version packages (#3577)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-24 18:20:26 -03:00
rafael
44f81f2eb9
Add chat.bsky.convo.updateAllRead lex (#3576) 2025-02-24 13:15:33 -08:00
github-actions[bot]
95299e0f62
Version packages (#3566)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-24 14:29:37 +01:00
Foysal Ahamed
9b643fbeca
📝 Make comment property optional on ozone comment event (#3572) 2025-02-24 14:19:06 +01:00
Foysal Ahamed
5e61126157
🐛 Store empty comment for ozone events (#3571)
* 🐛 Store empty comment for ozone events

*  Make comment property optional

* 📝 Better comment event description
2025-02-24 14:15:20 +01:00
bnewbold
6e382f67aa
Lexicon updates for Sync v1.1 (inductive firehose) (#3391)
* mark 'blobs' as deprecated (can parse from records blocks)

* add 'prev' CID to record ops

* add inductive changes and #resync event

* updates from recent discussion

* add sync v1.1 account hosting status states (broken, throttled)

* prettier

* updates from discussion

* remove 'data' from #sync message

* add note on 'repo' field about inconsistent name

* codegen

* changeset
2025-02-21 17:01:13 -08:00
Daniel Holmgren
7e3678c089
Send prevs on firehose (#3449)
* schema

* reset rate limit codegen

* codegen

* send prev cids on firehose

* fix test

* fix some test compiler errors & add experimental note

* fix linting

* build branch

* add prevData to commit event

* fix cbor undefined err

* add sibling proofs to relevant blocks

* bump depth of obj in test

* fix bug on right sibling proof & add some tests

* another test

* refactor proof construction

* more tests

* factor into fixtures

* fix styles in json

* lint: import ordering

* pr feedback

* add invertible op test

* remove prev from outgoing events

* return to original proof construction

* dont build branch

* changeset
2025-02-21 15:01:08 -06:00
github-actions[bot]
27bff80a98
Version packages (#3565)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-21 16:42:38 +00:00
Foysal Ahamed
b9cb049d94
🐛 Add missing divert event to list of events on emitEvent (#3561)
* 🐛 Add missing divert event to list of events on emitEvent

* ♻️ Clean up

* 📝 Add changeset
2025-02-21 17:11:17 +01:00
github-actions[bot]
36ad5b1e82
Version packages (#3563)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-21 11:22:50 -03:00
rafael
22af31a898
Update chat lexicons (#3564)
* new chat lex

* changeset
2025-02-21 05:01:37 -08:00
bnewbold
01874c4be7
lexicons: use 'tid' and 'record-key' formats in sync+repo lexicons (#2378)
* lex: use 'tid' and 'record-key' formats in lexicons

* more TID formats; and remove redundant maxLength

* add maxLength back, with a comment/description

* revert accidential change to applyWrites

* codegen

* changeset

* update test for invalid record-key
2025-02-20 11:50:24 -08:00
Daniel Holmgren
2c0435f4ed
Emit identity event on activateAccount (#3560)
* push to run CI

* maybe fix

* attempted fix

* tidy
2025-02-20 12:24:19 -06:00
bnewbold
8b2f0a62c6
update year to 2025 (#3559) 2025-02-19 16:10:51 -08:00
github-actions[bot]
88ce852a8d
Version packages (#3556)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-19 10:20:10 +01:00
Matthieu Sieben
6faf3eb254
Add vscode settings and recommended extensions (#3507) 2025-02-19 10:16:21 +01:00
Foysal Ahamed
7449f8607c
Allow filtering ozone team list by role and status (#3554)
*  Allow filtering ozone team list by role and status

* fix style

* changeset

---------

Co-authored-by: Matthieu Sieben <matthieu.sieben@gmail.com>
2025-02-19 10:15:58 +01:00
github-actions[bot]
7b93618353
Version packages (#3548)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-19 09:44:01 +01:00
Foysal Ahamed
a9887f6877
📝 Add changeset for ozone reporter stats feature (#3546) 2025-02-18 16:23:02 +01:00
bnewbold
afb3e1cd6c
update CONTRIBUTORS.md (#3549) 2025-02-17 18:28:00 -08:00
bnewbold
010f10c6f2
com.atproto.sync.listReposByCollection Lexicon, for collections directory (#3524)
* com.atproto.sync.listReposByCollection, for collections directory

* bump listReposByCollection limit

* update max+default to align more with listRepos

* codegen

* changeset for listReposByCollection
2025-02-17 18:15:35 -08:00
Foysal Ahamed
b41ff4b4e3
Add reporter_stats materialized view and endpoint to fetch reporter stats (#3509)
*  Add reporter_stats materialized view and endpoint to fetch reporter stats

* 🚨 Fix linter issues

*  Change reporter stats query from materialized view to on demand select

* Add "createdAt" as part of the index

---------

Co-authored-by: Matthieu Sieben <matthieu.sieben@gmail.com>
Co-authored-by: Matthieu Sieben <matthieusieben@users.noreply.github.com>
2025-02-17 22:17:43 +01:00
github-actions[bot]
f1d323a6ef
Version packages (#3539)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-14 14:24:57 +01:00
Matthieu Sieben
bde6f71c4c
Mark "userAgent" as optional in RequestMetadata (#3538) 2025-02-14 14:20:18 +01:00
github-actions[bot]
a3d2204a7e
Version packages (#3533)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-14 10:57:36 +01:00
Matthieu Sieben
3f58dd0e74
changeset for Appview: apply needs-review to individual records (#3537) 2025-02-14 10:49:42 +01:00
Matthieu Sieben
ba5bb6e667
Add missing changeset for bugfix in api package (#3535) 2025-02-14 10:15:33 +01:00
Matthieu Sieben
175f89f8fe
Fix lex-cli Windows compatibility (#3534)
Windows compatibility

Fixes #3327
2025-02-14 10:10:10 +01:00
Matthieu Sieben
e69e89a037
Properly compute sleep time in contantTime util (#3514) 2025-02-14 09:53:53 +01:00
Matthieu Sieben
20e57bacf9
Improve indexing for chat.bsky.moderation.getMessageContext (#3520)
* Improve indexing for chat.bsky.moderation.getMessageContext

* tidy
2025-02-14 09:44:07 +01:00
Tatsuya Yamamoto / T28_tatsuya
eb83ae176d
fix(api): pass refreshJwt to deleteSession on logout() (#3530)
fix: set refreshJwt
2025-02-14 09:41:28 +01:00
Matthieu Sieben
6ea9c961af
Rework of authorization request hooks (#3525)
* Rework of authorization request hooks

* add device details to `onAuthorized` hook

* Expose port number in DeviceDetails, allow passing options to DeviceManager

* tidy

* tidy

* tidy

* tidy

* changeset

* Expose client request metadata in hooks

* tidy

* tidy

* docs
2025-02-14 09:38:57 +01:00
devin ivy
3c7976a0d1
Appview: apply needs-review to individual records (#3532)
appview: apply needs-review to individual records
2025-02-13 22:56:50 -05:00
rafael
809c7ac5e3
Label expiration (#3510) 2025-02-13 15:34:01 -03:00
github-actions[bot]
03351a5818
Version packages (#3529)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-13 15:27:09 +01:00
Matthieu Sieben
c53d943c8b
Improve codegen typings (#2999)
* Make codegen types stricter
* Add .js file extension to import statements in generated code
* Fixes a bug that would clear interests prefs when updating hidden posts prefs.
2025-02-13 15:21:00 +01:00
github-actions[bot]
f90eedc865
Version packages (#3505)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-06 21:03:25 +00:00
Foysal Ahamed
709a85b0b6
Add a priority score value for ozone subjects (#3495)
*  Add a priority score value for ozone subjects

* 🚨 Bring back lock file

*  Update snapshot for pds proxied tests

*  Update takedown appeal snapshot

*  Update takedown appeal snapshot

*  Update repo and record snapshots

* :rotating_lights: Fix lint issue

*  Update moderation events snapshot

*  Update moderation statuses snapshot

* 🧹 Cleanup unnecessary durationInHours field

*  Allow filtering by priority score

*  Add test for priorityScore filter

* 🚨 Fix import order

*  Allow 0 priority score filter

* 📝 Add changeset
2025-02-06 20:54:27 +00:00
github-actions[bot]
526bcf8cba
Version packages (#3499)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-06 12:21:42 -06:00
Eric Bailey
636951e472
Include new followerRule as valid setting in postInteractionSettings pref (#3501)
Include new followerRule as valid setting in postInteractionSettings pref
2025-02-06 12:17:14 -06:00
rafael
dc8a7842e6
Add followerRule threadgate (#3496)
* Add followerRule threadgate

* changeset
2025-02-06 11:52:21 -03:00
github-actions[bot]
799dd925e9
Version packages (#3493)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-05 17:50:10 -06:00
Eric Bailey
87ed907a6b
Add setPostInteractionSettings and related prefs (#3494)
* Add setPostInteractionSettings and related prefs

* Fix test

* Align types and implementation

* Tighten up, clarifying descriptions

* Fix test

* Format
2025-02-05 17:43:27 -06:00
Matthieu Sieben
61dc0d60e1
Add linting rule to sort imports (#3220)
* Add linting rule to sort imports

* remove spacing between import groups

* changeset

* changeset

* prettier config fine tuning

* forbid use of deprecated imports

* tidy
2025-02-05 15:06:58 +01:00
Matthieu Sieben
53a577fd4b
PDS: ActorStore Refactor (#3492)
* Similification of the `pds` package by:
- Removing `DetailedAccountStore` class (moving its logic inside `AccountManager`)
- Factorizes image URL building into its own class (for easy re-use from `AccountManager`)
- Adds an `AppView` class that exposes an `agent: AtpAgent` and url builder function (used by the `ImageUrlBuilder`).
- Reworks the `ActorStore` to avoid circular dependency between `AccountManager` and `LocalViewerCreator` (needed because of first item)

* tidy

* move classes in their own file
2025-02-05 13:37:16 +01:00
rafael
8a30e0ed92
[SH] fixes base (#3445)
Co-authored-by: Eric Bailey <git@esb.lol>
2025-02-04 16:37:48 -03:00
Kyle Mathews
8f88623c99
Fix typo in README (#3483) 2025-02-01 18:03:41 -08:00
github-actions[bot]
1c195a3845
Version packages (#3442)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-31 18:01:32 -06:00
Daniel Holmgren
52c687a05c
CBOR: parse safe uint64 as number (#3481)
* parse safe uint64 as number

* rename test
2025-01-31 17:57:48 -06:00
Foysal Ahamed
7f52e67354
Mark appeals as resolved when takedown is issued (#3352)
*  Mark appeals as resolved when takedown is issued

*  Only set appealed false if in appealed state

* 📝 Add changeset
2025-01-31 12:01:17 -08:00
Foysal Ahamed
d377d1a9be
Allow creating labels with expiry (#3476)
*  Allow creating labels with expiry

* 🧹 Cleanup
2025-01-31 11:48:10 -08:00
Foysal Ahamed
8fd5dcea92
🐛 Add account, record and identity events to the list of allowed event filter (#3464)
🐛 Add account, record and identity events to he list of allowed event filter
2025-01-31 11:46:45 -08:00
Matthieu Sieben
cc2a1222bd
Fix did:web encoding/decoding (#3454) 2025-01-26 16:06:06 -08:00
Matthieu Sieben
fb64d50ee2
Explicitly allow "undefined" values in headers (#3456)
* Explicitly allow "undefined" values in `headers`

* fix tests types
2025-01-26 13:24:27 -08:00
Matthieu Sieben
8810885b8e
fix pds tests flakiness (#3463) 2025-01-26 13:24:03 -08:00
Matthieu Sieben
933b6ba36e
Improve codegen script (#3465)
paralellize codegen
2025-01-26 12:29:28 -08:00
devin ivy
a8f06939f9
Appview: ensure takedowns on modlist authors always apply (#3192)
* appview: begin rewiring logic for applying modlist, based on owner status.

* appview: unify logic for checking list-block/mutes

* appview: apply actor takedowns for 3p list-blocks

* appview: apply actor takedowns for 1p list-blocks, fix dataplane method

* appview: test takedown on modlist author, application of list
2025-01-24 18:49:35 -05:00
devin ivy
8c777f041f
Appview: add user-agent for feeds and resolving blobs (#3450)
appview: add user-agent for feeds and resolving blobs
2025-01-24 18:07:59 -05:00
Eric Bailey
e5d4c7462d
Update confirm-email template (#2849) 2025-01-24 14:59:31 -06:00
Matthieu Sieben
da7a831a73
Code cleanup (#3437) 2025-01-24 15:29:33 +01:00
devin ivy
0904515069
Add imax to contributors for disclosure (#3434) 2025-01-23 22:53:02 -08:00
Matthieu Sieben
4f2841efeb
Improve error reporting in case of failed PLC update operation (#3439)
* Improve error reporting in case of failed PLC update operation

* Improve error message

* convert all PlcClientError XRPCError

* changeset
2025-01-23 15:53:38 +01:00
github-actions[bot]
3aa97a9dd3
Version packages (#3438)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-23 14:27:29 +00:00
Samuel Newman
8c6c7813a9
Allow passing allowTakendown to createSession (#3441)
* allow passing `allowTakendown` to createSession

* changeset
2025-01-23 14:22:55 +00:00
Matthieu Sieben
b04943191b
Add description for transition:* scopes (#3432) 2025-01-23 11:01:37 +01:00
Daniel Holmgren
08a48c16a0
Reset rate limit codegen (#3435)
reset rate limit codegen
2025-01-22 17:55:34 -06:00
github-actions[bot]
e6bd2ad8d1
Version packages (#3427)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-22 15:52:42 -03:00
Matthieu Sieben
c5a4cdb0a5
Improve error description in case invalid DPoP nonce is used (#3415) 2025-01-22 11:17:20 +01:00
rafael
e6e6aea381
version api (#3429) 2025-01-21 22:06:08 -03:00
rafael
c0a75d310a
posts_with_video filter (#3390) 2025-01-21 15:49:02 -03:00
rafael
6b8a51e881
[threadContext 2] Add threadContext to threadViewPost - backend (#3313) 2025-01-21 15:35:16 -03:00
rafael
b1dd0504cc
[threadContext 1] Add threadContext to threadViewPost - lex (#3318) 2025-01-21 14:36:50 -03:00
Matthieu Sieben
1ada2d0934
Fix getSubjectStatuses SQL (#3426) 2025-01-21 17:12:02 +01:00
github-actions[bot]
74ee108262
Version packages (#3425)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-21 10:55:50 -03:00
rafael
1015d96925
changeset (#3422) 2025-01-21 10:33:28 -03:00
github-actions[bot]
d3432f0a79
Version packages (#3421)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-20 22:00:43 -03:00
rafael
6241f6b00b
expose resetRouteRateLimits to the req handler (#3420) 2025-01-20 21:56:11 -03:00
github-actions[bot]
d80380cb56
Version packages (#3417)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-20 15:28:55 +00:00
Matthieu Sieben
50603b4f2e
Add account and record level statistics when querring `tools.ozone.mo… (#3416)
* Add account and record level statistics when querring `tools.ozone.moderation.queryStatuses`.

* Update `tools.ozone.moderation.queryStatuses` lexicon
2025-01-20 16:17:42 +01:00
Matthieu Sieben
ee9779d074
Add account details to queryStatuses (#3236)
* Moderation subjectStatusView with statistics

* add account stats to queue entries

* fix

* adapt

* review changes

* style

* review comments

* wip

* add indexes

* refresh materialized view

* use the background queue to refresh materialized views

* tidy

* fix verrify

* tidy

* Add filtering based on "minAccountSuspendCount"

* fix tests

* Update test snapshots

* update materialized views when running `processAll`

* tidy

* processAll sequentially

* tidy

* tidy

* fix dead lock
2025-01-20 15:36:02 +01:00
github-actions[bot]
5417476622
Version packages (#3380)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-17 20:32:20 -03:00
rafael
cbf17066f3
feed generator content mode (#3389) 2025-01-17 20:26:29 -03:00
devin ivy
9c01281931
fetch-node: ensure unicast checks allow psl domains (#3379) 2025-01-16 18:43:27 -05:00
rafael
4ab7075fde
small rate-limit improvements (#3376) 2025-01-16 16:38:28 -03:00
rafael
4e43cc0de1
use ubuntu 22.04 on github actions (#3377) 2025-01-16 15:46:37 -03:00
rafael
688ff00dde
codegen un-codegen-ed stuff on main (#3374) 2025-01-15 19:34:42 -03:00
github-actions[bot]
fa96a997ec
Version packages (#3372)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-15 13:58:19 -03:00
rafael
0832a377d2
Allow resetting a route's rate limits (#3348) 2025-01-15 13:43:16 -03:00
devin ivy
c6c8686de4
Appview: permit redirects during blob resolution (#3370)
appview: permit redirects during blob resolution
2025-01-15 11:04:42 -05:00
bnewbold
07f11d3e0c
lexicon schema for lexicon schema records (meta) (#3286)
* lexicon schema for lexicon schema records (meta)

* defs are object/unknown, not array

* simplify just to 'lexicon' field

* codegen lexicon schema
2025-01-14 22:21:09 -08:00
2472 changed files with 110657 additions and 29312 deletions

View File

@ -0,0 +1,5 @@
---
"@atproto/api": patch
---
Add verification state to profile view lexicons

View File

@ -0,0 +1,5 @@
---
"@atproto/oauth-provider-frontend": patch
---
Minor UI/UX tweaks

View File

@ -1,26 +1,50 @@
{
"root": true,
// parse TypeScript files
// https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/parser
"parser": "@typescript-eslint/parser",
// configure eslint using options described at
// https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin
"plugins": ["@typescript-eslint"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/base",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:prettier/recommended",
"prettier"
"plugin:import/recommended",
"plugin:import/typescript"
],
"plugins": ["n"],
"ignorePatterns": ["dist", "node_modules"],
"rules": {
"no-var": "error",
"prefer-const": "warn",
"no-misleading-character-class": "warn",
"eqeqeq": ["error", "always", { "null": "ignore" }],
"n/global-require": "error",
"n/no-extraneous-import": "error",
"n/prefer-node-protocol": "error",
"import/extensions": ["off", "ignorePackages"],
"import/export": "off",
"import/namespace": "off",
"import/no-deprecated": "error",
"import/no-absolute-path": "error",
"import/no-dynamic-require": "error",
"import/no-self-import": "error",
"import/order": [
"error",
{
"named": true,
"distinctGroup": true,
"alphabetize": { "order": "asc" },
"newlines-between": "never",
"groups": [
"builtin",
"external",
"internal",
"parent",
["index", "sibling"],
"object"
]
}
],
"@typescript-eslint/no-unused-vars": [
"warn",
"error",
{ "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }
],
"@typescript-eslint/ban-ts-comment": "off",
@ -43,6 +67,34 @@
"rules": {
"@typescript-eslint/no-var-requires": "off"
}
},
{
"files": ["**/*.test.ts", "**/tests/**/*.ts"],
"rules": {
"n/no-extraneous-import": [
"error",
{ "allowModules": ["@atproto/dev-env"] }
]
}
}
]
],
"settings": {
"node": { "version": ">=18.7.0" },
"import/internal-regex": "^@atproto(?:-labs)?/",
"import/parsers": { "@typescript-eslint/parser": [".ts", ".tsx"] },
"import/resolver": {
"typescript": {
"project": [
"tsconfig.json",
"packages/oauth/*/tsconfig.json",
"packages/oauth/*/tsconfig.src.json",
"packages/internal/*/tsconfig.json",
"packages/*/tsconfig.json"
]
},
"node": {
"extensions": [".js", ".jsx", ".json"]
}
}
}
}

View File

@ -12,7 +12,7 @@ env:
jobs:
bsky-container-aws:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -3,6 +3,7 @@ on:
push:
branches:
- main
- divy/etcd-dp-host-list
env:
REGISTRY: ghcr.io
USERNAME: ${{ github.actor }}
@ -14,7 +15,7 @@ env:
jobs:
bsky-container-ghcr:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -12,7 +12,7 @@ env:
jobs:
bsync-container-aws:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -14,7 +14,7 @@ env:
jobs:
bsync-container-ghcr:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -3,7 +3,7 @@ on:
push:
branches:
- main
- divy/ozone-passthru
- divy/ozone-metadata
env:
REGISTRY: ${{ secrets.AWS_ECR_REGISTRY_USEAST2_PACKAGES_REGISTRY }}
USERNAME: ${{ secrets.AWS_ECR_REGISTRY_USEAST2_PACKAGES_USERNAME }}
@ -13,7 +13,7 @@ env:
jobs:
ozone-container-aws:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -14,7 +14,7 @@ env:
jobs:
ozone-container-ghcr:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -12,7 +12,7 @@ env:
jobs:
pds-container-aws:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -14,7 +14,7 @@ env:
jobs:
pds-container-ghcr:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

View File

@ -13,7 +13,7 @@ jobs:
build:
name: Build & Publish
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
contents: write
pull-requests: write

View File

@ -12,7 +12,7 @@ concurrency:
jobs:
build:
name: Build
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- run: corepack enable && corepack prepare --activate
@ -35,6 +35,7 @@ jobs:
path: |
packages/*/dist
packages/*/*/dist
packages/oauth/*/src/locales/*/messages.ts
retention-days: 1
test:
name: Test
@ -42,7 +43,7 @@ jobs:
strategy:
matrix:
shard: [1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8]
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- run: corepack enable && corepack prepare --activate
@ -66,7 +67,7 @@ jobs:
verify:
name: Verify
needs: build
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- run: corepack enable && corepack prepare --activate

2
.gitignore vendored
View File

@ -5,12 +5,12 @@ yarn-error.log
packages/**/dist
.idea
packages/*/coverage
.vscode/
test.sqlite
.DS_Store
*.log
*.tsbuildinfo
.*.env
.env.*
.env
\#*\#
*~

1
.npmrc
View File

@ -1 +1,2 @@
enable-pre-post-scripts = true
include-workspace-root = true

View File

@ -1,12 +1,19 @@
node_modules
interop-test-files
__snapshots__
dist
build
.nyc_output
coverage
pnpm-lock.yaml
.pnpm*
.changeset
*.d.ts
packages/bsky/src/data-plane/gen
CHANGELOG.md
# Prettier is used to format the code during codegen
packages/api/src/client
packages/bsky/src/lexicon
packages/pds/src/lexicon
packages/ozone/src/lexicon
# Automatically generated by lingui
packages/oauth/*/src/locales/*/messages.ts
packages/oauth/oauth-provider-frontend/src/routeTree.gen.ts

View File

@ -3,12 +3,20 @@
"tabWidth": 2,
"semi": false,
"singleQuote": true,
"plugins": ["prettier-plugin-tailwindcss"],
"overrides": [
{
"files": "*.hbs",
"options": {
"singleQuote": false
}
},
{
"files": [".eslintrc"],
"options": {
"parser": "json",
"trailingComma": "none"
}
}
]
}

8
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,8 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"wengerk.highlight-bad-chars",
"esbenp.prettier-vscode",
"streetsidesoftware.code-spell-checker"
]
}

51
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,51 @@
{
"cSpell.language": "en,en-US",
"cSpell.userWords": [
"algs",
"appview",
"atproto",
"blockstore",
"bluesky",
"bsky",
"bsync",
"clsx",
"consolas",
"dpop",
"googleusercontent",
"hcaptcha",
"hexeditor",
"ingester",
"insertable",
"jwks",
"keypair",
"kysely",
"merkle",
"msid",
"multibase",
"multiformats",
"nameserver",
"oidc",
"pkce",
"ponyfill",
"proxied",
"ssrf",
"undici",
"webcrypto",
"whatwg",
"xrpc"
],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.sortImports": "never"
},
"files.associations": {
"**/tsconfig/*.json": "jsonc"
},
"files.defaultLanguage": "ts",
"files.insertFinalNewline": true,
"files.trimTrailingWhitespace": true,
"prettier.semi": false,
"prettier.singleQuote": true,
"prettier.trailingComma": "es5",
"typescript.tsdk": "node_modules/typescript/lib"
}

View File

@ -19,3 +19,7 @@ ATProto receives so many contributions that we could never list everyone who des
#### [goeo\_](https://bsky.app/profile/did:web:genco.me), Security disclosure, May 2024
#### [DavidBuchanan314](https://github.com/DavidBuchanan314), Security disclosure, November 2024
#### [daniel](https://hackerone.com/daniel), Security disclosure, November 2024
#### [imax](https://github.com/imax9000), Security disclosure, January 2025

View File

@ -1,6 +1,6 @@
Dual MIT/Apache-2.0 License
Copyright (c) 2022-2024 Bluesky PBC, and Contributors
Copyright (c) 2022-2025 Bluesky PBC, and Contributors
Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).

View File

@ -28,12 +28,7 @@ run-dev-env-logged: ## Run a "development environment" shell (with logging)
.PHONY: codegen
codegen: ## Re-generate packages from lexicon/ files
cd packages/api; pnpm run codegen
cd packages/pds; pnpm run codegen
cd packages/bsky; pnpm run codegen
cd packages/ozone; pnpm run codegen
# clean up codegen output
pnpm format
pnpm codegen
.PHONY: lint
lint: ## Run style checks and verify syntax
@ -43,6 +38,10 @@ lint: ## Run style checks and verify syntax
fmt: ## Run syntax re-formatting
pnpm format
.PHONY: fmt-lexicons
fmt-lexicons: ## Run syntax re-formatting, just on .json files
pnpm exec eslint ./lexicons/ --ext .json --fix
.PHONY: deps
deps: ## Installs dependent libs using 'pnpm install'
pnpm install --frozen-lockfile

View File

@ -32,3 +32,4 @@ at://did:abc:123/io.nsid.someFunc/-
at://did:abc:123/io.nsid.someFunc/_
at://did:abc:123/io.nsid.someFunc/~
at://did:abc:123/io.nsid.someFunc/...
at://did:plc:asdf123/com.atproto.feed.postV2

View File

@ -3,15 +3,13 @@ com.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.foo
com.example.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
com.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.foo
# invliad examples
# invalid examples
com.example.foo.*
com.example.foo.blah*
com.example.foo.*blah
com.example.f00
com.exa💩ple.thing
a-0.b-1.c-3
a-0.b-1.c-o
a0.b1.c3
1.0.0.127.record
0two.example.foo
example.com
@ -29,4 +27,4 @@ com.atproto.feed.p*st
com.atproto.feed.po#t
com.atproto.feed.p!ot
com.example-.foo
com.example.fooBar.2

View File

@ -5,6 +5,7 @@ com.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle.middle
# valid examples
com.example.fooBar
com.example.fooBarV2
net.users.bob.ping
a.b.c
m.xn--masekowski-d0b.pl
@ -18,6 +19,8 @@ test.12345.record
a01.thing.record
a.0.c
xn--fiqs8s.xn--fiqa61au8b7zsevnm8ak20mc4a87e.record.two
a0.b1.c3
com.example.f00
# allows onion (Tor) NSIDs
onion.expyuzz4wqqyqhjn.spec.getThing

View File

@ -23,7 +23,11 @@
"type": "array",
"items": { "type": "ref", "ref": "com.atproto.label.defs#label" }
},
"createdAt": { "type": "string", "format": "datetime" }
"createdAt": { "type": "string", "format": "datetime" },
"verification": {
"type": "ref",
"ref": "#verificationState"
}
}
},
"profileView": {
@ -53,6 +57,10 @@
"labels": {
"type": "array",
"items": { "type": "ref", "ref": "com.atproto.label.defs#label" }
},
"verification": {
"type": "ref",
"ref": "#verificationState"
}
}
},
@ -95,6 +103,10 @@
"pinnedPost": {
"type": "ref",
"ref": "com.atproto.repo.strongRef"
},
"verification": {
"type": "ref",
"ref": "#verificationState"
}
}
},
@ -158,6 +170,54 @@
}
}
},
"verificationState": {
"type": "object",
"description": "Represents the verification information about the user this object is attached to.",
"required": ["verifications", "verifiedStatus", "trustedVerifierStatus"],
"properties": {
"verifications": {
"type": "array",
"description": "All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included.",
"items": { "type": "ref", "ref": "#verificationView" }
},
"verifiedStatus": {
"type": "string",
"description": "The user's status as a verified account.",
"knownValues": ["valid", "invalid", "none"]
},
"trustedVerifierStatus": {
"type": "string",
"description": "The user's status as a trusted verifier.",
"knownValues": ["valid", "invalid", "none"]
}
}
},
"verificationView": {
"type": "object",
"description": "An individual verification for an associated subject.",
"required": ["issuer", "uri", "isValid", "createdAt"],
"properties": {
"issuer": {
"type": "string",
"description": "The user who issued this verification.",
"format": "did"
},
"uri": {
"type": "string",
"description": "The AT-URI of the verification record.",
"format": "at-uri"
},
"isValid": {
"type": "boolean",
"description": "True if the verification passes validation, otherwise false."
},
"createdAt": {
"type": "string",
"description": "Timestamp when the verification was created.",
"format": "datetime"
}
}
},
"preferences": {
"type": "array",
"items": {
@ -174,7 +234,8 @@
"#mutedWordsPref",
"#hiddenPostsPref",
"#bskyAppStatePref",
"#labelersPref"
"#labelersPref",
"#postInteractionSettingsPref"
]
}
},
@ -468,6 +529,36 @@
"description": "The date and time at which the NUX will expire and should be considered completed."
}
}
},
"postInteractionSettingsPref": {
"type": "object",
"description": "Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly.",
"required": [],
"properties": {
"threadgateAllowRules": {
"description": "Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply.",
"type": "array",
"maxLength": 5,
"items": {
"type": "union",
"refs": [
"app.bsky.feed.threadgate#mentionRule",
"app.bsky.feed.threadgate#followerRule",
"app.bsky.feed.threadgate#followingRule",
"app.bsky.feed.threadgate#listRule"
]
}
},
"postgateEmbeddingRules": {
"description": "Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed.",
"type": "array",
"maxLength": 5,
"items": {
"type": "union",
"refs": ["app.bsky.feed.postgate#disableRule"]
}
}
}
}
}
}

View File

@ -9,8 +9,9 @@
"properties": {
"video": {
"type": "blob",
"description": "The mp4 video file. May be up to 100mb, formerly limited to 50mb.",
"accept": ["video/mp4"],
"maxSize": 50000000
"maxSize": 100000000
},
"captions": {
"type": "array",

View File

@ -48,6 +48,13 @@
"pinned": { "type": "boolean" }
}
},
"threadContext": {
"type": "object",
"description": "Metadata about this post within the context of the thread it is in.",
"properties": {
"rootAuthorLike": { "type": "string", "format": "at-uri" }
}
},
"feedViewPost": {
"type": "object",
"required": ["post"],
@ -108,7 +115,8 @@
"type": "union",
"refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"]
}
}
},
"threadContext": { "type": "ref", "ref": "#threadContext" }
}
},
"notFoundPost": {
@ -162,6 +170,13 @@
"items": { "type": "ref", "ref": "com.atproto.label.defs#label" }
},
"viewer": { "type": "ref", "ref": "#generatorViewerState" },
"contentMode": {
"type": "string",
"knownValues": [
"app.bsky.feed.defs#contentModeUnspecified",
"app.bsky.feed.defs#contentModeVideo"
]
},
"indexedAt": { "type": "string", "format": "datetime" }
}
},
@ -262,6 +277,14 @@
"type": "token",
"description": "User clicked through to the embedded content of the feed item"
},
"contentModeUnspecified": {
"type": "token",
"description": "Declares the feed generator returns any types of posts."
},
"contentModeVideo": {
"type": "token",
"description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds."
},
"interactionSeen": {
"type": "token",
"description": "Feed item was seen by user"

View File

@ -39,6 +39,13 @@
"description": "Self-label values",
"refs": ["com.atproto.label.defs#selfLabels"]
},
"contentMode": {
"type": "string",
"knownValues": [
"app.bsky.feed.defs#contentModeUnspecified",
"app.bsky.feed.defs#contentModeVideo"
]
},
"createdAt": { "type": "string", "format": "datetime" }
}
}

View File

@ -24,7 +24,8 @@
"posts_with_replies",
"posts_no_replies",
"posts_with_media",
"posts_and_author_threads"
"posts_and_author_threads",
"posts_with_video"
],
"default": "posts_with_replies"
},

View File

@ -26,6 +26,7 @@
"description": "List of AT-URIs embedding this post that the author has detached from."
},
"embeddingRules": {
"description": "List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed.",
"type": "array",
"maxLength": 5,
"items": {

View File

@ -16,11 +16,17 @@
"description": "Reference (AT-URI) to the post record."
},
"allow": {
"description": "List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply.",
"type": "array",
"maxLength": 5,
"items": {
"type": "union",
"refs": ["#mentionRule", "#followingRule", "#listRule"]
"refs": [
"#mentionRule",
"#followerRule",
"#followingRule",
"#listRule"
]
}
},
"createdAt": { "type": "string", "format": "datetime" },
@ -41,6 +47,11 @@
"description": "Allow replies from actors mentioned in your post.",
"properties": {}
},
"followerRule": {
"type": "object",
"description": "Allow replies from actors who follow you.",
"properties": {}
},
"followingRule": {
"type": "object",
"description": "Allow replies from actors you follow.",

View File

@ -0,0 +1,36 @@
{
"lexicon": 1,
"id": "app.bsky.graph.verification",
"defs": {
"main": {
"type": "record",
"description": "Record declaring a verification relationship between two accounts. Verifications are only considered valid by an app if issued by an account the app considers trusted.",
"key": "tid",
"record": {
"type": "object",
"required": ["subject", "handle", "displayName", "createdAt"],
"properties": {
"subject": {
"description": "DID of the subject the verification applies to.",
"type": "string",
"format": "did"
},
"handle": {
"description": "Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying.",
"type": "string",
"format": "handle"
},
"displayName": {
"description": "Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying.",
"type": "string"
},
"createdAt": {
"description": "Date of when the verification was created.",
"type": "string",
"format": "datetime"
}
}
}
}
}
}

View File

@ -35,6 +35,27 @@
"labels": {
"type": "array",
"items": { "type": "ref", "ref": "com.atproto.label.defs#label" }
},
"reasonTypes": {
"description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#reasonType"
}
},
"subjectTypes": {
"description": "The set of subject types (account, record, etc) this service accepts reports on.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#subjectType"
}
},
"subjectCollections": {
"type": "array",
"description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.",
"items": { "type": "string", "format": "nsid" }
}
}
},

View File

@ -18,7 +18,28 @@
"type": "union",
"refs": ["com.atproto.label.defs#selfLabels"]
},
"createdAt": { "type": "string", "format": "datetime" }
"createdAt": { "type": "string", "format": "datetime" },
"reasonTypes": {
"description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#reasonType"
}
},
"subjectTypes": {
"description": "The set of subject types (account, record, etc) this service accepts reports on.",
"type": "array",
"items": {
"type": "ref",
"ref": "com.atproto.moderation.defs#subjectType"
}
},
"subjectCollections": {
"type": "array",
"description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.",
"items": { "type": "string", "format": "nsid" }
}
}
}
}

View File

@ -32,6 +32,60 @@
"description": { "type": "string" },
"link": { "type": "string" }
}
},
"skeletonTrend": {
"type": "object",
"required": [
"topic",
"displayName",
"link",
"startedAt",
"postCount",
"dids"
],
"properties": {
"topic": { "type": "string" },
"displayName": { "type": "string" },
"link": { "type": "string" },
"startedAt": { "type": "string", "format": "datetime" },
"postCount": { "type": "integer" },
"status": { "type": "string", "knownValues": ["hot"] },
"category": { "type": "string" },
"dids": {
"type": "array",
"items": {
"type": "string",
"format": "did"
}
}
}
},
"trendView": {
"type": "object",
"required": [
"topic",
"displayName",
"link",
"startedAt",
"postCount",
"actors"
],
"properties": {
"topic": { "type": "string" },
"displayName": { "type": "string" },
"link": { "type": "string" },
"startedAt": { "type": "string", "format": "datetime" },
"postCount": { "type": "integer" },
"status": { "type": "string", "knownValues": ["hot"] },
"category": { "type": "string" },
"actors": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.actor.defs#profileViewBasic"
}
}
}
}
}
}

View File

@ -0,0 +1,37 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getSuggestedFeeds",
"defs": {
"main": {
"type": "query",
"description": "Get a list of suggested feeds",
"parameters": {
"type": "params",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["feeds"],
"properties": {
"feeds": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.feed.defs#generatorView"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,42 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getSuggestedFeedsSkeleton",
"defs": {
"main": {
"type": "query",
"description": "Get a skeleton of suggested feeds. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedFeeds",
"parameters": {
"type": "params",
"properties": {
"viewer": {
"type": "string",
"format": "did",
"description": "DID of the account making the request (not included for public/unauthenticated queries)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["feeds"],
"properties": {
"feeds": {
"type": "array",
"items": {
"type": "string",
"format": "at-uri"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,37 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getSuggestedStarterPacks",
"defs": {
"main": {
"type": "query",
"description": "Get a list of suggested starterpacks",
"parameters": {
"type": "params",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["starterPacks"],
"properties": {
"starterPacks": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.graph.defs#starterPackView"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,42 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getSuggestedStarterPacksSkeleton",
"defs": {
"main": {
"type": "query",
"description": "Get a skeleton of suggested starterpacks. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedStarterpacks",
"parameters": {
"type": "params",
"properties": {
"viewer": {
"type": "string",
"format": "did",
"description": "DID of the account making the request (not included for public/unauthenticated queries)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["starterPacks"],
"properties": {
"starterPacks": {
"type": "array",
"items": {
"type": "string",
"format": "at-uri"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,41 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getSuggestedUsers",
"defs": {
"main": {
"type": "query",
"description": "Get a list of suggested users",
"parameters": {
"type": "params",
"properties": {
"category": {
"type": "string",
"description": "Category of users to get suggestions for."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 25
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["actors"],
"properties": {
"actors": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.actor.defs#profileView"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,46 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getSuggestedUsersSkeleton",
"defs": {
"main": {
"type": "query",
"description": "Get a skeleton of suggested users. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsers",
"parameters": {
"type": "params",
"properties": {
"viewer": {
"type": "string",
"format": "did",
"description": "DID of the account making the request (not included for public/unauthenticated queries)."
},
"category": {
"type": "string",
"description": "Category of users to get suggestions for."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 25
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["dids"],
"properties": {
"dids": {
"type": "array",
"items": {
"type": "string",
"format": "did"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,37 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getTrends",
"defs": {
"main": {
"type": "query",
"description": "Get the current trends on the network",
"parameters": {
"type": "params",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["trends"],
"properties": {
"trends": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.unspecced.defs#trendView"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,42 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getTrendsSkeleton",
"defs": {
"main": {
"type": "query",
"description": "Get the skeleton of trends on the network. Intended to be called and then hydrated through app.bsky.unspecced.getTrends",
"parameters": {
"type": "params",
"properties": {
"viewer": {
"type": "string",
"format": "did",
"description": "DID of the account making the request (not included for public/unauthenticated queries)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["trends"],
"properties": {
"trends": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.unspecced.defs#skeletonTrend"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,31 @@
{
"lexicon": 1,
"id": "chat.bsky.convo.acceptConvo",
"defs": {
"main": {
"type": "procedure",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["convoId"],
"properties": {
"convoId": { "type": "string" }
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"properties": {
"rev": {
"description": "Rev when the convo was accepted. If not present, the convo was already accepted.",
"type": "string"
}
}
}
}
}
}
}

View File

@ -0,0 +1,55 @@
{
"lexicon": 1,
"id": "chat.bsky.convo.addReaction",
"defs": {
"main": {
"type": "procedure",
"description": "Adds an emoji reaction to a message. Requires authentication. It is idempotent, so multiple calls from the same user with the same emoji result in a single reaction.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["convoId", "messageId", "value"],
"properties": {
"convoId": { "type": "string" },
"messageId": { "type": "string" },
"value": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"minGraphemes": 1,
"maxGraphemes": 1
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["message"],
"properties": {
"message": {
"type": "ref",
"ref": "chat.bsky.convo.defs#messageView"
}
}
}
},
"errors": [
{
"name": "ReactionMessageDeleted",
"description": "Indicates that the message has been deleted and reactions can no longer be added/removed."
},
{
"name": "ReactionLimitReached",
"description": "Indicates that the message has the maximum number of reactions allowed for a single user, and the requested reaction wasn't yet present. If it was already present, the request will not fail since it is idempotent."
},
{
"name": "ReactionInvalidValue",
"description": "Indicates the value for the reaction is not acceptable. In general, this means it is not an emoji."
}
]
}
}
}

View File

@ -51,6 +51,11 @@
"type": "union",
"refs": ["app.bsky.embed.record#view"]
},
"reactions": {
"type": "array",
"description": "Reactions to this message, in ascending order of creation time.",
"items": { "type": "ref", "ref": "#reactionView" }
},
"sender": { "type": "ref", "ref": "#messageViewSender" },
"sentAt": { "type": "string", "format": "datetime" }
}
@ -72,6 +77,30 @@
"did": { "type": "string", "format": "did" }
}
},
"reactionView": {
"type": "object",
"required": ["value", "sender", "createdAt"],
"properties": {
"value": { "type": "string" },
"sender": { "type": "ref", "ref": "#reactionViewSender" },
"createdAt": { "type": "string", "format": "datetime" }
}
},
"reactionViewSender": {
"type": "object",
"required": ["did"],
"properties": {
"did": { "type": "string", "format": "did" }
}
},
"messageAndReactionView": {
"type": "object",
"required": ["message", "reaction"],
"properties": {
"message": { "type": "ref", "ref": "#messageView" },
"reaction": { "type": "ref", "ref": "#reactionView" }
}
},
"convoView": {
"type": "object",
"required": ["id", "rev", "members", "muted", "unreadCount"],
@ -89,8 +118,15 @@
"type": "union",
"refs": ["#messageView", "#deletedMessageView"]
},
"lastReaction": {
"type": "union",
"refs": ["#messageAndReactionView"]
},
"muted": { "type": "boolean" },
"opened": { "type": "boolean" },
"status": {
"type": "string",
"knownValues": ["request", "accepted"]
},
"unreadCount": { "type": "integer" }
}
},
@ -102,6 +138,14 @@
"convoId": { "type": "string" }
}
},
"logAcceptConvo": {
"type": "object",
"required": ["rev", "convoId"],
"properties": {
"rev": { "type": "string" },
"convoId": { "type": "string" }
}
},
"logLeaveConvo": {
"type": "object",
"required": ["rev", "convoId"],
@ -110,6 +154,22 @@
"convoId": { "type": "string" }
}
},
"logMuteConvo": {
"type": "object",
"required": ["rev", "convoId"],
"properties": {
"rev": { "type": "string" },
"convoId": { "type": "string" }
}
},
"logUnmuteConvo": {
"type": "object",
"required": ["rev", "convoId"],
"properties": {
"rev": { "type": "string" },
"convoId": { "type": "string" }
}
},
"logCreateMessage": {
"type": "object",
"required": ["rev", "convoId", "message"],
@ -133,6 +193,44 @@
"refs": ["#messageView", "#deletedMessageView"]
}
}
},
"logReadMessage": {
"type": "object",
"required": ["rev", "convoId", "message"],
"properties": {
"rev": { "type": "string" },
"convoId": { "type": "string" },
"message": {
"type": "union",
"refs": ["#messageView", "#deletedMessageView"]
}
}
},
"logAddReaction": {
"type": "object",
"required": ["rev", "convoId", "message", "reaction"],
"properties": {
"rev": { "type": "string" },
"convoId": { "type": "string" },
"message": {
"type": "union",
"refs": ["#messageView", "#deletedMessageView"]
},
"reaction": { "type": "ref", "ref": "#reactionView" }
}
},
"logRemoveReaction": {
"type": "object",
"required": ["rev", "convoId", "message", "reaction"],
"properties": {
"rev": { "type": "string" },
"convoId": { "type": "string" },
"message": {
"type": "union",
"refs": ["#messageView", "#deletedMessageView"]
},
"reaction": { "type": "ref", "ref": "#reactionView" }
}
}
}
}

View File

@ -0,0 +1,41 @@
{
"lexicon": 1,
"id": "chat.bsky.convo.getConvoAvailability",
"defs": {
"main": {
"type": "query",
"description": "Get whether the requester and the other members can chat. If an existing convo is found for these members, it is returned.",
"parameters": {
"type": "params",
"required": ["members"],
"properties": {
"members": {
"type": "array",
"minLength": 1,
"maxLength": 10,
"items": {
"type": "string",
"format": "did"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["canChat"],
"properties": {
"canChat": {
"type": "boolean"
},
"convo": {
"type": "ref",
"ref": "chat.bsky.convo.defs#convoView"
}
}
}
}
}
}
}

View File

@ -24,9 +24,15 @@
"type": "union",
"refs": [
"chat.bsky.convo.defs#logBeginConvo",
"chat.bsky.convo.defs#logAcceptConvo",
"chat.bsky.convo.defs#logLeaveConvo",
"chat.bsky.convo.defs#logMuteConvo",
"chat.bsky.convo.defs#logUnmuteConvo",
"chat.bsky.convo.defs#logCreateMessage",
"chat.bsky.convo.defs#logDeleteMessage"
"chat.bsky.convo.defs#logDeleteMessage",
"chat.bsky.convo.defs#logReadMessage",
"chat.bsky.convo.defs#logAddReaction",
"chat.bsky.convo.defs#logRemoveReaction"
]
}
}

View File

@ -13,7 +13,15 @@
"maximum": 100,
"default": 50
},
"cursor": { "type": "string" }
"cursor": { "type": "string" },
"readState": {
"type": "string",
"knownValues": ["unread"]
},
"status": {
"type": "string",
"knownValues": ["request", "accepted"]
}
}
},
"output": {

View File

@ -0,0 +1,51 @@
{
"lexicon": 1,
"id": "chat.bsky.convo.removeReaction",
"defs": {
"main": {
"type": "procedure",
"description": "Removes an emoji reaction from a message. Requires authentication. It is idempotent, so multiple calls from the same user with the same emoji result in that reaction not being present, even if it already wasn't.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["convoId", "messageId", "value"],
"properties": {
"convoId": { "type": "string" },
"messageId": { "type": "string" },
"value": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"minGraphemes": 1,
"maxGraphemes": 1
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["message"],
"properties": {
"message": {
"type": "ref",
"ref": "chat.bsky.convo.defs#messageView"
}
}
}
},
"errors": [
{
"name": "ReactionMessageDeleted",
"description": "Indicates that the message has been deleted and reactions can no longer be added/removed."
},
{
"name": "ReactionInvalidValue",
"description": "Indicates the value for the reaction is not acceptable. In general, this means it is not an emoji."
}
]
}
}
}

View File

@ -0,0 +1,34 @@
{
"lexicon": 1,
"id": "chat.bsky.convo.updateAllRead",
"defs": {
"main": {
"type": "procedure",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"knownValues": ["request", "accepted"]
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["updatedCount"],
"properties": {
"updatedCount": {
"description": "The count of updated convos.",
"type": "integer"
}
}
}
}
}
}
}

View File

@ -0,0 +1,25 @@
{
"lexicon": 1,
"id": "com.atproto.admin.updateAccountSigningKey",
"defs": {
"main": {
"type": "procedure",
"description": "Administrative action to update an account's signing key in their Did document.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["did", "signingKey"],
"properties": {
"did": { "type": "string", "format": "did" },
"signingKey": {
"type": "string",
"format": "did",
"description": "Did-key formatted public key"
}
}
}
}
}
}
}

View File

@ -0,0 +1,22 @@
{
"lexicon": 1,
"id": "com.atproto.identity.defs",
"defs": {
"identityInfo": {
"type": "object",
"required": ["did", "handle", "didDoc"],
"properties": {
"did": { "type": "string", "format": "did" },
"handle": {
"type": "string",
"format": "handle",
"description": "The validated handle of the account; or 'handle.invalid' if the handle did not bi-directionally match the DID document."
},
"didDoc": {
"type": "unknown",
"description": "The complete DID document for the identity."
}
}
}
}
}

View File

@ -0,0 +1,44 @@
{
"lexicon": 1,
"id": "com.atproto.identity.refreshIdentity",
"defs": {
"main": {
"type": "procedure",
"description": "Request that the server re-resolve an identity (DID and handle). The server may ignore this request, or require authentication, depending on the role, implementation, and policy of the server.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["identifier"],
"properties": {
"identifier": {
"type": "string",
"format": "at-identifier"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "com.atproto.identity.defs#identityInfo"
}
},
"errors": [
{
"name": "HandleNotFound",
"description": "The resolution process confirmed that the handle does not resolve to any DID."
},
{
"name": "DidNotFound",
"description": "The DID resolution process confirmed that there is no current DID."
},
{
"name": "DidDeactivated",
"description": "The DID previously existed, but has been deactivated."
}
]
}
}
}

View File

@ -0,0 +1,44 @@
{
"lexicon": 1,
"id": "com.atproto.identity.resolveDid",
"defs": {
"main": {
"type": "query",
"description": "Resolves DID to DID document. Does not bi-directionally verify handle.",
"parameters": {
"type": "params",
"required": ["did"],
"properties": {
"did": {
"type": "string",
"format": "did",
"description": "DID to resolve."
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["didDoc"],
"properties": {
"didDoc": {
"type": "unknown",
"description": "The complete DID document for the identity."
}
}
}
},
"errors": [
{
"name": "DidNotFound",
"description": "The DID resolution process confirmed that there is no current DID."
},
{
"name": "DidDeactivated",
"description": "The DID previously existed, but has been deactivated."
}
]
}
}
}

View File

@ -4,7 +4,7 @@
"defs": {
"main": {
"type": "query",
"description": "Resolves a handle (domain name) to a DID.",
"description": "Resolves an atproto handle (hostname) to a DID. Does not necessarily bi-directionally verify against the the DID document.",
"parameters": {
"type": "params",
"required": ["handle"],
@ -25,7 +25,13 @@
"did": { "type": "string", "format": "did" }
}
}
}
},
"errors": [
{
"name": "HandleNotFound",
"description": "The resolution process confirmed that the handle does not resolve to any DID."
}
]
}
}
}

View File

@ -0,0 +1,42 @@
{
"lexicon": 1,
"id": "com.atproto.identity.resolveIdentity",
"defs": {
"main": {
"type": "query",
"description": "Resolves an identity (DID or Handle) to a full identity (DID document and verified handle).",
"parameters": {
"type": "params",
"required": ["identifier"],
"properties": {
"identifier": {
"type": "string",
"format": "at-identifier",
"description": "Handle or DID to resolve."
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "com.atproto.identity.defs#identityInfo"
}
},
"errors": [
{
"name": "HandleNotFound",
"description": "The resolution process confirmed that the handle does not resolve to any DID."
},
{
"name": "DidNotFound",
"description": "The DID resolution process confirmed that there is no current DID."
},
{
"name": "DidDeactivated",
"description": "The DID previously existed, but has been deactivated."
}
]
}
}
}

View File

@ -0,0 +1,21 @@
{
"lexicon": 1,
"id": "com.atproto.lexicon.schema",
"defs": {
"main": {
"type": "record",
"description": "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).",
"key": "nsid",
"record": {
"type": "object",
"required": ["lexicon"],
"properties": {
"lexicon": {
"type": "integer",
"description": "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system."
}
}
}
}
}
}

View File

@ -41,6 +41,11 @@
"reasonAppeal": {
"type": "token",
"description": "Appeal: appeal a previously taken moderation action"
},
"subjectType": {
"type": "string",
"description": "Tag describing a type of subject that might be reported.",
"knownValues": ["account", "record", "chat"]
}
}
}

View File

@ -70,7 +70,12 @@
"required": ["collection", "value"],
"properties": {
"collection": { "type": "string", "format": "nsid" },
"rkey": { "type": "string", "maxLength": 512 },
"rkey": {
"type": "string",
"maxLength": 512,
"format": "record-key",
"description": "NOTE: maxLength is redundant with record-key format. Keeping it temporarily to ensure backwards compatibility."
},
"value": { "type": "unknown" }
}
},
@ -80,7 +85,7 @@
"required": ["collection", "rkey", "value"],
"properties": {
"collection": { "type": "string", "format": "nsid" },
"rkey": { "type": "string" },
"rkey": { "type": "string", "format": "record-key" },
"value": { "type": "unknown" }
}
},
@ -90,7 +95,7 @@
"required": ["collection", "rkey"],
"properties": {
"collection": { "type": "string", "format": "nsid" },
"rkey": { "type": "string" }
"rkey": { "type": "string", "format": "record-key" }
}
},
"createResult": {

View File

@ -23,6 +23,7 @@
},
"rkey": {
"type": "string",
"format": "record-key",
"description": "The Record Key.",
"maxLength": 512
},

View File

@ -7,7 +7,7 @@
"required": ["cid", "rev"],
"properties": {
"cid": { "type": "string", "format": "cid" },
"rev": { "type": "string" }
"rev": { "type": "string", "format": "tid" }
}
}
}

View File

@ -23,6 +23,7 @@
},
"rkey": {
"type": "string",
"format": "record-key",
"description": "The Record Key."
},
"swapRecord": {

View File

@ -19,7 +19,11 @@
"format": "nsid",
"description": "The NSID of the record collection."
},
"rkey": { "type": "string", "description": "The Record Key." },
"rkey": {
"type": "string",
"description": "The Record Key.",
"format": "record-key"
},
"cid": {
"type": "string",
"format": "cid",

View File

@ -27,14 +27,6 @@
"description": "The number of records to return."
},
"cursor": { "type": "string" },
"rkeyStart": {
"type": "string",
"description": "DEPRECATED: The lowest sort-ordered rkey to start from (exclusive)"
},
"rkeyEnd": {
"type": "string",
"description": "DEPRECATED: The highest sort-ordered rkey to stop at (exclusive)"
},
"reverse": {
"type": "boolean",
"description": "Flag to reverse the order of the returned records."

View File

@ -24,6 +24,7 @@
},
"rkey": {
"type": "string",
"format": "record-key",
"description": "The Record Key.",
"maxLength": 512
},

View File

@ -0,0 +1,10 @@
{
"lexicon": 1,
"id": "com.atproto.sync.defs",
"defs": {
"hostStatus": {
"type": "string",
"knownValues": ["active", "idle", "offline", "throttled", "banned"]
}
}
}

View File

@ -0,0 +1,43 @@
{
"lexicon": 1,
"id": "com.atproto.sync.getHostStatus",
"defs": {
"main": {
"type": "query",
"description": "Returns information about a specified upstream host, as consumed by the server. Implemented by relays.",
"parameters": {
"type": "params",
"required": ["hostname"],
"properties": {
"hostname": {
"type": "string",
"description": "Hostname of the host (eg, PDS or relay) being queried."
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["hostname"],
"properties": {
"hostname": { "type": "string" },
"seq": {
"type": "integer",
"description": "Recent repo stream event sequence number. May be delayed from actual stream processing (eg, persisted cursor not in-memory cursor)."
},
"accountCount": {
"type": "integer",
"description": "Number of accounts on the server which are associated with the upstream host. Note that the upstream may actually have more accounts."
},
"status": {
"type": "ref",
"ref": "com.atproto.sync.defs#hostStatus"
}
}
}
},
"errors": [{ "name": "HostNotFound" }]
}
}
}

View File

@ -23,7 +23,7 @@
"required": ["cid", "rev"],
"properties": {
"cid": { "type": "string", "format": "cid" },
"rev": { "type": "string" }
"rev": { "type": "string", "format": "tid" }
}
}
},

View File

@ -15,11 +15,10 @@
"description": "The DID of the repo."
},
"collection": { "type": "string", "format": "nsid" },
"rkey": { "type": "string", "description": "Record Key" },
"commit": {
"rkey": {
"type": "string",
"format": "cid",
"description": "DEPRECATED: referenced a repo commit by CID, and retrieved record as of that commit"
"description": "Record Key",
"format": "record-key"
}
}
},

View File

@ -16,6 +16,7 @@
},
"since": {
"type": "string",
"format": "tid",
"description": "The revision ('rev') of the repo to create a diff from."
}
}

View File

@ -27,10 +27,18 @@
"status": {
"type": "string",
"description": "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.",
"knownValues": ["takendown", "suspended", "deactivated"]
"knownValues": [
"takendown",
"suspended",
"deleted",
"deactivated",
"desynchronized",
"throttled"
]
},
"rev": {
"type": "string",
"format": "tid",
"description": "Optional field, the current rev of the repo, if active=true"
}
}

View File

@ -16,6 +16,7 @@
},
"since": {
"type": "string",
"format": "tid",
"description": "Optional revision of the repo to list blobs since."
},
"limit": {

View File

@ -0,0 +1,56 @@
{
"lexicon": 1,
"id": "com.atproto.sync.listHosts",
"defs": {
"main": {
"type": "query",
"description": "Enumerates upstream hosts (eg, PDS or relay instances) that this service consumes from. Implemented by relays.",
"parameters": {
"type": "params",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 1000,
"default": 200
},
"cursor": { "type": "string" }
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["hosts"],
"properties": {
"cursor": { "type": "string" },
"hosts": {
"type": "array",
"items": { "type": "ref", "ref": "#host" },
"description": "Sort order is not formally specified. Recommended order is by time host was first seen by the server, with oldest first."
}
}
}
}
},
"host": {
"type": "object",
"required": ["hostname"],
"properties": {
"hostname": {
"type": "string",
"description": "hostname of server; not a URL (no scheme)"
},
"seq": {
"type": "integer",
"description": "Recent repo stream event sequence number. May be delayed from actual stream processing (eg, persisted cursor not in-memory cursor)."
},
"accountCount": { "type": "integer" },
"status": {
"type": "ref",
"ref": "com.atproto.sync.defs#hostStatus"
}
}
}
}
}

View File

@ -42,12 +42,19 @@
"format": "cid",
"description": "Current repo commit CID"
},
"rev": { "type": "string" },
"rev": { "type": "string", "format": "tid" },
"active": { "type": "boolean" },
"status": {
"type": "string",
"description": "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.",
"knownValues": ["takendown", "suspended", "deactivated"]
"knownValues": [
"takendown",
"suspended",
"deleted",
"deactivated",
"desynchronized",
"throttled"
]
}
}
}

View File

@ -0,0 +1,46 @@
{
"lexicon": 1,
"id": "com.atproto.sync.listReposByCollection",
"defs": {
"main": {
"type": "query",
"description": "Enumerates all the DIDs which have records with the given collection NSID.",
"parameters": {
"type": "params",
"required": ["collection"],
"properties": {
"collection": { "type": "string", "format": "nsid" },
"limit": {
"type": "integer",
"description": "Maximum size of response set. Recommend setting a large maximum (1000+) when enumerating large DID lists.",
"minimum": 1,
"maximum": 2000,
"default": 500
},
"cursor": { "type": "string" }
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["repos"],
"properties": {
"cursor": { "type": "string" },
"repos": {
"type": "array",
"items": { "type": "ref", "ref": "#repo" }
}
}
}
}
},
"repo": {
"type": "object",
"required": ["did"],
"properties": {
"did": { "type": "string", "format": "did" }
}
}
}
}

View File

@ -4,7 +4,7 @@
"defs": {
"main": {
"type": "procedure",
"description": "Notify a crawling service of a recent update, and that crawling should resume. Intended use is after a gap between repo stream events caused the crawling service to disconnect. Does not require auth; implemented by Relay.",
"description": "Notify a crawling service of a recent update, and that crawling should resume. Intended use is after a gap between repo stream events caused the crawling service to disconnect. Does not require auth; implemented by Relay. DEPRECATED: just use com.atproto.sync.requestCrawl",
"input": {
"encoding": "application/json",
"schema": {

View File

@ -17,7 +17,8 @@
}
}
}
}
},
"errors": [{ "name": "HostBanned" }]
}
}
}

View File

@ -17,15 +17,7 @@
"message": {
"schema": {
"type": "union",
"refs": [
"#commit",
"#identity",
"#account",
"#handle",
"#migrate",
"#tombstone",
"#info"
]
"refs": ["#commit", "#sync", "#identity", "#account", "#info"]
}
},
"errors": [
@ -52,7 +44,7 @@
"blobs",
"time"
],
"nullable": ["prev", "since"],
"nullable": ["since"],
"properties": {
"seq": {
"type": "integer",
@ -61,33 +53,31 @@
"rebase": { "type": "boolean", "description": "DEPRECATED -- unused" },
"tooBig": {
"type": "boolean",
"description": "Indicates that this commit contained too many ops, or data size was too large. Consumers will need to make a separate request to get missing data."
"description": "DEPRECATED -- replaced by #sync event and data limits. Indicates that this commit contained too many ops, or data size was too large. Consumers will need to make a separate request to get missing data."
},
"repo": {
"type": "string",
"format": "did",
"description": "The repo this event comes from."
"description": "The repo this event comes from. Note that all other message types name this field 'did'."
},
"commit": {
"type": "cid-link",
"description": "Repo commit object CID."
},
"prev": {
"type": "cid-link",
"description": "DEPRECATED -- unused. WARNING -- nullable and optional; stick with optional to ensure golang interoperability."
},
"rev": {
"type": "string",
"format": "tid",
"description": "The rev of the emitted commit. Note that this information is also in the commit object included in blocks, unless this is a tooBig event."
},
"since": {
"type": "string",
"format": "tid",
"description": "The rev of the last emitted commit from this repo (if any)."
},
"blocks": {
"type": "bytes",
"description": "CAR file containing relevant blocks, as a diff since the previous repo state.",
"maxLength": 1000000
"description": "CAR file containing relevant blocks, as a diff since the previous repo state. The commit must be included as a block, and the commit block CID must be the first entry in the CAR header 'roots' list.",
"maxLength": 2000000
},
"ops": {
"type": "array",
@ -102,9 +92,43 @@
"type": "array",
"items": {
"type": "cid-link",
"description": "List of new blobs (by CID) referenced by records in this commit."
"description": "DEPRECATED -- will soon always be empty. List of new blobs (by CID) referenced by records in this commit."
}
},
"prevData": {
"type": "cid-link",
"description": "The root CID of the MST tree for the previous commit from this repo (indicated by the 'since' revision field in this message). Corresponds to the 'data' field in the repo commit object. NOTE: this field is effectively required for the 'inductive' version of firehose."
},
"time": {
"type": "string",
"format": "datetime",
"description": "Timestamp of when this message was originally broadcast."
}
}
},
"sync": {
"type": "object",
"description": "Updates the repo to a new state, without necessarily including that state on the firehose. Used to recover from broken commit streams, data loss incidents, or in situations where upstream host does not know recent state of the repository.",
"required": ["seq", "did", "blocks", "rev", "time"],
"properties": {
"seq": {
"type": "integer",
"description": "The stream sequence number of this message."
},
"did": {
"type": "string",
"format": "did",
"description": "The account this repo event corresponds to. Must match that in the commit object."
},
"blocks": {
"type": "bytes",
"description": "CAR file containing the commit, as a block. The CAR header must include the commit block CID as the first 'root'.",
"maxLength": 10000
},
"rev": {
"type": "string",
"description": "The rev of the commit. This value must match that in the commit object."
},
"time": {
"type": "string",
"format": "datetime",
@ -142,43 +166,17 @@
"status": {
"type": "string",
"description": "If active=false, this optional field indicates a reason for why the account is not active.",
"knownValues": ["takendown", "suspended", "deleted", "deactivated"]
"knownValues": [
"takendown",
"suspended",
"deleted",
"deactivated",
"desynchronized",
"throttled"
]
}
}
},
"handle": {
"type": "object",
"description": "DEPRECATED -- Use #identity event instead",
"required": ["seq", "did", "handle", "time"],
"properties": {
"seq": { "type": "integer" },
"did": { "type": "string", "format": "did" },
"handle": { "type": "string", "format": "handle" },
"time": { "type": "string", "format": "datetime" }
}
},
"migrate": {
"type": "object",
"description": "DEPRECATED -- Use #account event instead",
"required": ["seq", "did", "migrateTo", "time"],
"nullable": ["migrateTo"],
"properties": {
"seq": { "type": "integer" },
"did": { "type": "string", "format": "did" },
"migrateTo": { "type": "string" },
"time": { "type": "string", "format": "datetime" }
}
},
"tombstone": {
"type": "object",
"description": "DEPRECATED -- Use #account event instead",
"required": ["seq", "did", "time"],
"properties": {
"seq": { "type": "integer" },
"did": { "type": "string", "format": "did" },
"time": { "type": "string", "format": "datetime" }
}
},
"info": {
"type": "object",
"required": ["name"],
@ -206,6 +204,10 @@
"cid": {
"type": "cid-link",
"description": "For creates and updates, the new record CID. For deletions, null."
},
"prev": {
"type": "cid-link",
"description": "For updates and deletes, the previous record CID (required for inductive firehose). For creations, field should not be defined."
}
}
}

View File

@ -34,7 +34,8 @@
"#modEventTag",
"#accountEvent",
"#identityEvent",
"#recordEvent"
"#recordEvent",
"#modEventPriorityScore"
]
},
"subject": {
@ -84,7 +85,8 @@
"#modEventTag",
"#accountEvent",
"#identityEvent",
"#recordEvent"
"#recordEvent",
"#modEventPriorityScore"
]
},
"subject": {
@ -143,6 +145,12 @@
"type": "string",
"description": "Sticky comment on the subject."
},
"priorityScore": {
"type": "integer",
"description": "Numeric value representing the level of priority. Higher score means higher priority.",
"minimum": 0,
"maximum": 100
},
"muteUntil": {
"type": "string",
"format": "datetime"
@ -182,6 +190,110 @@
"tags": {
"type": "array",
"items": { "type": "string" }
},
"accountStats": {
"description": "Statistics related to the account subject",
"type": "ref",
"ref": "#accountStats"
},
"recordsStats": {
"description": "Statistics related to the record subjects authored by the subject's account",
"type": "ref",
"ref": "#recordsStats"
}
}
},
"subjectView": {
"description": "Detailed view of a subject. For record subjects, the author's repo and profile will be returned.",
"type": "object",
"required": ["type", "subject"],
"properties": {
"type": {
"type": "ref",
"ref": "com.atproto.moderation.defs#subjectType"
},
"subject": {
"type": "string"
},
"status": {
"type": "ref",
"ref": "#subjectStatusView"
},
"repo": {
"type": "ref",
"ref": "#repoViewDetail"
},
"profile": {
"type": "union",
"refs": []
},
"record": {
"type": "ref",
"ref": "#recordViewDetail"
}
}
},
"accountStats": {
"description": "Statistics about a particular account subject",
"type": "object",
"properties": {
"reportCount": {
"description": "Total number of reports on the account",
"type": "integer"
},
"appealCount": {
"description": "Total number of appeals against a moderation action on the account",
"type": "integer"
},
"suspendCount": {
"description": "Number of times the account was suspended",
"type": "integer"
},
"escalateCount": {
"description": "Number of times the account was escalated",
"type": "integer"
},
"takedownCount": {
"description": "Number of times the account was taken down",
"type": "integer"
}
}
},
"recordsStats": {
"description": "Statistics about a set of record subject items",
"type": "object",
"properties": {
"totalReports": {
"description": "Cumulative sum of the number of reports on the items in the set",
"type": "integer"
},
"reportedCount": {
"description": "Number of items that were reported at least once",
"type": "integer"
},
"escalatedCount": {
"description": "Number of items that were escalated at least once",
"type": "integer"
},
"appealedCount": {
"description": "Number of items that were appealed at least once",
"type": "integer"
},
"subjectCount": {
"description": "Total number of item in the set",
"type": "integer"
},
"pendingCount": {
"description": "Number of item currently in \"reviewOpen\" or \"reviewEscalated\" state",
"type": "integer"
},
"processedCount": {
"description": "Number of item currently in \"reviewNone\" or \"reviewClosed\" state",
"type": "integer"
},
"takendownCount": {
"description": "Number of item currently taken down",
"type": "integer"
}
}
},
@ -255,8 +367,7 @@
},
"modEventComment": {
"type": "object",
"description": "Add a comment to a subject",
"required": ["comment"],
"description": "Add a comment to a subject. An empty comment will clear any previously set sticky comment.",
"properties": {
"comment": {
"type": "string"
@ -300,6 +411,25 @@
"negateLabelVals": {
"type": "array",
"items": { "type": "string" }
},
"durationInHours": {
"type": "integer",
"description": "Indicates how long the label will remain on the subject. Only applies on labels that are being added."
}
}
},
"modEventPriorityScore": {
"type": "object",
"description": "Set priority score of the subject. Higher score means higher priority.",
"required": ["score"],
"properties": {
"comment": {
"type": "string"
},
"score": {
"type": "integer",
"minimum": 0,
"maximum": 100
}
}
},
@ -711,6 +841,58 @@
"format": "datetime"
}
}
},
"reporterStats": {
"type": "object",
"required": [
"did",
"accountReportCount",
"recordReportCount",
"reportedAccountCount",
"reportedRecordCount",
"takendownAccountCount",
"takendownRecordCount",
"labeledAccountCount",
"labeledRecordCount"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"accountReportCount": {
"type": "integer",
"description": "The total number of reports made by the user on accounts."
},
"recordReportCount": {
"type": "integer",
"description": "The total number of reports made by the user on records."
},
"reportedAccountCount": {
"type": "integer",
"description": "The total number of accounts reported by the user."
},
"reportedRecordCount": {
"type": "integer",
"description": "The total number of records reported by the user."
},
"takendownAccountCount": {
"type": "integer",
"description": "The total number of accounts taken down as a result of the user's reports."
},
"takendownRecordCount": {
"type": "integer",
"description": "The total number of records taken down as a result of the user's reports."
},
"labeledAccountCount": {
"type": "integer",
"description": "The total number of accounts labeled as a result of the user's reports."
},
"labeledRecordCount": {
"type": "integer",
"description": "The total number of records labeled as a result of the user's reports."
}
}
}
}
}

View File

@ -27,10 +27,12 @@
"tools.ozone.moderation.defs#modEventReverseTakedown",
"tools.ozone.moderation.defs#modEventResolveAppeal",
"tools.ozone.moderation.defs#modEventEmail",
"tools.ozone.moderation.defs#modEventDivert",
"tools.ozone.moderation.defs#modEventTag",
"tools.ozone.moderation.defs#accountEvent",
"tools.ozone.moderation.defs#identityEvent",
"tools.ozone.moderation.defs#recordEvent"
"tools.ozone.moderation.defs#recordEvent",
"tools.ozone.moderation.defs#modEventPriorityScore"
]
},
"subject": {

View File

@ -0,0 +1,40 @@
{
"lexicon": 1,
"id": "tools.ozone.moderation.getReporterStats",
"defs": {
"main": {
"type": "query",
"description": "Get reporter stats for a list of users.",
"parameters": {
"type": "params",
"required": ["dids"],
"properties": {
"dids": {
"type": "array",
"maxLength": 100,
"items": {
"type": "string",
"format": "did"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["stats"],
"properties": {
"stats": {
"type": "array",
"items": {
"type": "ref",
"ref": "tools.ozone.moderation.defs#reporterStats"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,40 @@
{
"lexicon": 1,
"id": "tools.ozone.moderation.getSubjects",
"defs": {
"main": {
"type": "query",
"description": "Get details about subjects.",
"parameters": {
"type": "params",
"required": ["subjects"],
"properties": {
"subjects": {
"type": "array",
"maxLength": 100,
"minLength": 1,
"items": {
"type": "string"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["subjects"],
"properties": {
"subjects": {
"type": "array",
"items": {
"type": "ref",
"ref": "tools.ozone.moderation.defs#subjectView"
}
}
}
}
}
}
}
}

View File

@ -107,7 +107,13 @@
"sortField": {
"type": "string",
"default": "lastReportedAt",
"enum": ["lastReviewedAt", "lastReportedAt"]
"enum": [
"lastReviewedAt",
"lastReportedAt",
"reportedRecordsCount",
"takendownRecordsCount",
"priorityScore"
]
},
"sortDirection": {
"type": "string",
@ -158,6 +164,24 @@
"type": "string",
"description": "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.",
"knownValues": ["account", "record"]
},
"minAccountSuspendCount": {
"type": "integer",
"description": "If specified, only subjects that belong to an account that has at least this many suspensions will be returned."
},
"minReportedRecordsCount": {
"type": "integer",
"description": "If specified, only subjects that belong to an account that has at least this many reported records will be returned."
},
"minTakendownRecordsCount": {
"type": "integer",
"description": "If specified, only subjects that belong to an account that has at least this many taken down records will be returned."
},
"minPriorityScore": {
"minimum": 0,
"maximum": 100,
"type": "integer",
"description": "If specified, only subjects that have priority score value above the given value will be returned."
}
}
},

View File

@ -8,13 +8,27 @@
"parameters": {
"type": "params",
"properties": {
"q": {
"type": "string"
},
"disabled": {
"type": "boolean"
},
"roles": {
"type": "array",
"items": {
"type": "string"
}
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
},
"cursor": { "type": "string" }
"cursor": {
"type": "string"
}
}
},
"output": {
@ -23,7 +37,9 @@
"type": "object",
"required": ["members"],
"properties": {
"cursor": { "type": "string" },
"cursor": {
"type": "string"
},
"members": {
"type": "array",
"items": {

View File

@ -6,12 +6,12 @@
"license": "MIT",
"private": true,
"engines": {
"node": "18"
"node": ">=18.7.0"
},
"packageManager": "pnpm@8.15.9",
"packageManager": "pnpm@8.15.9+sha512.499434c9d8fdd1a2794ebf4552b3b25c0a633abcee5bb15e7b5de90f32f47b513aca98cd5cfd001c31f0db454bc3804edccd578501e4ca293a6816166bbd9f81",
"scripts": {
"lint:fix": "pnpm lint --fix",
"lint": "eslint . --ext .ts,.js",
"lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"style:fix": "prettier --write .",
"style": "prettier --check .",
"verify": "pnpm --stream '/^verify:.+$/'",
@ -19,12 +19,13 @@
"verify:lint": "pnpm lint",
"verify:types": "tsc --build tsconfig.json",
"format": "pnpm lint:fix && pnpm style:fix",
"build": "pnpm --recursive --stream build",
"dev": "NODE_ENV=development pnpm --stream '/^dev:.+$/'",
"dev:tsc": "tsc --build tsconfig.json --watch",
"dev:pkg": "pnpm --recursive --parallel --stream dev",
"test": "LOG_ENABLED=false ./packages/dev-infra/with-test-redis-and-db.sh pnpm --stream -r test",
"test:withFlags": "LOG_ENABLED=false ./packages/dev-infra/with-test-redis-and-db.sh pnpm --stream -r test --",
"precodegen": "pnpm run --recursive --stream --filter '@atproto/lex-cli...' build --force",
"codegen": "pnpm run --sort --recursive --stream --parallel codegen",
"build": "pnpm run --sort --recursive --stream '/^(build|build:.+)$/'",
"dev": "NODE_ENV=development pnpm run --recursive --parallel --stream '/^(dev|dev:.+)$/'",
"dev:tsc": "tsc --build tsconfig.json --preserveWatchOutput --watch",
"test": "LOG_ENABLED=false ./packages/dev-infra/with-test-redis-and-db.sh pnpm test --stream --recursive",
"test:withFlags": "pnpm run test --",
"changeset": "changeset",
"release": "pnpm build && changeset publish",
"version-packages": "changeset version && git add ."
@ -42,13 +43,17 @@
"dotenv": "^16.0.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "^3.7.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-n": "^17.15.0",
"eslint-plugin-prettier": "^5.1.3",
"jest": "^28.1.2",
"node-gyp": "^9.3.1",
"pino-pretty": "^9.1.0",
"prettier": "^3.2.5",
"prettier-config-standard": "^7.0.0",
"typescript": "^5.6.3"
"prettier-plugin-tailwindcss": "^0.6.11",
"typescript": "^5.8.2"
},
"workspaces": {
"packages": [

View File

@ -1,5 +1,260 @@
# @atproto/api
## 0.15.0
### Minor Changes
- [#3715](https://github.com/bluesky-social/atproto/pull/3715) [`23462184d`](https://github.com/bluesky-social/atproto/commit/23462184dc941ba2fc3b4d054985a53715585020) Thanks [@knotbin](https://github.com/knotbin)! - run codegen for changes in lex-cli
## 0.14.22
### Patch Changes
- [#3714](https://github.com/bluesky-social/atproto/pull/3714) [`fc61662d7`](https://github.com/bluesky-social/atproto/commit/fc61662d7b88597f78383e37ee54264a8bb4b670) Thanks [@bnewbold](https://github.com/bnewbold)! - new lexicons: listHosts and getHostStatus endpoints under com.atproto.sync
- [#3741](https://github.com/bluesky-social/atproto/pull/3741) [`ca07871c4`](https://github.com/bluesky-social/atproto/commit/ca07871c487abc99fe7b7f8671aa8d98eb5dc4bb) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Update reaction limit on chat lexicon
## 0.14.21
### Patch Changes
- [#3724](https://github.com/bluesky-social/atproto/pull/3724) [`8b7bf7e8f`](https://github.com/bluesky-social/atproto/commit/8b7bf7e8f0e5447c68633a87a2a3cff99f9e7e1c) Thanks [@haileyok](https://github.com/haileyok)! - Return `ProfileView` from `getSuggestedUsers` unspecced endpoint
## 0.14.20
### Patch Changes
- [#3713](https://github.com/bluesky-social/atproto/pull/3713) [`0e681d303`](https://github.com/bluesky-social/atproto/commit/0e681d3036fd0b35c6d2198638392051b2ce4c81) Thanks [@haileyok](https://github.com/haileyok)! - add `getSuggestedUsers` and `getSuggestedUsersSkeleton`
## 0.14.19
### Patch Changes
- [#3680](https://github.com/bluesky-social/atproto/pull/3680) [`efb302db1`](https://github.com/bluesky-social/atproto/commit/efb302db1a615b68795c725a22489dbd0400e011) Thanks [@haileyok](https://github.com/haileyok)! - Add unspecced `getSuggestedFeeds` and associated types
- Updated dependencies [[`4db923ca1`](https://github.com/bluesky-social/atproto/commit/4db923ca1c4fadd31d41c851933659e5186ee144)]:
- @atproto/common-web@0.4.1
- @atproto/lexicon@0.4.10
- @atproto/xrpc@0.6.12
## 0.14.18
### Patch Changes
- [#3706](https://github.com/bluesky-social/atproto/pull/3706) [`04b6230cd`](https://github.com/bluesky-social/atproto/commit/04b6230cd2fbfe4a06cb00ab8ccb8e6c87c6c546) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Return `StarterPackView` instead of `StarterPackViewBasic` from `getSuggestedStarterPacks`
## 0.14.17
### Patch Changes
- [#2519](https://github.com/bluesky-social/atproto/pull/2519) [`bdbd3c3e3`](https://github.com/bluesky-social/atproto/commit/bdbd3c3e3f8fe8476a3fecac73810554846c938f) Thanks [@dholms](https://github.com/dholms)! - Add com.atproto.admin.updateAccountSigningKey
- [#3673](https://github.com/bluesky-social/atproto/pull/3673) [`2b7efb6cb`](https://github.com/bluesky-social/atproto/commit/2b7efb6cb1c93a108570efdafe9d9ec3f1018dfa) Thanks [@haileyok](https://github.com/haileyok)! - Add `getTrends`, `getTrendsSkeleton`, and associated types
- [#3705](https://github.com/bluesky-social/atproto/pull/3705) [`b0a0f1484`](https://github.com/bluesky-social/atproto/commit/b0a0f1484378adeb5e2aa20b9b6ff2c2eca0f740) Thanks [@dholms](https://github.com/dholms)! - Fix codegent for com.atproto.admin.updateAccountSigningKey
- [#3677](https://github.com/bluesky-social/atproto/pull/3677) [`0eea698be`](https://github.com/bluesky-social/atproto/commit/0eea698bef76520ae4cc0e1f2efbb588a0459556) Thanks [@haileyok](https://github.com/haileyok)! - Add `getSuggestedStarterPacks`, `getSuggestedStarterPacksSkeleton`, and associated types
## 0.14.16
### Patch Changes
- [#3695](https://github.com/bluesky-social/atproto/pull/3695) [`652894308`](https://github.com/bluesky-social/atproto/commit/65289430806976ec13177ed9c9f0e883e8f9330c) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Fix last reaction lexicon
## 0.14.15
### Patch Changes
- [#3692](https://github.com/bluesky-social/atproto/pull/3692) [`b4ab5011b`](https://github.com/bluesky-social/atproto/commit/b4ab5011bcc64f9f05122a8773806af8e0c13146) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Support more ways to instantiate an `Agent`
## 0.14.14
### Patch Changes
- [#3685](https://github.com/bluesky-social/atproto/pull/3685) [`9a05892f6`](https://github.com/bluesky-social/atproto/commit/9a05892f6fd405bf6bb96c9c8d2a9a89d5e94bc5) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Update chat reaction lexicon
## 0.14.13
### Patch Changes
- [#3651](https://github.com/bluesky-social/atproto/pull/3651) [`076c2f987`](https://github.com/bluesky-social/atproto/commit/076c2f9872387217806624306e3af08878d1adcd) Thanks [@foysalit](https://github.com/foysalit)! - Add getSubjects endpoint to ozone for fetching detailed view of multiple subjects
## 0.14.12
### Patch Changes
- [#3674](https://github.com/bluesky-social/atproto/pull/3674) [`44f5c3639`](https://github.com/bluesky-social/atproto/commit/44f5c3639fcaf73865d21ec4b0c64baa641006c0) Thanks [@mozzius](https://github.com/mozzius)! - run codegen for changes in chat lexicon
## 0.14.11
### Patch Changes
- [#3670](https://github.com/bluesky-social/atproto/pull/3670) [`d87ffc7bf`](https://github.com/bluesky-social/atproto/commit/d87ffc7bfe3c1e792dc84a320544eb2e053d61ce) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add DM reactions lexicons
## 0.14.10
### Patch Changes
- Updated dependencies [[`670b6b5de`](https://github.com/bluesky-social/atproto/commit/670b6b5de2bf91e6944761c98eb1126fb6a681ee)]:
- @atproto/syntax@0.4.0
- @atproto/lexicon@0.4.9
- @atproto/xrpc@0.6.11
## 0.14.9
### Patch Changes
- [#3587](https://github.com/bluesky-social/atproto/pull/3587) [`18fbfa000`](https://github.com/bluesky-social/atproto/commit/18fbfa00057dda9ef4eba77d8b4e87994893c952) Thanks [@foysalit](https://github.com/foysalit)! - Add searchable handle and displayName to ozone team members
## 0.14.8
### Patch Changes
- [#3585](https://github.com/bluesky-social/atproto/pull/3585) [`38320191e`](https://github.com/bluesky-social/atproto/commit/38320191e559f8b928c6e951a9b4a6207240bfc1) Thanks [@dholms](https://github.com/dholms)! - Wrap sync v1.1 semantics. Add #sync event to subscribeRepos and deprecate #handle and #tombstone events
- [#3602](https://github.com/bluesky-social/atproto/pull/3602) [`6bcbb6d8c`](https://github.com/bluesky-social/atproto/commit/6bcbb6d8cd3696280935ff7892d8e191fd21fa49) Thanks [@devinivy](https://github.com/devinivy)! - Permit 100mb video embeds.
- [#2264](https://github.com/bluesky-social/atproto/pull/2264) [`dc6e4ecb0`](https://github.com/bluesky-social/atproto/commit/dc6e4ecb0e09bbf4bc7a79c6ac43fb6da4166200) Thanks [@bnewbold](https://github.com/bnewbold)! - new com.atproto.identity endpoints: resolveDid, resolveIdentity, refreshIdentity
- Updated dependencies [[`850e39843`](https://github.com/bluesky-social/atproto/commit/850e39843cb0ec9ea716675f7568c0c601f45e29)]:
- @atproto/syntax@0.3.4
- @atproto/lexicon@0.4.8
- @atproto/xrpc@0.6.10
## 0.14.7
### Patch Changes
- [#3521](https://github.com/bluesky-social/atproto/pull/3521) [`99e2809ca`](https://github.com/bluesky-social/atproto/commit/99e2809ca2ebf70acaa10254f140a8dd0fad4305) Thanks [@bnewbold](https://github.com/bnewbold)! - Add `reasonTypes`, `subjectTypes`, and `subjectCollections` properties to labeler service records.
- [#2506](https://github.com/bluesky-social/atproto/pull/2506) [`27b0a7be1`](https://github.com/bluesky-social/atproto/commit/27b0a7be1ed1b6e098114791d84ec9dc844db552) Thanks [@bnewbold](https://github.com/bnewbold)! - remove some deprecated fields from com.atproto Lexicons
- [#3579](https://github.com/bluesky-social/atproto/pull/3579) [`11d8d21be`](https://github.com/bluesky-social/atproto/commit/11d8d21beac4b79ac44b930197761f9d08dbb492) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Mirror new labeler service record properties on `labelerViewDetailed`.
## 0.14.6
### Patch Changes
- [#3576](https://github.com/bluesky-social/atproto/pull/3576) [`44f81f2eb`](https://github.com/bluesky-social/atproto/commit/44f81f2eb9229e21aec4472b3a05e855396dbec5) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add chat.bsky.convo.updateAllRead lex
## 0.14.5
### Patch Changes
- [#3449](https://github.com/bluesky-social/atproto/pull/3449) [`7e3678c08`](https://github.com/bluesky-social/atproto/commit/7e3678c089d2faa1a884a52a4fb80b8116c9854f) Thanks [@dholms](https://github.com/dholms)! - Updated subscribeRepo to include prev CIDs for operations and covering proofs for all ops.
- [#3572](https://github.com/bluesky-social/atproto/pull/3572) [`9b643fbec`](https://github.com/bluesky-social/atproto/commit/9b643fbecac30de5cfdb80d0671bfa55e9f4512a) Thanks [@foysalit](https://github.com/foysalit)! - Make comment property optional on ozone comment event
- [#3391](https://github.com/bluesky-social/atproto/pull/3391) [`6e382f67a`](https://github.com/bluesky-social/atproto/commit/6e382f67aa73532efadfea80ff96a27b526cb178) Thanks [@bnewbold](https://github.com/bnewbold)! - update sync lexicons for induction firehose
## 0.14.4
### Patch Changes
- [#3561](https://github.com/bluesky-social/atproto/pull/3561) [`b9cb049d9`](https://github.com/bluesky-social/atproto/commit/b9cb049d940cc706681142ef498238f74e2f539c) Thanks [@foysalit](https://github.com/foysalit)! - Add Divert event to the list of allowed ozone events
## 0.14.3
### Patch Changes
- [#3564](https://github.com/bluesky-social/atproto/pull/3564) [`22af31a89`](https://github.com/bluesky-social/atproto/commit/22af31a898476c5e317aea263af366bddda120d6) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Update chat lexicons
- [#2378](https://github.com/bluesky-social/atproto/pull/2378) [`01874c4be`](https://github.com/bluesky-social/atproto/commit/01874c4be73a41ffb8fe28378f674949aa2c938f) Thanks [@bnewbold](https://github.com/bnewbold)! - set 'tid' and 'record-key' formats on com.atproto.sync and com.atproto.repo lexicons
## 0.14.2
### Patch Changes
- [#3524](https://github.com/bluesky-social/atproto/pull/3524) [`010f10c6f`](https://github.com/bluesky-social/atproto/commit/010f10c6f212f699ad42c0349a58bbcf2172e3cc) Thanks [@bnewbold](https://github.com/bnewbold)! - add com.atproto.sync.listReposByCollection Lexicon
- [#3546](https://github.com/bluesky-social/atproto/pull/3546) [`a9887f687`](https://github.com/bluesky-social/atproto/commit/a9887f68778c49932d92cfea98aadcfa4d5b62e9) Thanks [@foysalit](https://github.com/foysalit)! - Add reporter stats endpoint on ozone service
## 0.14.1
### Patch Changes
- [#3535](https://github.com/bluesky-social/atproto/pull/3535) [`ba5bb6e66`](https://github.com/bluesky-social/atproto/commit/ba5bb6e667fb58bbefd332844957de575e102ca3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix bug preventing "logout()" calls from working.
## 0.14.0
### Minor Changes
- [#2999](https://github.com/bluesky-social/atproto/pull/2999) [`c53d943c8`](https://github.com/bluesky-social/atproto/commit/c53d943c8be5b8886254e020970a68c0f745b14c) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Update Lexicon derived code to better reflect data typings. In particular, Lexicon derived interfaces will now explicitly include the `$type` property that can be present in the data.
- [#2999](https://github.com/bluesky-social/atproto/pull/2999) [`c53d943c8`](https://github.com/bluesky-social/atproto/commit/c53d943c8be5b8886254e020970a68c0f745b14c) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Helper functions (e.g. `NS.isRecord`) no longer casts the output value. Use `asPredicate(NS.validateRecord)` to create a predicate function that will ensure that an unknown value is indeed an `NS.Record`. The `isX` helper function's purpose is to discriminate between `$type`d values from unions.
### Patch Changes
- [#2999](https://github.com/bluesky-social/atproto/pull/2999) [`c53d943c8`](https://github.com/bluesky-social/atproto/commit/c53d943c8be5b8886254e020970a68c0f745b14c) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fixes a bug that would clear interests prefs when updating hidden posts
- Updated dependencies [[`c53d943c8`](https://github.com/bluesky-social/atproto/commit/c53d943c8be5b8886254e020970a68c0f745b14c), [`c53d943c8`](https://github.com/bluesky-social/atproto/commit/c53d943c8be5b8886254e020970a68c0f745b14c), [`c53d943c8`](https://github.com/bluesky-social/atproto/commit/c53d943c8be5b8886254e020970a68c0f745b14c)]:
- @atproto/syntax@0.3.3
- @atproto/lexicon@0.4.7
- @atproto/xrpc@0.6.9
## 0.13.35
### Patch Changes
- [#3495](https://github.com/bluesky-social/atproto/pull/3495) [`709a85b0b`](https://github.com/bluesky-social/atproto/commit/709a85b0b633b5483b7161db64b429c746239153) Thanks [@foysalit](https://github.com/foysalit)! - Add a priority score to ozone subjects
## 0.13.34
### Patch Changes
- [#3496](https://github.com/bluesky-social/atproto/pull/3496) [`dc8a7842e`](https://github.com/bluesky-social/atproto/commit/dc8a7842e67f5f3709e88310d2a60d384453b486) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add followerRule threadgate
- [#3501](https://github.com/bluesky-social/atproto/pull/3501) [`636951e47`](https://github.com/bluesky-social/atproto/commit/636951e4728cd52c2e5355eb93b47d7e869b67e9) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Include `followerRule` as valid setting in `postInteractionSettings` pref
## 0.13.33
### Patch Changes
- [#3220](https://github.com/bluesky-social/atproto/pull/3220) [`61dc0d60e`](https://github.com/bluesky-social/atproto/commit/61dc0d60e19b88c6427a54c6d95a391b5f4da7bd) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Apply new linting rules regarding import order
- [#3494](https://github.com/bluesky-social/atproto/pull/3494) [`87ed907a6`](https://github.com/bluesky-social/atproto/commit/87ed907a6b96b408c02c9af819cec8380a453254) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Add `setPostInteractionSettings` for configuring default interaction settings for creation of posts
- Updated dependencies [[`61dc0d60e`](https://github.com/bluesky-social/atproto/commit/61dc0d60e19b88c6427a54c6d95a391b5f4da7bd), [`8a30e0ed9`](https://github.com/bluesky-social/atproto/commit/8a30e0ed9239cb2037d54fb98e70e8b0cfbc3e39)]:
- @atproto/common-web@0.4.0
- @atproto/lexicon@0.4.6
- @atproto/syntax@0.3.2
- @atproto/xrpc@0.6.8
## 0.13.32
### Patch Changes
- [#3352](https://github.com/bluesky-social/atproto/pull/3352) [`7f52e6735`](https://github.com/bluesky-social/atproto/commit/7f52e67354906c3bf9830d7a2924ab58d6160905) Thanks [@foysalit](https://github.com/foysalit)! - Auto resolve appeals when taking down
- Updated dependencies [[`fb64d50ee`](https://github.com/bluesky-social/atproto/commit/fb64d50ee220316b9f1183e5c3259629489734c9)]:
- @atproto/xrpc@0.6.7
## 0.13.31
### Patch Changes
- [#3441](https://github.com/bluesky-social/atproto/pull/3441) [`8c6c7813a`](https://github.com/bluesky-social/atproto/commit/8c6c7813a9c2110c8fe21acdca8f09554a1983ce) Thanks [@mozzius](https://github.com/mozzius)! - Allow passing `allowTakendown` to createSession
## 0.13.30
### Patch Changes
- [#3429](https://github.com/bluesky-social/atproto/pull/3429) [`e6e6aea38`](https://github.com/bluesky-social/atproto/commit/e6e6aea3814e3d0bb42a537f80d77947e85fa73f) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - add feedViewPost.threadContext defs
- [#3390](https://github.com/bluesky-social/atproto/pull/3390) [`c0a75d310`](https://github.com/bluesky-social/atproto/commit/c0a75d310aa92c067799a97d1acc5bd0543114c5) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - posts_with_video filter in getAuthorFeed
## 0.13.29
### Patch Changes
- [#3416](https://github.com/bluesky-social/atproto/pull/3416) [`50603b4f2`](https://github.com/bluesky-social/atproto/commit/50603b4f2ef08bd618730107ec164a57f27dcca6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Update `tools.ozone.moderation.queryStatuses` lexicon
## 0.13.28
### Patch Changes
- [#3389](https://github.com/bluesky-social/atproto/pull/3389) [`cbf17066f`](https://github.com/bluesky-social/atproto/commit/cbf17066f314fbc7f2e943127ee4a9f589f8bec2) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - add feedgen content mode lexicon spec
## 0.13.27
### Patch Changes

View File

@ -85,7 +85,7 @@ are available:
- [@atproto/oauth-client-node](https://www.npmjs.com/package/@atproto/oauth-client-node): for
Node.js.
- [@atproto/oauth-client](https://www.npmjs.com/package/@atproto/oauth-client):
Lower lever; compatible with most JS engines.
Lower level; compatible with most JS engines.
Every `@atproto/oauth-client-*` implementation has a different way to obtain an
`OAuthSession` instance that can be used to instantiate an `Agent` (from

View File

@ -1,9 +0,0 @@
import { BskyAgent } from '@atproto/api'
describe('Agent Benchmarks', () => {
it('Creates new Agent instance 10 times', () => {
for (let i = 0; i < 10; i++) {
new BskyAgent({ service: 'https://bsky.social' })
}
})
})

View File

@ -5,4 +5,5 @@ module.exports = {
testTimeout: 60000,
setupFiles: ['<rootDir>/../../jest.setup.ts'],
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] },
}

View File

@ -1,6 +1,6 @@
{
"name": "@atproto/api",
"version": "0.13.27",
"version": "0.15.0",
"license": "MIT",
"description": "Client library for atproto and Bluesky",
"keywords": [

File diff suppressed because it is too large Load Diff

View File

@ -309,6 +309,7 @@ export class CredentialSession implements SessionManager {
identifier: opts.identifier,
password: opts.password,
authFactorToken: opts.authFactorToken,
allowTakendown: opts.allowTakendown,
})
this.session = {
accessJwt: res.data.accessJwt,
@ -336,7 +337,7 @@ export class CredentialSession implements SessionManager {
try {
await this.server.deleteSession(undefined, {
headers: {
authorization: `Bearer ${this.session.accessJwt}`,
authorization: `Bearer ${this.session.refreshJwt}`,
},
})
} catch {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,26 @@
/**
* GENERATED CODE - DO NOT MODIFY
*/
import { ValidationResult, BlobRef } from '@atproto/lexicon'
import { isObj, hasProp } from '../../../../util'
import { lexicons } from '../../../../lexicons'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs'
import * as AppBskyGraphDefs from '../graph/defs'
import * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js'
import type * as AppBskyGraphDefs from '../graph/defs.js'
import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js'
import type * as AppBskyFeedThreadgate from '../feed/threadgate.js'
import type * as AppBskyFeedPostgate from '../feed/postgate.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.actor.defs'
export interface ProfileViewBasic {
$type?: 'app.bsky.actor.defs#profileViewBasic'
did: string
handle: string
displayName?: string
@ -18,22 +29,21 @@ export interface ProfileViewBasic {
viewer?: ViewerState
labels?: ComAtprotoLabelDefs.Label[]
createdAt?: string
[k: string]: unknown
verification?: VerificationState
}
export function isProfileViewBasic(v: unknown): v is ProfileViewBasic {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#profileViewBasic'
)
const hashProfileViewBasic = 'profileViewBasic'
export function isProfileViewBasic<V>(v: V) {
return is$typed(v, id, hashProfileViewBasic)
}
export function validateProfileViewBasic(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#profileViewBasic', v)
export function validateProfileViewBasic<V>(v: V) {
return validate<ProfileViewBasic & V>(v, id, hashProfileViewBasic)
}
export interface ProfileView {
$type?: 'app.bsky.actor.defs#profileView'
did: string
handle: string
displayName?: string
@ -44,22 +54,21 @@ export interface ProfileView {
createdAt?: string
viewer?: ViewerState
labels?: ComAtprotoLabelDefs.Label[]
[k: string]: unknown
verification?: VerificationState
}
export function isProfileView(v: unknown): v is ProfileView {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#profileView'
)
const hashProfileView = 'profileView'
export function isProfileView<V>(v: V) {
return is$typed(v, id, hashProfileView)
}
export function validateProfileView(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#profileView', v)
export function validateProfileView<V>(v: V) {
return validate<ProfileView & V>(v, id, hashProfileView)
}
export interface ProfileViewDetailed {
$type?: 'app.bsky.actor.defs#profileViewDetailed'
did: string
handle: string
displayName?: string
@ -76,63 +85,56 @@ export interface ProfileViewDetailed {
viewer?: ViewerState
labels?: ComAtprotoLabelDefs.Label[]
pinnedPost?: ComAtprotoRepoStrongRef.Main
[k: string]: unknown
verification?: VerificationState
}
export function isProfileViewDetailed(v: unknown): v is ProfileViewDetailed {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#profileViewDetailed'
)
const hashProfileViewDetailed = 'profileViewDetailed'
export function isProfileViewDetailed<V>(v: V) {
return is$typed(v, id, hashProfileViewDetailed)
}
export function validateProfileViewDetailed(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#profileViewDetailed', v)
export function validateProfileViewDetailed<V>(v: V) {
return validate<ProfileViewDetailed & V>(v, id, hashProfileViewDetailed)
}
export interface ProfileAssociated {
$type?: 'app.bsky.actor.defs#profileAssociated'
lists?: number
feedgens?: number
starterPacks?: number
labeler?: boolean
chat?: ProfileAssociatedChat
[k: string]: unknown
}
export function isProfileAssociated(v: unknown): v is ProfileAssociated {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#profileAssociated'
)
const hashProfileAssociated = 'profileAssociated'
export function isProfileAssociated<V>(v: V) {
return is$typed(v, id, hashProfileAssociated)
}
export function validateProfileAssociated(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#profileAssociated', v)
export function validateProfileAssociated<V>(v: V) {
return validate<ProfileAssociated & V>(v, id, hashProfileAssociated)
}
export interface ProfileAssociatedChat {
$type?: 'app.bsky.actor.defs#profileAssociatedChat'
allowIncoming: 'all' | 'none' | 'following' | (string & {})
[k: string]: unknown
}
export function isProfileAssociatedChat(
v: unknown,
): v is ProfileAssociatedChat {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#profileAssociatedChat'
)
const hashProfileAssociatedChat = 'profileAssociatedChat'
export function isProfileAssociatedChat<V>(v: V) {
return is$typed(v, id, hashProfileAssociatedChat)
}
export function validateProfileAssociatedChat(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#profileAssociatedChat', v)
export function validateProfileAssociatedChat<V>(v: V) {
return validate<ProfileAssociatedChat & V>(v, id, hashProfileAssociatedChat)
}
/** Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests. */
export interface ViewerState {
$type?: 'app.bsky.actor.defs#viewerState'
muted?: boolean
mutedByList?: AppBskyGraphDefs.ListViewBasic
blockedBy?: boolean
@ -141,168 +143,197 @@ export interface ViewerState {
following?: string
followedBy?: string
knownFollowers?: KnownFollowers
[k: string]: unknown
}
export function isViewerState(v: unknown): v is ViewerState {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#viewerState'
)
const hashViewerState = 'viewerState'
export function isViewerState<V>(v: V) {
return is$typed(v, id, hashViewerState)
}
export function validateViewerState(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#viewerState', v)
export function validateViewerState<V>(v: V) {
return validate<ViewerState & V>(v, id, hashViewerState)
}
/** The subject's followers whom you also follow */
export interface KnownFollowers {
$type?: 'app.bsky.actor.defs#knownFollowers'
count: number
followers: ProfileViewBasic[]
[k: string]: unknown
}
export function isKnownFollowers(v: unknown): v is KnownFollowers {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#knownFollowers'
)
const hashKnownFollowers = 'knownFollowers'
export function isKnownFollowers<V>(v: V) {
return is$typed(v, id, hashKnownFollowers)
}
export function validateKnownFollowers(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#knownFollowers', v)
export function validateKnownFollowers<V>(v: V) {
return validate<KnownFollowers & V>(v, id, hashKnownFollowers)
}
/** Represents the verification information about the user this object is attached to. */
export interface VerificationState {
$type?: 'app.bsky.actor.defs#verificationState'
/** All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included. */
verifications: VerificationView[]
/** The user's status as a verified account. */
verifiedStatus: 'valid' | 'invalid' | 'none' | (string & {})
/** The user's status as a trusted verifier. */
trustedVerifierStatus: 'valid' | 'invalid' | 'none' | (string & {})
}
const hashVerificationState = 'verificationState'
export function isVerificationState<V>(v: V) {
return is$typed(v, id, hashVerificationState)
}
export function validateVerificationState<V>(v: V) {
return validate<VerificationState & V>(v, id, hashVerificationState)
}
/** An individual verification for an associated subject. */
export interface VerificationView {
$type?: 'app.bsky.actor.defs#verificationView'
/** The user who issued this verification. */
issuer: string
/** The AT-URI of the verification record. */
uri: string
/** True if the verification passes validation, otherwise false. */
isValid: boolean
/** Timestamp when the verification was created. */
createdAt: string
}
const hashVerificationView = 'verificationView'
export function isVerificationView<V>(v: V) {
return is$typed(v, id, hashVerificationView)
}
export function validateVerificationView<V>(v: V) {
return validate<VerificationView & V>(v, id, hashVerificationView)
}
export type Preferences = (
| AdultContentPref
| ContentLabelPref
| SavedFeedsPref
| SavedFeedsPrefV2
| PersonalDetailsPref
| FeedViewPref
| ThreadViewPref
| InterestsPref
| MutedWordsPref
| HiddenPostsPref
| BskyAppStatePref
| LabelersPref
| { $type: string; [k: string]: unknown }
| $Typed<AdultContentPref>
| $Typed<ContentLabelPref>
| $Typed<SavedFeedsPref>
| $Typed<SavedFeedsPrefV2>
| $Typed<PersonalDetailsPref>
| $Typed<FeedViewPref>
| $Typed<ThreadViewPref>
| $Typed<InterestsPref>
| $Typed<MutedWordsPref>
| $Typed<HiddenPostsPref>
| $Typed<BskyAppStatePref>
| $Typed<LabelersPref>
| $Typed<PostInteractionSettingsPref>
| { $type: string }
)[]
export interface AdultContentPref {
$type?: 'app.bsky.actor.defs#adultContentPref'
enabled: boolean
[k: string]: unknown
}
export function isAdultContentPref(v: unknown): v is AdultContentPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#adultContentPref'
)
const hashAdultContentPref = 'adultContentPref'
export function isAdultContentPref<V>(v: V) {
return is$typed(v, id, hashAdultContentPref)
}
export function validateAdultContentPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#adultContentPref', v)
export function validateAdultContentPref<V>(v: V) {
return validate<AdultContentPref & V>(v, id, hashAdultContentPref)
}
export interface ContentLabelPref {
$type?: 'app.bsky.actor.defs#contentLabelPref'
/** Which labeler does this preference apply to? If undefined, applies globally. */
labelerDid?: string
label: string
visibility: 'ignore' | 'show' | 'warn' | 'hide' | (string & {})
[k: string]: unknown
}
export function isContentLabelPref(v: unknown): v is ContentLabelPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#contentLabelPref'
)
const hashContentLabelPref = 'contentLabelPref'
export function isContentLabelPref<V>(v: V) {
return is$typed(v, id, hashContentLabelPref)
}
export function validateContentLabelPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#contentLabelPref', v)
export function validateContentLabelPref<V>(v: V) {
return validate<ContentLabelPref & V>(v, id, hashContentLabelPref)
}
export interface SavedFeed {
$type?: 'app.bsky.actor.defs#savedFeed'
id: string
type: 'feed' | 'list' | 'timeline' | (string & {})
value: string
pinned: boolean
[k: string]: unknown
}
export function isSavedFeed(v: unknown): v is SavedFeed {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#savedFeed'
)
const hashSavedFeed = 'savedFeed'
export function isSavedFeed<V>(v: V) {
return is$typed(v, id, hashSavedFeed)
}
export function validateSavedFeed(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#savedFeed', v)
export function validateSavedFeed<V>(v: V) {
return validate<SavedFeed & V>(v, id, hashSavedFeed)
}
export interface SavedFeedsPrefV2 {
$type?: 'app.bsky.actor.defs#savedFeedsPrefV2'
items: SavedFeed[]
[k: string]: unknown
}
export function isSavedFeedsPrefV2(v: unknown): v is SavedFeedsPrefV2 {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#savedFeedsPrefV2'
)
const hashSavedFeedsPrefV2 = 'savedFeedsPrefV2'
export function isSavedFeedsPrefV2<V>(v: V) {
return is$typed(v, id, hashSavedFeedsPrefV2)
}
export function validateSavedFeedsPrefV2(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#savedFeedsPrefV2', v)
export function validateSavedFeedsPrefV2<V>(v: V) {
return validate<SavedFeedsPrefV2 & V>(v, id, hashSavedFeedsPrefV2)
}
export interface SavedFeedsPref {
$type?: 'app.bsky.actor.defs#savedFeedsPref'
pinned: string[]
saved: string[]
timelineIndex?: number
[k: string]: unknown
}
export function isSavedFeedsPref(v: unknown): v is SavedFeedsPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#savedFeedsPref'
)
const hashSavedFeedsPref = 'savedFeedsPref'
export function isSavedFeedsPref<V>(v: V) {
return is$typed(v, id, hashSavedFeedsPref)
}
export function validateSavedFeedsPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#savedFeedsPref', v)
export function validateSavedFeedsPref<V>(v: V) {
return validate<SavedFeedsPref & V>(v, id, hashSavedFeedsPref)
}
export interface PersonalDetailsPref {
$type?: 'app.bsky.actor.defs#personalDetailsPref'
/** The birth date of account owner. */
birthDate?: string
[k: string]: unknown
}
export function isPersonalDetailsPref(v: unknown): v is PersonalDetailsPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#personalDetailsPref'
)
const hashPersonalDetailsPref = 'personalDetailsPref'
export function isPersonalDetailsPref<V>(v: V) {
return is$typed(v, id, hashPersonalDetailsPref)
}
export function validatePersonalDetailsPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#personalDetailsPref', v)
export function validatePersonalDetailsPref<V>(v: V) {
return validate<PersonalDetailsPref & V>(v, id, hashPersonalDetailsPref)
}
export interface FeedViewPref {
$type?: 'app.bsky.actor.defs#feedViewPref'
/** The URI of the feed, or an identifier which describes the feed. */
feed: string
/** Hide replies in the feed. */
@ -315,22 +346,20 @@ export interface FeedViewPref {
hideReposts?: boolean
/** Hide quote posts in the feed. */
hideQuotePosts?: boolean
[k: string]: unknown
}
export function isFeedViewPref(v: unknown): v is FeedViewPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#feedViewPref'
)
const hashFeedViewPref = 'feedViewPref'
export function isFeedViewPref<V>(v: V) {
return is$typed(v, id, hashFeedViewPref)
}
export function validateFeedViewPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#feedViewPref', v)
export function validateFeedViewPref<V>(v: V) {
return validate<FeedViewPref & V>(v, id, hashFeedViewPref)
}
export interface ThreadViewPref {
$type?: 'app.bsky.actor.defs#threadViewPref'
/** Sorting mode for threads. */
sort?:
| 'oldest'
@ -341,43 +370,39 @@ export interface ThreadViewPref {
| (string & {})
/** Show followed users at the top of all replies. */
prioritizeFollowedUsers?: boolean
[k: string]: unknown
}
export function isThreadViewPref(v: unknown): v is ThreadViewPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#threadViewPref'
)
const hashThreadViewPref = 'threadViewPref'
export function isThreadViewPref<V>(v: V) {
return is$typed(v, id, hashThreadViewPref)
}
export function validateThreadViewPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#threadViewPref', v)
export function validateThreadViewPref<V>(v: V) {
return validate<ThreadViewPref & V>(v, id, hashThreadViewPref)
}
export interface InterestsPref {
$type?: 'app.bsky.actor.defs#interestsPref'
/** A list of tags which describe the account owner's interests gathered during onboarding. */
tags: string[]
[k: string]: unknown
}
export function isInterestsPref(v: unknown): v is InterestsPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#interestsPref'
)
const hashInterestsPref = 'interestsPref'
export function isInterestsPref<V>(v: V) {
return is$typed(v, id, hashInterestsPref)
}
export function validateInterestsPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#interestsPref', v)
export function validateInterestsPref<V>(v: V) {
return validate<InterestsPref & V>(v, id, hashInterestsPref)
}
export type MutedWordTarget = 'content' | 'tag' | (string & {})
/** A word that the account owner has muted. */
export interface MutedWord {
$type?: 'app.bsky.actor.defs#mutedWord'
id?: string
/** The muted word itself. */
value: string
@ -387,148 +412,165 @@ export interface MutedWord {
actorTarget: 'all' | 'exclude-following' | (string & {})
/** The date and time at which the muted word will expire and no longer be applied. */
expiresAt?: string
[k: string]: unknown
}
export function isMutedWord(v: unknown): v is MutedWord {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#mutedWord'
)
const hashMutedWord = 'mutedWord'
export function isMutedWord<V>(v: V) {
return is$typed(v, id, hashMutedWord)
}
export function validateMutedWord(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#mutedWord', v)
export function validateMutedWord<V>(v: V) {
return validate<MutedWord & V>(v, id, hashMutedWord)
}
export interface MutedWordsPref {
$type?: 'app.bsky.actor.defs#mutedWordsPref'
/** A list of words the account owner has muted. */
items: MutedWord[]
[k: string]: unknown
}
export function isMutedWordsPref(v: unknown): v is MutedWordsPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#mutedWordsPref'
)
const hashMutedWordsPref = 'mutedWordsPref'
export function isMutedWordsPref<V>(v: V) {
return is$typed(v, id, hashMutedWordsPref)
}
export function validateMutedWordsPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#mutedWordsPref', v)
export function validateMutedWordsPref<V>(v: V) {
return validate<MutedWordsPref & V>(v, id, hashMutedWordsPref)
}
export interface HiddenPostsPref {
$type?: 'app.bsky.actor.defs#hiddenPostsPref'
/** A list of URIs of posts the account owner has hidden. */
items: string[]
[k: string]: unknown
}
export function isHiddenPostsPref(v: unknown): v is HiddenPostsPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#hiddenPostsPref'
)
const hashHiddenPostsPref = 'hiddenPostsPref'
export function isHiddenPostsPref<V>(v: V) {
return is$typed(v, id, hashHiddenPostsPref)
}
export function validateHiddenPostsPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#hiddenPostsPref', v)
export function validateHiddenPostsPref<V>(v: V) {
return validate<HiddenPostsPref & V>(v, id, hashHiddenPostsPref)
}
export interface LabelersPref {
$type?: 'app.bsky.actor.defs#labelersPref'
labelers: LabelerPrefItem[]
[k: string]: unknown
}
export function isLabelersPref(v: unknown): v is LabelersPref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#labelersPref'
)
const hashLabelersPref = 'labelersPref'
export function isLabelersPref<V>(v: V) {
return is$typed(v, id, hashLabelersPref)
}
export function validateLabelersPref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#labelersPref', v)
export function validateLabelersPref<V>(v: V) {
return validate<LabelersPref & V>(v, id, hashLabelersPref)
}
export interface LabelerPrefItem {
$type?: 'app.bsky.actor.defs#labelerPrefItem'
did: string
[k: string]: unknown
}
export function isLabelerPrefItem(v: unknown): v is LabelerPrefItem {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#labelerPrefItem'
)
const hashLabelerPrefItem = 'labelerPrefItem'
export function isLabelerPrefItem<V>(v: V) {
return is$typed(v, id, hashLabelerPrefItem)
}
export function validateLabelerPrefItem(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#labelerPrefItem', v)
export function validateLabelerPrefItem<V>(v: V) {
return validate<LabelerPrefItem & V>(v, id, hashLabelerPrefItem)
}
/** A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this. */
export interface BskyAppStatePref {
$type?: 'app.bsky.actor.defs#bskyAppStatePref'
activeProgressGuide?: BskyAppProgressGuide
/** An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user. */
queuedNudges?: string[]
/** Storage for NUXs the user has encountered. */
nuxs?: Nux[]
[k: string]: unknown
}
export function isBskyAppStatePref(v: unknown): v is BskyAppStatePref {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#bskyAppStatePref'
)
const hashBskyAppStatePref = 'bskyAppStatePref'
export function isBskyAppStatePref<V>(v: V) {
return is$typed(v, id, hashBskyAppStatePref)
}
export function validateBskyAppStatePref(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#bskyAppStatePref', v)
export function validateBskyAppStatePref<V>(v: V) {
return validate<BskyAppStatePref & V>(v, id, hashBskyAppStatePref)
}
/** If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress. */
export interface BskyAppProgressGuide {
$type?: 'app.bsky.actor.defs#bskyAppProgressGuide'
guide: string
[k: string]: unknown
}
export function isBskyAppProgressGuide(v: unknown): v is BskyAppProgressGuide {
return (
isObj(v) &&
hasProp(v, '$type') &&
v.$type === 'app.bsky.actor.defs#bskyAppProgressGuide'
)
const hashBskyAppProgressGuide = 'bskyAppProgressGuide'
export function isBskyAppProgressGuide<V>(v: V) {
return is$typed(v, id, hashBskyAppProgressGuide)
}
export function validateBskyAppProgressGuide(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#bskyAppProgressGuide', v)
export function validateBskyAppProgressGuide<V>(v: V) {
return validate<BskyAppProgressGuide & V>(v, id, hashBskyAppProgressGuide)
}
/** A new user experiences (NUX) storage object */
export interface Nux {
$type?: 'app.bsky.actor.defs#nux'
id: string
completed: boolean
/** Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters. */
data?: string
/** The date and time at which the NUX will expire and should be considered completed. */
expiresAt?: string
[k: string]: unknown
}
export function isNux(v: unknown): v is Nux {
return (
isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.actor.defs#nux'
const hashNux = 'nux'
export function isNux<V>(v: V) {
return is$typed(v, id, hashNux)
}
export function validateNux<V>(v: V) {
return validate<Nux & V>(v, id, hashNux)
}
/** Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly. */
export interface PostInteractionSettingsPref {
$type?: 'app.bsky.actor.defs#postInteractionSettingsPref'
/** Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply. */
threadgateAllowRules?: (
| $Typed<AppBskyFeedThreadgate.MentionRule>
| $Typed<AppBskyFeedThreadgate.FollowerRule>
| $Typed<AppBskyFeedThreadgate.FollowingRule>
| $Typed<AppBskyFeedThreadgate.ListRule>
| { $type: string }
)[]
/** Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed. */
postgateEmbeddingRules?: (
| $Typed<AppBskyFeedPostgate.DisableRule>
| { $type: string }
)[]
}
const hashPostInteractionSettingsPref = 'postInteractionSettingsPref'
export function isPostInteractionSettingsPref<V>(v: V) {
return is$typed(v, id, hashPostInteractionSettingsPref)
}
export function validatePostInteractionSettingsPref<V>(v: V) {
return validate<PostInteractionSettingsPref & V>(
v,
id,
hashPostInteractionSettingsPref,
)
}
export function validateNux(v: unknown): ValidationResult {
return lexicons.validate('app.bsky.actor.defs#nux', v)
}

View File

@ -2,11 +2,19 @@
* GENERATED CODE - DO NOT MODIFY
*/
import { HeadersMap, XRPCError } from '@atproto/xrpc'
import { ValidationResult, BlobRef } from '@atproto/lexicon'
import { isObj, hasProp } from '../../../../util'
import { lexicons } from '../../../../lexicons'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import * as AppBskyActorDefs from './defs'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as AppBskyActorDefs from './defs.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.actor.getPreferences'
export interface QueryParams {}
@ -14,7 +22,6 @@ export type InputSchema = undefined
export interface OutputSchema {
preferences: AppBskyActorDefs.Preferences
[k: string]: unknown
}
export interface CallOptions {

View File

@ -2,11 +2,19 @@
* GENERATED CODE - DO NOT MODIFY
*/
import { HeadersMap, XRPCError } from '@atproto/xrpc'
import { ValidationResult, BlobRef } from '@atproto/lexicon'
import { isObj, hasProp } from '../../../../util'
import { lexicons } from '../../../../lexicons'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import * as AppBskyActorDefs from './defs'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as AppBskyActorDefs from './defs.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.actor.getProfile'
export interface QueryParams {
/** Handle or DID of account to fetch profile of. */

View File

@ -2,11 +2,19 @@
* GENERATED CODE - DO NOT MODIFY
*/
import { HeadersMap, XRPCError } from '@atproto/xrpc'
import { ValidationResult, BlobRef } from '@atproto/lexicon'
import { isObj, hasProp } from '../../../../util'
import { lexicons } from '../../../../lexicons'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import * as AppBskyActorDefs from './defs'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as AppBskyActorDefs from './defs.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.actor.getProfiles'
export interface QueryParams {
actors: string[]
@ -16,7 +24,6 @@ export type InputSchema = undefined
export interface OutputSchema {
profiles: AppBskyActorDefs.ProfileViewDetailed[]
[k: string]: unknown
}
export interface CallOptions {

Some files were not shown because too many files have changed in this diff Show More