Compare commits

...

238 Commits

Author SHA1 Message Date
d4133d4c37 Merge tag '@atproto/pds@0.4.180' into modify-pds
@atproto/pds@0.4.180
2025-09-24 06:04:44 -04:00
github-actions[bot]
4c4ee7208f
Version packages (#4218)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-23 08:30:58 +02:00
Matthieu Sieben
7351589a31
Add onResetPasswordRequest and onResetPasswordConfirm hooks (#4217) 2025-09-22 19:38:38 +02:00
github-actions[bot]
d91988fe79
Version packages (#4192)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-10 15:15:55 +02:00
Matthieu Sieben
cf4117966c
Fix call to onDecodeToken oauth verifier hook (#4191)
* Make `DpopProof` readonly

* Improve token verification error details

* Always log warnings when DPOP proof `htu` contains # or ?.

* Add missing initialization of `onDecodeToken` hook

* Add logging around scope dereferencing operations
2025-09-09 15:56:32 +02:00
github-actions[bot]
e10a020629
Version packages (#4190)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-09 14:48:22 +02:00
Foysal Ahamed
ff30786af6
⬆️ Add changeset for api and pds package with support for new ozone event type (#4189) 2025-09-09 14:36:56 +02:00
github-actions[bot]
0222378371
Version packages (#4188)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-09 14:22:53 +02:00
Foysal Ahamed
55cc15cdd6
Add ozone proxy for revokeCredentials endpoint (#4170)
*  Add ozone proxy for revokeCredentials endpoint

* 📝 Add changeset

*  Add mod event for revoke credentials

*  Add tests
2025-09-09 14:13:48 +02:00
github-actions[bot]
e216e87859
Version packages (#4167)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-09 12:29:10 +02:00
Matthieu Sieben
bef7d109a5
Fix build (#4187)
* Add missing dep
2025-09-09 12:20:53 +02:00
Matthieu Sieben
8914f9abde
Allow encoding scope claims of oauth access token JWT (#4149)
* Refactor token decoding

* Add scope decoder to pds

* tidy

* tidy

* tidy

* tidy

* review changes

* Add scope normzlization utility

* wording in lexicon

* Add specific error

* style

* tidy

* Update `AccessTokenMode` enum values to be more meaningful

* tidy

* Update .changeset/brown-boxes-bow.md

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

* Add retry strategy

* lint

* lint

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-09-09 12:13:34 +02:00
Matthieu Sieben
d570db43d6
Pr/3654 (#4186)
* add ja to links title and availableLocales

* japanese translation messages.po

* update translation

social-appの翻訳に寄せる

* update translate

* Update packages/oauth/oauth-provider-ui/src/locales/ja/messages.po

Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>

* Update packages/oauth/oauth-provider-ui/src/locales/ja/messages.po

Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>

* Update packages/oauth/oauth-provider-ui/src/locales/ja/messages.po

Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>

* Update packages/oauth/oauth-provider-ui/src/locales/ja/messages.po

Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>

* add translation

* Japanese translation message.po from oauth-provider-frontend

* add ja to links title

* Update packages/oauth/oauth-provider-ui/src/locales/ja/messages.po

Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>

* Update packages/oauth/oauth-provider-ui/src/locales/ja/messages.po

Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>

* Update translation "Avatar"

* Add missing translation

* Add missing translation frontend

* Add changeset

* Enable JA

---------

Co-authored-by: L-tan <3786294+dolciss@users.noreply.github.com>
Co-authored-by: Takayuki KUSANO <65759+tkusano@users.noreply.github.com>
2025-09-09 12:09:18 +02:00
Matthieu Sieben
055a413fba
InternalServerError when creating records (#4169)
* Various perf fixes

* add transaction assertions

* tidy

* changeset

* tidy

* Update packages/aws/src/s3.ts

* tidy

* Apply suggestions from code review

* tidy

* Update .changeset/chilled-shirts-ring.md

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

* Update .changeset/stale-rocks-press.md

* Update packages/pds/src/actor-store/blob/transactor.ts

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

* build

* revert blob upload logic

* tidy

* use `uploadTimeoutMs` as default for `requestTimeoutMs`

* review coments

* chngeset

* tidy

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
Co-authored-by: David Buchanan <david@blueskyweb.xyz>
2025-09-08 18:40:56 +02:00
Matthieu Sieben
6d7bf4bffc
Remove old, never resolved, lexicons from the database (#4162) 2025-09-04 11:04:48 +02:00
Eric Bailey
a5b20f0218
Add expanded moderation report reasons (#3881)
* Integrate new reporting reasons

* Update bnn to BNR, prefix all with reason* to match previous

* Remap deprecations

* Update naming, add notes about Bluesky-only reasons

* Update reason

* Move new defs to tools.ozone namespace

* Add ozone lexicons to app view

* Copy known values to merge defs

* Update comments

* Add reasonAppeal to new ozone namespace defs

* Changeset

* ❇️ Support new reporting categories in ozone (#3974)

*  Validate report reason using labeler service profile

*  Rename test

* :rotating_lights: Fix lint issue

*  Use both appeal reason type for materialized views

*  Add old to new reason mapping for fallback

*  Update test snapshot

* :rotating_lights: Fix lint issue

* 🧹 Cleanup

* :rotating_lights: Fix lint issue

*  Adjust report reason tagging

* 📝 Additional comment for new migration

---------

Co-authored-by: Foysal Ahamed <foysal@blueskyweb.xyz>
2025-09-02 21:40:31 +02:00
github-actions[bot]
420f315493
Version packages (#4165)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-02 11:00:40 -03:00
rafael
09717f29ac
Add bookmarks changeset (#4164) 2025-09-02 10:54:26 -03:00
rafael
64100a75b3
Bookmarks (#4163) 2025-09-02 10:28:34 -03:00
github-actions[bot]
39b319be94
Version packages (#4157)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-02 10:36:51 +02:00
Matthieu Sieben
d54d278abd
Allow unexpected error to go through when fetching permission sets (#4155)
* Allow unexpected error to go through when fetching permission sets

* Log `cid` as string after succesful lexicon resolution

* Log `cid` and `uri` as string on successful lexicon resolution
2025-08-30 15:26:28 +02:00
zhoujiaweii
a64bd4536b
chore: remove redundant word in comment (#4151)
Signed-off-by: zhoujiaweii <zjwustc@outlook.com>
2025-08-29 12:35:36 -07:00
github-actions[bot]
c2dc0ec11b
Version packages (#4154)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-29 16:05:17 +02:00
Matthieu Sieben
f4cb3e4d0a add missing changeset 2025-08-29 15:59:53 +02:00
github-actions[bot]
920f895807
Version packages (#4152)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-29 12:54:51 +02:00
Matthieu Sieben
86c4699da8
Improve oauth client callback handling (#4150) 2025-08-29 12:45:35 +02:00
Matthieu Sieben
9ce0b0039c
Add missing lexicon-resolver to PDS dockerfile (#4153) 2025-08-29 12:29:34 +02:00
Matthieu Sieben
f9dc9aa4c9
Permission set (#4108)
* Export constants and type assertion utilities

* Add permission set support to oauth provider

* improve permission set parsing

* Rename `PermissionSet` to `ScopePermissions`

* Improve performance of NSID validation

* Add support for `permission-set` in lexicon document

* Validate NSID syntax using `@atproto/syntax`

* Export all types used in public interfaces (from `lexicon-resolver`)

* Small performance improvement

* Rework scope parsing utilities to work with Lexicon defined permissions

* file rename

* fixup! Rework scope parsing utilities to work with Lexicon defined permissions

* removed outdated comment

* removed outdated comment

* fix comment typo

* Improve `SimpleStore` api

* permission-set NSID auth scopes

* Remove dev dependency on dev-env

* fix build script

* pnpm-lock

* Improve fetch-node unicast protection

* Explicitly set the `redirect: "follow"` `fetch()` option

* Add delay when building oauth-provider-ui in watch mode

* Remove external dependencies from auth-scopes

* Add customizable lexicon authority to pds (for dev purposes)

* fix pds migration

* update permission-set icon

* Add support for `include:` syntax in scopes

* tidy

* Renaming of "resource" concept to better reflect the fact that not all oauth scope values are about resources

* changeset

* ui improvmeents

* i18n

* ui imporvements

* add `AtprotoAudience` type

* Enforce proper formatting of audience (atproto supported did + fragment part)

* tidy

* tidy

* tidy

* fix ci ?

* ci fix ?

* tidy ?

* Apply consistent outline around focusable items

* Use `inheritAud: true` to control `aud` inheritance

* Update packages/oauth/oauth-provider/src/lexicon/lexicon-manager.ts

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

* Review comments

* Add `nsid` property to `LexiconResolutionError`

* improve nsid validation

* i18n

* Improve oauth scope parsing

* Simplify lex scope parsing

* tidy

* docs

* tidy

* ci

* Code simplification

* tidy

* improve type safety

* improve deps graph

* naming

* Improve tests and package structure

* Improve error when resolving a non permission-set

* improve nsid parsing perfs

* benchmark

* Refactor ozone and lexicon into using a common service profile mechanism

* improve perfs

* ci fix (?)

* tidy

* Allow storage of valid lexicons in lexicon store

* Improve handling of lexicon resolution failures

* review comment

* Test both regexp and non regexp based nsid validation

* properly detect presence of port number in https did:web

* Re-enable logging of `safeFetch` requests

* tidy

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-08-29 12:19:19 +02:00
Matthieu Sieben
f65afa33f5
Support multiple redirect URIs for @atproto/oauth-client-browser #4144 (#4147)
* Support multiple redirect URIs for @atproto/oauth-client-browser

* For redirect_uri callback parameter type

* fix-type-error

* Do not fail if the client can't figure out which redirect uri was used (and only one is available)

---------

Co-authored-by: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
2025-08-28 17:57:38 +02:00
github-actions[bot]
5aab697d9d
Version packages (#4148)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-28 10:35:45 -04:00
David Buchanan
66dbf8db6d
revokeAccountCredentials lexicon (#4142)
* lexicons: add com.atproto.temp.revokeAccountCredentials

* codegen

* changeset
2025-08-28 10:17:12 -04:00
github-actions[bot]
7b5b846aef
Version packages (#4146)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-27 15:12:41 -05:00
Eric Bailey
0f2944305f
Expose AppView DID in dev-env (#4145)
* Expose AppView DID in dev-env

* Changset
2025-08-27 15:03:25 -05:00
hailey
0a6a87891e
adjust notifications to filter thread hidden tags (#4140) 2025-08-27 11:55:28 -07:00
github-actions[bot]
768e81b232
Version packages (#4126)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-27 13:36:05 -04:00
devin ivy
e1967c1c2a
PDS: avoid extra lookup when configured with appview details (#4141)
* pds: avoid lookup if appview is configured

* changeset
2025-08-27 10:18:44 -04:00
Emelia Smith
6231c8730a
Fix #4136: Support multiple redirect URIs in @atproto/oauth-client (#4139)
* Fix #4136: Support multiple redirect URIs in @atproto/oauth-client

* Fix type error in exchangeCode
2025-08-27 14:42:25 +02:00
Matthieu Sieben
c0126f4a84
Improve error handling when destroying pipethrough stream (#4133)
* Improve error handling when destroying pipethrough stream

fixes #4129

* docs

* pds: add failing test for abort handling

---------

Co-authored-by: Devin Ivy <devinivy@gmail.com>
2025-08-26 14:33:34 -04:00
David Buchanan
2104d9033e
@atproto/lexicon: relax validation of lexicon documents (#4122)
* @atproto/lexicon: relax validation of lexicon documents to allow unknown fields

* changeset

* remove  field from lexiconDoc validation, no longer necessary
2025-08-22 16:58:59 +01:00
Matthieu Sieben
9d22305f71
Fix circular dev dependencies and build scripts (#4124)
* fix build script

* Remove dev dependency on dev-env

* pnpm-lock
2025-08-21 16:02:54 +02:00
github-actions[bot]
5188ef3b59
Version packages (#4116)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-20 21:48:51 +02:00
Foysal Ahamed
3156ddf615
Add batchId filter for queryEvents (#4109)
*  Add batchId filter for queryEvents

* 📝 Add changeset
2025-08-20 21:39:24 +02:00
devin ivy
331a356ce2
Lexicon resolver package (#4069)
* lexicon: doc validation compatibility with published lexicons

* lexicon-resolver: setup new package

* lexicon-resolver: implement record resolution

* lexicon-resolver: implement lexicon resolution

* lexicon-resolver: test record resolution

* repo: add option to verify CIDs found in CARs. tidy.

* lexicon-resolution: verify CIDs in proof CAR

* lexicon-resolution: tests and fixes

* tidy

* lexicon-resolution: add entrypoint

* lexicon-resolver: tidy errors

* lexicon-resolver: readme

* lexicon-resolver: changeset

* prettier

* eslint

* tidy

* tidy

* tidy

* enable CID-to-content verification within CARs by default

* lexicon-resolver: tidy types, application of defaults, gitattributes

* lexicon-resolver: add interface and builder fn for lexicon and record resolvers

* lexicon-resolver: update readme

* tidy

* lexicon-resolver: cover error cases in record resolution

---------

Co-authored-by: Matthieu Sieben <matthieu.sieben@gmail.com>
2025-08-17 22:45:51 -04:00
github-actions[bot]
649e5ad772
Version packages (#4105)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-15 17:27:00 +02:00
Matthieu Sieben
369a201161
Perf: Avoid fetching account data twice in putRecord (#4107)
* Perf: Avoid fetching account data twice in `putRecord`

* Apply same changes in `createRecord`/`deleteRecord`/`applyWrites`

* tidy

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* switch validation order

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-15 17:20:56 +02:00
David Buchanan
75162ffb9e
Fix putRecord auth check (#4104)
* Fix putRecord auth check

* changeset

* switch pds changeset to patch

* add test for putRecord via handle

* style fix

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-08-13 22:41:39 +01:00
github-actions[bot]
d02d43c05b
Version packages (#4102)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-13 15:22:03 +02:00
Matthieu Sieben
8a88e2c154
Add support for legacy JWKS validation in OAuth configuration (#4101)
* Remore requirement for JWK to define either `use` or `key_ops`

* Prevent inconsistent use of `use` and `key_ops` in JWK

* docs

* review comments

* comment
2025-08-13 15:15:54 +02:00
github-actions[bot]
f8667835db
Version packages (#4099)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-13 10:30:51 +02:00
Matthieu Sieben
832866c33b
Enforce stronger validation of jwks loaded through their own uri (#4100)
* Enforce stronger validation of jwks loaded through their own uri

* add some docs
2025-08-13 09:45:23 +02:00
Matthieu Sieben
8602827985
Prevent cookie from being downgraded when doing "pnpm up" (#4098) 2025-08-12 17:35:02 +02:00
Matthieu Sieben
396ab57ed0
Fix warnings during build (#4096)
* Fix warnings during build

* Update caniuse-lite
2025-08-12 17:15:23 +02:00
Matthieu Sieben
c274bd1b38
Fix permission bug with transition:email scope (#4097)
* Fix permission bug with `transition:email` scope

* fix tests
2025-08-12 17:14:51 +02:00
github-actions[bot]
174f86da5f
Version packages (#4094)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-12 14:45:00 +02:00
Matthieu Sieben
1dbc7750d2
Fix changeset and version numbers (#4095) 2025-08-12 13:22:51 +02:00
Matthieu Sieben
1899b1fc16
OAuth scopes (#3806)
* style: prefix `id` and `uri` with `request` where applicable

* Dynamically validate OAuth scopes

* Allow configuring trusted OAuth clients

* Improve client validation

* Rework authorization to work with permissions

* Review changes

* fix permissions

* tidy

* Drop authorization result

* unused code cleanup

* fix preferences auth

* remove redundant check in `applyWrites`

* style

* Remove need to specify "scopes" in authorized auth strategy

* fixup! Remove need to specify "scopes" in authorized auth strategy

* split authorized and oauth auth methods

* Require explicit opt-in for takendown

* fix tests

* rollback redundant permissions mechanism

* tidy

* Fix tests

* tidy

* tidy

* pr changes

* remove hack allowing access to full preferences

* always specify authorize method

* Add OAuth scope parsing & matching

* tidy

* add support for oauth scopes in client

* review changes

* Small xrpc-server optimizations

* pr comments

* Review comments

* refactor: move oauth scopes parser & checker in own package

* code simplification

* Allow multiple collections in `repo` scopes.
Allow wildcard action in `repo` scopes.
Require action in `repo` scopes.

* Rename `emailUpdate` to `email-update` in `account` scope params.
Add wildcard (`*`) in `account` and `identity` scopes.

* tidy

* add oauth-scopes package to PDS Dockerfile

* unit tests

* Syntax rework

* adapt to latest scope definition

* Add missing tests

* Render scopes in UI

* fix build

* fixes and tests

* improve ui

* tidy

* tidy

* ui improvements

* tidy

* fr messages

* tidy

* improve consent screen ui

* fix test

* tidy

* improve dx

* Remove `transition:` scopes from `scopes_supported` authorization server metadata

* Hide blob scope if no repo scope present

* changeset

* Remove the `action` param from the `identity` scope

* fix html syntax

* simplified wording

* Make `account:email` scope optional (#4089)

* Make `account:email` scope optional

* tidy

* tidy

* tidy

* tidy

* fix

* tidy

* review comments

* tidy

* refactor: remove redundant tests for identity scope parsing and matching

* minor ui fixes

* fix "back" label not translated

* ui improvements

* fix tests
2025-08-12 13:13:14 +02:00
Matthieu Sieben
43fbeda63e
Update cookie dependency (#4092) 2025-08-12 09:49:14 +02:00
David Buchanan
41b205051b
Make codegen locale-independent (second attempt) (#4087) 2025-08-11 11:47:35 -03:00
Matthieu Sieben
0e40995e80
Run codegen (#4085) 2025-08-07 15:27:58 +02:00
github-actions[bot]
9a1746a025
Version packages (#4082)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-05 03:36:19 -07:00
rafael
c370d933b7
Lists API improvements (#4081)
* Add purposes filter to app.bsky.graph.getLists

* Add getListsWithMembership

* Add getStarterPacksWithMembership

* Refactor list membership hydration

* changeset

* update getStarterPacksWithMembership lexicon output

* bsky: address feedback on list api improvements

* tidy

* tidy

---------

Co-authored-by: Devin Ivy <devinivy@gmail.com>
2025-08-05 01:06:05 -04:00
github-actions[bot]
757fa34458
Version packages (#4075)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-08-04 23:36:10 +02:00
Foysal Ahamed
171efadb49
❇️ Ozone events timeline (#3927)
* 🚧 WIP

*  Blend in plc and account history events in account timeline

*  Adjust snapshot

* 🧹 Cleanup and address review comments

*  Update test snapshot

* 🐛 Add back the helper function

* 📝 Add explainer comment

*  Map plc events to conforming naming convention

*  Update test snapshot

* 🧹 Cleanup

*  Add known values for event types

* 📝 Add changeset
2025-08-04 20:37:05 +02:00
hailey
a723ab3893
hydrate acceptsInteractions in generator view (#4071)
* hydrate  in generator view

* add a mock feedgen

* add feed-generation test

* Fix verify

---------

Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-08-04 11:40:47 -04:00
Matthieu Sieben
82e3e7bf6b
Small xrpc-server optimizations (#4073) 2025-07-30 15:43:03 +02:00
github-actions[bot]
c55d5910ea
Version packages (#4063)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-29 17:13:36 -03:00
rafael
9751eebd71
Cleanup app.bsky.unspecced.checkHandleAvailability (#4072) 2025-07-29 17:00:05 -03:00
rafael
459a5dcddc
Cleanup AA gate (#4066) 2025-07-28 10:53:10 -03:00
rafael
8dba37fdea
Tweak worflow 2025-07-24 17:21:42 -03:00
rafael
d59a7a1227
trigger workflow 2025-07-24 17:03:55 -03:00
rafael
edb1fc2ca3
trigger workflow 2025-07-24 17:01:10 -03:00
rafael
391fd08f8f
Add github workflow 2025-07-24 16:56:49 -03:00
Devin Ivy
8d56743a18 add changeset 2025-07-22 13:59:10 -04:00
tomo-x
33483b47b0
Fixed a bug in @atproto/lex-cli (#4061)
replace nsidToEnum with shared toTitleCase utility
2025-07-22 13:58:35 -04:00
rafael
de29a346d8
Fix paginateAll mistakes and improve typing (#4062) 2025-07-22 14:51:16 -03:00
github-actions[bot]
3f5c6af971
Version packages (#4054)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-22 07:52:30 -05:00
Eric Bailey
8787fd9dea
Prevent assured user from re-initiating (#4058)
* Validate user status before initiating

* Format

* Add test, not working yet

* Fix test

* Import order

---------

Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-07-18 14:13:25 -05:00
rafael
534bea0a98
Fixes on handle suggestions (#4055) 2025-07-18 12:12:09 -03:00
rafael
dc84906c86
checkHandleAvailability endpoint (#4049) 2025-07-17 16:09:14 -03:00
github-actions[bot]
527729e0d6
Version packages (#4051)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-16 17:09:52 -05:00
rafael
77c6dffd0b
AA fixes (#4050) 2025-07-16 15:13:21 -03:00
github-actions[bot]
47236325a9
Version packages (#4043)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-15 17:39:15 -05:00
Foysal Ahamed
3b356c5096
External ID in ozone events to help dedupe events (#4048)
*  Add externalId to ozone events for deduping events per subject and event type

* 📝 Add changeset

*  Move duplicate event check inside transaction
2025-07-15 18:32:22 +02:00
rafael
083566ddfc
Endpoint for unregistering push notifications (#4041)
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
2025-07-14 20:06:22 -03:00
Foysal Ahamed
5ae9987972
Ozone allow aa event type query (#4044)
* 🐛 Allow filtering ozone event stream by age assurance event

* 📝 Add changeset
2025-07-14 23:26:11 +02:00
Eric Bailey
2aecd2b290
Uppercase countryCode in initAgeAssuranceMethod (#4042) 2025-07-14 15:58:04 -03:00
rafael
91bc841c71
Update proto to keep up with latest changes (#4040) 2025-07-14 13:27:49 -03:00
rafael
22295e4211
Fix KWS env var name (#4039) 2025-07-14 11:09:53 -03:00
github-actions[bot]
5094525ccc
Version packages (#4036)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-11 19:15:20 -03:00
rafael
88c1364274
APIs for age assurance compliance (#4028)
Co-authored-by: Eric Bailey <git@esb.lol>
2025-07-11 19:09:18 -03:00
github-actions[bot]
f27ae66432
Version packages (#4024)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-11 20:35:18 +02:00
Foysal Ahamed
34d7a0846b
📝 Add changeset for ozone age assurance changes (#4034) 2025-07-11 18:09:49 +02:00
Foysal Ahamed
926193f825
Ozone support for age assurance compliance events (#4029)
* 🚧 WIP

*  Make age assurance state queryable

*  Split age assurance events into 2

*  Implement admin and user state overrides

*  Add blocked as a known value for age assurance state

*  Update test snapshot

*  Update test snapshot

*  Cleanup
2025-07-11 18:00:55 +02:00
Matthieu Sieben
ad18fc171e
Properly compute token exp in getServiceAuth endpoint (#4025) 2025-07-11 17:17:05 +02:00
Jim Calabro
c73d913354
Pass Through Age Restricted Status on Device Push Tokens (#4030)
* add ageRestricted to lexicon

* make codegen

* update courier proto

* pass through ageRestricted

* make fmt
2025-07-10 17:22:09 -04:00
devin ivy
5ed4a88596
Fix json and text uploads: don't parse bodies with input encoding of */* (#4027)
* xrpc-server: skip body parsing when input encoding is */*, fix json and text uploads

* changeset

* pds: add tests for text and json uploads

* tidy

* xrpc-server: only create body parser when it will be used
2025-07-09 18:55:48 -04:00
Matthieu Sieben
8ef976d385
xrpc-server & lex-cli rework (#3999)
* xrpc-server & lex-cli rework

* codegen

* tidy

* tidy

* tidy

* Update .changeset/nasty-icons-peel.md

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

* excludeErrorResult util

* Restore export of `SkeletonHandler` from `pds`

* Make `calcKey` RateLimiter option required

* Process request input after auth

* fix tests

* changeset

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-07-08 13:04:11 +02:00
github-actions[bot]
e113a55d28
Version packages (#4017)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-03 09:54:47 +02:00
Foysal Ahamed
0c0381a2bb
❇️ Ozone user agent (#3991)
*  Add userAgent tracking for events

* :rotating_lights: Fix lint issue

* ♻️ Refactor userAgent to modTool

*  Rename extra to meta

* 📝 Add changeset

*  Support modTools param in createReport

*  Add support for mod tool in createReport
2025-07-02 22:34:15 +02:00
github-actions[bot]
e5bd36e0c5
Version packages (#4016)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-02 22:15:58 +02:00
Foysal Ahamed
02c358d0ca
Adds safelink module (#3945)
*  Adds safelink module

*  Remove createdAt timestamp bloat

* :rotating_lights: Fix lint issue

* 🐛 Fix pagination

* 🔨 Refactor safelink rule table

* 🧹 Add better default

*  Better search params

*  Remove mod requirement for query rules and events

*  Cleanup search for queryEvents

* 📝 Add changeset

* :rotating_lights: Fix lint issue

* 🧹 Adjust as per review feedback

*  Add support for sort direction in safelink rules

* :rotating_lights: Fix lint issue

*  Split input and response object shape

* :rotating_lights: Fix lint issue
2025-07-02 21:17:38 +02:00
github-actions[bot]
cf3af4660d
Version packages (#4012)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-01 06:59:28 -07:00
Samuel Newman
d344723a10
Loosen unspecced constraint on saved feed IDs (#4010)
* only specify ID must be present

* update validateSavedFeed test

* changeset

* fix unused import

* fix typo in changeset
2025-07-01 06:48:09 -07:00
Samuel Newman
8a0f190399
Subscribe to activity implementation (#3908)
Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-06-30 18:43:27 -03:00
github-actions[bot]
a2705e5a5d
Version packages (#4006)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-30 08:14:33 -07:00
Samuel Newman
bb65f7a6e2
Add subscribed-post notification reason (#4005)
* add new notification reason

* changeset
2025-06-30 07:53:56 -07:00
github-actions[bot]
76367f8a94
Version packages (#4001)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-27 04:52:57 -07:00
Samuel Newman
376778a92f
Add missing put method to record (#3997)
add missing put record
2025-06-27 04:11:10 -07:00
rafael
3499642ed1
Improve stash types for namespaces (#4000) 2025-06-26 16:45:18 -03:00
github-actions[bot]
ad81144cac
Version packages (#3996)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-25 23:33:53 -07:00
Samuel Newman
e3e31b2b9b
Add put method to record utility classes (#3995) 2025-06-25 23:06:22 +03:00
github-actions[bot]
b70f62c6b9
Version packages (#3988)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-24 06:17:02 -07:00
rafael
6cd1202065
Subscribe to activity lexicons (#3990)
* Activity subscription lexicons

* Update lexicons/app/bsky/notification/declaration.json

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

* update codegen

---------

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
2025-06-24 03:43:53 -07:00
Matthieu Sieben
f792b91938
Improve error reporting and logging (#3953)
* Improve error reporting and logging

* tidy

* tidy

* Improve zod error message extraction

* Properly serialize request in oauth logger

* Improve formatting of Zod errors

* Restore logging of refresh errors

* tidy

* Avoid double logging of errors

* tidy

* tidy

* revert merge changes

* tidy

* tidy

* more tidy
2025-06-23 19:49:10 +02:00
Matthieu Sieben
3a1e010e14
OAuth: Improve error reporting (#3973)
* Fix authorization error type name

* Refactor authorization error handling: replace AccessDeniedError with AuthorizationError and improve error reporting
2025-06-23 18:30:33 +02:00
Matthieu Sieben
09d90ae486
Improve OAuth Example app (#3952)
* Improve OAuth Example app

* Improve style

* bsync: Accept NSID with fragment in operation ns (#3954)

* Add `match: MuteWordMatch` to `muted-word` mod decision `cause` (#2934)

* Return MuteWordMatch instead of simple boolean

* Return full mute word with match

* Add MuteWordMatch to decision cause, update a few tests

* Backwards compat

* Tighter types

* Return all mute word matches

* Clean up types

* Rename

* More cleanup of naming

* Remove unneeded changes

* Format

* Add predicate value to matches

* Better migration path

* Changeset

* Import sort

* Tighten up addMuteWord API

Co-authored-by: Matthieu Sieben <matthieusieben@users.noreply.github.com>

* Mute words: handle `Andor` and `and/or` case (#3948)

* Handle Andor case

* Remove useless escape

* Changeset

---------

Co-authored-by: Matthieu Sieben <matthieusieben@users.noreply.github.com>

* Version packages (#3947)

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

* Update README.md to add some missing details in examples (#3254)

Update README.md

Improve code examples (some OAuth implementation details are missing in these examples)

* Increase oauth session & refresh token lifetimes (#3883)

* Allow HTTPS `redirect_uris` from any origin (#3811)

* bump MST key length from 256 to 1024 chars (#3956)

* bump MST key length from 256 to 1024 chars

* update MST key test

* add a changeset

* Version packages (#3959)

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

* Rename `filter` -> `include` (#3966)

* rename filter -> include

* changeset

* fix tests

* Minor Fixes: Typo Correction and Comment Update (#3961)

* Update blob-resolver.ts

* Update index.ts

* Appview: sync up protos for notification prefs (#3970)

appview: sync up protos for notification prefs

* Version packages (#3969)

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

* Fix invalid use of `invalid_client` (#3967)

* Replace slice() with subarray() in car file parsing (#3971)

* Replace slice() with subarray() in car file parsing

* changeset

---------

Co-authored-by: Devin Ivy <devinivy@gmail.com>

* Re-export all types & utilities needed to instantiate an OAuth client (#3976)

* Re-export all types & utilities needed to instantiate an OAuth client

* Add `jwkPrivateSchema` to ensure a key is private

* Return object instead of array as result of `findPrivateKey`

* Allow override of default `handleResolver` and `runtimeImplementation` options for NodeOAuthClient

* changeset

* Allow `OAuthClient` to be instantiated with custom `didResolver` instance

* Version packages (#3975)

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

* Perform a bi-directional check when resolving identity from did (#3977)

* Perform a bi-directional check when resolving identity from did

* tidy

* Reject did documents containing invalid `alsoKnownAs` ATProto handles

* Use error classes

* tidy

* Improve identity resolution

* tidy

* Allow non-normalized handles in did document

* pnpm-lock

* Version packages (#3979)

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

* repo: MST should allow tilde in keys (#3981)

* repo: MST should allow tilde in keys

* add changeset

* fic ci

* tidy

* tidy

---------

Co-authored-by: rafael <rafael@blueskyweb.xyz>
Co-authored-by: Eric Bailey <git@esb.lol>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: James Futhey <kidGodzilla@users.noreply.github.com>
Co-authored-by: bnewbold <bnewbold@robocracy.org>
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: leopardracer <136604165+leopardracer@users.noreply.github.com>
Co-authored-by: devin ivy <devinivy@gmail.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2025-06-23 17:31:02 +02:00
Matthieu Sieben
4c2d499178
Identity resolver's resolve() method returns valud consistent with resolveIdentity (#3982)
* Identity resolver's `resolve()` method returns valud consistent with `com.atproto.identity.resolveIdentity`

* Refactor IdentityResolver into interface

* Update .changeset/few-rivers-chew.md

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

* tidy

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-06-23 16:27:25 +02:00
bnewbold
a8dee6af33
repo: MST should allow tilde in keys (#3981)
* repo: MST should allow tilde in keys

* add changeset
2025-06-22 17:43:06 -07:00
github-actions[bot]
bc2c578203
Version packages (#3979)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-20 10:54:34 +02:00
Matthieu Sieben
9dac8b0c60
Perform a bi-directional check when resolving identity from did (#3977)
* Perform a bi-directional check when resolving identity from did

* tidy

* Reject did documents containing invalid `alsoKnownAs` ATProto handles

* Use error classes

* tidy

* Improve identity resolution

* tidy

* Allow non-normalized handles in did document

* pnpm-lock
2025-06-20 10:34:53 +02:00
github-actions[bot]
9f9a08648b
Version packages (#3975)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-19 20:43:13 +02:00
Matthieu Sieben
90b4775fc9
Re-export all types & utilities needed to instantiate an OAuth client (#3976)
* Re-export all types & utilities needed to instantiate an OAuth client

* Add `jwkPrivateSchema` to ensure a key is private

* Return object instead of array as result of `findPrivateKey`

* Allow override of default `handleResolver` and `runtimeImplementation` options for NodeOAuthClient

* changeset

* Allow `OAuthClient` to be instantiated with custom `didResolver` instance
2025-06-19 19:27:38 +02:00
Paul Frazee
5fccbd2a14
Replace slice() with subarray() in car file parsing (#3971)
* Replace slice() with subarray() in car file parsing

* changeset

---------

Co-authored-by: Devin Ivy <devinivy@gmail.com>
2025-06-18 20:39:05 -07:00
Matthieu Sieben
68c43a94bd
Fix invalid use of invalid_client (#3967) 2025-06-18 15:46:32 +02:00
github-actions[bot]
727d9330a1
Version packages (#3969)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-18 02:12:45 -07:00
devin ivy
9f7be0b9eb
Appview: sync up protos for notification prefs (#3970)
appview: sync up protos for notification prefs
2025-06-17 22:34:52 -04:00
leopardracer
96c08da3ab
Minor Fixes: Typo Correction and Comment Update (#3961)
* Update blob-resolver.ts

* Update index.ts
2025-06-17 11:40:02 -07:00
Samuel Newman
97ef116571
Rename filter -> include (#3966)
* rename filter -> include

* changeset

* fix tests
2025-06-17 13:45:49 -04:00
github-actions[bot]
b4cb1ebac9
Version packages (#3959)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-17 15:50:58 +02:00
bnewbold
8bd45e2f89
bump MST key length from 256 to 1024 chars (#3956)
* bump MST key length from 256 to 1024 chars

* update MST key test

* add a changeset
2025-06-14 11:39:56 -07:00
Matthieu Sieben
7d9808ca81
Allow HTTPS redirect_uris from any origin (#3811) 2025-06-14 14:30:24 +02:00
Matthieu Sieben
e27d908454
Increase oauth session & refresh token lifetimes (#3883) 2025-06-14 14:25:11 +02:00
James Futhey
5072e5b811
Update README.md to add some missing details in examples (#3254)
Update README.md

Improve code examples (some OAuth implementation details are missing in these examples)
2025-06-14 14:15:44 +02:00
github-actions[bot]
71a0a026c1
Version packages (#3947)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-13 13:49:11 -05:00
Eric Bailey
7f1316748d
Add match: MuteWordMatch to muted-word mod decision cause (#2934)
* Return MuteWordMatch instead of simple boolean

* Return full mute word with match

* Add MuteWordMatch to decision cause, update a few tests

* Backwards compat

* Tighter types

* Return all mute word matches

* Clean up types

* Rename

* More cleanup of naming

* Remove unneeded changes

* Format

* Add predicate value to matches

* Better migration path

* Changeset

* Import sort

* Tighten up addMuteWord API

Co-authored-by: Matthieu Sieben <matthieusieben@users.noreply.github.com>

* Mute words: handle `Andor` and `and/or` case (#3948)

* Handle Andor case

* Remove useless escape

* Changeset

---------

Co-authored-by: Matthieu Sieben <matthieusieben@users.noreply.github.com>
2025-06-13 13:37:33 -05:00
rafael
6b07b4b08f
bsync: Accept NSID with fragment in operation ns (#3954) 2025-06-13 12:28:19 -03:00
Matthieu Sieben
349b59175e
Properly validate auth during refresh (#3847)
* Ensure that the credentials used during a refresh correspond to those used to create the OAuth tokens.

* tidy

* Bind the OAuth session to the kid that was used to authenticate the client (private_key_jwt)

* Store the whole authentication method in the client session store rather than the kid only

* tidy

* Improve error reporting in case an invalid `token_endpoint_auth_method` is used in the client metadata document.

* tidy

* tidy

* Improve JAR checks

* tidy

* changeset

* tidy

* Remove schema's `.optional()` modifier when a `.default()` is defined

* tidy

* verify client auth during code exchange

* tidy

* Minor naming improvement

* tidy

* Update .changeset/quiet-pans-fix.md

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

* Update packages/oauth/oauth-client/src/oauth-client-auth.ts

* Use `private_key_jwt` instead of incorrect `client_secret_jwt` as authentication method for confidential clients

* style

* code split

* dead code removal

* Represent missing client auth with a `null` instead of "none" when storing request data.

* Allow storing `null` in authorization_request's `clientAuth` json column

* document

* tidy

* Remove non-standard behavior that allowed client to authenticate through JAR

* Improved error messages

* Parse JSON encoded Authorization Request Parameters

* Use `application/x-www-form-urlencoded` content instead of JSON for OAuth requests

Fixes: #3723

* tidy

* tidy

* tidy

* tidy

* code style

* remove un-necessary checks

* tidy

* Pre-process number too

* improved type checking

* add missing exports

* fix merge conflict

* tidy

* Remove invalid default for `code_challenge_method` authorization request parameter

* tidy

* Delete inaccurate changeset

* PR comment

* tidy

* Update OAuth client credentials factory to return headers and payload separately.

* tidy

* Renamed `clientAuthCheck` to `validateClientAuth`

* Validate presence of DPoP proofs sooner when processing token requests.

Fixes: #3859

* Protect against concurrent use of request code

* tidy

* tidy

* Update packages/oauth/oauth-provider/src/client/client.ts

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

* Review comments

* Add missing `exp` claim in client attestation JWT

* fixup! Review comments

* Review comments

* Refactor: explicit optionality of unsigned JAR issuer & audience

* Use client attestation's `exp` claim to determine the life time of JWT's `jti` nonce.

* Fix PDS: consumeRequestCode should delete request data

* tidy

* tidy

* Unused code removal

* Restore "Native clients must authenticate using "none" method" check

* tidy

* tidy

* cleanup

* comment

* Allow missing DPoP header during PAR request if `dpop_jkt` is provided

* tidy

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-06-12 15:10:17 +02:00
github-actions[bot]
c2b57e3f65
Version packages (#3944)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-11 16:49:12 -05:00
rafael
3f07ffd3ef
Add field to NotificationPreferences proto msg (#3946) 2025-06-10 17:20:39 -03:00
Matthieu Sieben
0286f7ee3d
Refactor route rate limiter builder (#3886)
* Refactor route rate limiter builder

* Refactor RouteRateLimiter handle method to improve bypass logic and return type

* Use `redis` as rate limit db when available
2025-06-10 20:53:56 +02:00
Matthieu Sieben
809822ceeb fix pds build 2025-06-10 16:14:22 +02:00
rafael
dfdc8c8470
Add threads v2 seeds to dev-env seeds (#3911) 2025-06-10 10:57:04 -03:00
Matthieu Sieben
b675fbbf17
Return an error if the wrong HTTP verb is used for a known XRPC method (#3884) 2025-06-10 11:58:25 +02:00
Matthieu Sieben
192f3ab89c
Improve login_hint handling (#3933)
* Return atproto handle in identity resolution result

* Use resolved handle or did instead of raw input as "login_hint"

* Normalize and validate `login_hint` in oauth request properties
2025-06-10 11:57:49 +02:00
Matthieu Sieben
4e96e2c7b7
Remove iss claim from DPoP proofs (#3926) 2025-06-10 11:56:04 +02:00
Matthieu Sieben
30f851dee8
Fix footer links not working in account page (#3934)
Fixes: #3893
2025-06-10 11:55:51 +02:00
github-actions[bot]
93bf69df96
Version packages (#3936)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-06 20:20:02 -03:00
Samuel Newman
a48671e730
Notification preferences V2 endpoints (#3901)
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-06-06 18:29:05 -03:00
Matthieu Sieben
cd4bed3c9e
Cache new nonces from successful retries (#3935)
* @atproto/oauth-client: cache new nonces from successful retries

* Add changeset

---------

Co-authored-by: Eli Mallon <eli@aquareum.tv>
2025-06-06 19:29:48 +02:00
github-actions[bot]
bd77a88d05
Version packages (#3931)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-06 11:49:33 -05:00
Eric Bailey
c6eb8a12e2
Update V2 additional replies naming convention (#3929)
* Rename

* Import sorting
2025-06-06 10:54:36 -05:00
Matthieu Sieben
598fcb693d
Log invalid use of "htu" DPoP proof claim (#3930) 2025-06-06 14:50:43 +02:00
github-actions[bot]
623c95d01e
Version packages (#3924)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-05 14:59:03 +02:00
Matthieu Sieben
3fa2ee3b6a
Deprecate query & fragment in DPoP proof htu claim (#3879)
* Properly validate JWK `htu` claim by enforcing URL without query or fragment

* type fix

* Return DPoP validation result from `authenticateRequest`

* Log clients using invalid "htu" claim in DPoP proof

* review comments

* fix lint

* tidy

* rename dpop result to dpop proof
2025-06-05 14:46:51 +02:00
Matthieu Sieben
a3b24ca77c
Use Form encoded body instead of JSON for OAuth requests (#3919)
* Parse JSON encoded Authorization Request Parameters

* Use `application/x-www-form-urlencoded` content instead of JSON for OAuth requests

Fixes: #3723

* Pre-process number too

* improved type checking

* Update packages/oauth/oauth-client/src/oauth-server-agent.ts

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

---------

Co-authored-by: devin ivy <devinivy@gmail.com>
2025-06-05 14:15:42 +02:00
Matthieu Sieben
9214bd0170
Improve logging of XRPC errors (#3699)
* Improve logging of XRPC errors

* strip stack of non internal errors

* Review comments
2025-06-04 17:03:16 +02:00
github-actions[bot]
1919d10a22
Version packages (#3920)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-04 13:35:53 +02:00
rafael
b9616f63bf
[bsync] Rename operation endpoint properties (#3921) 2025-06-03 14:23:35 -03:00
Matthieu Sieben
71b9dcda96
Show account picker instead of welcome screen when user already signed-in (#3916)
* Show sign-in screen instead of welcome screen when user already signed-in
2025-06-03 10:10:42 +02:00
Matthieu Sieben
8fa2502e80
Require manual invocation of i18n:extract (#3918)
Currently, the `lingui extract` command is being run as part of the `build` and `dev` commands. This causes very large diffs in PRs, even when no change are made to `.po` files.

With this change, only running `pnpm i18n` (from the root folder), or `pnpm i18n:extract` (from ui libs that support it) will cause the PO files to be re-computed.
2025-06-02 19:18:33 +02:00
Foysal Ahamed
e2f1dfd3da
Fix flaky team test in ozone suite (#3917) 2025-06-02 16:45:02 +02:00
github-actions[bot]
45e8717e19
Version packages (#3914)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-31 16:37:17 -03:00
Eric Bailey
a5cd018bd5
Unify getPostThreadV2 and getPostThreadHiddenV2 responses (#3912)
Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-05-31 16:25:25 -03:00
github-actions[bot]
e05b38a727
Version packages (#3907)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-29 15:27:40 -03:00
rafael
a978681fde
changeset (#3910) 2025-05-29 15:20:29 -03:00
rafael
f6d5a467e7
Fix handling following users in threads v2 (#3909) 2025-05-29 13:01:11 -03:00
Samuel Newman
d880665e63
Fixed codegen for arrays of strings with known values (#3906)
* fix codegen for arrays of strings of knownValue

* changeset
2025-05-29 08:42:56 -07:00
Matthieu Sieben
06bf684a4a
Add max length limit to passwords (#3900)
* Add max length limit to passwords

* review changes
2025-05-29 14:15:45 +02:00
rafael
cb8bf1838f
app.bsky.unspecced.getPostThreadV2 filtering (#3905) 2025-05-29 00:32:11 -03:00
Foysal Ahamed
498f3c0738
🐛 Fetch record from pds if appview fails to find it for ozone (#3892)
* 🐛 Fetch record from pds if appview fails to find it for ozone

*  Resolve and etch from pds without auth

* ♻️ Refactor and cleanup

*  Fix tests

*  Fix tests

* 🚨 Fix linter issue

* 🧹 Cleanup
2025-05-28 21:39:28 +02:00
Jim Calabro
e474623d3f
Add Generic Bsync Proto (#3887)
Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-05-28 11:37:04 -03:00
Foysal Ahamed
37b5a4ef29
🐛 Add missing union ref to ozone mod subject (#3605) 2025-05-28 10:30:54 +02:00
Foysal Ahamed
fe2a1d12bb
🐛 Add datetime format in lexicon def for createdAt field on grantVerification input (#3829) 2025-05-28 10:30:43 +02:00
github-actions[bot]
bae3ef91fc
Version packages (#3897)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-27 21:31:22 -05:00
rafael
1dae6c59ab
Add app.bsky.unspecced.getPostThreadV2 (#3825)
Co-authored-by: Eric Bailey <git@esb.lol>
2025-05-27 22:12:12 -03:00
Matthieu Sieben
a03f0b906b
Remove un-necessary validation of alg on every dpop token creation (#3877) 2025-05-27 19:36:33 +02:00
github-actions[bot]
d6c40d6559
Version packages (#3878) 2025-05-26 22:04:18 +03:00
Samuel Newman
79a75bb1ed
Referred likes lexicon changes (#3882) 2025-05-26 19:28:59 +03:00
Matthieu Sieben
d1e3e68dd9 changeset 2025-05-26 13:45:09 +02:00
Johannes Andersen
ba293da9fe
feat: password reset discovery and sign-in/up autofill (#3888)
* feat: password reset discovery and sign-in/up autofill

* chore: update translation files
2025-05-26 13:42:54 +02:00
Matthieu Sieben
e939f8e466 Revert "Refactor route rate limiter builder"
This reverts commit da433bd0ca55c044c0e1c804717124a4ca40b791.
2025-05-23 14:51:39 +02:00
Matthieu Sieben
da433bd0ca Refactor route rate limiter builder 2025-05-23 14:50:52 +02:00
Matthieu Sieben
36d0d370c2 Remove query & fragment from DPoP proof htu claim
Fixes: https://github.com/bluesky-social/atproto/issues/3846
2025-05-21 17:21:26 +02:00
bnewbold
24e20b96c6
lexicons: update searchPosts to indicate it isn't always available publicly (#3844)
* update searchPost description to clarify it may or may not be public

* codegen
2025-05-20 21:04:40 -07:00
github-actions[bot]
0a2c30dd97
Version packages (#3872)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-20 15:15:10 -07:00
hailey
80f402f366
add reqId to interactions (#3869) 2025-05-20 14:45:19 -07:00
Matthieu Sieben
8318c57187
Allow proxying of getSession using OAuth session (#3820)
* Allow proxying of dpop bound requests by using service auth instead, for the `getSession` endpoint.

* Show `getSession` data in example app

* Add  scope

* strings

* cleanup

* tidy

* tidy

* Add transition:email scope to example app

* strings

* changeset

* pr comments
2025-05-20 14:37:02 +02:00
Matthieu Sieben
36dbd41551
Fix potential memory leak (#3819)
* Fix potential memory leak

* pr comment
2025-05-20 14:08:16 +02:00
Matthieu Sieben
43861a452b
Remove dependency on the Public Suffix List (#3818)
* Remove dependency on the Public Suffix List

* tidy
2025-05-20 14:01:10 +02:00
Matthieu Sieben
5050b6550e
Allow implicit redirects in safe fetch wrap (#3821) 2025-05-20 13:36:38 +02:00
Matthieu Sieben
eab7c9fb8a
Use the PDS's hostname as fallback PDS "name" in the auth screen (#3868) 2025-05-20 13:32:48 +02:00
github-actions[bot]
f476003709
Version packages (#3854)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-16 17:20:57 -03:00
rafael
86b3153884
Add liveNow to app.bsky.unspecced.getConfig (#3860) 2025-05-16 17:01:37 -03:00
devin ivy
efc64ba925
pds: client ip relative to trusted ips (#3850)
* pds: client ip relative to trusted ips

* changeset
2025-05-13 12:29:13 -07:00
Daiki Mizukami
81fb69ac65
Add @context for multikey to service DID documents (#3666) 2025-05-09 17:36:00 -07:00
github-actions[bot]
251f661c00
Version packages (#3841)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-08 21:51:09 -04:00
devin ivy
088d06204f
pds: fix account management migration, partial failure in some cases (#3840)
* pds: fix account management migration which had a partial failure in some cases

* changeset
2025-05-08 21:45:45 -04:00
bnewbold
fb283edbaf
use legally registered name for company (#3834) 2025-05-06 10:43:57 -07:00
github-actions[bot]
b36014dac5
Version packages (#3803)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-05-05 17:44:12 -03:00
rafael
3a65b68f7d
Actor status lexicon and views (#3824) 2025-05-05 17:35:10 -03:00
rafael
7049117ea2
Fix takendown blocklists application (#3807) 2025-04-30 14:03:05 -03:00
Foysal Ahamed
5fd7ef0bf6
🐛 Ignore expired labels when queried from ozone database (#3786)
* 🐛 Ignore expired labels when queried from ozone database

* 🚨 remove unused imports
2025-04-30 17:58:08 +02:00
rafael
ab4e72084d
Handle resolution improvements (#3816)
* Handle resolution improvements

On PDS, only perform resolution if appview is not configured.
On appview, never perform resolution, only rely on dataplane.

* changeset

* appview: add lookup_unidirectional to GetDidsByHandles

* appview: plumb lookup_unidirectional for handle lookup

* note

---------

Co-authored-by: Devin Ivy <devinivy@gmail.com>
2025-04-29 08:58:55 -04:00
rafael
b428ce3669
Hookup no-cache arg to GetInteractionCounts (#3812) 2025-04-28 19:15:35 -03:00
Foysal Ahamed
3301a2697f
🐛 Verification cleanups (#3802)
* 🐛 Remove default jetstream url in ozone

*  Prevent publishing multiple verification records

* 📝 Add changeset
2025-04-28 22:51:09 +02:00
Matthieu Sieben
e1bda27e55
Fix CORS issue on <img> tags (#3810) 2025-04-28 20:30:11 +02:00
Matthieu Sieben
eccbce278d
Small memory leak fix when reading CAR file with multiple roots (#3814) 2025-04-28 20:28:13 +02:00
Matthieu Sieben
b5afb723be
Consistenlty log errors with pino (#3700) 2025-04-25 17:02:51 +02:00
Matthieu Sieben
f36ab48d91
Small XRPC fixes (#3792) 2025-04-25 11:19:28 +02:00
Matthieu Sieben
a48b093f0b
Use more consistent UI regardless of profile completion (#3797)
* Expose `pdsAgent` as global constant

* Use more consistent UI regardless of profile completion

* strings

* Add `OidcUserinfo` type
2025-04-25 10:10:13 +02:00
Matthieu Sieben
cc485d2963
Optimize parsing of CID values (#3798)
* Improvements

* tidy
2025-04-25 10:02:56 +02:00
github-actions[bot]
284b9e90ac
Version packages (#3801)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-24 15:52:39 +02:00
Foysal Ahamed
45354c84f8
❇️ Verifications manager in ozone (#3765)
* First vouch implementation

* Remove unneeded endpoints

* wip

*  wip

*  Process jetstream events through p-queue and add tests

*  Add test for cursor update

* 🐛 Use utc time to update updatedAt

* 🧹 Cleanup

* 🔨 Fix pnpm versioning issues

*  Replace jetstream lib with manual implementation

*  Remove unnecessary 3p dep

*  Add e2e test for jetstream

* 🚨 Fix import

* 🧹 Remove unnecessary property

*  Fix dev-env and add profile to verification view in ozone

*  Add profile type

*  Add backpressure handling to jetstream listener

*  Use WebSocketKeepAlive from xrpc-server and replace partysocket

*  Add a new verifier role to ozone team meber roles

* 📝 Run codegen

* 🐛 Fix auth check

* 🐛 Fix test failure check

* 🚨 Fix json formatting

* 🐛 Fix team role check

* 🚧 Checking failing test

*  Fix tests

*  Address review comments

*  Add xrpc-server to version

* 🚨 Fix linter issue

* 🚨 Fix linter issue

*  Resolve race condition in cursor update

*  Add verification check on profile

* 🐛 Fix missing cid in test and firehose cursor

*  Fix test

*  Add record validation for verification and separate xrpc-server version

*  Return error object for failed revocations

*  Add re-login on expired session case

* 📝 Fix typo

---------

Co-authored-by: rafael <rafael@blueskyweb.xyz>
2025-04-24 10:49:45 +02:00
github-actions[bot]
bd54773dc2
Version packages (#3800)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-23 21:21:40 -04:00
devin ivy
7af77f3edf
Ozone: support for tools.ozone.hosting.getAccountHistory (#3768)
* update ozone lexicons w/ tools.ozone.hosting

* ozone: tidy deprecated usage

* ozone: proxy tools.ozone.hosting.getAccountHistory

* changeset

* ozone: consistency in account history lexicon
2025-04-23 18:06:36 -04:00
rafael
da168588de
Don't use unsafe values for HTTP codes (#3789) 2025-04-23 13:08:35 -03:00
github-actions[bot]
60d8e9ac57
Version packages (#3794)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-22 17:02:08 -05:00
Eric Bailey
9ef52d8292
Return verification views with empty display name values (#3772)
* Remove displayName requirement

* Be a little more correct

* Ok lets remove that check
2025-04-22 16:47:04 -05:00
devin ivy
9a585b6a2c
Ozone: fix correctness and perf issues with reporter stats (#3791)
ozone: fix correctness and perf issues with reporter stats
2025-04-22 10:13:45 -04:00
rafael
a1b2370dbc
Mark generated files in gitattributes (#3788) 2025-04-21 12:25:33 -03:00
rafael
d65ceaeeef
lex codegen for #3769 (#3787) 2025-04-21 11:38:14 -03:00
github-actions[bot]
2b0c0159a9
Version packages (#3784)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-18 17:31:23 -04:00
devin ivy
d794b06763
Revert hcaptcha COEP requirements (#3783)
* Revert "Use more secure COEP header when hCaptcha is enabled (#3755)"

This reverts commit 96de2acb301683effe4313cb93d7747f87a73b5e.

* changeset
2025-04-18 17:12:54 -04:00
github-actions[bot]
f1a2b44550
Version packages (#3782)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-18 14:59:07 -05:00
rafael
0087dc1c0b
Verification notifications (#3773)
Co-authored-by: Eric Bailey <git@esb.lol>
2025-04-18 16:46:42 -03:00
github-actions[bot]
8e696dbcbf
Version packages (#3779)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-18 15:37:26 -04:00
Eric Bailey
a70dad5aea
Skip lazy load of hcaptcha for now (#3781)
* Skip lazy load of hcaptcha for now

* Changeset

* I18n
2025-04-18 15:20:36 -04:00
Matthieu Sieben
81524fcb00
Minor UI fixes to OAuth flow (#3778) 2025-04-18 19:12:12 +02:00
github-actions[bot]
90e9a20d31
Version packages (#3777)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-18 11:11:53 +02:00
Matthieu Sieben
30f9b6690e
OAuth Provider account page fixes (#3764)
* Allow `:` chars in url path parts

* Allow customizing contrast and hue colors

* Allow customizing contrast and hue colors

* Use white as primary contrast color

* Fix buttons alignment and labels in "My Devices" section

* Add a `<title>` tag to all pages

* Properly display the "lastSeenAt" date

* Improve display of clients & devices

* tidy

* code split

* Add definition for `ConventionalOAuthClientId`

* Remove hard coded `client_name` from loopback client metadata

* Code factorization

* Fix `<title>` of branding page
2025-04-18 11:04:34 +02:00
Matthieu Sieben
0d77d1b550
Add context getter option to CachedGetter class (#3776)
* Add `context` getter option to `CachedGetter` class

* Remove `bind` method from `CachedGetter`
2025-04-18 11:04:24 +02:00
Matthieu Sieben
6db9faa4a1
Remove unused image-url.ts file (#3775) 2025-04-18 11:00:43 +02:00
surfdude29
d23f311684
Fix typo in lexicon (#3769)
fix typo in defs.json
2025-04-17 22:51:20 -07:00
github-actions[bot]
a70e7dabd0
Version packages (#3771)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-17 17:25:40 -05:00
Eric Bailey
553c988f1d
Add prefs (#3770)
* Add verification prefs

* Update other unrelated tests
2025-04-17 17:11:03 -05:00
github-actions[bot]
3bdddeb439
Version packages (#3760)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-17 14:04:07 -05:00
rafael
8d99915ce0
Update chat verification lexicon (#3766)
* Update chat verification lexicon

* changeset
2025-04-17 13:19:09 -05:00
Matthieu Sieben
96de2acb30
Use more secure COEP header when hCaptcha is enabled (#3755)
Refs: https://github.com/hCaptcha/react-hcaptcha/issues/259
2025-04-17 11:02:32 +02:00
1912 changed files with 132042 additions and 65665 deletions

View File

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

View File

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

View File

@ -1,4 +1,5 @@
packages/api/src/client packages/api/src/client
packages/lexicon-resolver/src/client
packages/bsky/src/lexicon packages/bsky/src/lexicon
packages/pds/src/lexicon packages/pds/src/lexicon
packages/ozone/src/lexicon packages/ozone/src/lexicon

View File

@ -45,7 +45,11 @@
], ],
"@typescript-eslint/no-unused-vars": [ "@typescript-eslint/no-unused-vars": [
"error", "error",
{ "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } {
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"ignoreRestSiblings": true
}
], ],
"@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/no-empty-interface": "off",
@ -58,6 +62,10 @@
"files": ["jest.config.js"], "files": ["jest.config.js"],
"env": { "commonjs": true } "env": { "commonjs": true }
}, },
{
"files": ["vite.config.js", "vite.config.cjs", "vite.config.mjs"],
"env": { "node": true }
},
{ {
"files": ["jest.setup.js"], "files": ["jest.setup.js"],
"env": { "jest": true } "env": { "jest": true }

7
.gitattributes vendored Normal file
View File

@ -0,0 +1,7 @@
packages/**/src/lexicon/** linguist-generated=true
packages/api/src/client/** linguist-generated=true
packages/lexicon-resolver/src/client/** linguist-generated=true
packages/bsky/src/proto/** linguist-generated=true
packages/bsync/src/proto/** linguist-generated=true
packages/oauth/oauth-provider-ui/src/locales/**/messages.po linguist-generated=true

View File

@ -3,6 +3,7 @@ on:
push: push:
branches: branches:
- main - main
- divy/pds-build-dblock-fix
env: env:
REGISTRY: ghcr.io REGISTRY: ghcr.io
USERNAME: ${{ github.actor }} USERNAME: ${{ github.actor }}

View File

@ -15,10 +15,16 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- run: corepack enable && corepack prepare --activate # https://github.com/actions/setup-node/issues/531#issuecomment-2960522861
- uses: actions/setup-node@v4 - name: Install Node.js
uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: package.json
- name: Enable Corepack
run: corepack enable
- name: Configure Dependency Cache
uses: actions/setup-node@v4
with:
cache: 'pnpm' cache: 'pnpm'
- name: Get current month - name: Get current month
run: echo "CURRENT_MONTH=$(date +'%Y-%m')" >> $GITHUB_ENV run: echo "CURRENT_MONTH=$(date +'%Y-%m')" >> $GITHUB_ENV
@ -46,10 +52,16 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- run: corepack enable && corepack prepare --activate # https://github.com/actions/setup-node/issues/531#issuecomment-2960522861
- uses: actions/setup-node@v4 - name: Install Node.js
uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: package.json
- name: Enable Corepack
run: corepack enable
- name: Configure Dependency Cache
uses: actions/setup-node@v4
with:
cache: 'pnpm' cache: 'pnpm'
- name: Get current month - name: Get current month
run: echo "CURRENT_MONTH=$(date +'%Y-%m')" >> $GITHUB_ENV run: echo "CURRENT_MONTH=$(date +'%Y-%m')" >> $GITHUB_ENV
@ -70,10 +82,16 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- run: corepack enable && corepack prepare --activate # https://github.com/actions/setup-node/issues/531#issuecomment-2960522861
- uses: actions/setup-node@v4 - name: Install Node.js
uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: package.json
- name: Enable Corepack
run: corepack enable
- name: Configure Dependency Cache
uses: actions/setup-node@v4
with:
cache: 'pnpm' cache: 'pnpm'
- name: Get current month - name: Get current month
run: echo "CURRENT_MONTH=$(date +'%Y-%m')" >> $GITHUB_ENV run: echo "CURRENT_MONTH=$(date +'%Y-%m')" >> $GITHUB_ENV

31
.github/workflows/sync-internal.yaml vendored Normal file
View File

@ -0,0 +1,31 @@
name: Sync to internal repo
on:
push:
branches: [main]
jobs:
sync:
if: github.repository == 'bluesky-social/atproto'
runs-on: ubuntu-latest
steps:
- name: Checkout public repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ vars.SYNC_INTERNAL_APP_ID }}
private-key: ${{ secrets.SYNC_INTERNAL_PK }}
repositories: atproto-internal
- name: Push to internal repo
env:
TOKEN: ${{ steps.app-token.outputs.token }}
run: |
git config user.name "github-actions"
git config user.email "test@users.noreply.github.com"
git config --unset-all http.https://github.com/.extraheader
git remote add internal https://x-access-token:${TOKEN}@github.com/bluesky-social/atproto-internal.git
git push internal main --force

View File

@ -9,6 +9,7 @@ CHANGELOG.md
# Prettier is used to format the code during codegen # Prettier is used to format the code during codegen
packages/api/src/client packages/api/src/client
packages/lexicon-resolver/src/client
packages/bsky/src/lexicon packages/bsky/src/lexicon
packages/pds/src/lexicon packages/pds/src/lexicon
packages/ozone/src/lexicon packages/ozone/src/lexicon
@ -16,4 +17,3 @@ packages/ozone/src/lexicon
# Automatically generated by lingui # Automatically generated by lingui
packages/oauth/*/src/locales/*/messages.ts packages/oauth/*/src/locales/*/messages.ts
packages/oauth/oauth-provider-frontend/src/routeTree.gen.ts packages/oauth/oauth-provider-frontend/src/routeTree.gen.ts

View File

@ -1,6 +1,6 @@
Dual MIT/Apache-2.0 License Dual MIT/Apache-2.0 License
Copyright (c) 2022-2025 Bluesky PBC, and Contributors Copyright (c) 2022-2025 Bluesky Social 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>). 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

@ -61,7 +61,7 @@ make help
## About AT Protocol ## About AT Protocol
The Authenticated Transfer Protocol ("ATP" or "atproto") is a decentralized social media protocol, developed by [Bluesky PBC](https://bsky.social). Learn more at: The Authenticated Transfer Protocol ("ATP" or "atproto") is a decentralized social media protocol, developed by [Bluesky Social PBC](https://bsky.social). Learn more at:
- [Overview and Guides](https://atproto.com/guides/overview) 👈 Best starting point - [Overview and Guides](https://atproto.com/guides/overview) 👈 Best starting point
- [Github Discussions](https://github.com/bluesky-social/atproto/discussions) 👈 Great place to ask questions - [Github Discussions](https://github.com/bluesky-social/atproto/discussions) 👈 Great place to ask questions

View File

@ -27,6 +27,10 @@
"verification": { "verification": {
"type": "ref", "type": "ref",
"ref": "#verificationState" "ref": "#verificationState"
},
"status": {
"type": "ref",
"ref": "#statusView"
} }
} }
}, },
@ -61,6 +65,10 @@
"verification": { "verification": {
"type": "ref", "type": "ref",
"ref": "#verificationState" "ref": "#verificationState"
},
"status": {
"type": "ref",
"ref": "#statusView"
} }
} }
}, },
@ -107,6 +115,10 @@
"verification": { "verification": {
"type": "ref", "type": "ref",
"ref": "#verificationState" "ref": "#verificationState"
},
"status": {
"type": "ref",
"ref": "#statusView"
} }
} }
}, },
@ -117,7 +129,11 @@
"feedgens": { "type": "integer" }, "feedgens": { "type": "integer" },
"starterPacks": { "type": "integer" }, "starterPacks": { "type": "integer" },
"labeler": { "type": "boolean" }, "labeler": { "type": "boolean" },
"chat": { "type": "ref", "ref": "#profileAssociatedChat" } "chat": { "type": "ref", "ref": "#profileAssociatedChat" },
"activitySubscription": {
"type": "ref",
"ref": "#profileAssociatedActivitySubscription"
}
} }
}, },
"profileAssociatedChat": { "profileAssociatedChat": {
@ -130,6 +146,16 @@
} }
} }
}, },
"profileAssociatedActivitySubscription": {
"type": "object",
"required": ["allowSubscriptions"],
"properties": {
"allowSubscriptions": {
"type": "string",
"knownValues": ["followers", "mutuals", "none"]
}
}
},
"viewerState": { "viewerState": {
"type": "object", "type": "object",
"description": "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.", "description": "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.",
@ -148,8 +174,14 @@
"following": { "type": "string", "format": "at-uri" }, "following": { "type": "string", "format": "at-uri" },
"followedBy": { "type": "string", "format": "at-uri" }, "followedBy": { "type": "string", "format": "at-uri" },
"knownFollowers": { "knownFollowers": {
"description": "This property is present only in selected cases, as an optimization.",
"type": "ref", "type": "ref",
"ref": "#knownFollowers" "ref": "#knownFollowers"
},
"activitySubscription": {
"description": "This property is present only in selected cases, as an optimization.",
"type": "ref",
"ref": "app.bsky.notification.defs#activitySubscription"
} }
} }
}, },
@ -235,7 +267,8 @@
"#hiddenPostsPref", "#hiddenPostsPref",
"#bskyAppStatePref", "#bskyAppStatePref",
"#labelersPref", "#labelersPref",
"#postInteractionSettingsPref" "#postInteractionSettingsPref",
"#verificationPrefs"
] ]
} }
}, },
@ -530,6 +563,18 @@
} }
} }
}, },
"verificationPrefs": {
"type": "object",
"description": "Preferences for how verified accounts appear in the app.",
"required": [],
"properties": {
"hideBadges": {
"description": "Hide the blue check badges for verified accounts and trusted verifiers.",
"type": "boolean",
"default": false
}
}
},
"postInteractionSettingsPref": { "postInteractionSettingsPref": {
"type": "object", "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.", "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.",
@ -559,6 +604,32 @@
} }
} }
} }
},
"statusView": {
"type": "object",
"required": ["status", "record"],
"properties": {
"status": {
"type": "string",
"description": "The status for the account.",
"knownValues": ["app.bsky.actor.status#live"]
},
"record": { "type": "unknown" },
"embed": {
"type": "union",
"description": "An optional embed associated with the status.",
"refs": ["app.bsky.embed.external#view"]
},
"expiresAt": {
"type": "string",
"description": "The date when this status will expire. The application might choose to no longer return the status after expiration.",
"format": "datetime"
},
"isActive": {
"type": "boolean",
"description": "True if the status is not expired, false if it is expired. Only present if expiration was set."
}
}
} }
} }
} }

View File

@ -0,0 +1,37 @@
{
"lexicon": 1,
"id": "app.bsky.actor.status",
"defs": {
"main": {
"type": "record",
"description": "A declaration of a Bluesky account status.",
"key": "literal:self",
"record": {
"type": "object",
"required": ["status", "createdAt"],
"properties": {
"status": {
"type": "string",
"description": "The status for the account.",
"knownValues": ["app.bsky.actor.status#live"]
},
"embed": {
"type": "union",
"description": "An optional embed associated with the status.",
"refs": ["app.bsky.embed.external"]
},
"durationMinutes": {
"type": "integer",
"description": "The duration of the status in minutes. Applications can choose to impose minimum and maximum limits.",
"minimum": 1
},
"createdAt": { "type": "string", "format": "datetime" }
}
}
},
"live": {
"type": "token",
"description": "Advertises an account as currently offering live content."
}
}
}

View File

@ -0,0 +1,27 @@
{
"lexicon": 1,
"id": "app.bsky.bookmark.createBookmark",
"defs": {
"main": {
"type": "procedure",
"description": "Creates a private bookmark for the specified record. Currently, only `app.bsky.feed.post` records are supported. Requires authentication.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["uri", "cid"],
"properties": {
"uri": { "type": "string", "format": "at-uri" },
"cid": { "type": "string", "format": "cid" }
}
}
},
"errors": [
{
"name": "UnsupportedCollection",
"description": "The URI to be bookmarked is for an unsupported collection."
}
]
}
}
}

View File

@ -0,0 +1,38 @@
{
"lexicon": 1,
"id": "app.bsky.bookmark.defs",
"defs": {
"bookmark": {
"description": "Object used to store bookmark data in stash.",
"type": "object",
"required": ["subject"],
"properties": {
"subject": {
"description": "A strong ref to the record to be bookmarked. Currently, only `app.bsky.feed.post` records are supported.",
"type": "ref",
"ref": "com.atproto.repo.strongRef"
}
}
},
"bookmarkView": {
"type": "object",
"required": ["subject", "item"],
"properties": {
"subject": {
"description": "A strong ref to the bookmarked record.",
"type": "ref",
"ref": "com.atproto.repo.strongRef"
},
"createdAt": { "type": "string", "format": "datetime" },
"item": {
"type": "union",
"refs": [
"app.bsky.feed.defs#blockedPost",
"app.bsky.feed.defs#notFoundPost",
"app.bsky.feed.defs#postView"
]
}
}
}
}
}

View File

@ -0,0 +1,26 @@
{
"lexicon": 1,
"id": "app.bsky.bookmark.deleteBookmark",
"defs": {
"main": {
"type": "procedure",
"description": "Deletes a private bookmark for the specified record. Currently, only `app.bsky.feed.post` records are supported. Requires authentication.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["uri"],
"properties": {
"uri": { "type": "string", "format": "at-uri" }
}
}
},
"errors": [
{
"name": "UnsupportedCollection",
"description": "The URI to be bookmarked is for an unsupported collection."
}
]
}
}
}

View File

@ -0,0 +1,39 @@
{
"lexicon": 1,
"id": "app.bsky.bookmark.getBookmarks",
"defs": {
"main": {
"type": "query",
"description": "Gets views of records bookmarked by the authenticated user. Requires authentication.",
"parameters": {
"type": "params",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
},
"cursor": { "type": "string" }
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["bookmarks"],
"properties": {
"cursor": { "type": "string" },
"bookmarks": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.bookmark.defs#bookmarkView"
}
}
}
}
}
}
}
}

View File

@ -23,6 +23,7 @@
"app.bsky.embed.recordWithMedia#view" "app.bsky.embed.recordWithMedia#view"
] ]
}, },
"bookmarkCount": { "type": "integer" },
"replyCount": { "type": "integer" }, "replyCount": { "type": "integer" },
"repostCount": { "type": "integer" }, "repostCount": { "type": "integer" },
"likeCount": { "type": "integer" }, "likeCount": { "type": "integer" },
@ -42,6 +43,7 @@
"properties": { "properties": {
"repost": { "type": "string", "format": "at-uri" }, "repost": { "type": "string", "format": "at-uri" },
"like": { "type": "string", "format": "at-uri" }, "like": { "type": "string", "format": "at-uri" },
"bookmarked": { "type": "boolean" },
"threadMuted": { "type": "boolean" }, "threadMuted": { "type": "boolean" },
"replyDisabled": { "type": "boolean" }, "replyDisabled": { "type": "boolean" },
"embeddingDisabled": { "type": "boolean" }, "embeddingDisabled": { "type": "boolean" },
@ -66,6 +68,11 @@
"type": "string", "type": "string",
"description": "Context provided by feed generator that may be passed back alongside interactions.", "description": "Context provided by feed generator that may be passed back alongside interactions.",
"maxLength": 2000 "maxLength": 2000
},
"reqId": {
"type": "string",
"description": "Unique identifier per request that may be passed back alongside interactions.",
"maxLength": 100
} }
} }
}, },
@ -93,6 +100,8 @@
"required": ["by", "indexedAt"], "required": ["by", "indexedAt"],
"properties": { "properties": {
"by": { "type": "ref", "ref": "app.bsky.actor.defs#profileViewBasic" }, "by": { "type": "ref", "ref": "app.bsky.actor.defs#profileViewBasic" },
"uri": { "type": "string", "format": "at-uri" },
"cid": { "type": "string", "format": "cid" },
"indexedAt": { "type": "string", "format": "datetime" } "indexedAt": { "type": "string", "format": "datetime" }
} }
}, },
@ -250,6 +259,11 @@
"type": "string", "type": "string",
"description": "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", "description": "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.",
"maxLength": 2000 "maxLength": 2000
},
"reqId": {
"type": "string",
"description": "Unique identifier per request that may be passed back alongside interactions.",
"maxLength": 100
} }
} }
}, },

View File

@ -36,6 +36,11 @@
"type": "ref", "type": "ref",
"ref": "app.bsky.feed.defs#skeletonFeedPost" "ref": "app.bsky.feed.defs#skeletonFeedPost"
} }
},
"reqId": {
"type": "string",
"description": "Unique identifier per request that may be passed back alongside interactions.",
"maxLength": 100
} }
} }
} }

View File

@ -11,7 +11,8 @@
"required": ["subject", "createdAt"], "required": ["subject", "createdAt"],
"properties": { "properties": {
"subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" },
"createdAt": { "type": "string", "format": "datetime" } "createdAt": { "type": "string", "format": "datetime" },
"via": { "type": "ref", "ref": "com.atproto.repo.strongRef" }
} }
} }
} }

View File

@ -11,7 +11,8 @@
"required": ["subject", "createdAt"], "required": ["subject", "createdAt"],
"properties": { "properties": {
"subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" },
"createdAt": { "type": "string", "format": "datetime" } "createdAt": { "type": "string", "format": "datetime" },
"via": { "type": "ref", "ref": "com.atproto.repo.strongRef" }
} }
} }
} }

View File

@ -4,7 +4,7 @@
"defs": { "defs": {
"main": { "main": {
"type": "query", "type": "query",
"description": "Find posts matching search criteria, returning views of those posts.", "description": "Find posts matching search criteria, returning views of those posts. Note that this API endpoint may require authentication (eg, not public) for some service providers and implementations.",
"parameters": { "parameters": {
"type": "params", "type": "params",
"required": ["q"], "required": ["q"],

View File

@ -20,7 +20,15 @@
"maximum": 100, "maximum": 100,
"default": 50 "default": 50
}, },
"cursor": { "type": "string" } "cursor": { "type": "string" },
"purposes": {
"type": "array",
"description": "Optional filter by list purpose. If not specified, all supported types are returned.",
"items": {
"type": "string",
"knownValues": ["modlist", "curatelist"]
}
}
} }
}, },
"output": { "output": {

View File

@ -0,0 +1,65 @@
{
"lexicon": 1,
"id": "app.bsky.graph.getListsWithMembership",
"defs": {
"main": {
"type": "query",
"description": "Enumerates the lists created by the session user, and includes membership information about `actor` in those lists. Only supports curation and moderation lists (no reference lists, used in starter packs). Requires auth.",
"parameters": {
"type": "params",
"required": ["actor"],
"properties": {
"actor": {
"type": "string",
"format": "at-identifier",
"description": "The account (actor) to check for membership."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
},
"cursor": { "type": "string" },
"purposes": {
"type": "array",
"description": "Optional filter by list purpose. If not specified, all supported types are returned.",
"items": {
"type": "string",
"knownValues": ["modlist", "curatelist"]
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["listsWithMembership"],
"properties": {
"cursor": { "type": "string" },
"listsWithMembership": {
"type": "array",
"items": { "type": "ref", "ref": "#listWithMembership" }
}
}
}
}
},
"listWithMembership": {
"description": "A list and an optional list item indicating membership of a target user to that list.",
"type": "object",
"required": ["list"],
"properties": {
"list": {
"type": "ref",
"ref": "app.bsky.graph.defs#listView"
},
"listItem": {
"type": "ref",
"ref": "app.bsky.graph.defs#listItemView"
}
}
}
}
}

View File

@ -0,0 +1,57 @@
{
"lexicon": 1,
"id": "app.bsky.graph.getStarterPacksWithMembership",
"defs": {
"main": {
"type": "query",
"description": "Enumerates the starter packs created by the session user, and includes membership information about `actor` in those starter packs. Requires auth.",
"parameters": {
"type": "params",
"required": ["actor"],
"properties": {
"actor": {
"type": "string",
"format": "at-identifier",
"description": "The account (actor) to check for membership."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
},
"cursor": { "type": "string" }
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["starterPacksWithMembership"],
"properties": {
"cursor": { "type": "string" },
"starterPacksWithMembership": {
"type": "array",
"items": { "type": "ref", "ref": "#starterPackWithMembership" }
}
}
}
}
},
"starterPackWithMembership": {
"description": "A starter pack and an optional list item indicating membership of a target user to that starter pack.",
"type": "object",
"required": ["starterPack"],
"properties": {
"starterPack": {
"type": "ref",
"ref": "app.bsky.graph.defs#starterPackView"
},
"listItem": {
"type": "ref",
"ref": "app.bsky.graph.defs#listItemView"
}
}
}
}
}

View File

@ -0,0 +1,22 @@
{
"lexicon": 1,
"id": "app.bsky.notification.declaration",
"defs": {
"main": {
"type": "record",
"description": "A declaration of the user's choices related to notifications that can be produced by them.",
"key": "literal:self",
"record": {
"type": "object",
"required": ["allowSubscriptions"],
"properties": {
"allowSubscriptions": {
"type": "string",
"description": "A declaration of the user's preference for allowing activity subscriptions from other users. Absence of a record implies 'followers'.",
"knownValues": ["followers", "mutuals", "none"]
}
}
}
}
}
}

View File

@ -0,0 +1,88 @@
{
"lexicon": 1,
"id": "app.bsky.notification.defs",
"defs": {
"recordDeleted": {
"type": "object",
"properties": {}
},
"chatPreference": {
"type": "object",
"required": ["include", "push"],
"properties": {
"include": { "type": "string", "knownValues": ["all", "accepted"] },
"push": { "type": "boolean" }
}
},
"filterablePreference": {
"type": "object",
"required": ["include", "list", "push"],
"properties": {
"include": { "type": "string", "knownValues": ["all", "follows"] },
"list": { "type": "boolean" },
"push": { "type": "boolean" }
}
},
"preference": {
"type": "object",
"required": ["list", "push"],
"properties": {
"list": { "type": "boolean" },
"push": { "type": "boolean" }
}
},
"preferences": {
"type": "object",
"required": [
"chat",
"follow",
"like",
"likeViaRepost",
"mention",
"quote",
"reply",
"repost",
"repostViaRepost",
"starterpackJoined",
"subscribedPost",
"unverified",
"verified"
],
"properties": {
"chat": { "type": "ref", "ref": "#chatPreference" },
"follow": { "type": "ref", "ref": "#filterablePreference" },
"like": { "type": "ref", "ref": "#filterablePreference" },
"likeViaRepost": { "type": "ref", "ref": "#filterablePreference" },
"mention": { "type": "ref", "ref": "#filterablePreference" },
"quote": { "type": "ref", "ref": "#filterablePreference" },
"reply": { "type": "ref", "ref": "#filterablePreference" },
"repost": { "type": "ref", "ref": "#filterablePreference" },
"repostViaRepost": { "type": "ref", "ref": "#filterablePreference" },
"starterpackJoined": { "type": "ref", "ref": "#preference" },
"subscribedPost": { "type": "ref", "ref": "#preference" },
"unverified": { "type": "ref", "ref": "#preference" },
"verified": { "type": "ref", "ref": "#preference" }
}
},
"activitySubscription": {
"type": "object",
"required": ["post", "reply"],
"properties": {
"post": { "type": "boolean" },
"reply": { "type": "boolean" }
}
},
"subjectActivitySubscription": {
"description": "Object used to store activity subscription data in stash.",
"type": "object",
"required": ["subject", "activitySubscription"],
"properties": {
"subject": { "type": "string", "format": "did" },
"activitySubscription": {
"type": "ref",
"ref": "#activitySubscription"
}
}
}
}
}

View File

@ -0,0 +1,27 @@
{
"lexicon": 1,
"id": "app.bsky.notification.getPreferences",
"defs": {
"main": {
"type": "query",
"description": "Get notification-related preferences for an account. Requires auth.",
"parameters": {
"type": "params",
"properties": {}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["preferences"],
"properties": {
"preferences": {
"type": "ref",
"ref": "app.bsky.notification.defs#preferences"
}
}
}
}
}
}
}

View File

@ -0,0 +1,39 @@
{
"lexicon": 1,
"id": "app.bsky.notification.listActivitySubscriptions",
"defs": {
"main": {
"type": "query",
"description": "Enumerate all accounts to which the requesting account is subscribed to receive notifications for. Requires auth.",
"parameters": {
"type": "params",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
},
"cursor": { "type": "string" }
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["subscriptions"],
"properties": {
"cursor": { "type": "string" },
"subscriptions": {
"type": "array",
"items": {
"type": "ref",
"ref": "app.bsky.actor.defs#profileView"
}
}
}
}
}
}
}
}

View File

@ -61,7 +61,7 @@
"author": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, "author": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" },
"reason": { "reason": {
"type": "string", "type": "string",
"description": "Expected values are 'like', 'repost', 'follow', 'mention', 'reply', 'quote', and 'starterpack-joined'.", "description": "The reason why this notification was delivered - e.g. your post was liked, or you received a new follower.",
"knownValues": [ "knownValues": [
"like", "like",
"repost", "repost",
@ -69,7 +69,12 @@
"mention", "mention",
"reply", "reply",
"quote", "quote",
"starterpack-joined" "starterpack-joined",
"verified",
"unverified",
"like-via-repost",
"repost-via-repost",
"subscribed-post"
] ]
}, },
"reasonSubject": { "type": "string", "format": "at-uri" }, "reasonSubject": { "type": "string", "format": "at-uri" },

View File

@ -0,0 +1,38 @@
{
"lexicon": 1,
"id": "app.bsky.notification.putActivitySubscription",
"defs": {
"main": {
"type": "procedure",
"description": "Puts an activity subscription entry. The key should be omitted for creation and provided for updates. Requires auth.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["subject", "activitySubscription"],
"properties": {
"subject": { "type": "string", "format": "did" },
"activitySubscription": {
"type": "ref",
"ref": "app.bsky.notification.defs#activitySubscription"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["subject"],
"properties": {
"subject": { "type": "string", "format": "did" },
"activitySubscription": {
"type": "ref",
"ref": "app.bsky.notification.defs#activitySubscription"
}
}
}
}
}
}
}

View File

@ -0,0 +1,83 @@
{
"lexicon": 1,
"id": "app.bsky.notification.putPreferencesV2",
"defs": {
"main": {
"type": "procedure",
"description": "Set notification-related preferences for an account. Requires auth.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"properties": {
"chat": {
"type": "ref",
"ref": "app.bsky.notification.defs#chatPreference"
},
"follow": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"like": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"likeViaRepost": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"mention": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"quote": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"reply": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"repost": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"repostViaRepost": {
"type": "ref",
"ref": "app.bsky.notification.defs#filterablePreference"
},
"starterpackJoined": {
"type": "ref",
"ref": "app.bsky.notification.defs#preference"
},
"subscribedPost": {
"type": "ref",
"ref": "app.bsky.notification.defs#preference"
},
"unverified": {
"type": "ref",
"ref": "app.bsky.notification.defs#preference"
},
"verified": {
"type": "ref",
"ref": "app.bsky.notification.defs#preference"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["preferences"],
"properties": {
"preferences": {
"type": "ref",
"ref": "app.bsky.notification.defs#preferences"
}
}
}
}
}
}
}

View File

@ -17,7 +17,11 @@
"type": "string", "type": "string",
"knownValues": ["ios", "android", "web"] "knownValues": ["ios", "android", "web"]
}, },
"appId": { "type": "string" } "appId": { "type": "string" },
"ageRestricted": {
"type": "boolean",
"description": "Set to true when the actor is age restricted"
}
} }
} }
} }

View File

@ -0,0 +1,26 @@
{
"lexicon": 1,
"id": "app.bsky.notification.unregisterPush",
"defs": {
"main": {
"type": "procedure",
"description": "The inverse of registerPush - inform a specified service that push notifications should no longer be sent to the given token for the requesting account. Requires auth.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["serviceDid", "token", "platform", "appId"],
"properties": {
"serviceDid": { "type": "string", "format": "did" },
"token": { "type": "string" },
"platform": {
"type": "string",
"knownValues": ["ios", "android", "web"]
},
"appId": { "type": "string" }
}
}
}
}
}
}

View File

@ -86,6 +86,113 @@
} }
} }
} }
},
"threadItemPost": {
"type": "object",
"required": [
"post",
"moreParents",
"moreReplies",
"opThread",
"hiddenByThreadgate",
"mutedByViewer"
],
"properties": {
"post": { "type": "ref", "ref": "app.bsky.feed.defs#postView" },
"moreParents": {
"type": "boolean",
"description": "This post has more parents that were not present in the response. This is just a boolean, without the number of parents."
},
"moreReplies": {
"type": "integer",
"description": "This post has more replies that were not present in the response. This is a numeric value, which is best-effort and might not be accurate."
},
"opThread": {
"type": "boolean",
"description": "This post is part of a contiguous thread by the OP from the thread root. Many different OP threads can happen in the same thread."
},
"hiddenByThreadgate": {
"type": "boolean",
"description": "The threadgate created by the author indicates this post as a reply to be hidden for everyone consuming the thread."
},
"mutedByViewer": {
"type": "boolean",
"description": "This is by an account muted by the viewer requesting it."
}
}
},
"threadItemNoUnauthenticated": {
"type": "object",
"properties": {}
},
"threadItemNotFound": {
"type": "object",
"properties": {}
},
"threadItemBlocked": {
"type": "object",
"required": ["author"],
"properties": {
"author": { "type": "ref", "ref": "app.bsky.feed.defs#blockedAuthor" }
}
},
"ageAssuranceState": {
"type": "object",
"description": "The computed state of the age assurance process, returned to the user in question on certain authenticated requests.",
"required": ["status"],
"properties": {
"lastInitiatedAt": {
"type": "string",
"format": "datetime",
"description": "The timestamp when this state was last updated."
},
"status": {
"type": "string",
"description": "The status of the age assurance process.",
"knownValues": ["unknown", "pending", "assured", "blocked"]
}
}
},
"ageAssuranceEvent": {
"type": "object",
"description": "Object used to store age assurance data in stash.",
"required": ["createdAt", "status", "attemptId"],
"properties": {
"createdAt": {
"type": "string",
"format": "datetime",
"description": "The date and time of this write operation."
},
"status": {
"type": "string",
"description": "The status of the age assurance process.",
"knownValues": ["unknown", "pending", "assured"]
},
"attemptId": {
"type": "string",
"description": "The unique identifier for this instance of the age assurance flow, in UUID format."
},
"email": {
"type": "string",
"description": "The email used for AA."
},
"initIp": {
"type": "string",
"description": "The IP address used when initiating the AA flow."
},
"initUa": {
"type": "string",
"description": "The user agent used when initiating the AA flow."
},
"completeIp": {
"type": "string",
"description": "The IP address used when completing the AA flow."
},
"completeUa": {
"type": "string",
"description": "The user agent used when completing the AA flow."
}
}
} }
} }
} }

View File

@ -0,0 +1,17 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getAgeAssuranceState",
"defs": {
"main": {
"type": "query",
"description": "Returns the current state of the age assurance process for an account. This is used to check if the user has completed age assurance or if further action is required.",
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "app.bsky.unspecced.defs#ageAssuranceState"
}
}
}
}
}

View File

@ -11,7 +11,24 @@
"type": "object", "type": "object",
"required": [], "required": [],
"properties": { "properties": {
"checkEmailConfirmed": { "type": "boolean" } "checkEmailConfirmed": { "type": "boolean" },
"liveNow": {
"type": "array",
"items": { "type": "ref", "ref": "#liveNowConfig" }
}
}
}
}
},
"liveNowConfig": {
"type": "object",
"required": ["did", "domains"],
"properties": {
"did": { "type": "string", "format": "did" },
"domains": {
"type": "array",
"items": {
"type": "string"
} }
} }
} }

View File

@ -0,0 +1,61 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getPostThreadOtherV2",
"defs": {
"main": {
"type": "query",
"description": "(NOTE: this endpoint is under development and WILL change without notice. Don't use it until it is moved out of `unspecced` or your application WILL break) Get additional posts under a thread e.g. replies hidden by threadgate. Based on an anchor post at any depth of the tree, returns top-level replies below that anchor. It does not include ancestors nor the anchor itself. This should be called after exhausting `app.bsky.unspecced.getPostThreadV2`. Does not require auth, but additional metadata and filtering will be applied for authed requests.",
"parameters": {
"type": "params",
"required": ["anchor"],
"properties": {
"anchor": {
"type": "string",
"format": "at-uri",
"description": "Reference (AT-URI) to post record. This is the anchor post."
},
"prioritizeFollowedUsers": {
"type": "boolean",
"description": "Whether to prioritize posts from followed users. It only has effect when the user is authenticated.",
"default": false
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["thread"],
"properties": {
"thread": {
"type": "array",
"description": "A flat list of other thread items. The depth of each item is indicated by the depth property inside the item.",
"items": {
"type": "ref",
"ref": "#threadItem"
}
}
}
}
}
},
"threadItem": {
"type": "object",
"required": ["uri", "depth", "value"],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"depth": {
"type": "integer",
"description": "The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths."
},
"value": {
"type": "union",
"refs": ["app.bsky.unspecced.defs#threadItemPost"]
}
}
}
}
}

View File

@ -0,0 +1,99 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.getPostThreadV2",
"defs": {
"main": {
"type": "query",
"description": "(NOTE: this endpoint is under development and WILL change without notice. Don't use it until it is moved out of `unspecced` or your application WILL break) Get posts in a thread. It is based in an anchor post at any depth of the tree, and returns posts above it (recursively resolving the parent, without further branching to their replies) and below it (recursive replies, with branching to their replies). Does not require auth, but additional metadata and filtering will be applied for authed requests.",
"parameters": {
"type": "params",
"required": ["anchor"],
"properties": {
"anchor": {
"type": "string",
"format": "at-uri",
"description": "Reference (AT-URI) to post record. This is the anchor post, and the thread will be built around it. It can be any post in the tree, not necessarily a root post."
},
"above": {
"type": "boolean",
"description": "Whether to include parents above the anchor.",
"default": true
},
"below": {
"type": "integer",
"description": "How many levels of replies to include below the anchor.",
"default": 6,
"minimum": 0,
"maximum": 20
},
"branchingFactor": {
"type": "integer",
"description": "Maximum of replies to include at each level of the thread, except for the direct replies to the anchor, which are (NOTE: currently, during unspecced phase) all returned (NOTE: later they might be paginated).",
"default": 10,
"minimum": 0,
"maximum": 100
},
"prioritizeFollowedUsers": {
"type": "boolean",
"description": "Whether to prioritize posts from followed users. It only has effect when the user is authenticated.",
"default": false
},
"sort": {
"type": "string",
"description": "Sorting for the thread replies.",
"knownValues": ["newest", "oldest", "top"],
"default": "oldest"
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["thread", "hasOtherReplies"],
"properties": {
"thread": {
"type": "array",
"description": "A flat list of thread items. The depth of each item is indicated by the depth property inside the item.",
"items": {
"type": "ref",
"ref": "#threadItem"
}
},
"threadgate": {
"type": "ref",
"ref": "app.bsky.feed.defs#threadgateView"
},
"hasOtherReplies": {
"type": "boolean",
"description": "Whether this thread has additional replies. If true, a call can be made to the `getPostThreadOtherV2` endpoint to retrieve them."
}
}
}
}
},
"threadItem": {
"type": "object",
"required": ["uri", "depth", "value"],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"depth": {
"type": "integer",
"description": "The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths."
},
"value": {
"type": "union",
"refs": [
"app.bsky.unspecced.defs#threadItemPost",
"app.bsky.unspecced.defs#threadItemNoUnauthenticated",
"app.bsky.unspecced.defs#threadItemNotFound",
"app.bsky.unspecced.defs#threadItemBlocked"
]
}
}
}
}
}

View File

@ -0,0 +1,43 @@
{
"lexicon": 1,
"id": "app.bsky.unspecced.initAgeAssurance",
"defs": {
"main": {
"type": "procedure",
"description": "Initiate age assurance for an account. This is a one-time action that will start the process of verifying the user's age.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["email", "language", "countryCode"],
"properties": {
"email": {
"type": "string",
"description": "The user's email address to receive assurance instructions."
},
"language": {
"type": "string",
"description": "The user's preferred language for communication during the assurance process."
},
"countryCode": {
"type": "string",
"description": "An ISO 3166-1 alpha-2 code of the user's location."
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "app.bsky.unspecced.defs#ageAssuranceState"
}
},
"errors": [
{ "name": "InvalidEmail" },
{ "name": "DidTooLong" },
{ "name": "InvalidInitiation" }
]
}
}
}

View File

@ -25,7 +25,11 @@
}, },
"chatDisabled": { "chatDisabled": {
"type": "boolean", "type": "boolean",
"description": "Set to true when the actor cannot actively participate in converations" "description": "Set to true when the actor cannot actively participate in conversations"
},
"verification": {
"type": "ref",
"ref": "app.bsky.actor.defs#verificationState"
} }
} }
} }

View File

@ -28,6 +28,10 @@
"com.atproto.admin.defs#repoRef", "com.atproto.admin.defs#repoRef",
"com.atproto.repo.strongRef" "com.atproto.repo.strongRef"
] ]
},
"modTool": {
"type": "ref",
"ref": "#modTool"
} }
} }
} }
@ -66,6 +70,21 @@
} }
} }
} }
},
"modTool": {
"type": "object",
"description": "Moderation tool information for tracing the source of the action",
"required": ["name"],
"properties": {
"name": {
"type": "string",
"description": "Name/identifier of the source (e.g., 'bsky-app/android', 'bsky-web/chrome')"
},
"meta": {
"type": "unknown",
"description": "Additional arbitrary metadata about the source"
}
}
} }
} }
} }

View File

@ -11,36 +11,89 @@
"com.atproto.moderation.defs#reasonSexual", "com.atproto.moderation.defs#reasonSexual",
"com.atproto.moderation.defs#reasonRude", "com.atproto.moderation.defs#reasonRude",
"com.atproto.moderation.defs#reasonOther", "com.atproto.moderation.defs#reasonOther",
"com.atproto.moderation.defs#reasonAppeal" "com.atproto.moderation.defs#reasonAppeal",
"tools.ozone.report.defs#reasonAppeal",
"tools.ozone.report.defs#reasonViolenceAnimalWelfare",
"tools.ozone.report.defs#reasonViolenceThreats",
"tools.ozone.report.defs#reasonViolenceGraphicContent",
"tools.ozone.report.defs#reasonViolenceSelfHarm",
"tools.ozone.report.defs#reasonViolenceGlorification",
"tools.ozone.report.defs#reasonViolenceExtremistContent",
"tools.ozone.report.defs#reasonViolenceTrafficking",
"tools.ozone.report.defs#reasonViolenceOther",
"tools.ozone.report.defs#reasonSexualAbuseContent",
"tools.ozone.report.defs#reasonSexualNCII",
"tools.ozone.report.defs#reasonSexualSextortion",
"tools.ozone.report.defs#reasonSexualDeepfake",
"tools.ozone.report.defs#reasonSexualAnimal",
"tools.ozone.report.defs#reasonSexualUnlabeled",
"tools.ozone.report.defs#reasonSexualOther",
"tools.ozone.report.defs#reasonChildSafetyCSAM",
"tools.ozone.report.defs#reasonChildSafetyGroom",
"tools.ozone.report.defs#reasonChildSafetyMinorPrivacy",
"tools.ozone.report.defs#reasonChildSafetyEndangerment",
"tools.ozone.report.defs#reasonChildSafetyHarassment",
"tools.ozone.report.defs#reasonChildSafetyPromotion",
"tools.ozone.report.defs#reasonChildSafetyOther",
"tools.ozone.report.defs#reasonHarassmentTroll",
"tools.ozone.report.defs#reasonHarassmentTargeted",
"tools.ozone.report.defs#reasonHarassmentHateSpeech",
"tools.ozone.report.defs#reasonHarassmentDoxxing",
"tools.ozone.report.defs#reasonHarassmentOther",
"tools.ozone.report.defs#reasonMisleadingBot",
"tools.ozone.report.defs#reasonMisleadingImpersonation",
"tools.ozone.report.defs#reasonMisleadingSpam",
"tools.ozone.report.defs#reasonMisleadingScam",
"tools.ozone.report.defs#reasonMisleadingSyntheticContent",
"tools.ozone.report.defs#reasonMisleadingMisinformation",
"tools.ozone.report.defs#reasonMisleadingOther",
"tools.ozone.report.defs#reasonRuleSiteSecurity",
"tools.ozone.report.defs#reasonRuleStolenContent",
"tools.ozone.report.defs#reasonRuleProhibitedSales",
"tools.ozone.report.defs#reasonRuleBanEvasion",
"tools.ozone.report.defs#reasonRuleOther",
"tools.ozone.report.defs#reasonCivicElectoralProcess",
"tools.ozone.report.defs#reasonCivicDisclosure",
"tools.ozone.report.defs#reasonCivicInterference",
"tools.ozone.report.defs#reasonCivicMisinformation",
"tools.ozone.report.defs#reasonCivicImpersonation"
] ]
}, },
"reasonSpam": { "reasonSpam": {
"type": "token", "type": "token",
"description": "Spam: frequent unwanted promotion, replies, mentions" "description": "Spam: frequent unwanted promotion, replies, mentions. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingSpam`."
}, },
"reasonViolation": { "reasonViolation": {
"type": "token", "type": "token",
"description": "Direct violation of server rules, laws, terms of service" "description": "Direct violation of server rules, laws, terms of service. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`."
}, },
"reasonMisleading": { "reasonMisleading": {
"type": "token", "type": "token",
"description": "Misleading identity, affiliation, or content" "description": "Misleading identity, affiliation, or content. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingOther`."
}, },
"reasonSexual": { "reasonSexual": {
"type": "token", "type": "token",
"description": "Unwanted or mislabeled sexual content" "description": "Unwanted or mislabeled sexual content. Prefer new lexicon definition `tools.ozone.report.defs#reasonSexualUnlabeled`."
}, },
"reasonRude": { "reasonRude": {
"type": "token", "type": "token",
"description": "Rude, harassing, explicit, or otherwise unwelcoming behavior" "description": "Rude, harassing, explicit, or otherwise unwelcoming behavior. Prefer new lexicon definition `tools.ozone.report.defs#reasonHarassmentOther`."
}, },
"reasonOther": { "reasonOther": {
"type": "token", "type": "token",
"description": "Other: reports not falling under another report category" "description": "Reports not falling under another report category. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`."
}, },
"reasonAppeal": { "reasonAppeal": {
"type": "token", "type": "token",
"description": "Appeal: appeal a previously taken moderation action" "description": "Appeal a previously taken moderation action"
}, },
"subjectType": { "subjectType": {
"type": "string", "type": "string",

View File

@ -0,0 +1,88 @@
{
"lexicon": 1,
"id": "com.atproto.temp.checkHandleAvailability",
"defs": {
"main": {
"type": "query",
"description": "Checks whether the provided handle is available. If the handle is not available, available suggestions will be returned. Optional inputs will be used to generate suggestions.",
"parameters": {
"type": "params",
"required": ["handle"],
"properties": {
"handle": {
"type": "string",
"format": "handle",
"description": "Tentative handle. Will be checked for availability or used to build handle suggestions."
},
"email": {
"type": "string",
"description": "User-provided email. Might be used to build handle suggestions."
},
"birthDate": {
"type": "string",
"format": "datetime",
"description": "User-provided birth date. Might be used to build handle suggestions."
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["handle", "result"],
"properties": {
"handle": {
"type": "string",
"format": "handle",
"description": "Echo of the input handle."
},
"result": {
"type": "union",
"refs": ["#resultAvailable", "#resultUnavailable"]
}
}
}
},
"errors": [
{
"name": "InvalidEmail",
"description": "An invalid email was provided."
}
]
},
"resultAvailable": {
"type": "object",
"description": "Indicates the provided handle is available.",
"properties": {}
},
"resultUnavailable": {
"type": "object",
"description": "Indicates the provided handle is unavailable and gives suggestions of available handles.",
"required": ["suggestions"],
"properties": {
"suggestions": {
"type": "array",
"description": "List of suggested handles based on the provided inputs.",
"items": {
"type": "ref",
"ref": "#suggestion"
}
}
}
},
"suggestion": {
"type": "object",
"required": ["handle", "method"],
"properties": {
"handle": {
"type": "string",
"format": "handle"
},
"method": {
"type": "string",
"description": "Method used to build this suggestion. Should be considered opaque to clients. Can be used for metrics."
}
}
}
}
}

View File

@ -0,0 +1,39 @@
{
"lexicon": 1,
"id": "com.atproto.temp.dereferenceScope",
"defs": {
"main": {
"type": "query",
"description": "Allows finding the oauth permission scope from a reference",
"parameters": {
"type": "params",
"required": ["scope"],
"properties": {
"scope": {
"type": "string",
"description": "The scope reference (starts with 'ref:')"
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["scope"],
"properties": {
"scope": {
"type": "string",
"description": "The full oauth permission scope"
}
}
}
},
"errors": [
{
"name": "InvalidScopeReference",
"description": "An invalid scope reference was provided."
}
]
}
}
}

View File

@ -0,0 +1,23 @@
{
"lexicon": 1,
"id": "com.atproto.temp.revokeAccountCredentials",
"defs": {
"main": {
"type": "procedure",
"description": "Revoke sessions, password, and app passwords associated with account. May be resolved by a password reset.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["account"],
"properties": {
"account": {
"type": "string",
"format": "at-identifier"
}
}
}
}
}
}
}

View File

@ -0,0 +1,106 @@
{
"lexicon": 1,
"id": "tools.ozone.hosting.getAccountHistory",
"defs": {
"main": {
"type": "query",
"description": "Get account history, e.g. log of updated email addresses or other identity information.",
"parameters": {
"type": "params",
"required": ["did"],
"properties": {
"did": { "type": "string", "format": "did" },
"events": {
"type": "array",
"items": {
"type": "string",
"knownValues": [
"accountCreated",
"emailUpdated",
"emailConfirmed",
"passwordUpdated",
"handleUpdated"
]
}
},
"cursor": { "type": "string" },
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["events"],
"properties": {
"cursor": { "type": "string" },
"events": {
"type": "array",
"items": {
"type": "ref",
"ref": "#event"
}
}
}
}
}
},
"event": {
"type": "object",
"required": ["details", "createdBy", "createdAt"],
"properties": {
"details": {
"type": "union",
"refs": [
"#accountCreated",
"#emailUpdated",
"#emailConfirmed",
"#passwordUpdated",
"#handleUpdated"
]
},
"createdBy": { "type": "string" },
"createdAt": { "type": "string", "format": "datetime" }
}
},
"accountCreated": {
"type": "object",
"required": [],
"properties": {
"email": { "type": "string" },
"handle": { "type": "string", "format": "handle" }
}
},
"emailUpdated": {
"type": "object",
"required": ["email"],
"properties": {
"email": { "type": "string" }
}
},
"emailConfirmed": {
"type": "object",
"required": ["email"],
"properties": {
"email": { "type": "string" }
}
},
"passwordUpdated": {
"type": "object",
"required": [],
"properties": {}
},
"handleUpdated": {
"type": "object",
"required": ["handle"],
"properties": {
"handle": { "type": "string", "format": "handle" }
}
}
}
}

View File

@ -35,7 +35,10 @@
"#accountEvent", "#accountEvent",
"#identityEvent", "#identityEvent",
"#recordEvent", "#recordEvent",
"#modEventPriorityScore" "#modEventPriorityScore",
"#ageAssuranceEvent",
"#ageAssuranceOverrideEvent",
"#revokeAccountCredentialsEvent"
] ]
}, },
"subject": { "subject": {
@ -50,7 +53,8 @@
"createdBy": { "type": "string", "format": "did" }, "createdBy": { "type": "string", "format": "did" },
"createdAt": { "type": "string", "format": "datetime" }, "createdAt": { "type": "string", "format": "datetime" },
"creatorHandle": { "type": "string" }, "creatorHandle": { "type": "string" },
"subjectHandle": { "type": "string" } "subjectHandle": { "type": "string" },
"modTool": { "type": "ref", "ref": "#modTool" }
} }
}, },
"modEventViewDetail": { "modEventViewDetail": {
@ -86,7 +90,10 @@
"#accountEvent", "#accountEvent",
"#identityEvent", "#identityEvent",
"#recordEvent", "#recordEvent",
"#modEventPriorityScore" "#modEventPriorityScore",
"#ageAssuranceEvent",
"#ageAssuranceOverrideEvent",
"#revokeAccountCredentialsEvent"
] ]
}, },
"subject": { "subject": {
@ -103,7 +110,8 @@
"items": { "type": "ref", "ref": "#blobView" } "items": { "type": "ref", "ref": "#blobView" }
}, },
"createdBy": { "type": "string", "format": "did" }, "createdBy": { "type": "string", "format": "did" },
"createdAt": { "type": "string", "format": "datetime" } "createdAt": { "type": "string", "format": "datetime" },
"modTool": { "type": "ref", "ref": "#modTool" }
} }
}, },
"subjectStatusView": { "subjectStatusView": {
@ -115,7 +123,8 @@
"type": "union", "type": "union",
"refs": [ "refs": [
"com.atproto.admin.defs#repoRef", "com.atproto.admin.defs#repoRef",
"com.atproto.repo.strongRef" "com.atproto.repo.strongRef",
"chat.bsky.convo.defs#messageRef"
] ]
}, },
"hosting": { "hosting": {
@ -200,6 +209,16 @@
"description": "Statistics related to the record subjects authored by the subject's account", "description": "Statistics related to the record subjects authored by the subject's account",
"type": "ref", "type": "ref",
"ref": "#recordsStats" "ref": "#recordsStats"
},
"ageAssuranceState": {
"type": "string",
"description": "Current age assurance state of the subject.",
"knownValues": ["pending", "assured", "unknown", "reset", "blocked"]
},
"ageAssuranceUpdatedBy": {
"type": "string",
"description": "Whether or not the last successful update to age assurance was made by the user or admin.",
"knownValues": ["admin", "user"]
} }
} }
}, },
@ -433,6 +452,70 @@
} }
} }
}, },
"ageAssuranceEvent": {
"type": "object",
"description": "Age assurance info coming directly from users. Only works on DID subjects.",
"required": ["createdAt", "status", "attemptId"],
"properties": {
"createdAt": {
"type": "string",
"format": "datetime",
"description": "The date and time of this write operation."
},
"status": {
"type": "string",
"description": "The status of the age assurance process.",
"knownValues": ["unknown", "pending", "assured"]
},
"attemptId": {
"type": "string",
"description": "The unique identifier for this instance of the age assurance flow, in UUID format."
},
"initIp": {
"type": "string",
"description": "The IP address used when initiating the AA flow."
},
"initUa": {
"type": "string",
"description": "The user agent used when initiating the AA flow."
},
"completeIp": {
"type": "string",
"description": "The IP address used when completing the AA flow."
},
"completeUa": {
"type": "string",
"description": "The user agent used when completing the AA flow."
}
}
},
"ageAssuranceOverrideEvent": {
"type": "object",
"description": "Age assurance status override by moderators. Only works on DID subjects.",
"required": ["comment", "status"],
"properties": {
"status": {
"type": "string",
"description": "The status to be set for the user decided by a moderator, overriding whatever value the user had previously. Use reset to default to original state.",
"knownValues": ["assured", "reset", "blocked"]
},
"comment": {
"type": "string",
"description": "Comment describing the reason for the override."
}
}
},
"revokeAccountCredentialsEvent": {
"type": "object",
"description": "Account credentials revocation by moderators. Only works on DID subjects.",
"required": ["comment"],
"properties": {
"comment": {
"type": "string",
"description": "Comment describing the reason for the revocation."
}
}
},
"modEventAcknowledge": { "modEventAcknowledge": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -893,6 +976,33 @@
"description": "The total number of records labeled as a result of the user's reports." "description": "The total number of records labeled as a result of the user's reports."
} }
} }
},
"modTool": {
"type": "object",
"description": "Moderation tool information for tracing the source of the action",
"required": ["name"],
"properties": {
"name": {
"type": "string",
"description": "Name/identifier of the source (e.g., 'automod', 'ozone/workspace')"
},
"meta": {
"type": "unknown",
"description": "Additional arbitrary metadata about the source"
}
}
},
"timelineEventPlcCreate": {
"type": "token",
"description": "Moderation event timeline event for a PLC create operation"
},
"timelineEventPlcOperation": {
"type": "token",
"description": "Moderation event timeline event for generic PLC operation"
},
"timelineEventPlcTombstone": {
"type": "token",
"description": "Moderation event timeline event for a PLC tombstone operation"
} }
} }
} }

View File

@ -32,7 +32,10 @@
"tools.ozone.moderation.defs#accountEvent", "tools.ozone.moderation.defs#accountEvent",
"tools.ozone.moderation.defs#identityEvent", "tools.ozone.moderation.defs#identityEvent",
"tools.ozone.moderation.defs#recordEvent", "tools.ozone.moderation.defs#recordEvent",
"tools.ozone.moderation.defs#modEventPriorityScore" "tools.ozone.moderation.defs#modEventPriorityScore",
"tools.ozone.moderation.defs#ageAssuranceEvent",
"tools.ozone.moderation.defs#ageAssuranceOverrideEvent",
"tools.ozone.moderation.defs#revokeAccountCredentialsEvent"
] ]
}, },
"subject": { "subject": {
@ -44,9 +47,23 @@
}, },
"subjectBlobCids": { "subjectBlobCids": {
"type": "array", "type": "array",
"items": { "type": "string", "format": "cid" } "items": {
"type": "string",
"format": "cid"
}
}, },
"createdBy": { "type": "string", "format": "did" } "createdBy": {
"type": "string",
"format": "did"
},
"modTool": {
"type": "ref",
"ref": "tools.ozone.moderation.defs#modTool"
},
"externalId": {
"type": "string",
"description": "An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject."
}
} }
} }
}, },
@ -57,7 +74,15 @@
"ref": "tools.ozone.moderation.defs#modEventView" "ref": "tools.ozone.moderation.defs#modEventView"
} }
}, },
"errors": [{ "name": "SubjectHasAction" }] "errors": [
{
"name": "SubjectHasAction"
},
{
"name": "DuplicateExternalId",
"description": "An event with the same external ID already exists for the subject."
}
]
} }
} }
} }

View File

@ -0,0 +1,104 @@
{
"lexicon": 1,
"id": "tools.ozone.moderation.getAccountTimeline",
"defs": {
"main": {
"type": "query",
"description": "Get timeline of all available events of an account. This includes moderation events, account history and did history.",
"parameters": {
"type": "params",
"required": ["did"],
"properties": {
"did": {
"type": "string",
"format": "did"
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["timeline"],
"properties": {
"timeline": {
"type": "array",
"items": {
"type": "ref",
"ref": "#timelineItem"
}
}
}
}
},
"errors": [
{
"name": "RepoNotFound"
}
]
},
"timelineItem": {
"type": "object",
"required": ["day", "summary"],
"properties": {
"day": {
"type": "string"
},
"summary": {
"type": "array",
"items": {
"type": "ref",
"ref": "#timelineItemSummary"
}
}
}
},
"timelineItemSummary": {
"type": "object",
"required": ["eventSubjectType", "eventType", "count"],
"properties": {
"eventSubjectType": {
"type": "string",
"knownValues": ["account", "record", "chat"]
},
"eventType": {
"type": "string",
"knownValues": [
"tools.ozone.moderation.defs#modEventTakedown",
"tools.ozone.moderation.defs#modEventReverseTakedown",
"tools.ozone.moderation.defs#modEventComment",
"tools.ozone.moderation.defs#modEventReport",
"tools.ozone.moderation.defs#modEventLabel",
"tools.ozone.moderation.defs#modEventAcknowledge",
"tools.ozone.moderation.defs#modEventEscalate",
"tools.ozone.moderation.defs#modEventMute",
"tools.ozone.moderation.defs#modEventUnmute",
"tools.ozone.moderation.defs#modEventMuteReporter",
"tools.ozone.moderation.defs#modEventUnmuteReporter",
"tools.ozone.moderation.defs#modEventEmail",
"tools.ozone.moderation.defs#modEventResolveAppeal",
"tools.ozone.moderation.defs#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#modEventPriorityScore",
"tools.ozone.moderation.defs#revokeAccountCredentialsEvent",
"tools.ozone.moderation.defs#ageAssuranceEvent",
"tools.ozone.moderation.defs#ageAssuranceOverrideEvent",
"tools.ozone.moderation.defs#timelineEventPlcCreate",
"tools.ozone.moderation.defs#timelineEventPlcOperation",
"tools.ozone.moderation.defs#timelineEventPlcTombstone",
"tools.ozone.hosting.getAccountHistory#accountCreated",
"tools.ozone.hosting.getAccountHistory#emailConfirmed",
"tools.ozone.hosting.getAccountHistory#passwordUpdated",
"tools.ozone.hosting.getAccountHistory#handleUpdated"
]
},
"count": {
"type": "integer"
}
}
}
}
}

View File

@ -113,6 +113,22 @@
"description": "If specified, only events where the action policies match any of the given policies are returned" "description": "If specified, only events where the action policies match any of the given policies are returned"
} }
}, },
"modTool": {
"type": "array",
"items": {
"type": "string"
},
"description": "If specified, only events where the modTool name matches any of the given values are returned"
},
"batchId": {
"type": "string",
"description": "If specified, only events where the batchId matches the given value are returned"
},
"ageAssuranceState": {
"type": "string",
"description": "If specified, only events where the age assurance state matches the given value are returned",
"knownValues": ["pending", "assured", "unknown", "reset", "blocked"]
},
"cursor": { "cursor": {
"type": "string" "type": "string"
} }

View File

@ -182,6 +182,11 @@
"maximum": 100, "maximum": 100,
"type": "integer", "type": "integer",
"description": "If specified, only subjects that have priority score value above the given value will be returned." "description": "If specified, only subjects that have priority score value above the given value will be returned."
},
"ageAssuranceState": {
"type": "string",
"description": "If specified, only subjects with the given age assurance state will be returned.",
"knownValues": ["pending", "assured", "unknown", "reset", "blocked"]
} }
} }
}, },

View File

@ -0,0 +1,249 @@
{
"lexicon": 1,
"id": "tools.ozone.report.defs",
"defs": {
"reasonType": {
"type": "string",
"knownValues": [
"tools.ozone.report.defs#reasonAppeal",
"tools.ozone.report.defs#reasonViolenceAnimalWelfare",
"tools.ozone.report.defs#reasonViolenceThreats",
"tools.ozone.report.defs#reasonViolenceGraphicContent",
"tools.ozone.report.defs#reasonViolenceSelfHarm",
"tools.ozone.report.defs#reasonViolenceGlorification",
"tools.ozone.report.defs#reasonViolenceExtremistContent",
"tools.ozone.report.defs#reasonViolenceTrafficking",
"tools.ozone.report.defs#reasonViolenceOther",
"tools.ozone.report.defs#reasonSexualAbuseContent",
"tools.ozone.report.defs#reasonSexualNCII",
"tools.ozone.report.defs#reasonSexualSextortion",
"tools.ozone.report.defs#reasonSexualDeepfake",
"tools.ozone.report.defs#reasonSexualAnimal",
"tools.ozone.report.defs#reasonSexualUnlabeled",
"tools.ozone.report.defs#reasonSexualOther",
"tools.ozone.report.defs#reasonChildSafetyCSAM",
"tools.ozone.report.defs#reasonChildSafetyGroom",
"tools.ozone.report.defs#reasonChildSafetyMinorPrivacy",
"tools.ozone.report.defs#reasonChildSafetyEndangerment",
"tools.ozone.report.defs#reasonChildSafetyHarassment",
"tools.ozone.report.defs#reasonChildSafetyPromotion",
"tools.ozone.report.defs#reasonChildSafetyOther",
"tools.ozone.report.defs#reasonHarassmentTroll",
"tools.ozone.report.defs#reasonHarassmentTargeted",
"tools.ozone.report.defs#reasonHarassmentHateSpeech",
"tools.ozone.report.defs#reasonHarassmentDoxxing",
"tools.ozone.report.defs#reasonHarassmentOther",
"tools.ozone.report.defs#reasonMisleadingBot",
"tools.ozone.report.defs#reasonMisleadingImpersonation",
"tools.ozone.report.defs#reasonMisleadingSpam",
"tools.ozone.report.defs#reasonMisleadingScam",
"tools.ozone.report.defs#reasonMisleadingSyntheticContent",
"tools.ozone.report.defs#reasonMisleadingMisinformation",
"tools.ozone.report.defs#reasonMisleadingOther",
"tools.ozone.report.defs#reasonRuleSiteSecurity",
"tools.ozone.report.defs#reasonRuleStolenContent",
"tools.ozone.report.defs#reasonRuleProhibitedSales",
"tools.ozone.report.defs#reasonRuleBanEvasion",
"tools.ozone.report.defs#reasonRuleOther",
"tools.ozone.report.defs#reasonCivicElectoralProcess",
"tools.ozone.report.defs#reasonCivicDisclosure",
"tools.ozone.report.defs#reasonCivicInterference",
"tools.ozone.report.defs#reasonCivicMisinformation",
"tools.ozone.report.defs#reasonCivicImpersonation"
]
},
"reasonAppeal": {
"type": "token",
"description": "Appeal a previously taken moderation action"
},
"reasonViolenceAnimalWelfare": {
"type": "token",
"description": "Animal welfare violations"
},
"reasonViolenceThreats": {
"type": "token",
"description": "Threats or incitement"
},
"reasonViolenceGraphicContent": {
"type": "token",
"description": "Graphic violent content"
},
"reasonViolenceSelfHarm": {
"type": "token",
"description": "Self harm"
},
"reasonViolenceGlorification": {
"type": "token",
"description": "Glorification of violence"
},
"reasonViolenceExtremistContent": {
"type": "token",
"description": "Extremist content. These reports will be sent only be sent to the application's Moderation Authority."
},
"reasonViolenceTrafficking": {
"type": "token",
"description": "Human trafficking"
},
"reasonViolenceOther": {
"type": "token",
"description": "Other violent content"
},
"reasonSexualAbuseContent": {
"type": "token",
"description": "Adult sexual abuse content"
},
"reasonSexualNCII": {
"type": "token",
"description": "Non-consensual intimate imagery"
},
"reasonSexualSextortion": {
"type": "token",
"description": "Sextortion"
},
"reasonSexualDeepfake": {
"type": "token",
"description": "Deepfake adult content"
},
"reasonSexualAnimal": {
"type": "token",
"description": "Animal sexual abuse"
},
"reasonSexualUnlabeled": {
"type": "token",
"description": "Unlabelled adult content"
},
"reasonSexualOther": {
"type": "token",
"description": "Other sexual violence content"
},
"reasonChildSafetyCSAM": {
"type": "token",
"description": "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority."
},
"reasonChildSafetyGroom": {
"type": "token",
"description": "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority."
},
"reasonChildSafetyMinorPrivacy": {
"type": "token",
"description": "Privacy violation involving a minor"
},
"reasonChildSafetyEndangerment": {
"type": "token",
"description": "Child endangerment. These reports will be sent only be sent to the application's Moderation Authority."
},
"reasonChildSafetyHarassment": {
"type": "token",
"description": "Harassment or bullying of minors"
},
"reasonChildSafetyPromotion": {
"type": "token",
"description": "Promotion of child exploitation. These reports will be sent only be sent to the application's Moderation Authority."
},
"reasonChildSafetyOther": {
"type": "token",
"description": "Other child safety. These reports will be sent only be sent to the application's Moderation Authority."
},
"reasonHarassmentTroll": {
"type": "token",
"description": "Trolling"
},
"reasonHarassmentTargeted": {
"type": "token",
"description": "Targeted harassment"
},
"reasonHarassmentHateSpeech": {
"type": "token",
"description": "Hate speech"
},
"reasonHarassmentDoxxing": {
"type": "token",
"description": "Doxxing"
},
"reasonHarassmentOther": {
"type": "token",
"description": "Other harassing or hateful content"
},
"reasonMisleadingBot": {
"type": "token",
"description": "Fake account or bot"
},
"reasonMisleadingImpersonation": {
"type": "token",
"description": "Impersonation"
},
"reasonMisleadingSpam": {
"type": "token",
"description": "Spam"
},
"reasonMisleadingScam": {
"type": "token",
"description": "Scam"
},
"reasonMisleadingSyntheticContent": {
"type": "token",
"description": "Unlabelled gen-AI or synthetic content"
},
"reasonMisleadingMisinformation": {
"type": "token",
"description": "Harmful false claims"
},
"reasonMisleadingOther": {
"type": "token",
"description": "Other misleading content"
},
"reasonRuleSiteSecurity": {
"type": "token",
"description": "Hacking or system attacks"
},
"reasonRuleStolenContent": {
"type": "token",
"description": "Stolen content"
},
"reasonRuleProhibitedSales": {
"type": "token",
"description": "Promoting or selling prohibited items or services"
},
"reasonRuleBanEvasion": {
"type": "token",
"description": "Banned user returning"
},
"reasonRuleOther": {
"type": "token",
"description": "Other"
},
"reasonCivicElectoralProcess": {
"type": "token",
"description": "Electoral process violations"
},
"reasonCivicDisclosure": {
"type": "token",
"description": "Disclosure & transparency violations"
},
"reasonCivicInterference": {
"type": "token",
"description": "Voter intimidation or interference"
},
"reasonCivicMisinformation": {
"type": "token",
"description": "Election misinformation"
},
"reasonCivicImpersonation": {
"type": "token",
"description": "Impersonation of electoral officials/entities"
}
}
}

View File

@ -0,0 +1,61 @@
{
"lexicon": 1,
"id": "tools.ozone.safelink.addRule",
"defs": {
"main": {
"type": "procedure",
"description": "Add a new URL safety rule",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["url", "pattern", "action", "reason"],
"properties": {
"url": {
"type": "string",
"description": "The URL or domain to apply the rule to"
},
"pattern": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#patternType"
},
"action": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#actionType"
},
"reason": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#reasonType"
},
"comment": {
"type": "string",
"description": "Optional comment about the decision"
},
"createdBy": {
"type": "string",
"format": "did",
"description": "Author DID. Only respected when using admin auth"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#event"
}
},
"errors": [
{
"name": "InvalidUrl",
"description": "The provided URL is invalid"
},
{
"name": "RuleAlreadyExists",
"description": "A rule for this URL/domain already exists"
}
]
}
}
}

View File

@ -0,0 +1,125 @@
{
"lexicon": 1,
"id": "tools.ozone.safelink.defs",
"defs": {
"event": {
"type": "object",
"description": "An event for URL safety decisions",
"required": [
"id",
"eventType",
"url",
"pattern",
"action",
"reason",
"createdBy",
"createdAt"
],
"properties": {
"id": {
"type": "integer",
"description": "Auto-incrementing row ID"
},
"eventType": {
"type": "ref",
"ref": "#eventType"
},
"url": {
"type": "string",
"description": "The URL that this rule applies to"
},
"pattern": {
"type": "ref",
"ref": "#patternType"
},
"action": {
"type": "ref",
"ref": "#actionType"
},
"reason": {
"type": "ref",
"ref": "#reasonType"
},
"createdBy": {
"type": "string",
"format": "did",
"description": "DID of the user who created this rule"
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"comment": {
"type": "string",
"description": "Optional comment about the decision"
}
}
},
"eventType": {
"type": "string",
"knownValues": ["addRule", "updateRule", "removeRule"]
},
"patternType": {
"type": "string",
"knownValues": ["domain", "url"]
},
"actionType": {
"type": "string",
"knownValues": ["block", "warn", "whitelist"]
},
"reasonType": {
"type": "string",
"knownValues": ["csam", "spam", "phishing", "none"]
},
"urlRule": {
"type": "object",
"description": "Input for creating a URL safety rule",
"required": [
"url",
"pattern",
"action",
"reason",
"createdBy",
"createdAt",
"updatedAt"
],
"properties": {
"url": {
"type": "string",
"description": "The URL or domain to apply the rule to"
},
"pattern": {
"type": "ref",
"ref": "#patternType"
},
"action": {
"type": "ref",
"ref": "#actionType"
},
"reason": {
"type": "ref",
"ref": "#reasonType"
},
"comment": {
"type": "string",
"description": "Optional comment about the decision"
},
"createdBy": {
"type": "string",
"format": "did",
"description": "DID of the user added the rule."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp when the rule was created"
},
"updatedAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp when the rule was last updated"
}
}
}
}
}

View File

@ -0,0 +1,66 @@
{
"lexicon": 1,
"id": "tools.ozone.safelink.queryEvents",
"defs": {
"main": {
"type": "procedure",
"description": "Query URL safety audit events",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"description": "Cursor for pagination"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum number of results to return"
},
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by specific URLs or domains"
},
"patternType": {
"type": "string",
"description": "Filter by pattern type"
},
"sortDirection": {
"type": "string",
"knownValues": ["asc", "desc"],
"default": "desc",
"description": "Sort direction"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["events"],
"properties": {
"cursor": {
"type": "string",
"description": "Next cursor for pagination. Only present if there are more results."
},
"events": {
"type": "array",
"items": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#event"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,82 @@
{
"lexicon": 1,
"id": "tools.ozone.safelink.queryRules",
"defs": {
"main": {
"type": "procedure",
"description": "Query URL safety rules",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"properties": {
"cursor": {
"type": "string",
"description": "Cursor for pagination"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum number of results to return"
},
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by specific URLs or domains"
},
"patternType": {
"type": "string",
"description": "Filter by pattern type"
},
"actions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by action types"
},
"reason": {
"type": "string",
"description": "Filter by reason type"
},
"createdBy": {
"type": "string",
"format": "did",
"description": "Filter by rule creator"
},
"sortDirection": {
"type": "string",
"knownValues": ["asc", "desc"],
"default": "desc",
"description": "Sort direction"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["rules"],
"properties": {
"cursor": {
"type": "string",
"description": "Next cursor for pagination. Only present if there are more results."
},
"rules": {
"type": "array",
"items": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#urlRule"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,49 @@
{
"lexicon": 1,
"id": "tools.ozone.safelink.removeRule",
"defs": {
"main": {
"type": "procedure",
"description": "Remove an existing URL safety rule",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["url", "pattern"],
"properties": {
"url": {
"type": "string",
"description": "The URL or domain to remove the rule for"
},
"pattern": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#patternType"
},
"comment": {
"type": "string",
"description": "Optional comment about why the rule is being removed"
},
"createdBy": {
"type": "string",
"format": "did",
"description": "Optional DID of the user. Only respected when using admin auth."
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#event"
}
},
"errors": [
{
"name": "RuleNotFound",
"description": "No active rule found for this URL/domain"
}
]
}
}
}

View File

@ -0,0 +1,57 @@
{
"lexicon": 1,
"id": "tools.ozone.safelink.updateRule",
"defs": {
"main": {
"type": "procedure",
"description": "Update an existing URL safety rule",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["url", "pattern", "action", "reason"],
"properties": {
"url": {
"type": "string",
"description": "The URL or domain to update the rule for"
},
"pattern": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#patternType"
},
"action": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#actionType"
},
"reason": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#reasonType"
},
"comment": {
"type": "string",
"description": "Optional comment about the update"
},
"createdBy": {
"type": "string",
"format": "did",
"description": "Optional DID to credit as the creator. Only respected for admin_token authentication."
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "ref",
"ref": "tools.ozone.safelink.defs#event"
}
},
"errors": [
{
"name": "RuleNotFound",
"description": "No active rule found for this URL/domain"
}
]
}
}
}

View File

@ -29,6 +29,11 @@
"viewer": { "viewer": {
"type": "ref", "type": "ref",
"ref": "#viewerConfig" "ref": "#viewerConfig"
},
"verifierDid": {
"type": "string",
"format": "did",
"description": "The did of the verifier used for verification."
} }
} }
} }
@ -51,7 +56,8 @@
"knownValues": [ "knownValues": [
"tools.ozone.team.defs#roleAdmin", "tools.ozone.team.defs#roleAdmin",
"tools.ozone.team.defs#roleModerator", "tools.ozone.team.defs#roleModerator",
"tools.ozone.team.defs#roleTriage" "tools.ozone.team.defs#roleTriage",
"tools.ozone.team.defs#roleVerifier"
] ]
} }
} }

View File

@ -42,7 +42,8 @@
"knownValues": [ "knownValues": [
"tools.ozone.team.defs#roleModerator", "tools.ozone.team.defs#roleModerator",
"tools.ozone.team.defs#roleTriage", "tools.ozone.team.defs#roleTriage",
"tools.ozone.team.defs#roleAdmin" "tools.ozone.team.defs#roleAdmin",
"tools.ozone.team.defs#roleVerifier"
] ]
}, },
"scope": { "scope": {

View File

@ -31,6 +31,7 @@
"knownValues": [ "knownValues": [
"tools.ozone.team.defs#roleModerator", "tools.ozone.team.defs#roleModerator",
"tools.ozone.team.defs#roleTriage", "tools.ozone.team.defs#roleTriage",
"tools.ozone.team.defs#roleVerifier",
"tools.ozone.team.defs#roleAdmin" "tools.ozone.team.defs#roleAdmin"
] ]
} }

View File

@ -17,6 +17,7 @@
"knownValues": [ "knownValues": [
"tools.ozone.team.defs#roleAdmin", "tools.ozone.team.defs#roleAdmin",
"tools.ozone.team.defs#roleModerator", "tools.ozone.team.defs#roleModerator",
"tools.ozone.team.defs#roleVerifier",
"tools.ozone.team.defs#roleTriage" "tools.ozone.team.defs#roleTriage"
] ]
} }

View File

@ -17,7 +17,12 @@
"lastUpdatedBy": { "type": "string" }, "lastUpdatedBy": { "type": "string" },
"role": { "role": {
"type": "string", "type": "string",
"knownValues": ["#roleAdmin", "#roleModerator", "#roleTriage"] "knownValues": [
"#roleAdmin",
"#roleModerator",
"#roleTriage",
"#roleVerifier"
]
} }
} }
}, },
@ -32,6 +37,10 @@
"roleTriage": { "roleTriage": {
"type": "token", "type": "token",
"description": "Triage role. Mostly intended for monitoring and escalating issues." "description": "Triage role. Mostly intended for monitoring and escalating issues."
},
"roleVerifier": {
"type": "token",
"description": "Verifier role. Only allowed to issue verifications."
} }
} }
} }

View File

@ -18,6 +18,7 @@
"knownValues": [ "knownValues": [
"tools.ozone.team.defs#roleAdmin", "tools.ozone.team.defs#roleAdmin",
"tools.ozone.team.defs#roleModerator", "tools.ozone.team.defs#roleModerator",
"tools.ozone.team.defs#roleVerifier",
"tools.ozone.team.defs#roleTriage" "tools.ozone.team.defs#roleTriage"
] ]
} }

View File

@ -0,0 +1,85 @@
{
"lexicon": 1,
"id": "tools.ozone.verification.defs",
"defs": {
"verificationView": {
"type": "object",
"description": "Verification data for the associated subject.",
"required": [
"issuer",
"uri",
"subject",
"handle",
"displayName",
"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"
},
"subject": {
"type": "string",
"format": "did",
"description": "The subject of the verification."
},
"handle": {
"type": "string",
"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.",
"format": "handle"
},
"displayName": {
"type": "string",
"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."
},
"createdAt": {
"type": "string",
"description": "Timestamp when the verification was created.",
"format": "datetime"
},
"revokeReason": {
"type": "string",
"description": "Describes the reason for revocation, also indicating that the verification is no longer valid."
},
"revokedAt": {
"type": "string",
"description": "Timestamp when the verification was revoked.",
"format": "datetime"
},
"revokedBy": {
"type": "string",
"description": "The user who revoked this verification.",
"format": "did"
},
"subjectProfile": {
"type": "union",
"refs": []
},
"issuerProfile": {
"type": "union",
"refs": []
},
"subjectRepo": {
"type": "union",
"refs": [
"tools.ozone.moderation.defs#repoViewDetail",
"tools.ozone.moderation.defs#repoViewNotFound"
]
},
"issuerRepo": {
"type": "union",
"refs": [
"tools.ozone.moderation.defs#repoViewDetail",
"tools.ozone.moderation.defs#repoViewNotFound"
]
}
}
}
}
}

View File

@ -0,0 +1,92 @@
{
"lexicon": 1,
"id": "tools.ozone.verification.grantVerifications",
"defs": {
"main": {
"type": "procedure",
"description": "Grant verifications to multiple subjects. Allows batch processing of up to 100 verifications at once.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["verifications"],
"properties": {
"verifications": {
"type": "array",
"description": "Array of verification requests to process",
"maxLength": 100,
"items": {
"type": "ref",
"ref": "#verificationInput"
}
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["verifications", "failedVerifications"],
"properties": {
"verifications": {
"type": "array",
"items": {
"type": "ref",
"ref": "tools.ozone.verification.defs#verificationView"
}
},
"failedVerifications": {
"type": "array",
"items": {
"type": "ref",
"ref": "#grantError"
}
}
}
}
}
},
"verificationInput": {
"type": "object",
"required": ["subject", "handle", "displayName"],
"properties": {
"subject": {
"type": "string",
"description": "The did of the subject being verified",
"format": "did"
},
"handle": {
"type": "string",
"description": "Handle of the subject the verification applies to at the moment of verifying.",
"format": "handle"
},
"displayName": {
"type": "string",
"description": "Display name of the subject the verification applies to at the moment of verifying."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp for verification record. Defaults to current time when not specified."
}
}
},
"grantError": {
"type": "object",
"description": "Error object for failed verifications.",
"required": ["error", "subject"],
"properties": {
"error": {
"type": "string",
"description": "Error message describing the reason for failure."
},
"subject": {
"type": "string",
"description": "The did of the subject being verified",
"format": "did"
}
}
}
}
}

View File

@ -0,0 +1,83 @@
{
"lexicon": 1,
"id": "tools.ozone.verification.listVerifications",
"defs": {
"main": {
"type": "query",
"description": "List verifications",
"parameters": {
"type": "params",
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor"
},
"limit": {
"type": "integer",
"description": "Maximum number of results to return",
"minimum": 1,
"maximum": 100,
"default": 50
},
"createdAfter": {
"type": "string",
"format": "datetime",
"description": "Filter to verifications created after this timestamp"
},
"createdBefore": {
"type": "string",
"format": "datetime",
"description": "Filter to verifications created before this timestamp"
},
"issuers": {
"type": "array",
"maxLength": 100,
"description": "Filter to verifications from specific issuers",
"items": {
"type": "string",
"format": "did"
}
},
"subjects": {
"type": "array",
"description": "Filter to specific verified DIDs",
"maxLength": 100,
"items": {
"type": "string",
"format": "did"
}
},
"sortDirection": {
"type": "string",
"description": "Sort direction for creation date",
"enum": ["asc", "desc"],
"default": "desc"
},
"isRevoked": {
"type": "boolean",
"description": "Filter to verifications that are revoked or not. By default, includes both."
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["verifications"],
"properties": {
"cursor": {
"type": "string"
},
"verifications": {
"type": "array",
"items": {
"type": "ref",
"ref": "tools.ozone.verification.defs#verificationView"
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,75 @@
{
"lexicon": 1,
"id": "tools.ozone.verification.revokeVerifications",
"defs": {
"main": {
"type": "procedure",
"description": "Revoke previously granted verifications in batches of up to 100.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["uris"],
"properties": {
"uris": {
"type": "array",
"description": "Array of verification record uris to revoke",
"maxLength": 100,
"items": {
"type": "string",
"description": "The AT-URI of the verification record to revoke.",
"format": "at-uri"
}
},
"revokeReason": {
"type": "string",
"description": "Reason for revoking the verification. This is optional and can be omitted if not needed.",
"maxLength": 1000
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": ["revokedVerifications", "failedRevocations"],
"properties": {
"revokedVerifications": {
"type": "array",
"description": "List of verification uris successfully revoked",
"items": {
"type": "string",
"format": "at-uri"
}
},
"failedRevocations": {
"type": "array",
"description": "List of verification uris that couldn't be revoked, including failure reasons",
"items": {
"type": "ref",
"ref": "#revokeError"
}
}
}
}
}
},
"revokeError": {
"type": "object",
"description": "Error object for failed revocations",
"required": ["uri", "error"],
"properties": {
"uri": {
"type": "string",
"description": "The AT-URI of the verification record that failed to revoke.",
"format": "at-uri"
},
"error": {
"type": "string",
"description": "Description of the error that occurred during revocation."
}
}
}
}
}

View File

@ -2,7 +2,7 @@
"name": "atp", "name": "atp",
"version": "0.0.1", "version": "0.0.1",
"repository": "git@github.com:bluesky-social/atproto.git", "repository": "git@github.com:bluesky-social/atproto.git",
"author": "Bluesky PBC <hello@blueskyweb.xyz>", "author": "Bluesky Social PBC <hello@blueskyweb.xyz>",
"license": "MIT", "license": "MIT",
"private": true, "private": true,
"engines": { "engines": {
@ -22,6 +22,7 @@
"precodegen": "pnpm run --recursive --stream --filter '@atproto/lex-cli...' build --force", "precodegen": "pnpm run --recursive --stream --filter '@atproto/lex-cli...' build --force",
"codegen": "pnpm run --sort --recursive --stream --parallel codegen", "codegen": "pnpm run --sort --recursive --stream --parallel codegen",
"build": "pnpm run --sort --recursive --stream '/^(build|build:.+)$/'", "build": "pnpm run --sort --recursive --stream '/^(build|build:.+)$/'",
"i18n": "pnpm run --parallel i18n:extract",
"dev": "NODE_ENV=development pnpm run --recursive --parallel --stream '/^(dev|dev:.+)$/'", "dev": "NODE_ENV=development pnpm run --recursive --parallel --stream '/^(dev|dev:.+)$/'",
"dev:tsc": "tsc --build tsconfig.json --preserveWatchOutput --watch", "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": "LOG_ENABLED=false ./packages/dev-infra/with-test-redis-and-db.sh pnpm test --stream --recursive",
@ -53,7 +54,12 @@
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-config-standard": "^7.0.0", "prettier-config-standard": "^7.0.0",
"prettier-plugin-tailwindcss": "^0.6.11", "prettier-plugin-tailwindcss": "^0.6.11",
"typescript": "^5.8.2" "typescript": "^5.8.3"
},
"pnpm": {
"overrides": {
"cookie": "^0.7.2"
}
}, },
"workspaces": { "workspaces": {
"packages": [ "packages": [

View File

@ -1,5 +1,262 @@
# @atproto/api # @atproto/api
## 0.16.9
### Patch Changes
- [#4189](https://github.com/bluesky-social/atproto/pull/4189) [`ff30786af`](https://github.com/bluesky-social/atproto/commit/ff30786af6f72ad6506939bfca01a3f55a096c1c) Thanks [@foysalit](https://github.com/foysalit)! - Add revoke credentials moderation event type to lexicons
## 0.16.8
### Patch Changes
- [#3881](https://github.com/bluesky-social/atproto/pull/3881) [`a5b20f021`](https://github.com/bluesky-social/atproto/commit/a5b20f0218bd13e3c5d7681de2263dcc850b7523) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Add expanded moderation report reasons as outlined in
[RFC-0009](https://github.com/bluesky-social/proposals/tree/main/0009-mod-report-granularity)
- Updated dependencies [[`055a413fb`](https://github.com/bluesky-social/atproto/commit/055a413fba4fab510ec899377154f1204ab12099)]:
- @atproto/common-web@0.4.3
- @atproto/lexicon@0.5.1
- @atproto/xrpc@0.7.5
## 0.16.7
### Patch Changes
- [#4164](https://github.com/bluesky-social/atproto/pull/4164) [`09717f29a`](https://github.com/bluesky-social/atproto/commit/09717f29ac7ca742c9c3310980dbe4d112b7597f) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add bookmarks lexicons
## 0.16.6
### Patch Changes
- Updated dependencies [[`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d), [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d), [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d), [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d)]:
- @atproto/lexicon@0.5.0
- @atproto/syntax@0.4.1
- @atproto/xrpc@0.7.4
## 0.16.5
### Patch Changes
- [#4142](https://github.com/bluesky-social/atproto/pull/4142) [`66dbf8db6`](https://github.com/bluesky-social/atproto/commit/66dbf8db6dd9defeee140accd2e7b25d13feb8b6) Thanks [@DavidBuchanan314](https://github.com/DavidBuchanan314)! - add com.atproto.temp.revokeAccountCredentials lexicon schema
## 0.16.4
### Patch Changes
- Updated dependencies [[`2104d9033`](https://github.com/bluesky-social/atproto/commit/2104d9033e2e1a3a7b821c1f0c5c8ffac5832d59)]:
- @atproto/lexicon@0.4.14
- @atproto/xrpc@0.7.3
## 0.16.3
### Patch Changes
- [#4109](https://github.com/bluesky-social/atproto/pull/4109) [`3156ddf61`](https://github.com/bluesky-social/atproto/commit/3156ddf61519fede9ed148478f082184a1e3242e) Thanks [@foysalit](https://github.com/foysalit)! - Add batchId filter to tools.ozone.moderation.queryEvents endpoint
- Updated dependencies [[`331a356ce`](https://github.com/bluesky-social/atproto/commit/331a356ce27ff1d0b24747b0c16f3b54b07a0a12)]:
- @atproto/lexicon@0.4.13
- @atproto/xrpc@0.7.2
## 0.16.2
### Patch Changes
- [#4081](https://github.com/bluesky-social/atproto/pull/4081) [`c370d933b`](https://github.com/bluesky-social/atproto/commit/c370d933b76b4e15b83a82b40d1b6a32bd54add6) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Adds `purpose` filtering to `app.bsky.graph.getLists`.
Adds `app.bsky.graph.getListsWithMembership`.
Adds `app.bsky.graph.getStarterPacksWithMembership`.
## 0.16.1
### Patch Changes
- [#3927](https://github.com/bluesky-social/atproto/pull/3927) [`171efadb4`](https://github.com/bluesky-social/atproto/commit/171efadb49f842aa8ff3bf9d790caa6e0e0456ef) Thanks [@foysalit](https://github.com/foysalit)! - Introduces ozone event timeline lexicons
## 0.16.0
### Minor Changes
- [#4072](https://github.com/bluesky-social/atproto/pull/4072) [`9751eebd7`](https://github.com/bluesky-social/atproto/commit/9751eebd718066984a91046b63e410caecd64022) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Remove app.bsky.unspecced.checkHandleAvailability, add com.atproto.temp.checkHandleAvailability
## 0.15.27
### Patch Changes
- [#4058](https://github.com/bluesky-social/atproto/pull/4058) [`8787fd9de`](https://github.com/bluesky-social/atproto/commit/8787fd9dea769716412c9883e355cd496664bc6e) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Only allow initiating age assurance flow from certain states, return `InvalidInitiation` error if violated.
- [#4049](https://github.com/bluesky-social/atproto/pull/4049) [`dc84906c8`](https://github.com/bluesky-social/atproto/commit/dc84906c865e8a97939a909dd3f75decde538363) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - app.bsky.unspecced.checkHandleAvailability lexicon
## 0.15.26
### Patch Changes
- [#4041](https://github.com/bluesky-social/atproto/pull/4041) [`083566ddf`](https://github.com/bluesky-social/atproto/commit/083566ddfc3c9263423ebd5e59bfdbfe7b091c82) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add `unregisterPush` API
- [#4048](https://github.com/bluesky-social/atproto/pull/4048) [`3b356c509`](https://github.com/bluesky-social/atproto/commit/3b356c5096a269f1be6c4e69bdee7f5d14eb5d7e) Thanks [@foysalit](https://github.com/foysalit)! - Add externalId to ozone events for deduping events per subject and event type
## 0.15.25
### Patch Changes
- [#4028](https://github.com/bluesky-social/atproto/pull/4028) [`88c136427`](https://github.com/bluesky-social/atproto/commit/88c136427451a20d21812a1aa88a70cf21904138) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Age assurance compliance
## 0.15.24
### Patch Changes
- [#4034](https://github.com/bluesky-social/atproto/pull/4034) [`34d7a0846`](https://github.com/bluesky-social/atproto/commit/34d7a0846bb14bb36a8cc2747fb7ce73005e59d1) Thanks [@foysalit](https://github.com/foysalit)! - Add age assurance event types to ozone lexicons
- Updated dependencies [[`8ef976d38`](https://github.com/bluesky-social/atproto/commit/8ef976d3852df4bfa376e515e131cc0810a42f20)]:
- @atproto/lexicon@0.4.12
- @atproto/xrpc@0.7.1
## 0.15.23
### Patch Changes
- [#3991](https://github.com/bluesky-social/atproto/pull/3991) [`0c0381a2b`](https://github.com/bluesky-social/atproto/commit/0c0381a2bb9b9dc14ca6c1c8c4a6b966f0d516e8) Thanks [@foysalit](https://github.com/foysalit)! - Add modTool parameter to ozone events
## 0.15.22
### Patch Changes
- [#3945](https://github.com/bluesky-social/atproto/pull/3945) [`02c358d0c`](https://github.com/bluesky-social/atproto/commit/02c358d0ca280922c20da5be1e23b4aa9e90a30b) Thanks [@foysalit](https://github.com/foysalit)! - Add safelink module in ozone
## 0.15.21
### Patch Changes
- [#4010](https://github.com/bluesky-social/atproto/pull/4010) [`d344723a1`](https://github.com/bluesky-social/atproto/commit/d344723a1018b2436b5453526397936bd587a2e2) Thanks [@mozzius](https://github.com/mozzius)! - Loosen constraints for saved feed preferences
## 0.15.20
### Patch Changes
- [#4005](https://github.com/bluesky-social/atproto/pull/4005) [`bb65f7a6e`](https://github.com/bluesky-social/atproto/commit/bb65f7a6e22ceedb57c74a18cf0539c1dd04c0a7) Thanks [@mozzius](https://github.com/mozzius)! - add `subscribed-post` notification reason
## 0.15.19
### Patch Changes
- [#3997](https://github.com/bluesky-social/atproto/pull/3997) [`376778a92`](https://github.com/bluesky-social/atproto/commit/376778a92f08fb6709c4cde736bfaca7393a72e1) Thanks [@mozzius](https://github.com/mozzius)! - Add put method for AppBskyNotificationDeclarationRecord
## 0.15.18
### Patch Changes
- [#3995](https://github.com/bluesky-social/atproto/pull/3995) [`e3e31b2b9`](https://github.com/bluesky-social/atproto/commit/e3e31b2b9bf8c4de6b2d7fa992c3b3795686ea72) Thanks [@mozzius](https://github.com/mozzius)! - Add put method to record utility classes
## 0.15.17
### Patch Changes
- [#3990](https://github.com/bluesky-social/atproto/pull/3990) [`6cd120206`](https://github.com/bluesky-social/atproto/commit/6cd12020657bfb5f87e97cd16e4abb379b64f60b) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add activity subscription lexicons
## 0.15.16
### Patch Changes
- [#3966](https://github.com/bluesky-social/atproto/pull/3966) [`97ef11657`](https://github.com/bluesky-social/atproto/commit/97ef116571909c95713017bcd7b621c8afbc90ef) Thanks [@mozzius](https://github.com/mozzius)! - Rename notification preference lexicon "filter" key to "include"
## 0.15.15
### Patch Changes
- [#2934](https://github.com/bluesky-social/atproto/pull/2934) [`7f1316748`](https://github.com/bluesky-social/atproto/commit/7f1316748dedb512ae739ad51b95644baa39fe80) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Fix bug where fuzzy matching mute words was over-zealous e.g. `Andor` matching `and/or`.
- [#2934](https://github.com/bluesky-social/atproto/pull/2934) [`7f1316748`](https://github.com/bluesky-social/atproto/commit/7f1316748dedb512ae739ad51b95644baa39fe80) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Updates mute word matching to include a `matches: MuteWordMatch[]` property on the `muted-word` `cause` type returned as part of a `ModerationDecision`.
## 0.15.14
### Patch Changes
- [#3901](https://github.com/bluesky-social/atproto/pull/3901) [`a48671e73`](https://github.com/bluesky-social/atproto/commit/a48671e730681f692a88053e8f137bd9e2aed5f1) Thanks [@mozzius](https://github.com/mozzius)! - Add notification preferences V2 lexicons
## 0.15.13
### Patch Changes
- [#3929](https://github.com/bluesky-social/atproto/pull/3929) [`c6eb8a12e`](https://github.com/bluesky-social/atproto/commit/c6eb8a12e291c88fea79da447f9da8608d02300d) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Rename `getPostThreadHiddenV2` to `getPostThreadOtherV2` to better reflect the intent of the API.
## 0.15.12
### Patch Changes
- [#3912](https://github.com/bluesky-social/atproto/pull/3912) [`a5cd018bd`](https://github.com/bluesky-social/atproto/commit/a5cd018bd5f237221902ab1b6956b46233c92187) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Unify `getPostThreadV2` and `getPostThreadHiddenV2` responses under `app.bsky.unspecced.defs` namespace and a single interface via `threadItemPost`.
## 0.15.11
### Patch Changes
- [#3910](https://github.com/bluesky-social/atproto/pull/3910) [`a978681fd`](https://github.com/bluesky-social/atproto/commit/a978681fde1c138a5298bae77e5dc36ce155f955) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Updates to app.bsky.unspecced.getPostThreadHiddenV2 done in f6d5a467e71fb54996754cce7747b1e98a34442b (https://github.com/bluesky-social/atproto/pull/3909)
## 0.15.10
### Patch Changes
- [#3825](https://github.com/bluesky-social/atproto/pull/3825) [`1dae6c59a`](https://github.com/bluesky-social/atproto/commit/1dae6c59abe0e5aa4a7b7d0cc1dfee88f458d4b9) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add app.bsky.unspecced.getPostThreadV2
- [#3825](https://github.com/bluesky-social/atproto/pull/3825) [`1dae6c59a`](https://github.com/bluesky-social/atproto/commit/1dae6c59abe0e5aa4a7b7d0cc1dfee88f458d4b9) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add app.bsky.unspecced.getPostThreadHiddenV2
## 0.15.9
### Patch Changes
- [#3882](https://github.com/bluesky-social/atproto/pull/3882) [`79a75bb1e`](https://github.com/bluesky-social/atproto/commit/79a75bb1ed8fc14cefa246621fe1faeebf3fc159) Thanks [@mozzius](https://github.com/mozzius)! - add a "via" field to reposts and likes allowing a reference a repost, and then give a notification when a repost is liked or reposted.
## 0.15.8
### Patch Changes
- [#3869](https://github.com/bluesky-social/atproto/pull/3869) [`80f402f36`](https://github.com/bluesky-social/atproto/commit/80f402f3663af08fd048300738d04c67aa2b9cb8) Thanks [@haileyok](https://github.com/haileyok)! - add `reqId` to feed interactions
## 0.15.7
### Patch Changes
- [#3860](https://github.com/bluesky-social/atproto/pull/3860) [`86b315388`](https://github.com/bluesky-social/atproto/commit/86b3153884099ceeb0cfdb9d2bfdd447c39fb35a) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add liveNow to app.bsky.unspecced.getConfig
## 0.15.6
### Patch Changes
- [#3824](https://github.com/bluesky-social/atproto/pull/3824) [`3a65b68f7`](https://github.com/bluesky-social/atproto/commit/3a65b68f7dc63c8bfbea0ae615f8ae984272f2e4) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add app.bsky.actor.status lexicon
- Updated dependencies [[`cc485d296`](https://github.com/bluesky-social/atproto/commit/cc485d29638488928b5efec3d4b0627040589812), [`f36ab48d9`](https://github.com/bluesky-social/atproto/commit/f36ab48d910fc4a3afcd22138ba014c814beb93b), [`f36ab48d9`](https://github.com/bluesky-social/atproto/commit/f36ab48d910fc4a3afcd22138ba014c814beb93b), [`f36ab48d9`](https://github.com/bluesky-social/atproto/commit/f36ab48d910fc4a3afcd22138ba014c814beb93b), [`cc485d296`](https://github.com/bluesky-social/atproto/commit/cc485d29638488928b5efec3d4b0627040589812)]:
- @atproto/common-web@0.4.2
- @atproto/xrpc@0.7.0
- @atproto/lexicon@0.4.11
## 0.15.5
### Patch Changes
- [#3765](https://github.com/bluesky-social/atproto/pull/3765) [`45354c84f`](https://github.com/bluesky-social/atproto/commit/45354c84f898d79f58c14b5c0da3661beb7353f9) Thanks [@foysalit](https://github.com/foysalit)! - Add verification lexicons to ozone
## 0.15.4
### Patch Changes
- [#3768](https://github.com/bluesky-social/atproto/pull/3768) [`7af77f3ed`](https://github.com/bluesky-social/atproto/commit/7af77f3edfe52f77729f61de4188e8375f03b4ef) Thanks [@devinivy](https://github.com/devinivy)! - Support tools.ozone.hosting.getAccountHistory
## 0.15.3
### Patch Changes
- [#3773](https://github.com/bluesky-social/atproto/pull/3773) [`0087dc1c0`](https://github.com/bluesky-social/atproto/commit/0087dc1c0bafad1d0a0a1a16683d250dea031bf9) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add verification notifications
## 0.15.2
### Patch Changes
- [#3770](https://github.com/bluesky-social/atproto/pull/3770) [`553c988f1`](https://github.com/bluesky-social/atproto/commit/553c988f1d226b3d2fbe94c117b088f5c82db794) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Add `verificationPrefs` and `hideBadges` setting to user prefs.
## 0.15.1
### Patch Changes
- [#3761](https://github.com/bluesky-social/atproto/pull/3761) [`688268b6a`](https://github.com/bluesky-social/atproto/commit/688268b6a5ee30f0922ee152ffbd26583d164ae4) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Add verification state to profile view lexicons
- [#3766](https://github.com/bluesky-social/atproto/pull/3766) [`8d99915ce`](https://github.com/bluesky-social/atproto/commit/8d99915ce02c73b9b37bf121ccd2703fa14a906a) Thanks [@rafaelbsky](https://github.com/rafaelbsky)! - Update chat verification lexicon
## 0.15.0 ## 0.15.0
### Minor Changes ### Minor Changes

View File

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

View File

@ -385,12 +385,13 @@ export class Agent extends XrpcClient {
}) })
} }
async like(uri: string, cid: string) { async like(uri: string, cid: string, via?: { uri: string; cid: string }) {
return this.app.bsky.feed.like.create( return this.app.bsky.feed.like.create(
{ repo: this.accountDid }, { repo: this.accountDid },
{ {
subject: { uri, cid }, subject: { uri, cid },
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
via,
}, },
) )
} }
@ -405,12 +406,13 @@ export class Agent extends XrpcClient {
}) })
} }
async repost(uri: string, cid: string) { async repost(uri: string, cid: string, via?: { uri: string; cid: string }) {
return this.app.bsky.feed.repost.create( return this.app.bsky.feed.repost.create(
{ repo: this.accountDid }, { repo: this.accountDid },
{ {
subject: { uri, cid }, subject: { uri, cid },
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
via,
}, },
) )
} }
@ -582,6 +584,9 @@ export class Agent extends XrpcClient {
threadgateAllowRules: undefined, threadgateAllowRules: undefined,
postgateEmbeddingRules: undefined, postgateEmbeddingRules: undefined,
}, },
verificationPrefs: {
hideBadges: false,
},
} }
const res = await this.app.bsky.actor.getPreferences({}) const res = await this.app.bsky.actor.getPreferences({})
const labelPrefs: AppBskyActorDefs.ContentLabelPref[] = [] const labelPrefs: AppBskyActorDefs.ContentLabelPref[] = []
@ -646,6 +651,10 @@ export class Agent extends XrpcClient {
pref.threadgateAllowRules pref.threadgateAllowRules
prefs.postInteractionSettings.postgateEmbeddingRules = prefs.postInteractionSettings.postgateEmbeddingRules =
pref.postgateEmbeddingRules pref.postgateEmbeddingRules
} else if (predicate.isValidVerificationPrefs(pref)) {
prefs.verificationPrefs = {
hideBadges: pref.hideBadges,
}
} }
} }
@ -1334,6 +1343,25 @@ export class Agent extends XrpcClient {
}) })
} }
async setVerificationPrefs(settings: AppBskyActorDefs.VerificationPrefs) {
const result = AppBskyActorDefs.validateVerificationPrefs(settings)
// Fool-proofing (should not be needed because of type safety)
if (!result.success) throw result.error
await this.updatePreferences((prefs) => {
const pref = prefs.findLast(predicate.isValidVerificationPrefs) || {
$type: 'app.bsky.actor.defs#verificationPrefs',
hideBadges: false,
}
pref.hideBadges = settings.hideBadges
return prefs
.filter((p) => !AppBskyActorDefs.isVerificationPrefs(p))
.concat(pref)
})
}
//- Private methods //- Private methods
#prefsLock = new AwaitLock() #prefsLock = new AwaitLock()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,8 +12,10 @@ import {
import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js'
import type * as AppBskyGraphDefs from '../graph/defs.js' import type * as AppBskyGraphDefs from '../graph/defs.js'
import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js'
import type * as AppBskyNotificationDefs from '../notification/defs.js'
import type * as AppBskyFeedThreadgate from '../feed/threadgate.js' import type * as AppBskyFeedThreadgate from '../feed/threadgate.js'
import type * as AppBskyFeedPostgate from '../feed/postgate.js' import type * as AppBskyFeedPostgate from '../feed/postgate.js'
import type * as AppBskyEmbedExternal from '../embed/external.js'
const is$typed = _is$typed, const is$typed = _is$typed,
validate = _validate validate = _validate
@ -30,6 +32,7 @@ export interface ProfileViewBasic {
labels?: ComAtprotoLabelDefs.Label[] labels?: ComAtprotoLabelDefs.Label[]
createdAt?: string createdAt?: string
verification?: VerificationState verification?: VerificationState
status?: StatusView
} }
const hashProfileViewBasic = 'profileViewBasic' const hashProfileViewBasic = 'profileViewBasic'
@ -55,6 +58,7 @@ export interface ProfileView {
viewer?: ViewerState viewer?: ViewerState
labels?: ComAtprotoLabelDefs.Label[] labels?: ComAtprotoLabelDefs.Label[]
verification?: VerificationState verification?: VerificationState
status?: StatusView
} }
const hashProfileView = 'profileView' const hashProfileView = 'profileView'
@ -86,6 +90,7 @@ export interface ProfileViewDetailed {
labels?: ComAtprotoLabelDefs.Label[] labels?: ComAtprotoLabelDefs.Label[]
pinnedPost?: ComAtprotoRepoStrongRef.Main pinnedPost?: ComAtprotoRepoStrongRef.Main
verification?: VerificationState verification?: VerificationState
status?: StatusView
} }
const hashProfileViewDetailed = 'profileViewDetailed' const hashProfileViewDetailed = 'profileViewDetailed'
@ -105,6 +110,7 @@ export interface ProfileAssociated {
starterPacks?: number starterPacks?: number
labeler?: boolean labeler?: boolean
chat?: ProfileAssociatedChat chat?: ProfileAssociatedChat
activitySubscription?: ProfileAssociatedActivitySubscription
} }
const hashProfileAssociated = 'profileAssociated' const hashProfileAssociated = 'profileAssociated'
@ -132,6 +138,26 @@ export function validateProfileAssociatedChat<V>(v: V) {
return validate<ProfileAssociatedChat & V>(v, id, hashProfileAssociatedChat) return validate<ProfileAssociatedChat & V>(v, id, hashProfileAssociatedChat)
} }
export interface ProfileAssociatedActivitySubscription {
$type?: 'app.bsky.actor.defs#profileAssociatedActivitySubscription'
allowSubscriptions: 'followers' | 'mutuals' | 'none' | (string & {})
}
const hashProfileAssociatedActivitySubscription =
'profileAssociatedActivitySubscription'
export function isProfileAssociatedActivitySubscription<V>(v: V) {
return is$typed(v, id, hashProfileAssociatedActivitySubscription)
}
export function validateProfileAssociatedActivitySubscription<V>(v: V) {
return validate<ProfileAssociatedActivitySubscription & V>(
v,
id,
hashProfileAssociatedActivitySubscription,
)
}
/** Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests. */ /** Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests. */
export interface ViewerState { export interface ViewerState {
$type?: 'app.bsky.actor.defs#viewerState' $type?: 'app.bsky.actor.defs#viewerState'
@ -143,6 +169,7 @@ export interface ViewerState {
following?: string following?: string
followedBy?: string followedBy?: string
knownFollowers?: KnownFollowers knownFollowers?: KnownFollowers
activitySubscription?: AppBskyNotificationDefs.ActivitySubscription
} }
const hashViewerState = 'viewerState' const hashViewerState = 'viewerState'
@ -230,6 +257,7 @@ export type Preferences = (
| $Typed<BskyAppStatePref> | $Typed<BskyAppStatePref>
| $Typed<LabelersPref> | $Typed<LabelersPref>
| $Typed<PostInteractionSettingsPref> | $Typed<PostInteractionSettingsPref>
| $Typed<VerificationPrefs>
| { $type: string } | { $type: string }
)[] )[]
@ -543,6 +571,23 @@ export function validateNux<V>(v: V) {
return validate<Nux & V>(v, id, hashNux) return validate<Nux & V>(v, id, hashNux)
} }
/** Preferences for how verified accounts appear in the app. */
export interface VerificationPrefs {
$type?: 'app.bsky.actor.defs#verificationPrefs'
/** Hide the blue check badges for verified accounts and trusted verifiers. */
hideBadges: boolean
}
const hashVerificationPrefs = 'verificationPrefs'
export function isVerificationPrefs<V>(v: V) {
return is$typed(v, id, hashVerificationPrefs)
}
export function validateVerificationPrefs<V>(v: V) {
return validate<VerificationPrefs & V>(v, id, hashVerificationPrefs)
}
/** 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. */ /** 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 { export interface PostInteractionSettingsPref {
$type?: 'app.bsky.actor.defs#postInteractionSettingsPref' $type?: 'app.bsky.actor.defs#postInteractionSettingsPref'
@ -574,3 +619,25 @@ export function validatePostInteractionSettingsPref<V>(v: V) {
hashPostInteractionSettingsPref, hashPostInteractionSettingsPref,
) )
} }
export interface StatusView {
$type?: 'app.bsky.actor.defs#statusView'
/** The status for the account. */
status: 'app.bsky.actor.status#live' | (string & {})
record: { [_ in string]: unknown }
embed?: $Typed<AppBskyEmbedExternal.View> | { $type: string }
/** The date when this status will expire. The application might choose to no longer return the status after expiration. */
expiresAt?: string
/** True if the status is not expired, false if it is expired. Only present if expiration was set. */
isActive?: boolean
}
const hashStatusView = 'statusView'
export function isStatusView<V>(v: V) {
return is$typed(v, id, hashStatusView)
}
export function validateStatusView<V>(v: V) {
return validate<StatusView & V>(v, id, hashStatusView)
}

View File

@ -16,8 +16,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.getPreferences' const id = 'app.bsky.actor.getPreferences'
export interface QueryParams {} export type QueryParams = {}
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,11 +16,10 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.getProfile' const id = 'app.bsky.actor.getProfile'
export interface QueryParams { export type QueryParams = {
/** Handle or DID of account to fetch profile of. */ /** Handle or DID of account to fetch profile of. */
actor: string actor: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export type OutputSchema = AppBskyActorDefs.ProfileViewDetailed export type OutputSchema = AppBskyActorDefs.ProfileViewDetailed

View File

@ -16,10 +16,9 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.getProfiles' const id = 'app.bsky.actor.getProfiles'
export interface QueryParams { export type QueryParams = {
actors: string[] actors: string[]
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,11 +16,10 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.getSuggestions' const id = 'app.bsky.actor.getSuggestions'
export interface QueryParams { export type QueryParams = {
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,7 +16,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.putPreferences' const id = 'app.bsky.actor.putPreferences'
export interface QueryParams {} export type QueryParams = {}
export interface InputSchema { export interface InputSchema {
preferences: AppBskyActorDefs.Preferences preferences: AppBskyActorDefs.Preferences

View File

@ -16,7 +16,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.searchActors' const id = 'app.bsky.actor.searchActors'
export interface QueryParams { export type QueryParams = {
/** DEPRECATED: use 'q' instead. */ /** DEPRECATED: use 'q' instead. */
term?: string term?: string
/** Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ /** Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */
@ -24,7 +24,6 @@ export interface QueryParams {
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,14 +16,13 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.actor.searchActorsTypeahead' const id = 'app.bsky.actor.searchActorsTypeahead'
export interface QueryParams { export type QueryParams = {
/** DEPRECATED: use 'q' instead. */ /** DEPRECATED: use 'q' instead. */
term?: string term?: string
/** Search query prefix; not a full query string. */ /** Search query prefix; not a full query string. */
q?: string q?: string
limit?: number limit?: number
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -0,0 +1,40 @@
/**
* GENERATED CODE - DO NOT MODIFY
*/
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as AppBskyEmbedExternal from '../embed/external.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.actor.status'
export interface Record {
$type: 'app.bsky.actor.status'
/** The status for the account. */
status: 'app.bsky.actor.status#live' | (string & {})
embed?: $Typed<AppBskyEmbedExternal.Main> | { $type: string }
/** The duration of the status in minutes. Applications can choose to impose minimum and maximum limits. */
durationMinutes?: number
createdAt: string
[k: string]: unknown
}
const hashRecord = 'main'
export function isRecord<V>(v: V) {
return is$typed(v, id, hashRecord)
}
export function validateRecord<V>(v: V) {
return validate<Record & V>(v, id, hashRecord, true)
}
/** Advertises an account as currently offering live content. */
export const LIVE = `${id}#live`

View File

@ -0,0 +1,50 @@
/**
* GENERATED CODE - DO NOT MODIFY
*/
import { HeadersMap, XRPCError } from '@atproto/xrpc'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.bookmark.createBookmark'
export type QueryParams = {}
export interface InputSchema {
uri: string
cid: string
}
export interface CallOptions {
signal?: AbortSignal
headers?: HeadersMap
qp?: QueryParams
encoding?: 'application/json'
}
export interface Response {
success: boolean
headers: HeadersMap
}
export class UnsupportedCollectionError extends XRPCError {
constructor(src: XRPCError) {
super(src.status, src.error, src.message, src.headers, { cause: src })
}
}
export function toKnownErr(e: any) {
if (e instanceof XRPCError) {
if (e.error === 'UnsupportedCollection')
return new UnsupportedCollectionError(e)
}
return e
}

View File

@ -0,0 +1,54 @@
/**
* GENERATED CODE - DO NOT MODIFY
*/
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js'
import type * as AppBskyFeedDefs from '../feed/defs.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.bookmark.defs'
/** Object used to store bookmark data in stash. */
export interface Bookmark {
$type?: 'app.bsky.bookmark.defs#bookmark'
subject: ComAtprotoRepoStrongRef.Main
}
const hashBookmark = 'bookmark'
export function isBookmark<V>(v: V) {
return is$typed(v, id, hashBookmark)
}
export function validateBookmark<V>(v: V) {
return validate<Bookmark & V>(v, id, hashBookmark)
}
export interface BookmarkView {
$type?: 'app.bsky.bookmark.defs#bookmarkView'
subject: ComAtprotoRepoStrongRef.Main
createdAt?: string
item:
| $Typed<AppBskyFeedDefs.BlockedPost>
| $Typed<AppBskyFeedDefs.NotFoundPost>
| $Typed<AppBskyFeedDefs.PostView>
| { $type: string }
}
const hashBookmarkView = 'bookmarkView'
export function isBookmarkView<V>(v: V) {
return is$typed(v, id, hashBookmarkView)
}
export function validateBookmarkView<V>(v: V) {
return validate<BookmarkView & V>(v, id, hashBookmarkView)
}

View File

@ -0,0 +1,49 @@
/**
* GENERATED CODE - DO NOT MODIFY
*/
import { HeadersMap, XRPCError } from '@atproto/xrpc'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.bookmark.deleteBookmark'
export type QueryParams = {}
export interface InputSchema {
uri: string
}
export interface CallOptions {
signal?: AbortSignal
headers?: HeadersMap
qp?: QueryParams
encoding?: 'application/json'
}
export interface Response {
success: boolean
headers: HeadersMap
}
export class UnsupportedCollectionError extends XRPCError {
constructor(src: XRPCError) {
super(src.status, src.error, src.message, src.headers, { cause: src })
}
}
export function toKnownErr(e: any) {
if (e instanceof XRPCError) {
if (e.error === 'UnsupportedCollection')
return new UnsupportedCollectionError(e)
}
return e
}

View File

@ -0,0 +1,43 @@
/**
* GENERATED CODE - DO NOT MODIFY
*/
import { HeadersMap, XRPCError } from '@atproto/xrpc'
import { type ValidationResult, BlobRef } from '@atproto/lexicon'
import { CID } from 'multiformats/cid'
import { validate as _validate } from '../../../../lexicons'
import {
type $Typed,
is$typed as _is$typed,
type OmitKey,
} from '../../../../util'
import type * as AppBskyBookmarkDefs from './defs.js'
const is$typed = _is$typed,
validate = _validate
const id = 'app.bsky.bookmark.getBookmarks'
export type QueryParams = {
limit?: number
cursor?: string
}
export type InputSchema = undefined
export interface OutputSchema {
cursor?: string
bookmarks: AppBskyBookmarkDefs.BookmarkView[]
}
export interface CallOptions {
signal?: AbortSignal
headers?: HeadersMap
}
export interface Response {
success: boolean
headers: HeadersMap
data: OutputSchema
}
export function toKnownErr(e: any) {
return e
}

View File

@ -36,6 +36,7 @@ export interface PostView {
| $Typed<AppBskyEmbedRecord.View> | $Typed<AppBskyEmbedRecord.View>
| $Typed<AppBskyEmbedRecordWithMedia.View> | $Typed<AppBskyEmbedRecordWithMedia.View>
| { $type: string } | { $type: string }
bookmarkCount?: number
replyCount?: number replyCount?: number
repostCount?: number repostCount?: number
likeCount?: number likeCount?: number
@ -61,6 +62,7 @@ export interface ViewerState {
$type?: 'app.bsky.feed.defs#viewerState' $type?: 'app.bsky.feed.defs#viewerState'
repost?: string repost?: string
like?: string like?: string
bookmarked?: boolean
threadMuted?: boolean threadMuted?: boolean
replyDisabled?: boolean replyDisabled?: boolean
embeddingDisabled?: boolean embeddingDisabled?: boolean
@ -100,6 +102,8 @@ export interface FeedViewPost {
reason?: $Typed<ReasonRepost> | $Typed<ReasonPin> | { $type: string } reason?: $Typed<ReasonRepost> | $Typed<ReasonPin> | { $type: string }
/** Context provided by feed generator that may be passed back alongside interactions. */ /** Context provided by feed generator that may be passed back alongside interactions. */
feedContext?: string feedContext?: string
/** Unique identifier per request that may be passed back alongside interactions. */
reqId?: string
} }
const hashFeedViewPost = 'feedViewPost' const hashFeedViewPost = 'feedViewPost'
@ -140,6 +144,8 @@ export function validateReplyRef<V>(v: V) {
export interface ReasonRepost { export interface ReasonRepost {
$type?: 'app.bsky.feed.defs#reasonRepost' $type?: 'app.bsky.feed.defs#reasonRepost'
by: AppBskyActorDefs.ProfileViewBasic by: AppBskyActorDefs.ProfileViewBasic
uri?: string
cid?: string
indexedAt: string indexedAt: string
} }
@ -376,6 +382,8 @@ export interface Interaction {
| (string & {}) | (string & {})
/** Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton. */ /** Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton. */
feedContext?: string feedContext?: string
/** Unique identifier per request that may be passed back alongside interactions. */
reqId?: string
} }
const hashInteraction = 'interaction' const hashInteraction = 'interaction'

View File

@ -15,8 +15,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.describeFeedGenerator' const id = 'app.bsky.feed.describeFeedGenerator'
export interface QueryParams {} export type QueryParams = {}
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,12 +16,11 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getActorFeeds' const id = 'app.bsky.feed.getActorFeeds'
export interface QueryParams { export type QueryParams = {
actor: string actor: string
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,12 +16,11 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getActorLikes' const id = 'app.bsky.feed.getActorLikes'
export interface QueryParams { export type QueryParams = {
actor: string actor: string
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,7 +16,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getAuthorFeed' const id = 'app.bsky.feed.getAuthorFeed'
export interface QueryParams { export type QueryParams = {
actor: string actor: string
limit?: number limit?: number
cursor?: string cursor?: string
@ -30,7 +30,6 @@ export interface QueryParams {
| (string & {}) | (string & {})
includePins?: boolean includePins?: boolean
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,12 +16,11 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getFeed' const id = 'app.bsky.feed.getFeed'
export interface QueryParams { export type QueryParams = {
feed: string feed: string
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,11 +16,10 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getFeedGenerator' const id = 'app.bsky.feed.getFeedGenerator'
export interface QueryParams { export type QueryParams = {
/** AT-URI of the feed generator record. */ /** AT-URI of the feed generator record. */
feed: string feed: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,10 +16,9 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getFeedGenerators' const id = 'app.bsky.feed.getFeedGenerators'
export interface QueryParams { export type QueryParams = {
feeds: string[] feeds: string[]
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,18 +16,19 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getFeedSkeleton' const id = 'app.bsky.feed.getFeedSkeleton'
export interface QueryParams { export type QueryParams = {
/** Reference to feed generator record describing the specific feed being requested. */ /** Reference to feed generator record describing the specific feed being requested. */
feed: string feed: string
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {
cursor?: string cursor?: string
feed: AppBskyFeedDefs.SkeletonFeedPost[] feed: AppBskyFeedDefs.SkeletonFeedPost[]
/** Unique identifier per request that may be passed back alongside interactions. */
reqId?: string
} }
export interface CallOptions { export interface CallOptions {

View File

@ -16,7 +16,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getLikes' const id = 'app.bsky.feed.getLikes'
export interface QueryParams { export type QueryParams = {
/** AT-URI of the subject (eg, a post record). */ /** AT-URI of the subject (eg, a post record). */
uri: string uri: string
/** CID of the subject record (aka, specific version of record), to filter likes. */ /** CID of the subject record (aka, specific version of record), to filter likes. */
@ -24,7 +24,6 @@ export interface QueryParams {
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,13 +16,12 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getListFeed' const id = 'app.bsky.feed.getListFeed'
export interface QueryParams { export type QueryParams = {
/** Reference (AT-URI) to the list record. */ /** Reference (AT-URI) to the list record. */
list: string list: string
limit?: number limit?: number
cursor?: string cursor?: string
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

View File

@ -16,7 +16,7 @@ const is$typed = _is$typed,
validate = _validate validate = _validate
const id = 'app.bsky.feed.getPostThread' const id = 'app.bsky.feed.getPostThread'
export interface QueryParams { export type QueryParams = {
/** Reference (AT-URI) to post record. */ /** Reference (AT-URI) to post record. */
uri: string uri: string
/** How many levels of reply depth should be included in response. */ /** How many levels of reply depth should be included in response. */
@ -24,7 +24,6 @@ export interface QueryParams {
/** How many levels of parent (and grandparent, etc) post to include. */ /** How many levels of parent (and grandparent, etc) post to include. */
parentHeight?: number parentHeight?: number
} }
export type InputSchema = undefined export type InputSchema = undefined
export interface OutputSchema { export interface OutputSchema {

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