diff --git a/lib/mix/tasks/tempest.lexicon.sync.ex b/lib/mix/tasks/tempest.lexicon.sync.ex index 89be9ac..70fb626 100644 --- a/lib/mix/tasks/tempest.lexicon.sync.ex +++ b/lib/mix/tasks/tempest.lexicon.sync.ex @@ -20,9 +20,10 @@ defmodule Mix.Tasks.Tempest.Lexicon.Sync do * `--generated-at` - timestamp passed to the generator when `--generate` is set. * `--bundle-out` - generated module path when `--generate` is set. - The default path set intentionally includes local PDS endpoints plus the - private `app.bsky.actor` preference compatibility endpoints and their minimal - official dependency closure as currently tracked by Tempest. + The default path set includes local PDS endpoints plus every official + `app.bsky.*` Lexicon document available at the pinned commit. If GitHub tree + discovery is not available, Tempest falls back to the known record and + dependency subset required for local PDS writes. """ use Mix.Task @@ -31,7 +32,7 @@ defmodule Mix.Tasks.Tempest.Lexicon.Sync do @requirements ["app.config"] - @default_paths ~w( + @fallback_app_bsky_paths ~w( app/bsky/actor/defs.json app/bsky/actor/getPreferences.json app/bsky/actor/profile.json @@ -44,13 +45,28 @@ defmodule Mix.Tasks.Tempest.Lexicon.Sync do app/bsky/embed/recordWithMedia.json app/bsky/embed/video.json app/bsky/feed/defs.json + app/bsky/feed/generator.json + app/bsky/feed/like.json app/bsky/feed/post.json app/bsky/feed/postgate.json + app/bsky/feed/repost.json app/bsky/feed/threadgate.json + app/bsky/graph/block.json app/bsky/graph/defs.json + app/bsky/graph/follow.json + app/bsky/graph/list.json + app/bsky/graph/listblock.json + app/bsky/graph/listitem.json + app/bsky/graph/starterpack.json + app/bsky/graph/verification.json app/bsky/labeler/defs.json + app/bsky/labeler/service.json + app/bsky/notification/declaration.json app/bsky/notification/defs.json app/bsky/richtext/facet.json + ) + + @default_core_paths ~w( com/atproto/identity/resolveHandle.json com/atproto/identity/updateHandle.json com/atproto/label/defs.json @@ -124,7 +140,10 @@ defmodule Mix.Tasks.Tempest.Lexicon.Sync do out = Keyword.get(opts, :out, "priv/lexicons/official") source_repo = Keyword.get(opts, :source_repo, "https://github.com/bluesky-social/atproto") base_url = Keyword.get(opts, :base_url, raw_base_url(source_repo, commit)) - paths = lexicon_paths(Keyword.get(opts, :paths)) + + {:ok, _apps} = Application.ensure_all_started(:req) + + paths = lexicon_paths(Keyword.get(opts, :paths), source_repo, commit) Enum.each(paths, &sync_path(base_url, out, &1)) Mix.shell().info("Synced #{length(paths)} Lexicon document(s) to #{out}") @@ -157,9 +176,16 @@ defmodule Mix.Tasks.Tempest.Lexicon.Sync do defp raw_base_url(source_repo, commit), do: String.trim_trailing(source_repo, "/") <> "/" <> commit <> "/lexicons" - defp lexicon_paths(nil), do: @default_paths + defp lexicon_paths(nil, source_repo, commit) do + source_repo + |> discover_app_bsky_paths(commit) + |> case do + {:ok, paths} -> Enum.uniq(Enum.sort(paths ++ @default_core_paths)) + {:error, _reason} -> Enum.uniq(Enum.sort(@fallback_app_bsky_paths ++ @default_core_paths)) + end + end - defp lexicon_paths(path_file) do + defp lexicon_paths(path_file, _source_repo, _commit) do path_file |> File.read!() |> String.split("\n", trim: true) @@ -167,6 +193,34 @@ defmodule Mix.Tasks.Tempest.Lexicon.Sync do |> Enum.reject(&(&1 == "" or String.starts_with?(&1, "#"))) end + defp discover_app_bsky_paths("https://github.com/" <> repo, commit) do + repo = String.trim_trailing(repo, "/") + url = "https://api.github.com/repos/#{repo}/git/trees/#{commit}?recursive=1" + + case Req.get(url: url, retry: false) do + {:ok, %{status: 200, body: %{"tree" => tree}}} when is_list(tree) -> + paths = + tree + |> Enum.flat_map(fn + %{"path" => "lexicons/app/bsky/" <> rest, "type" => "blob"} -> + if String.ends_with?(rest, ".json"), do: ["app/bsky/" <> rest], else: [] + + _entry -> + [] + end) + + if paths == [], do: {:error, :no_app_bsky_paths}, else: {:ok, paths} + + {:ok, %{status: status}} -> + {:error, {:tree_status, status}} + + {:error, reason} -> + {:error, reason} + end + end + + defp discover_app_bsky_paths(_source_repo, _commit), do: {:error, :unsupported_source_repo} + defp sync_path("file://" <> source, out, path) do source_path = Path.join(source, path) destination = Path.join(out, path) diff --git a/lib/tempest/lexicon/bundled.ex b/lib/tempest/lexicon/bundled.ex index 337bf9c..8bde46d 100644 --- a/lib/tempest/lexicon/bundled.ex +++ b/lib/tempest/lexicon/bundled.ex @@ -10,27 +10,164 @@ defmodule Tempest.Lexicon.Bundled do @behaviour Tempest.Lexicon.Provider @manifest %{ - "document_count" => 72, + "document_count" => 209, "document_ids" => [ "app.bsky.actor.defs", "app.bsky.actor.getPreferences", + "app.bsky.actor.getProfile", + "app.bsky.actor.getProfiles", + "app.bsky.actor.getSuggestions", "app.bsky.actor.profile", "app.bsky.actor.putPreferences", + "app.bsky.actor.searchActors", + "app.bsky.actor.searchActorsTypeahead", + "app.bsky.actor.status", + "app.bsky.ageassurance.begin", + "app.bsky.ageassurance.defs", + "app.bsky.ageassurance.getConfig", + "app.bsky.ageassurance.getState", + "app.bsky.authCreatePosts", + "app.bsky.authDeleteContent", + "app.bsky.authFullApp", + "app.bsky.authManageFeedDeclarations", + "app.bsky.authManageLabelerService", + "app.bsky.authManageModeration", + "app.bsky.authManageNotifications", + "app.bsky.authManageProfile", + "app.bsky.authViewAll", + "app.bsky.bookmark.createBookmark", + "app.bsky.bookmark.defs", + "app.bsky.bookmark.deleteBookmark", + "app.bsky.bookmark.getBookmarks", + "app.bsky.contact.defs", + "app.bsky.contact.dismissMatch", + "app.bsky.contact.getMatches", + "app.bsky.contact.getSyncStatus", + "app.bsky.contact.importContacts", + "app.bsky.contact.removeData", + "app.bsky.contact.sendNotification", + "app.bsky.contact.startPhoneVerification", + "app.bsky.contact.verifyPhone", + "app.bsky.draft.createDraft", + "app.bsky.draft.defs", + "app.bsky.draft.deleteDraft", + "app.bsky.draft.getDrafts", + "app.bsky.draft.updateDraft", "app.bsky.embed.defs", "app.bsky.embed.external", "app.bsky.embed.gallery", + "app.bsky.embed.getEmbedExternalView", "app.bsky.embed.images", "app.bsky.embed.record", "app.bsky.embed.recordWithMedia", "app.bsky.embed.video", "app.bsky.feed.defs", + "app.bsky.feed.describeFeedGenerator", + "app.bsky.feed.generator", + "app.bsky.feed.getActorFeeds", + "app.bsky.feed.getActorLikes", + "app.bsky.feed.getAuthorFeed", + "app.bsky.feed.getFeed", + "app.bsky.feed.getFeedGenerator", + "app.bsky.feed.getFeedGenerators", + "app.bsky.feed.getFeedSkeleton", + "app.bsky.feed.getLikes", + "app.bsky.feed.getListFeed", + "app.bsky.feed.getPostThread", + "app.bsky.feed.getPosts", + "app.bsky.feed.getQuotes", + "app.bsky.feed.getRepostedBy", + "app.bsky.feed.getSuggestedFeeds", + "app.bsky.feed.getTimeline", + "app.bsky.feed.like", "app.bsky.feed.post", "app.bsky.feed.postgate", + "app.bsky.feed.repost", + "app.bsky.feed.searchPosts", + "app.bsky.feed.sendInteractions", "app.bsky.feed.threadgate", + "app.bsky.graph.block", "app.bsky.graph.defs", + "app.bsky.graph.follow", + "app.bsky.graph.getActorStarterPacks", + "app.bsky.graph.getBlocks", + "app.bsky.graph.getFollowers", + "app.bsky.graph.getFollows", + "app.bsky.graph.getKnownFollowers", + "app.bsky.graph.getList", + "app.bsky.graph.getListBlocks", + "app.bsky.graph.getListMutes", + "app.bsky.graph.getLists", + "app.bsky.graph.getListsWithMembership", + "app.bsky.graph.getMutes", + "app.bsky.graph.getRelationships", + "app.bsky.graph.getStarterPack", + "app.bsky.graph.getStarterPacks", + "app.bsky.graph.getStarterPacksWithMembership", + "app.bsky.graph.getSuggestedFollowsByActor", + "app.bsky.graph.list", + "app.bsky.graph.listblock", + "app.bsky.graph.listitem", + "app.bsky.graph.muteActor", + "app.bsky.graph.muteActorList", + "app.bsky.graph.muteThread", + "app.bsky.graph.searchStarterPacks", + "app.bsky.graph.starterpack", + "app.bsky.graph.unmuteActor", + "app.bsky.graph.unmuteActorList", + "app.bsky.graph.unmuteThread", + "app.bsky.graph.verification", "app.bsky.labeler.defs", + "app.bsky.labeler.getServices", + "app.bsky.labeler.service", + "app.bsky.notification.declaration", "app.bsky.notification.defs", + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.putActivitySubscription", + "app.bsky.notification.putPreferences", + "app.bsky.notification.putPreferencesV2", + "app.bsky.notification.registerPush", + "app.bsky.notification.unregisterPush", + "app.bsky.notification.updateSeen", "app.bsky.richtext.facet", + "app.bsky.unspecced.defs", + "app.bsky.unspecced.getAgeAssuranceState", + "app.bsky.unspecced.getConfig", + "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton", + "app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton", + "app.bsky.unspecced.getPopularFeedGenerators", + "app.bsky.unspecced.getPostThreadOtherV2", + "app.bsky.unspecced.getPostThreadV2", + "app.bsky.unspecced.getSuggestedFeeds", + "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "app.bsky.unspecced.getSuggestedOnboardingUsers", + "app.bsky.unspecced.getSuggestedStarterPacks", + "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "app.bsky.unspecced.getSuggestedUsers", + "app.bsky.unspecced.getSuggestedUsersForDiscover", + "app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton", + "app.bsky.unspecced.getSuggestedUsersForExplore", + "app.bsky.unspecced.getSuggestedUsersForExploreSkeleton", + "app.bsky.unspecced.getSuggestedUsersForSeeMore", + "app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton", + "app.bsky.unspecced.getSuggestedUsersSkeleton", + "app.bsky.unspecced.getSuggestionsSkeleton", + "app.bsky.unspecced.getTaggedSuggestions", + "app.bsky.unspecced.getTrendingTopics", + "app.bsky.unspecced.getTrends", + "app.bsky.unspecced.getTrendsSkeleton", + "app.bsky.unspecced.initAgeAssurance", + "app.bsky.unspecced.searchActorsSkeleton", + "app.bsky.unspecced.searchPostsSkeleton", + "app.bsky.unspecced.searchStarterPacksSkeleton", + "app.bsky.video.defs", + "app.bsky.video.getJobStatus", + "app.bsky.video.getUploadLimits", + "app.bsky.video.uploadVideo", "com.atproto.identity.getRecommendedDidCredentials", "com.atproto.identity.requestPlcOperationSignature", "com.atproto.identity.resolveHandle", @@ -85,7 +222,7 @@ defmodule Tempest.Lexicon.Bundled do "com.atproto.sync.requestCrawl", "com.atproto.sync.subscribeRepos" ], - "generated_at" => "2026-06-13T00:00:00Z", + "generated_at" => "2026-06-14T00:00:00Z", "source_commit" => "6b4f57f49dd113d891bba38c89dada2b8547689b", "source_repo" => "https://github.com/bluesky-social/atproto" } @@ -800,6 +937,120 @@ defmodule Tempest.Lexicon.Bundled do "id" => "app.bsky.actor.getPreferences", "lexicon" => 1 }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "ref" => "app.bsky.actor.defs#profileViewDetailed", + "type" => "ref" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{ + "description" => "Handle or DID of account to fetch profile of.", + "format" => "at-identifier", + "type" => "string" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.actor.getProfile", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get detailed profile views of multiple actors.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "profiles" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileViewDetailed", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["profiles"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{"format" => "at-identifier", "type" => "string"}, + "maxLength" => 25, + "type" => "array" + } + }, + "required" => ["actors"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.actor.getProfiles", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a list of suggested actors. Expected use is discovery of accounts to follow during new account onboarding.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "cursor" => %{"type" => "string"}, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", + "type" => "integer" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["actors"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.actor.getSuggestions", + "lexicon" => 1 + }, %{ "defs" => %{ "main" => %{ @@ -885,1540 +1136,7695 @@ defmodule Tempest.Lexicon.Bundled do }, %{ "defs" => %{ - "aspectRatio" => %{ - "description" => - "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.", - "properties" => %{ - "height" => %{"minimum" => 1, "type" => "integer"}, - "width" => %{"minimum" => 1, "type" => "integer"} + "main" => %{ + "description" => "Find actors (profiles) matching search criteria. Does not require auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "cursor" => %{"type" => "string"} + }, + "required" => ["actors"], + "type" => "object" + } }, - "required" => ["width", "height"], - "type" => "object" + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 25, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "q" => %{ + "description" => + "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.", + "type" => "string" + }, + "term" => %{ + "description" => "DEPRECATED: use 'q' instead.", + "type" => "string" + } + }, + "type" => "params" + }, + "type" => "query" } }, - "id" => "app.bsky.embed.defs", + "id" => "app.bsky.actor.searchActors", "lexicon" => 1 }, %{ "defs" => %{ - "colorRGB" => %{ - "description" => "RGB color definition, inspired by site.standard.theme.color#rgb", - "properties" => %{ - "b" => %{"maximum" => 255, "minimum" => 0, "type" => "integer"}, - "g" => %{"maximum" => 255, "minimum" => 0, "type" => "integer"}, - "r" => %{"maximum" => 255, "minimum" => 0, "type" => "integer"} + "main" => %{ + "description" => + "Find actor suggestions for a prefix search term. Expected use is for auto-completion during text field entry. Does not require auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["actors"], + "type" => "object" + } }, - "required" => ["r", "g", "b"], - "type" => "object" - }, - "external" => %{ - "properties" => %{ - "associatedRefs" => %{ - "description" => "StrongRefs (uri+cid) of the Atmosphere records that backed this view.", - "items" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"}, - "type" => "array" - }, - "description" => %{"type" => "string"}, - "thumb" => %{ - "accept" => ["image/*"], - "maxSize" => 1_000_000, - "type" => "blob" + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "q" => %{ + "description" => "Search query prefix; not a full query string.", + "type" => "string" + }, + "term" => %{ + "description" => "DEPRECATED: use 'q' instead.", + "type" => "string" + } }, - "title" => %{"type" => "string"}, - "uri" => %{"format" => "uri", "type" => "string"} + "type" => "params" }, - "required" => ["uri", "title", "description"], - "type" => "object" + "type" => "query" + } + }, + "id" => "app.bsky.actor.searchActorsTypeahead", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "live" => %{ + "description" => "Advertises an account as currently offering live content.", + "type" => "token" }, "main" => %{ - "description" => - "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", - "properties" => %{ - "external" => %{"ref" => "#external", "type" => "ref"} + "description" => "A declaration of a Bluesky account status.", + "key" => "literal:self", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "durationMinutes" => %{ + "description" => + "The duration of the status in minutes. Applications can choose to impose minimum and maximum limits.", + "minimum" => 1, + "type" => "integer" + }, + "embed" => %{ + "description" => "An optional embed associated with the status.", + "refs" => ["app.bsky.embed.external"], + "type" => "union" + }, + "status" => %{ + "description" => "The status for the account.", + "knownValues" => ["app.bsky.actor.status#live"], + "type" => "string" + } + }, + "required" => ["status", "createdAt"], + "type" => "object" }, - "required" => ["external"], - "type" => "object" - }, - "view" => %{ - "properties" => %{ - "external" => %{"ref" => "#viewExternal", "type" => "ref"} + "type" => "record" + } + }, + "id" => "app.bsky.actor.status", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Initiate Age Assurance for an account.", + "errors" => [ + %{"name" => "InvalidEmail"}, + %{"name" => "DidTooLong"}, + %{"name" => "InvalidInitiation"}, + %{"name" => "RegionNotSupported"} + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "countryCode" => %{ + "description" => "An ISO 3166-1 alpha-2 code of the user's location.", + "type" => "string" + }, + "email" => %{ + "description" => "The user's email address to receive Age Assurance instructions.", + "type" => "string" + }, + "language" => %{ + "description" => "The user's preferred language for communication during the Age Assurance process.", + "type" => "string" + }, + "regionCode" => %{ + "description" => "An optional ISO 3166-2 code of the user's region or state within the country.", + "type" => "string" + } + }, + "required" => ["email", "language", "countryCode"], + "type" => "object" + } }, - "required" => ["external"], - "type" => "object" + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "ref" => "app.bsky.ageassurance.defs#state", + "type" => "ref" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.ageassurance.begin", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "access" => %{ + "description" => "The access level granted based on Age Assurance data we've processed.", + "knownValues" => ["unknown", "none", "safe", "full"], + "type" => "string" }, - "viewExternal" => %{ + "config" => %{ + "description" => "", "properties" => %{ - "associatedProfiles" => %{ - "description" => "Profiles of the owners of the Atmosphere records that backed this view.", + "regions" => %{ + "description" => "The per-region Age Assurance configuration.", "items" => %{ - "ref" => "app.bsky.actor.defs#profileViewBasic", + "ref" => "app.bsky.ageassurance.defs#configRegion", "type" => "ref" }, "type" => "array" + } + }, + "required" => ["regions"], + "type" => "object" + }, + "configRegion" => %{ + "description" => "The Age Assurance configuration for a specific region.", + "properties" => %{ + "countryCode" => %{ + "description" => "The ISO 3166-1 alpha-2 country code this configuration applies to.", + "type" => "string" }, - "associatedRefs" => %{ - "description" => "StrongRefs (uri+cid) of the Atmosphere records that backed this view.", - "items" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"}, - "type" => "array" - }, - "createdAt" => %{ + "minAccessAge" => %{ + "description" => "The minimum age (as a whole integer) required to use Bluesky in this region.", + "type" => "integer" + }, + "regionCode" => %{ "description" => - "When the external content was created, if available. Example: a publication date, for an article.", - "format" => "datetime", + "The ISO 3166-2 region code this configuration applies to. If omitted, the configuration applies to the entire country.", "type" => "string" }, - "description" => %{"type" => "string"}, - "labels" => %{ + "rules" => %{ + "description" => + "The ordered list of Age Assurance rules that apply to this region. Rules should be applied in order, and the first matching rule determines the access level granted. The rules array should always include a default rule as the last item.", "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" + "refs" => [ + "#configRegionRuleDefault", + "#configRegionRuleIfDeclaredOverAge", + "#configRegionRuleIfDeclaredUnderAge", + "#configRegionRuleIfAssuredOverAge", + "#configRegionRuleIfAssuredUnderAge", + "#configRegionRuleIfAccountNewerThan", + "#configRegionRuleIfAccountOlderThan" + ], + "type" => "union" }, "type" => "array" + } + }, + "required" => ["countryCode", "minAccessAge", "rules"], + "type" => "object" + }, + "configRegionRuleDefault" => %{ + "description" => "Age Assurance rule that applies by default.", + "properties" => %{ + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" + } + }, + "required" => ["access"], + "type" => "object" + }, + "configRegionRuleIfAccountNewerThan" => %{ + "description" => "Age Assurance rule that applies if the account is equal-to or newer than a certain date.", + "properties" => %{ + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" }, - "readingTime" => %{ - "description" => "Estimated reading time in minutes, if applicable and available.", - "type" => "integer" - }, - "source" => %{"ref" => "#viewExternalSource", "type" => "ref"}, - "thumb" => %{"format" => "uri", "type" => "string"}, - "title" => %{"type" => "string"}, - "updatedAt" => %{ - "description" => "When the external content was updated, if available.", + "date" => %{ + "description" => "The date threshold as a datetime string.", "format" => "datetime", "type" => "string" - }, - "uri" => %{"format" => "uri", "type" => "string"} + } }, - "required" => ["uri", "title", "description"], + "required" => ["date", "access"], "type" => "object" }, - "viewExternalSource" => %{ - "description" => "The source of an external embed, such as a standard.site publication.", + "configRegionRuleIfAccountOlderThan" => %{ + "description" => "Age Assurance rule that applies if the account is older than a certain date.", "properties" => %{ - "description" => %{"type" => "string"}, - "icon" => %{ - "description" => - "Fully-qualified URL where an icon representing the source can be fetched. For example, CDN location provided by the App View.", - "format" => "uri", - "type" => "string" + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" }, - "theme" => %{"ref" => "#viewExternalSourceTheme", "type" => "ref"}, - "title" => %{"type" => "string"}, - "uri" => %{ - "description" => - "URI of the source, if available. Example: the https:// URL of a site.standard.publication record.", - "format" => "uri", + "date" => %{ + "description" => "The date threshold as a datetime string.", + "format" => "datetime", "type" => "string" } }, - "required" => ["uri", "title"], + "required" => ["date", "access"], "type" => "object" }, - "viewExternalSourceTheme" => %{ + "configRegionRuleIfAssuredOverAge" => %{ "description" => - "The theme colors of an external source, such as a site.standard.publication. These colors may be used when rendering an embed from that source.", + "Age Assurance rule that applies if the user has been assured to be equal-to or over a certain age.", "properties" => %{ - "accentForegroundRGB" => %{"ref" => "#colorRGB", "type" => "ref"}, - "accentRGB" => %{"ref" => "#colorRGB", "type" => "ref"}, - "backgroundRGB" => %{"ref" => "#colorRGB", "type" => "ref"}, - "foregroundRGB" => %{"ref" => "#colorRGB", "type" => "ref"} + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" + }, + "age" => %{ + "description" => "The age threshold as a whole integer.", + "type" => "integer" + } }, + "required" => ["age", "access"], "type" => "object" - } - }, - "id" => "app.bsky.embed.external", - "lexicon" => 1 - }, - %{ - "defs" => %{ - "image" => %{ + }, + "configRegionRuleIfAssuredUnderAge" => %{ + "description" => "Age Assurance rule that applies if the user has been assured to be under a certain age.", "properties" => %{ - "alt" => %{ - "description" => "Alt text description of the image, for accessibility.", - "type" => "string" - }, - "aspectRatio" => %{ - "ref" => "app.bsky.embed.defs#aspectRatio", + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", "type" => "ref" }, - "image" => %{ - "accept" => ["image/*"], - "maxSize" => 2_000_000, - "type" => "blob" + "age" => %{ + "description" => "The age threshold as a whole integer.", + "type" => "integer" } }, - "required" => ["image", "alt", "aspectRatio"], + "required" => ["age", "access"], "type" => "object" }, - "main" => %{ + "configRegionRuleIfDeclaredOverAge" => %{ + "description" => + "Age Assurance rule that applies if the user has declared themselves equal-to or over a certain age.", "properties" => %{ - "items" => %{ - "description" => - "The schema-level maxLength of 20 is a future-proof ceiling. Clients should currently enforce a soft limit of 10 items in authoring UIs.", - "items" => %{ - "description" => - "The media items in the gallery. Each item may be of a different type, but all types must be supported by the client.", - "refs" => ["#image"], - "type" => "union" - }, - "maxLength" => 20, - "type" => "array" + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" + }, + "age" => %{ + "description" => "The age threshold as a whole integer.", + "type" => "integer" } }, - "required" => ["items"], + "required" => ["age", "access"], "type" => "object" }, - "view" => %{ + "configRegionRuleIfDeclaredUnderAge" => %{ + "description" => "Age Assurance rule that applies if the user has declared themselves under a certain age.", "properties" => %{ - "items" => %{ - "items" => %{"refs" => ["#viewImage"], "type" => "union"}, - "type" => "array" + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" + }, + "age" => %{ + "description" => "The age threshold as a whole integer.", + "type" => "integer" } }, - "required" => ["items"], + "required" => ["age", "access"], "type" => "object" }, - "viewImage" => %{ + "event" => %{ + "description" => "Object used to store Age Assurance data in stash.", "properties" => %{ - "alt" => %{ - "description" => "Alt text description of the image, for accessibility.", + "access" => %{ + "description" => "The access level granted based on Age Assurance data we've processed.", + "knownValues" => ["unknown", "none", "safe", "full"], "type" => "string" }, - "aspectRatio" => %{ - "ref" => "app.bsky.embed.defs#aspectRatio", - "type" => "ref" + "attemptId" => %{ + "description" => "The unique identifier for this instance of the Age Assurance flow, in UUID format.", + "type" => "string" }, - "fullsize" => %{ - "description" => - "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View.", - "format" => "uri", + "completeIp" => %{ + "description" => "The IP address used when completing the Age Assurance flow.", "type" => "string" }, - "thumbnail" => %{ - "description" => - "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View.", - "format" => "uri", + "completeUa" => %{ + "description" => "The user agent used when completing the Age Assurance flow.", "type" => "string" - } - }, - "required" => ["thumbnail", "fullsize", "alt", "aspectRatio"], - "type" => "object" - } - }, - "description" => "An assortment of media embedded in a Bluesky record (eg, a post).", - "id" => "app.bsky.embed.gallery", - "lexicon" => 1 - }, - %{ - "defs" => %{ - "image" => %{ - "properties" => %{ - "alt" => %{ - "description" => "Alt text description of the image, for accessibility.", + }, + "countryCode" => %{ + "description" => "The ISO 3166-1 alpha-2 country code provided when beginning the Age Assurance flow.", "type" => "string" }, - "aspectRatio" => %{ - "ref" => "app.bsky.embed.defs#aspectRatio", - "type" => "ref" + "createdAt" => %{ + "description" => "The date and time of this write operation.", + "format" => "datetime", + "type" => "string" }, - "image" => %{ - "accept" => ["image/*"], - "description" => "The raw image file. May be up to 2 MB, formerly limited to 1 MB.", - "maxSize" => 2_000_000, - "type" => "blob" + "email" => %{ + "description" => "The email used for Age Assurance.", + "type" => "string" + }, + "initIp" => %{ + "description" => "The IP address used when initiating the Age Assurance flow.", + "type" => "string" + }, + "initUa" => %{ + "description" => "The user agent used when initiating the Age Assurance flow.", + "type" => "string" + }, + "regionCode" => %{ + "description" => "The ISO 3166-2 region code provided when beginning the Age Assurance flow.", + "type" => "string" + }, + "status" => %{ + "description" => "The status of the Age Assurance process.", + "knownValues" => ["unknown", "pending", "assured", "blocked"], + "type" => "string" } }, - "required" => ["image", "alt"], + "required" => ["createdAt", "status", "access", "attemptId", "countryCode"], "type" => "object" }, - "main" => %{ + "state" => %{ + "description" => "The user's computed Age Assurance state.", "properties" => %{ - "images" => %{ - "items" => %{"ref" => "#image", "type" => "ref"}, - "maxLength" => 4, - "type" => "array" + "access" => %{ + "ref" => "app.bsky.ageassurance.defs#access", + "type" => "ref" + }, + "lastInitiatedAt" => %{ + "description" => "The timestamp when this state was last updated.", + "format" => "datetime", + "type" => "string" + }, + "status" => %{ + "ref" => "app.bsky.ageassurance.defs#status", + "type" => "ref" } }, - "required" => ["images"], + "required" => ["status", "access"], "type" => "object" }, - "view" => %{ + "stateMetadata" => %{ + "description" => "Additional metadata needed to compute Age Assurance state client-side.", "properties" => %{ - "images" => %{ - "items" => %{"ref" => "#viewImage", "type" => "ref"}, - "maxLength" => 4, - "type" => "array" + "accountCreatedAt" => %{ + "description" => "The account creation timestamp.", + "format" => "datetime", + "type" => "string" } }, - "required" => ["images"], + "required" => [], "type" => "object" }, - "viewImage" => %{ - "properties" => %{ - "alt" => %{ - "description" => "Alt text description of the image, for accessibility.", - "type" => "string" - }, - "aspectRatio" => %{ - "ref" => "app.bsky.embed.defs#aspectRatio", + "status" => %{ + "description" => "The status of the Age Assurance process.", + "knownValues" => ["unknown", "pending", "assured", "blocked"], + "type" => "string" + } + }, + "id" => "app.bsky.ageassurance.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Returns Age Assurance configuration for use on the client.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "ref" => "app.bsky.ageassurance.defs#config", "type" => "ref" - }, - "fullsize" => %{ - "description" => - "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View.", - "format" => "uri", - "type" => "string" - }, - "thumb" => %{ - "description" => - "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View.", - "format" => "uri", - "type" => "string" } }, - "required" => ["thumb", "fullsize", "alt"], - "type" => "object" + "type" => "query" } }, - "description" => "A set of images embedded in a Bluesky record (eg, a post).", - "id" => "app.bsky.embed.images", + "id" => "app.bsky.ageassurance.getConfig", "lexicon" => 1 }, %{ "defs" => %{ "main" => %{ - "properties" => %{ - "record" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + "description" => + "Returns server-computed Age Assurance state, if available, and any additional metadata needed to compute Age Assurance state client-side.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "metadata" => %{ + "ref" => "app.bsky.ageassurance.defs#stateMetadata", + "type" => "ref" + }, + "state" => %{ + "ref" => "app.bsky.ageassurance.defs#state", + "type" => "ref" + } + }, + "required" => ["state", "metadata"], + "type" => "object" + } }, - "required" => ["record"], - "type" => "object" - }, - "view" => %{ - "properties" => %{ - "record" => %{ - "refs" => [ - "#viewRecord", - "#viewNotFound", - "#viewBlocked", - "#viewDetached", - "app.bsky.feed.defs#generatorView", - "app.bsky.graph.defs#listView", - "app.bsky.labeler.defs#labelerView", - "app.bsky.graph.defs#starterPackViewBasic" - ], - "type" => "union" - } - }, - "required" => ["record"], - "type" => "object" - }, - "viewBlocked" => %{ - "properties" => %{ - "author" => %{ - "ref" => "app.bsky.feed.defs#blockedAuthor", - "type" => "ref" + "parameters" => %{ + "properties" => %{ + "countryCode" => %{"type" => "string"}, + "regionCode" => %{"type" => "string"} }, - "blocked" => %{"const" => true, "type" => "boolean"}, - "uri" => %{"format" => "at-uri", "type" => "string"} - }, - "required" => ["uri", "blocked", "author"], - "type" => "object" - }, - "viewDetached" => %{ - "properties" => %{ - "detached" => %{"const" => true, "type" => "boolean"}, - "uri" => %{"format" => "at-uri", "type" => "string"} - }, - "required" => ["uri", "detached"], - "type" => "object" - }, - "viewNotFound" => %{ - "properties" => %{ - "notFound" => %{"const" => true, "type" => "boolean"}, - "uri" => %{"format" => "at-uri", "type" => "string"} + "required" => ["countryCode"], + "type" => "params" }, - "required" => ["uri", "notFound"], - "type" => "object" - }, - "viewRecord" => %{ - "properties" => %{ - "author" => %{ - "ref" => "app.bsky.actor.defs#profileViewBasic", - "type" => "ref" - }, - "cid" => %{"format" => "cid", "type" => "string"}, - "embeds" => %{ - "items" => %{ - "refs" => [ - "app.bsky.embed.images#view", - "app.bsky.embed.video#view", - "app.bsky.embed.gallery#view", - "app.bsky.embed.external#view", - "app.bsky.embed.record#view", - "app.bsky.embed.recordWithMedia#view" - ], - "type" => "union" - }, - "type" => "array" + "type" => "query" + } + }, + "id" => "app.bsky.ageassurance.getState", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => "Can not update or delete posts.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "inheritAud" => true, + "lxm" => ["app.bsky.video.uploadVideo", "app.bsky.video.getJobStatus", "app.bsky.video.getUploadLimits"], + "resource" => "rpc", + "type" => "permission" }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" - }, - "type" => "array" + %{ + "action" => ["create"], + "collection" => ["app.bsky.feed.post", "app.bsky.feed.postgate", "app.bsky.feed.threadgate"], + "resource" => "repo", + "type" => "permission" + } + ], + "title" => "Create Bluesky Posts", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authCreatePosts", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => "Clean up public account history: posts, reposts, and likes.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "action" => ["delete"], + "collection" => [ + "app.bsky.feed.like", + "app.bsky.feed.post", + "app.bsky.feed.postgate", + "app.bsky.feed.repost", + "app.bsky.feed.threadgate" + ], + "resource" => "repo", + "type" => "permission" + } + ], + "title" => "Delete Bluesky Content", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authDeleteContent", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => + "Manage all public content and interactions, private preferences and subscriptions, and other Bluesky-specific app features and data.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "inheritAud" => true, + "lxm" => [ + "app.bsky.actor.getPreferences", + "app.bsky.actor.getProfile", + "app.bsky.actor.getProfiles", + "app.bsky.actor.getSuggestions", + "app.bsky.actor.putPreferences", + "app.bsky.actor.searchActors", + "app.bsky.actor.searchActorsTypeahead", + "app.bsky.bookmark.createBookmark", + "app.bsky.bookmark.deleteBookmark", + "app.bsky.bookmark.getBookmarks", + "app.bsky.contact.dismissMatch", + "app.bsky.contact.getMatches", + "app.bsky.contact.getSyncStatus", + "app.bsky.contact.importContacts", + "app.bsky.contact.removeData", + "app.bsky.contact.startPhoneVerification", + "app.bsky.contact.verifyPhone", + "app.bsky.feed.describeFeedGenerator", + "app.bsky.feed.getActorFeeds", + "app.bsky.feed.getActorLikes", + "app.bsky.feed.getAuthorFeed", + "app.bsky.feed.getFeed", + "app.bsky.feed.getFeedGenerator", + "app.bsky.feed.getFeedGenerators", + "app.bsky.feed.getFeedSkeleton", + "app.bsky.feed.getLikes", + "app.bsky.feed.getListFeed", + "app.bsky.feed.getPostThread", + "app.bsky.feed.getPosts", + "app.bsky.feed.getQuotes", + "app.bsky.feed.getRepostedBy", + "app.bsky.feed.getSuggestedFeeds", + "app.bsky.feed.getTimeline", + "app.bsky.feed.searchPosts", + "app.bsky.feed.sendInteractions", + "app.bsky.graph.getActorStarterPacks", + "app.bsky.graph.getBlocks", + "app.bsky.graph.getFollowers", + "app.bsky.graph.getFollows", + "app.bsky.graph.getKnownFollowers", + "app.bsky.graph.getList", + "app.bsky.graph.getListBlocks", + "app.bsky.graph.getListMutes", + "app.bsky.graph.getLists", + "app.bsky.graph.getListsWithMembership", + "app.bsky.graph.getMutes", + "app.bsky.graph.getRelationships", + "app.bsky.graph.getStarterPack", + "app.bsky.graph.getStarterPacks", + "app.bsky.graph.getStarterPacksWithMembership", + "app.bsky.graph.getSuggestedFollowsByActor", + "app.bsky.graph.muteActor", + "app.bsky.graph.muteActorList", + "app.bsky.graph.muteThread", + "app.bsky.graph.searchStarterPacks", + "app.bsky.graph.unmuteActor", + "app.bsky.graph.unmuteActorList", + "app.bsky.graph.unmuteThread", + "app.bsky.labeler.getServices", + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.putActivitySubscription", + "app.bsky.notification.putPreferences", + "app.bsky.notification.putPreferencesV2", + "app.bsky.notification.registerPush", + "app.bsky.notification.unregisterPush", + "app.bsky.notification.updateSeen", + "app.bsky.unspecced.getAgeAssuranceState", + "app.bsky.unspecced.getConfig", + "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "app.bsky.unspecced.getPopularFeedGenerators", + "app.bsky.unspecced.getPostThreadOtherV2", + "app.bsky.unspecced.getPostThreadV2", + "app.bsky.unspecced.getSuggestedFeeds", + "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "app.bsky.unspecced.getSuggestedStarterPacks", + "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "app.bsky.unspecced.getSuggestedUsers", + "app.bsky.unspecced.getSuggestedUsersSkeleton", + "app.bsky.unspecced.getSuggestionsSkeleton", + "app.bsky.unspecced.getTaggedSuggestions", + "app.bsky.unspecced.getTrendingTopics", + "app.bsky.unspecced.getTrends", + "app.bsky.unspecced.getTrendsSkeleton", + "app.bsky.unspecced.initAgeAssurance", + "app.bsky.unspecced.searchActorsSkeleton", + "app.bsky.unspecced.searchPostsSkeleton", + "app.bsky.unspecced.searchStarterPacksSkeleton", + "app.bsky.video.getJobStatus", + "app.bsky.video.getUploadLimits", + "app.bsky.video.uploadVideo" + ], + "resource" => "rpc", + "type" => "permission" }, - "likeCount" => %{"type" => "integer"}, - "quoteCount" => %{"type" => "integer"}, - "replyCount" => %{"type" => "integer"}, - "repostCount" => %{"type" => "integer"}, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "value" => %{ - "description" => "The record data itself.", - "type" => "unknown" + %{ + "action" => ["create", "update", "delete"], + "collection" => [ + "app.bsky.actor.profile", + "app.bsky.actor.status", + "app.bsky.feed.like", + "app.bsky.feed.post", + "app.bsky.feed.postgate", + "app.bsky.feed.repost", + "app.bsky.feed.threadgate", + "app.bsky.graph.block", + "app.bsky.graph.follow", + "app.bsky.graph.list", + "app.bsky.graph.listblock", + "app.bsky.graph.listitem", + "app.bsky.graph.starterpack", + "app.bsky.notification.declaration" + ], + "resource" => "repo", + "type" => "permission" } - }, - "required" => ["uri", "cid", "author", "value", "indexedAt"], - "type" => "object" + ], + "title" => "Full Bluesky Social App Permissions", + "title:lang" => %{}, + "type" => "permission-set" } }, - "description" => - "A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record.", - "id" => "app.bsky.embed.record", + "id" => "app.bsky.authFullApp", "lexicon" => 1 }, %{ "defs" => %{ "main" => %{ - "properties" => %{ - "media" => %{ - "refs" => [ - "app.bsky.embed.images", - "app.bsky.embed.video", - "app.bsky.embed.gallery", - "app.bsky.embed.external" + "detail" => "Configure feed generator declaration records.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "action" => ["create", "update", "delete"], + "collection" => ["app.bsky.feed.generator"], + "resource" => "repo", + "type" => "permission" + } + ], + "title" => "Manage Hosted Feeds", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authManageFeedDeclarations", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => "Configure labeler declaration records.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "action" => ["create", "update", "delete"], + "collection" => ["app.bsky.labeler.service"], + "resource" => "repo", + "type" => "permission" + } + ], + "title" => "Manage Hosted Labeling Service", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authManageLabelerService", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => "Control over blocks, mutes, mod lists, mod services, and preferences.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "inheritAud" => true, + "lxm" => [ + "app.bsky.actor.getPreferences", + "app.bsky.actor.putPreferences", + "app.bsky.graph.muteActor", + "app.bsky.graph.muteActorList", + "app.bsky.graph.muteThread", + "app.bsky.graph.unmuteActor", + "app.bsky.graph.unmuteActorList", + "app.bsky.graph.unmuteThread" ], - "type" => "union" + "resource" => "rpc", + "type" => "permission" }, - "record" => %{"ref" => "app.bsky.embed.record", "type" => "ref"} + %{ + "action" => ["create", "update", "delete"], + "collection" => ["app.bsky.graph.block", "app.bsky.graph.listblock"], + "resource" => "repo", + "type" => "permission" + } + ], + "title" => "Manage Personal Moderation", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authManageModeration", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => "View and configure notifications for the Bluesky app.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "inheritAud" => true, + "lxm" => [ + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.putActivitySubscription", + "app.bsky.notification.putPreferences", + "app.bsky.notification.putPreferencesV2", + "app.bsky.notification.registerPush", + "app.bsky.notification.unregisterPush", + "app.bsky.notification.updateSeen" + ], + "resource" => "rpc", + "type" => "permission" + } + ], + "title" => "Manage Bluesky Notifications", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authManageNotifications", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => "Update profile data, as well as status and public chat visibility.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "action" => ["create", "update", "delete"], + "collection" => ["app.bsky.actor.profile", "app.bsky.actor.status", "app.bsky.notification.declaration"], + "resource" => "repo", + "type" => "permission" + } + ], + "title" => "Manage Bluesky Profile", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authManageProfile", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "detail" => + "View Bluesky network content from account perspective, and read all notifications and preferences.", + "detail:lang" => %{}, + "permissions" => [ + %{ + "inheritAud" => true, + "lxm" => [ + "app.bsky.actor.getPreferences", + "app.bsky.actor.getProfile", + "app.bsky.actor.getProfiles", + "app.bsky.actor.getSuggestions", + "app.bsky.actor.searchActors", + "app.bsky.actor.searchActorsTypeahead", + "app.bsky.bookmark.getBookmarks", + "app.bsky.feed.describeFeedGenerator", + "app.bsky.feed.getActorFeeds", + "app.bsky.feed.getActorLikes", + "app.bsky.feed.getAuthorFeed", + "app.bsky.feed.getFeed", + "app.bsky.feed.getFeedGenerator", + "app.bsky.feed.getFeedGenerators", + "app.bsky.feed.getFeedSkeleton", + "app.bsky.feed.getLikes", + "app.bsky.feed.getListFeed", + "app.bsky.feed.getPostThread", + "app.bsky.feed.getPosts", + "app.bsky.feed.getQuotes", + "app.bsky.feed.getRepostedBy", + "app.bsky.feed.getSuggestedFeeds", + "app.bsky.feed.getTimeline", + "app.bsky.feed.searchPosts", + "app.bsky.graph.getActorStarterPacks", + "app.bsky.graph.getBlocks", + "app.bsky.graph.getFollowers", + "app.bsky.graph.getFollows", + "app.bsky.graph.getKnownFollowers", + "app.bsky.graph.getListBlocks", + "app.bsky.graph.getListMutes", + "app.bsky.graph.getLists", + "app.bsky.graph.getListsWithMembership", + "app.bsky.graph.getMutes", + "app.bsky.graph.getRelationships", + "app.bsky.graph.getStarterPack", + "app.bsky.graph.getStarterPacks", + "app.bsky.graph.getStarterPacksWithMembership", + "app.bsky.graph.getSuggestedFollowsByActor", + "app.bsky.graph.searchStarterPacks", + "app.bsky.labeler.getServices", + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.updateSeen", + "app.bsky.unspecced.getAgeAssuranceState", + "app.bsky.unspecced.getConfig", + "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "app.bsky.unspecced.getPopularFeedGenerators", + "app.bsky.unspecced.getPostThreadOtherV2", + "app.bsky.unspecced.getPostThreadV2", + "app.bsky.unspecced.getSuggestedFeeds", + "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "app.bsky.unspecced.getSuggestedStarterPacks", + "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "app.bsky.unspecced.getSuggestedUsers", + "app.bsky.unspecced.getSuggestedUsersSkeleton", + "app.bsky.unspecced.getSuggestionsSkeleton", + "app.bsky.unspecced.getTaggedSuggestions", + "app.bsky.unspecced.getTrendingTopics", + "app.bsky.unspecced.getTrends", + "app.bsky.unspecced.getTrendsSkeleton", + "app.bsky.unspecced.searchActorsSkeleton", + "app.bsky.unspecced.searchPostsSkeleton", + "app.bsky.unspecced.searchStarterPacksSkeleton", + "app.bsky.video.getUploadLimits" + ], + "resource" => "rpc", + "type" => "permission" + } + ], + "title" => "Read-only access to all content", + "title:lang" => %{}, + "type" => "permission-set" + } + }, + "id" => "app.bsky.authViewAll", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Creates a private bookmark for the specified record. Currently, only `app.bsky.feed.post` records are supported. Requires authentication.", + "errors" => [ + %{ + "description" => "The URI to be bookmarked is for an unsupported collection.", + "name" => "UnsupportedCollection" + } + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "cid"], + "type" => "object" + } }, - "required" => ["record", "media"], + "type" => "procedure" + } + }, + "id" => "app.bsky.bookmark.createBookmark", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "bookmark" => %{ + "description" => "Object used to store bookmark data in stash.", + "properties" => %{ + "subject" => %{ + "description" => + "A strong ref to the record to be bookmarked. Currently, only `app.bsky.feed.post` records are supported.", + "ref" => "com.atproto.repo.strongRef", + "type" => "ref" + } + }, + "required" => ["subject"], "type" => "object" }, - "view" => %{ + "bookmarkView" => %{ "properties" => %{ - "media" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "item" => %{ "refs" => [ - "app.bsky.embed.images#view", - "app.bsky.embed.video#view", - "app.bsky.embed.gallery#view", - "app.bsky.embed.external#view" + "app.bsky.feed.defs#blockedPost", + "app.bsky.feed.defs#notFoundPost", + "app.bsky.feed.defs#postView" ], "type" => "union" }, - "record" => %{"ref" => "app.bsky.embed.record#view", "type" => "ref"} + "subject" => %{ + "description" => "A strong ref to the bookmarked record.", + "ref" => "com.atproto.repo.strongRef", + "type" => "ref" + } }, - "required" => ["record", "media"], + "required" => ["subject", "item"], "type" => "object" } }, - "description" => - "A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card.", - "id" => "app.bsky.embed.recordWithMedia", + "id" => "app.bsky.bookmark.defs", "lexicon" => 1 }, %{ "defs" => %{ - "caption" => %{ - "properties" => %{ - "file" => %{ - "accept" => ["text/vtt"], - "maxSize" => 20000, - "type" => "blob" - }, - "lang" => %{"format" => "language", "type" => "string"} - }, - "required" => ["lang", "file"], - "type" => "object" - }, "main" => %{ - "properties" => %{ - "alt" => %{ - "description" => "Alt text description of the video, for accessibility.", - "maxGraphemes" => 1000, - "maxLength" => 10000, - "type" => "string" - }, - "aspectRatio" => %{ - "ref" => "app.bsky.embed.defs#aspectRatio", - "type" => "ref" - }, - "captions" => %{ - "items" => %{"ref" => "#caption", "type" => "ref"}, - "maxLength" => 20, - "type" => "array" - }, - "presentation" => %{ - "description" => "A hint to the client about how to present the video.", - "knownValues" => ["default", "gif"], - "type" => "string" - }, - "video" => %{ - "accept" => ["video/mp4"], - "description" => "The mp4 video file. May be up to 100mb, formerly limited to 50mb.", - "maxSize" => 100_000_000, - "type" => "blob" + "description" => + "Deletes a private bookmark for the specified record. Currently, only `app.bsky.feed.post` records are supported. Requires authentication.", + "errors" => [ + %{ + "description" => "The URI to be bookmarked is for an unsupported collection.", + "name" => "UnsupportedCollection" + } + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri"], + "type" => "object" } }, - "required" => ["video"], - "type" => "object" - }, - "view" => %{ - "properties" => %{ - "alt" => %{ - "maxGraphemes" => 1000, - "maxLength" => 10000, - "type" => "string" - }, - "aspectRatio" => %{ - "ref" => "app.bsky.embed.defs#aspectRatio", - "type" => "ref" - }, - "cid" => %{"format" => "cid", "type" => "string"}, - "playlist" => %{"format" => "uri", "type" => "string"}, - "presentation" => %{ - "description" => "A hint to the client about how to present the video.", - "knownValues" => ["default", "gif"], - "type" => "string" - }, - "thumbnail" => %{"format" => "uri", "type" => "string"} - }, - "required" => ["cid", "playlist"], - "type" => "object" + "type" => "procedure" } }, - "description" => "A video embedded in a Bluesky record (eg, a post).", - "id" => "app.bsky.embed.video", + "id" => "app.bsky.bookmark.deleteBookmark", "lexicon" => 1 }, %{ "defs" => %{ - "blockedAuthor" => %{ - "properties" => %{ - "did" => %{"format" => "did", "type" => "string"}, - "viewer" => %{ - "ref" => "app.bsky.actor.defs#viewerState", - "type" => "ref" + "main" => %{ + "description" => "Gets views of records bookmarked by the authenticated user. Requires authentication.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "bookmarks" => %{ + "items" => %{ + "ref" => "app.bsky.bookmark.defs#bookmarkView", + "type" => "ref" + }, + "type" => "array" + }, + "cursor" => %{"type" => "string"} + }, + "required" => ["bookmarks"], + "type" => "object" } }, - "required" => ["did"], - "type" => "object" - }, - "blockedPost" => %{ - "properties" => %{ - "author" => %{"ref" => "#blockedAuthor", "type" => "ref"}, - "blocked" => %{"const" => true, "type" => "boolean"}, - "uri" => %{"format" => "at-uri", "type" => "string"} + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" }, - "required" => ["uri", "blocked", "author"], - "type" => "object" - }, - "clickthroughAuthor" => %{ - "description" => "User clicked through to the author of the feed item", - "type" => "token" - }, - "clickthroughEmbed" => %{ - "description" => "User clicked through to the embedded content of the feed item", - "type" => "token" - }, - "clickthroughItem" => %{ - "description" => "User clicked through to the feed item", - "type" => "token" - }, - "clickthroughReposter" => %{ - "description" => "User clicked through to the reposter of the feed item", - "type" => "token" - }, - "contentModeUnspecified" => %{ - "description" => "Declares the feed generator returns any types of posts.", - "type" => "token" - }, - "contentModeVideo" => %{ - "description" => "Declares the feed generator returns posts containing app.bsky.embed.video embeds.", - "type" => "token" - }, - "feedViewPost" => %{ + "type" => "query" + } + }, + "id" => "app.bsky.bookmark.getBookmarks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "matchAndContactIndex" => %{ + "description" => + "Associates a profile with the positional index of the contact import input in the call to `app.bsky.contact.importContacts`, so clients can know which phone caused a particular match.", "properties" => %{ - "feedContext" => %{ - "description" => "Context provided by feed generator that may be passed back alongside interactions.", - "maxLength" => 2000, - "type" => "string" - }, - "post" => %{"ref" => "#postView", "type" => "ref"}, - "reason" => %{ - "refs" => ["#reasonRepost", "#reasonPin"], - "type" => "union" + "contactIndex" => %{ + "description" => "The index of this match in the import contact input.", + "maximum" => 999, + "minimum" => 0, + "type" => "integer" }, - "reply" => %{"ref" => "#replyRef", "type" => "ref"}, - "reqId" => %{ - "description" => "Unique identifier per request that may be passed back alongside interactions.", - "maxLength" => 100, - "type" => "string" + "match" => %{ + "description" => "Profile of the matched user.", + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" } }, - "required" => ["post"], + "required" => ["match", "contactIndex"], "type" => "object" }, - "generatorView" => %{ + "notification" => %{ + "description" => "A stash object to be sent via bsync representing a notification to be created.", "properties" => %{ - "acceptsInteractions" => %{"type" => "boolean"}, - "avatar" => %{"format" => "uri", "type" => "string"}, - "cid" => %{"format" => "cid", "type" => "string"}, - "contentMode" => %{ - "knownValues" => ["app.bsky.feed.defs#contentModeUnspecified", "app.bsky.feed.defs#contentModeVideo"], + "from" => %{ + "description" => "The DID of who this notification comes from.", + "format" => "did", "type" => "string" }, - "creator" => %{ - "ref" => "app.bsky.actor.defs#profileView", - "type" => "ref" - }, - "description" => %{ - "maxGraphemes" => 300, - "maxLength" => 3000, + "to" => %{ + "description" => "The DID of who this notification should go to.", + "format" => "did", "type" => "string" - }, - "descriptionFacets" => %{ - "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, - "type" => "array" - }, - "did" => %{"format" => "did", "type" => "string"}, - "displayName" => %{"type" => "string"}, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" - }, - "type" => "array" - }, - "likeCount" => %{"minimum" => 0, "type" => "integer"}, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "viewer" => %{"ref" => "#generatorViewerState", "type" => "ref"} + } }, - "required" => ["uri", "cid", "did", "creator", "displayName", "indexedAt"], - "type" => "object" - }, - "generatorViewerState" => %{ - "properties" => %{"like" => %{"format" => "at-uri", "type" => "string"}}, + "required" => ["from", "to"], "type" => "object" }, - "interaction" => %{ + "syncStatus" => %{ "properties" => %{ - "event" => %{ - "knownValues" => [ - "app.bsky.feed.defs#requestLess", - "app.bsky.feed.defs#requestMore", - "app.bsky.feed.defs#clickthroughItem", - "app.bsky.feed.defs#clickthroughAuthor", - "app.bsky.feed.defs#clickthroughReposter", - "app.bsky.feed.defs#clickthroughEmbed", - "app.bsky.feed.defs#interactionSeen", - "app.bsky.feed.defs#interactionLike", - "app.bsky.feed.defs#interactionRepost", - "app.bsky.feed.defs#interactionReply", - "app.bsky.feed.defs#interactionQuote", - "app.bsky.feed.defs#interactionShare" - ], - "type" => "string" - }, - "feedContext" => %{ + "matchesCount" => %{ "description" => - "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", - "maxLength" => 2000, - "type" => "string" + "Number of existing contact matches resulting of the user imports and of their imported contacts having imported the user. Matches stop being counted when the user either follows the matched contact or dismisses the match.", + "minimum" => 0, + "type" => "integer" }, - "item" => %{"format" => "at-uri", "type" => "string"}, - "reqId" => %{ - "description" => "Unique identifier per request that may be passed back alongside interactions.", - "maxLength" => 100, + "syncedAt" => %{ + "description" => "Last date when contacts where imported.", + "format" => "datetime", "type" => "string" } }, + "required" => ["syncedAt", "matchesCount"], "type" => "object" - }, - "interactionLike" => %{ - "description" => "User liked the feed item", - "type" => "token" - }, - "interactionQuote" => %{ - "description" => "User quoted the feed item", - "type" => "token" - }, - "interactionReply" => %{ - "description" => "User replied to the feed item", - "type" => "token" - }, - "interactionRepost" => %{ - "description" => "User reposted the feed item", - "type" => "token" - }, - "interactionSeen" => %{ - "description" => "Feed item was seen by user", - "type" => "token" - }, - "interactionShare" => %{ - "description" => "User shared the feed item", - "type" => "token" - }, - "notFoundPost" => %{ - "properties" => %{ - "notFound" => %{"const" => true, "type" => "boolean"}, - "uri" => %{"format" => "at-uri", "type" => "string"} - }, - "required" => ["uri", "notFound"], - "type" => "object" - }, - "postView" => %{ - "properties" => %{ - "author" => %{ - "ref" => "app.bsky.actor.defs#profileViewBasic", - "type" => "ref" - }, - "bookmarkCount" => %{"type" => "integer"}, - "cid" => %{"format" => "cid", "type" => "string"}, - "debug" => %{ - "description" => "Debug information for internal development", + } + }, + "id" => "app.bsky.contact.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Removes a match that was found via contact import. It shouldn't appear again if the same contact is re-imported. Requires authentication.", + "errors" => [%{"name" => "InvalidDid"}, %{"name" => "InternalError"}], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "subject" => %{ + "description" => "The subject's DID to dismiss the match with.", + "format" => "did", + "type" => "string" + } + }, + "required" => ["subject"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{"properties" => %{}, "type" => "object"} + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.contact.dismissMatch", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Returns the matched contacts (contacts that were mutually imported). Excludes dismissed matches. Requires authentication.", + "errors" => [ + %{"name" => "InvalidDid"}, + %{"name" => "InvalidLimit"}, + %{"name" => "InvalidCursor"}, + %{"name" => "InternalError"} + ], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "matches" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["matches"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.contact.getMatches", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Gets the user's current contact import status. Requires authentication.", + "errors" => [%{"name" => "InvalidDid"}, %{"name" => "InternalError"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "syncStatus" => %{ + "description" => + "If present, indicates the user has imported their contacts. If not present, indicates the user never used the feature or called `app.bsky.contact.removeData` and didn't import again since.", + "ref" => "app.bsky.contact.defs#syncStatus", + "type" => "ref" + } + }, + "type" => "object" + } + }, + "parameters" => %{"properties" => %{}, "type" => "params"}, + "type" => "query" + } + }, + "id" => "app.bsky.contact.getSyncStatus", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Import contacts for securely matching with other users. This follows the protocol explained in https://docs.bsky.app/blog/contact-import-rfc. Requires authentication.", + "errors" => [ + %{"name" => "InvalidDid"}, + %{"name" => "InvalidContacts"}, + %{"name" => "TooManyContacts"}, + %{"name" => "InvalidToken"}, + %{"name" => "InternalError"} + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "contacts" => %{ + "description" => + "List of phone numbers in global E.164 format (e.g., '+12125550123'). Phone numbers that cannot be normalized into a valid phone number will be discarded. Should not repeat the 'phone' input used in `app.bsky.contact.verifyPhone`.", + "items" => %{"type" => "string"}, + "maxLength" => 1000, + "minLength" => 1, + "type" => "array" + }, + "token" => %{ + "description" => + "JWT to authenticate the call. Use the JWT received as a response to the call to `app.bsky.contact.verifyPhone`.", + "type" => "string" + } + }, + "required" => ["token", "contacts"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "matchesAndContactIndexes" => %{ + "description" => + "The users that matched during import and their indexes on the input contacts, so the client can correlate with its local list.", + "items" => %{ + "ref" => "app.bsky.contact.defs#matchAndContactIndex", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["matchesAndContactIndexes"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.contact.importContacts", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Removes all stored hashes used for contact matching, existing matches, and sync status. Requires authentication.", + "errors" => [%{"name" => "InvalidDid"}, %{"name" => "InternalError"}], + "input" => %{ + "encoding" => "application/json", + "schema" => %{"properties" => %{}, "type" => "object"} + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{"properties" => %{}, "type" => "object"} + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.contact.removeData", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "System endpoint to send notifications related to contact imports. Requires role authentication.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "from" => %{ + "description" => "The DID of who this notification comes from.", + "format" => "did", + "type" => "string" + }, + "to" => %{ + "description" => "The DID of who this notification should go to.", + "format" => "did", + "type" => "string" + } + }, + "required" => ["from", "to"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{"properties" => %{}, "type" => "object"} + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.contact.sendNotification", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Starts a phone verification flow. The phone passed will receive a code via SMS that should be passed to `app.bsky.contact.verifyPhone`. Requires authentication.", + "errors" => [ + %{"name" => "RateLimitExceeded"}, + %{"name" => "InvalidDid"}, + %{"name" => "InvalidPhone"}, + %{"name" => "InternalError"} + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "phone" => %{ + "description" => "The phone number to receive the code via SMS.", + "type" => "string" + } + }, + "required" => ["phone"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{"properties" => %{}, "type" => "object"} + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.contact.startPhoneVerification", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Verifies control over a phone number with a code received via SMS and starts a contact import session. Requires authentication.", + "errors" => [ + %{"name" => "RateLimitExceeded"}, + %{"name" => "InvalidDid"}, + %{"name" => "InvalidPhone"}, + %{"name" => "InvalidCode"}, + %{"name" => "InternalError"} + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "code" => %{ + "description" => + "The code received via SMS as a result of the call to `app.bsky.contact.startPhoneVerification`.", + "type" => "string" + }, + "phone" => %{ + "description" => + "The phone number to verify. Should be the same as the one passed to `app.bsky.contact.startPhoneVerification`.", + "type" => "string" + } + }, + "required" => ["phone", "code"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "token" => %{ + "description" => + "JWT to be used in a call to `app.bsky.contact.importContacts`. It is only valid for a single call.", + "type" => "string" + } + }, + "required" => ["token"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.contact.verifyPhone", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Inserts a draft using private storage (stash). An upper limit of drafts might be enforced. Requires authentication.", + "errors" => [ + %{ + "description" => "Trying to insert a new draft when the limit was already reached.", + "name" => "DraftLimitReached" + } + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "draft" => %{ + "ref" => "app.bsky.draft.defs#draft", + "type" => "ref" + } + }, + "required" => ["draft"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "id" => %{ + "description" => "The ID of the created draft.", + "type" => "string" + } + }, + "required" => ["id"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.draft.createDraft", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "draft" => %{ + "description" => "A draft containing an array of draft posts.", + "properties" => %{ + "deviceId" => %{ + "description" => "UUIDv4 identifier of the device that created this draft.", + "maxLength" => 100, + "type" => "string" + }, + "deviceName" => %{ + "description" => "The device and/or platform on which the draft was created.", + "maxLength" => 100, + "type" => "string" + }, + "langs" => %{ + "description" => "Indicates human language of posts primary text content.", + "items" => %{"format" => "language", "type" => "string"}, + "maxLength" => 3, + "type" => "array" + }, + "postgateEmbeddingRules" => %{ + "description" => "Embedding rules for the postgates to be created when this draft is published.", + "items" => %{ + "refs" => ["app.bsky.feed.postgate#disableRule"], + "type" => "union" + }, + "maxLength" => 5, + "type" => "array" + }, + "posts" => %{ + "description" => "Array of draft posts that compose this draft.", + "items" => %{"ref" => "#draftPost", "type" => "ref"}, + "maxLength" => 100, + "minLength" => 1, + "type" => "array" + }, + "threadgateAllow" => %{ + "description" => "Allow-rules for the threadgate to be created when this draft is published.", + "items" => %{ + "refs" => [ + "app.bsky.feed.threadgate#mentionRule", + "app.bsky.feed.threadgate#followerRule", + "app.bsky.feed.threadgate#followingRule", + "app.bsky.feed.threadgate#listRule" + ], + "type" => "union" + }, + "maxLength" => 5, + "type" => "array" + } + }, + "required" => ["posts"], + "type" => "object" + }, + "draftEmbedCaption" => %{ + "properties" => %{ + "content" => %{"maxLength" => 10000, "type" => "string"}, + "lang" => %{"format" => "language", "type" => "string"} + }, + "required" => ["lang", "content"], + "type" => "object" + }, + "draftEmbedExternal" => %{ + "properties" => %{"uri" => %{"format" => "uri", "type" => "string"}}, + "required" => ["uri"], + "type" => "object" + }, + "draftEmbedGallery" => %{ + "properties" => %{ + "items" => %{"ref" => "#draftEmbedGalleryItems", "type" => "ref"} + }, + "required" => ["items"], + "type" => "object" + }, + "draftEmbedGalleryItems" => %{ + "description" => + "The schema-level maxLength of 20 is a future-proof ceiling. Clients should currently enforce a soft limit of 10 items in authoring UIs.", + "items" => %{"refs" => ["#draftEmbedImage"], "type" => "union"}, + "maxLength" => 20, + "type" => "array" + }, + "draftEmbedImage" => %{ + "properties" => %{ + "alt" => %{"maxGraphemes" => 2000, "type" => "string"}, + "localRef" => %{"ref" => "#draftEmbedLocalRef", "type" => "ref"} + }, + "required" => ["localRef"], + "type" => "object" + }, + "draftEmbedLocalRef" => %{ + "properties" => %{ + "path" => %{ + "description" => + "Local, on-device ref to file to be embedded. Embeds are currently device-bound for drafts.", + "maxLength" => 1024, + "minLength" => 1, + "type" => "string" + } + }, + "required" => ["path"], + "type" => "object" + }, + "draftEmbedRecord" => %{ + "properties" => %{ + "record" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + }, + "required" => ["record"], + "type" => "object" + }, + "draftEmbedVideo" => %{ + "properties" => %{ + "alt" => %{"maxGraphemes" => 2000, "type" => "string"}, + "captions" => %{ + "items" => %{"ref" => "#draftEmbedCaption", "type" => "ref"}, + "maxLength" => 20, + "type" => "array" + }, + "localRef" => %{"ref" => "#draftEmbedLocalRef", "type" => "ref"} + }, + "required" => ["localRef"], + "type" => "object" + }, + "draftPost" => %{ + "description" => "One of the posts that compose a draft.", + "properties" => %{ + "embedExternals" => %{ + "items" => %{"ref" => "#draftEmbedExternal", "type" => "ref"}, + "maxLength" => 1, + "type" => "array" + }, + "embedGallery" => %{"ref" => "#draftEmbedGallery", "type" => "ref"}, + "embedImages" => %{ + "items" => %{"ref" => "#draftEmbedImage", "type" => "ref"}, + "maxLength" => 4, + "type" => "array" + }, + "embedRecords" => %{ + "items" => %{"ref" => "#draftEmbedRecord", "type" => "ref"}, + "maxLength" => 1, + "type" => "array" + }, + "embedVideos" => %{ + "items" => %{"ref" => "#draftEmbedVideo", "type" => "ref"}, + "maxLength" => 1, + "type" => "array" + }, + "labels" => %{ + "description" => "Self-label values for this post. Effectively content warnings.", + "refs" => ["com.atproto.label.defs#selfLabels"], + "type" => "union" + }, + "text" => %{ + "description" => + "The primary post content. It has a higher limit than post contents to allow storing a larger text that can later be refined into smaller posts.", + "maxGraphemes" => 1000, + "maxLength" => 10000, + "type" => "string" + } + }, + "required" => ["text"], + "type" => "object" + }, + "draftView" => %{ + "description" => "View to present drafts data to users.", + "properties" => %{ + "createdAt" => %{ + "description" => "The time the draft was created.", + "format" => "datetime", + "type" => "string" + }, + "draft" => %{"ref" => "#draft", "type" => "ref"}, + "id" => %{ + "description" => "A TID to be used as a draft identifier.", + "format" => "tid", + "type" => "string" + }, + "updatedAt" => %{ + "description" => "The time the draft was last updated.", + "format" => "datetime", + "type" => "string" + } + }, + "required" => ["id", "draft", "createdAt", "updatedAt"], + "type" => "object" + }, + "draftWithId" => %{ + "description" => "A draft with an identifier, used to store drafts in private storage (stash).", + "properties" => %{ + "draft" => %{"ref" => "#draft", "type" => "ref"}, + "id" => %{ + "description" => "A TID to be used as a draft identifier.", + "format" => "tid", + "type" => "string" + } + }, + "required" => ["id", "draft"], + "type" => "object" + } + }, + "id" => "app.bsky.draft.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Deletes a draft by ID. Requires authentication.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{"id" => %{"format" => "tid", "type" => "string"}}, + "required" => ["id"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.draft.deleteDraft", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Gets views of user drafts. Requires authentication.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "drafts" => %{ + "items" => %{ + "ref" => "app.bsky.draft.defs#draftView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["drafts"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.draft.getDrafts", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Updates a draft using private storage (stash). If the draft ID points to a non-existing ID, the update will be silently ignored. This is done because updates don't enforce draft limit, so it accepts all writes, but will ignore invalid ones. Requires authentication.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "draft" => %{ + "ref" => "app.bsky.draft.defs#draftWithId", + "type" => "ref" + } + }, + "required" => ["draft"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.draft.updateDraft", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "aspectRatio" => %{ + "description" => + "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.", + "properties" => %{ + "height" => %{"minimum" => 1, "type" => "integer"}, + "width" => %{"minimum" => 1, "type" => "integer"} + }, + "required" => ["width", "height"], + "type" => "object" + } + }, + "id" => "app.bsky.embed.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "colorRGB" => %{ + "description" => "RGB color definition, inspired by site.standard.theme.color#rgb", + "properties" => %{ + "b" => %{"maximum" => 255, "minimum" => 0, "type" => "integer"}, + "g" => %{"maximum" => 255, "minimum" => 0, "type" => "integer"}, + "r" => %{"maximum" => 255, "minimum" => 0, "type" => "integer"} + }, + "required" => ["r", "g", "b"], + "type" => "object" + }, + "external" => %{ + "properties" => %{ + "associatedRefs" => %{ + "description" => "StrongRefs (uri+cid) of the Atmosphere records that backed this view.", + "items" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"}, + "type" => "array" + }, + "description" => %{"type" => "string"}, + "thumb" => %{ + "accept" => ["image/*"], + "maxSize" => 1_000_000, + "type" => "blob" + }, + "title" => %{"type" => "string"}, + "uri" => %{"format" => "uri", "type" => "string"} + }, + "required" => ["uri", "title", "description"], + "type" => "object" + }, + "main" => %{ + "description" => + "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", + "properties" => %{ + "external" => %{"ref" => "#external", "type" => "ref"} + }, + "required" => ["external"], + "type" => "object" + }, + "view" => %{ + "properties" => %{ + "external" => %{"ref" => "#viewExternal", "type" => "ref"} + }, + "required" => ["external"], + "type" => "object" + }, + "viewExternal" => %{ + "properties" => %{ + "associatedProfiles" => %{ + "description" => "Profiles of the owners of the Atmosphere records that backed this view.", + "items" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "type" => "array" + }, + "associatedRefs" => %{ + "description" => "StrongRefs (uri+cid) of the Atmosphere records that backed this view.", + "items" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"}, + "type" => "array" + }, + "createdAt" => %{ + "description" => + "When the external content was created, if available. Example: a publication date, for an article.", + "format" => "datetime", + "type" => "string" + }, + "description" => %{"type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "readingTime" => %{ + "description" => "Estimated reading time in minutes, if applicable and available.", + "type" => "integer" + }, + "source" => %{"ref" => "#viewExternalSource", "type" => "ref"}, + "thumb" => %{"format" => "uri", "type" => "string"}, + "title" => %{"type" => "string"}, + "updatedAt" => %{ + "description" => "When the external content was updated, if available.", + "format" => "datetime", + "type" => "string" + }, + "uri" => %{"format" => "uri", "type" => "string"} + }, + "required" => ["uri", "title", "description"], + "type" => "object" + }, + "viewExternalSource" => %{ + "description" => "The source of an external embed, such as a standard.site publication.", + "properties" => %{ + "description" => %{"type" => "string"}, + "icon" => %{ + "description" => + "Fully-qualified URL where an icon representing the source can be fetched. For example, CDN location provided by the App View.", + "format" => "uri", + "type" => "string" + }, + "theme" => %{"ref" => "#viewExternalSourceTheme", "type" => "ref"}, + "title" => %{"type" => "string"}, + "uri" => %{ + "description" => + "URI of the source, if available. Example: the https:// URL of a site.standard.publication record.", + "format" => "uri", + "type" => "string" + } + }, + "required" => ["uri", "title"], + "type" => "object" + }, + "viewExternalSourceTheme" => %{ + "description" => + "The theme colors of an external source, such as a site.standard.publication. These colors may be used when rendering an embed from that source.", + "properties" => %{ + "accentForegroundRGB" => %{"ref" => "#colorRGB", "type" => "ref"}, + "accentRGB" => %{"ref" => "#colorRGB", "type" => "ref"}, + "backgroundRGB" => %{"ref" => "#colorRGB", "type" => "ref"}, + "foregroundRGB" => %{"ref" => "#colorRGB", "type" => "ref"} + }, + "type" => "object" + } + }, + "id" => "app.bsky.embed.external", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "image" => %{ + "properties" => %{ + "alt" => %{ + "description" => "Alt text description of the image, for accessibility.", + "type" => "string" + }, + "aspectRatio" => %{ + "ref" => "app.bsky.embed.defs#aspectRatio", + "type" => "ref" + }, + "image" => %{ + "accept" => ["image/*"], + "maxSize" => 2_000_000, + "type" => "blob" + } + }, + "required" => ["image", "alt", "aspectRatio"], + "type" => "object" + }, + "main" => %{ + "properties" => %{ + "items" => %{ + "description" => + "The schema-level maxLength of 20 is a future-proof ceiling. Clients should currently enforce a soft limit of 10 items in authoring UIs.", + "items" => %{ + "description" => + "The media items in the gallery. Each item may be of a different type, but all types must be supported by the client.", + "refs" => ["#image"], + "type" => "union" + }, + "maxLength" => 20, + "type" => "array" + } + }, + "required" => ["items"], + "type" => "object" + }, + "view" => %{ + "properties" => %{ + "items" => %{ + "items" => %{"refs" => ["#viewImage"], "type" => "union"}, + "type" => "array" + } + }, + "required" => ["items"], + "type" => "object" + }, + "viewImage" => %{ + "properties" => %{ + "alt" => %{ + "description" => "Alt text description of the image, for accessibility.", + "type" => "string" + }, + "aspectRatio" => %{ + "ref" => "app.bsky.embed.defs#aspectRatio", + "type" => "ref" + }, + "fullsize" => %{ + "description" => + "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View.", + "format" => "uri", + "type" => "string" + }, + "thumbnail" => %{ + "description" => + "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View.", + "format" => "uri", + "type" => "string" + } + }, + "required" => ["thumbnail", "fullsize", "alt", "aspectRatio"], + "type" => "object" + } + }, + "description" => "An assortment of media embedded in a Bluesky record (eg, a post).", + "id" => "app.bsky.embed.gallery", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Resolve one or more AT-URIs into the data needed to render an enhanced external embed. Returns `associatedRefs` (strongRefs to embed into a post's external.associatedRefs), the raw `associatedRecords`, and a hydrated `view`. The response is empty (`{}`) when no records were resolvable, or when validation determined the resolved records don't actually back the requested URL; clients should fall back to their own link-card rendering in that case and skip writing strongRefs to the post.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "associatedRecords" => %{ + "items" => %{ + "description" => + "The raw record data of the Atmosphere records that backed this view. This is returned for convenience, to avoid the need for the client to separately fetch the record data for the associatedRefs. Example: the site.standard.document and site.standard.publication records that backed this view.", + "type" => "unknown" + }, + "type" => "array" + }, + "associatedRefs" => %{ + "description" => + "StrongRefs (URI+CID) of the Atmosphere records that backed this view, suitable for embedding into a post's external.associatedRefs.", + "items" => %{ + "ref" => "com.atproto.repo.strongRef", + "type" => "ref" + }, + "type" => "array" + }, + "view" => %{ + "description" => + "Hydrated view of the embed. Present only when the resolved records back the requested URL and supply enough information to populate the required `viewExternal` fields. Omitted alongside the rest of the response when no records resolved or validation failed.", + "ref" => "app.bsky.embed.external#view", + "type" => "ref" + } + }, + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "uris" => %{ + "description" => + "AT-URIs of any Atmosphere records that can be resolved and used to construct #externalView views. Example: a site.standard.document and optionally its associated site.standard.publication.", + "items" => %{"format" => "at-uri", "type" => "string"}, + "maxLength" => 4, + "type" => "array" + }, + "url" => %{ + "description" => + "The canonical web URL the embed represents (typically the URL the user pasted into the composer). Used as the returned view's `uri`. May be used for validation in the future.", + "format" => "uri", + "type" => "string" + } + }, + "required" => ["url", "uris"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.embed.getEmbedExternalView", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "image" => %{ + "properties" => %{ + "alt" => %{ + "description" => "Alt text description of the image, for accessibility.", + "type" => "string" + }, + "aspectRatio" => %{ + "ref" => "app.bsky.embed.defs#aspectRatio", + "type" => "ref" + }, + "image" => %{ + "accept" => ["image/*"], + "description" => "The raw image file. May be up to 2 MB, formerly limited to 1 MB.", + "maxSize" => 2_000_000, + "type" => "blob" + } + }, + "required" => ["image", "alt"], + "type" => "object" + }, + "main" => %{ + "properties" => %{ + "images" => %{ + "items" => %{"ref" => "#image", "type" => "ref"}, + "maxLength" => 4, + "type" => "array" + } + }, + "required" => ["images"], + "type" => "object" + }, + "view" => %{ + "properties" => %{ + "images" => %{ + "items" => %{"ref" => "#viewImage", "type" => "ref"}, + "maxLength" => 4, + "type" => "array" + } + }, + "required" => ["images"], + "type" => "object" + }, + "viewImage" => %{ + "properties" => %{ + "alt" => %{ + "description" => "Alt text description of the image, for accessibility.", + "type" => "string" + }, + "aspectRatio" => %{ + "ref" => "app.bsky.embed.defs#aspectRatio", + "type" => "ref" + }, + "fullsize" => %{ + "description" => + "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View.", + "format" => "uri", + "type" => "string" + }, + "thumb" => %{ + "description" => + "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View.", + "format" => "uri", + "type" => "string" + } + }, + "required" => ["thumb", "fullsize", "alt"], + "type" => "object" + } + }, + "description" => "A set of images embedded in a Bluesky record (eg, a post).", + "id" => "app.bsky.embed.images", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "properties" => %{ + "record" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + }, + "required" => ["record"], + "type" => "object" + }, + "view" => %{ + "properties" => %{ + "record" => %{ + "refs" => [ + "#viewRecord", + "#viewNotFound", + "#viewBlocked", + "#viewDetached", + "app.bsky.feed.defs#generatorView", + "app.bsky.graph.defs#listView", + "app.bsky.labeler.defs#labelerView", + "app.bsky.graph.defs#starterPackViewBasic" + ], + "type" => "union" + } + }, + "required" => ["record"], + "type" => "object" + }, + "viewBlocked" => %{ + "properties" => %{ + "author" => %{ + "ref" => "app.bsky.feed.defs#blockedAuthor", + "type" => "ref" + }, + "blocked" => %{"const" => true, "type" => "boolean"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "blocked", "author"], + "type" => "object" + }, + "viewDetached" => %{ + "properties" => %{ + "detached" => %{"const" => true, "type" => "boolean"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "detached"], + "type" => "object" + }, + "viewNotFound" => %{ + "properties" => %{ + "notFound" => %{"const" => true, "type" => "boolean"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "notFound"], + "type" => "object" + }, + "viewRecord" => %{ + "properties" => %{ + "author" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "cid" => %{"format" => "cid", "type" => "string"}, + "embeds" => %{ + "items" => %{ + "refs" => [ + "app.bsky.embed.images#view", + "app.bsky.embed.video#view", + "app.bsky.embed.gallery#view", + "app.bsky.embed.external#view", + "app.bsky.embed.record#view", + "app.bsky.embed.recordWithMedia#view" + ], + "type" => "union" + }, + "type" => "array" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "likeCount" => %{"type" => "integer"}, + "quoteCount" => %{"type" => "integer"}, + "replyCount" => %{"type" => "integer"}, + "repostCount" => %{"type" => "integer"}, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "value" => %{ + "description" => "The record data itself.", + "type" => "unknown" + } + }, + "required" => ["uri", "cid", "author", "value", "indexedAt"], + "type" => "object" + } + }, + "description" => + "A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record.", + "id" => "app.bsky.embed.record", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "properties" => %{ + "media" => %{ + "refs" => [ + "app.bsky.embed.images", + "app.bsky.embed.video", + "app.bsky.embed.gallery", + "app.bsky.embed.external" + ], + "type" => "union" + }, + "record" => %{"ref" => "app.bsky.embed.record", "type" => "ref"} + }, + "required" => ["record", "media"], + "type" => "object" + }, + "view" => %{ + "properties" => %{ + "media" => %{ + "refs" => [ + "app.bsky.embed.images#view", + "app.bsky.embed.video#view", + "app.bsky.embed.gallery#view", + "app.bsky.embed.external#view" + ], + "type" => "union" + }, + "record" => %{"ref" => "app.bsky.embed.record#view", "type" => "ref"} + }, + "required" => ["record", "media"], + "type" => "object" + } + }, + "description" => + "A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card.", + "id" => "app.bsky.embed.recordWithMedia", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "caption" => %{ + "properties" => %{ + "file" => %{ + "accept" => ["text/vtt"], + "maxSize" => 20000, + "type" => "blob" + }, + "lang" => %{"format" => "language", "type" => "string"} + }, + "required" => ["lang", "file"], + "type" => "object" + }, + "main" => %{ + "properties" => %{ + "alt" => %{ + "description" => "Alt text description of the video, for accessibility.", + "maxGraphemes" => 1000, + "maxLength" => 10000, + "type" => "string" + }, + "aspectRatio" => %{ + "ref" => "app.bsky.embed.defs#aspectRatio", + "type" => "ref" + }, + "captions" => %{ + "items" => %{"ref" => "#caption", "type" => "ref"}, + "maxLength" => 20, + "type" => "array" + }, + "presentation" => %{ + "description" => "A hint to the client about how to present the video.", + "knownValues" => ["default", "gif"], + "type" => "string" + }, + "video" => %{ + "accept" => ["video/mp4"], + "description" => "The mp4 video file. May be up to 100mb, formerly limited to 50mb.", + "maxSize" => 100_000_000, + "type" => "blob" + } + }, + "required" => ["video"], + "type" => "object" + }, + "view" => %{ + "properties" => %{ + "alt" => %{ + "maxGraphemes" => 1000, + "maxLength" => 10000, + "type" => "string" + }, + "aspectRatio" => %{ + "ref" => "app.bsky.embed.defs#aspectRatio", + "type" => "ref" + }, + "cid" => %{"format" => "cid", "type" => "string"}, + "playlist" => %{"format" => "uri", "type" => "string"}, + "presentation" => %{ + "description" => "A hint to the client about how to present the video.", + "knownValues" => ["default", "gif"], + "type" => "string" + }, + "thumbnail" => %{"format" => "uri", "type" => "string"} + }, + "required" => ["cid", "playlist"], + "type" => "object" + } + }, + "description" => "A video embedded in a Bluesky record (eg, a post).", + "id" => "app.bsky.embed.video", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "blockedAuthor" => %{ + "properties" => %{ + "did" => %{"format" => "did", "type" => "string"}, + "viewer" => %{ + "ref" => "app.bsky.actor.defs#viewerState", + "type" => "ref" + } + }, + "required" => ["did"], + "type" => "object" + }, + "blockedPost" => %{ + "properties" => %{ + "author" => %{"ref" => "#blockedAuthor", "type" => "ref"}, + "blocked" => %{"const" => true, "type" => "boolean"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "blocked", "author"], + "type" => "object" + }, + "clickthroughAuthor" => %{ + "description" => "User clicked through to the author of the feed item", + "type" => "token" + }, + "clickthroughEmbed" => %{ + "description" => "User clicked through to the embedded content of the feed item", + "type" => "token" + }, + "clickthroughItem" => %{ + "description" => "User clicked through to the feed item", + "type" => "token" + }, + "clickthroughReposter" => %{ + "description" => "User clicked through to the reposter of the feed item", + "type" => "token" + }, + "contentModeUnspecified" => %{ + "description" => "Declares the feed generator returns any types of posts.", + "type" => "token" + }, + "contentModeVideo" => %{ + "description" => "Declares the feed generator returns posts containing app.bsky.embed.video embeds.", + "type" => "token" + }, + "feedViewPost" => %{ + "properties" => %{ + "feedContext" => %{ + "description" => "Context provided by feed generator that may be passed back alongside interactions.", + "maxLength" => 2000, + "type" => "string" + }, + "post" => %{"ref" => "#postView", "type" => "ref"}, + "reason" => %{ + "refs" => ["#reasonRepost", "#reasonPin"], + "type" => "union" + }, + "reply" => %{"ref" => "#replyRef", "type" => "ref"}, + "reqId" => %{ + "description" => "Unique identifier per request that may be passed back alongside interactions.", + "maxLength" => 100, + "type" => "string" + } + }, + "required" => ["post"], + "type" => "object" + }, + "generatorView" => %{ + "properties" => %{ + "acceptsInteractions" => %{"type" => "boolean"}, + "avatar" => %{"format" => "uri", "type" => "string"}, + "cid" => %{"format" => "cid", "type" => "string"}, + "contentMode" => %{ + "knownValues" => ["app.bsky.feed.defs#contentModeUnspecified", "app.bsky.feed.defs#contentModeVideo"], + "type" => "string" + }, + "creator" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "description" => %{ + "maxGraphemes" => 300, + "maxLength" => 3000, + "type" => "string" + }, + "descriptionFacets" => %{ + "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, + "type" => "array" + }, + "did" => %{"format" => "did", "type" => "string"}, + "displayName" => %{"type" => "string"}, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "likeCount" => %{"minimum" => 0, "type" => "integer"}, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "viewer" => %{"ref" => "#generatorViewerState", "type" => "ref"} + }, + "required" => ["uri", "cid", "did", "creator", "displayName", "indexedAt"], + "type" => "object" + }, + "generatorViewerState" => %{ + "properties" => %{"like" => %{"format" => "at-uri", "type" => "string"}}, + "type" => "object" + }, + "interaction" => %{ + "properties" => %{ + "event" => %{ + "knownValues" => [ + "app.bsky.feed.defs#requestLess", + "app.bsky.feed.defs#requestMore", + "app.bsky.feed.defs#clickthroughItem", + "app.bsky.feed.defs#clickthroughAuthor", + "app.bsky.feed.defs#clickthroughReposter", + "app.bsky.feed.defs#clickthroughEmbed", + "app.bsky.feed.defs#interactionSeen", + "app.bsky.feed.defs#interactionLike", + "app.bsky.feed.defs#interactionRepost", + "app.bsky.feed.defs#interactionReply", + "app.bsky.feed.defs#interactionQuote", + "app.bsky.feed.defs#interactionShare" + ], + "type" => "string" + }, + "feedContext" => %{ + "description" => + "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", + "maxLength" => 2000, + "type" => "string" + }, + "item" => %{"format" => "at-uri", "type" => "string"}, + "reqId" => %{ + "description" => "Unique identifier per request that may be passed back alongside interactions.", + "maxLength" => 100, + "type" => "string" + } + }, + "type" => "object" + }, + "interactionLike" => %{ + "description" => "User liked the feed item", + "type" => "token" + }, + "interactionQuote" => %{ + "description" => "User quoted the feed item", + "type" => "token" + }, + "interactionReply" => %{ + "description" => "User replied to the feed item", + "type" => "token" + }, + "interactionRepost" => %{ + "description" => "User reposted the feed item", + "type" => "token" + }, + "interactionSeen" => %{ + "description" => "Feed item was seen by user", + "type" => "token" + }, + "interactionShare" => %{ + "description" => "User shared the feed item", + "type" => "token" + }, + "notFoundPost" => %{ + "properties" => %{ + "notFound" => %{"const" => true, "type" => "boolean"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "notFound"], + "type" => "object" + }, + "postView" => %{ + "properties" => %{ + "author" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "bookmarkCount" => %{"type" => "integer"}, + "cid" => %{"format" => "cid", "type" => "string"}, + "debug" => %{ + "description" => "Debug information for internal development", "type" => "unknown" }, - "embed" => %{ + "embed" => %{ + "refs" => [ + "app.bsky.embed.images#view", + "app.bsky.embed.video#view", + "app.bsky.embed.gallery#view", + "app.bsky.embed.external#view", + "app.bsky.embed.record#view", + "app.bsky.embed.recordWithMedia#view" + ], + "type" => "union" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "likeCount" => %{"type" => "integer"}, + "quoteCount" => %{"type" => "integer"}, + "record" => %{"type" => "unknown"}, + "replyCount" => %{"type" => "integer"}, + "repostCount" => %{"type" => "integer"}, + "threadgate" => %{"ref" => "#threadgateView", "type" => "ref"}, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "viewer" => %{"ref" => "#viewerState", "type" => "ref"} + }, + "required" => ["uri", "cid", "author", "record", "indexedAt"], + "type" => "object" + }, + "reasonPin" => %{"properties" => %{}, "type" => "object"}, + "reasonRepost" => %{ + "properties" => %{ + "by" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "cid" => %{"format" => "cid", "type" => "string"}, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["by", "indexedAt"], + "type" => "object" + }, + "replyRef" => %{ + "properties" => %{ + "grandparentAuthor" => %{ + "description" => "When parent is a reply to another post, this is the author of that post.", + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "parent" => %{ + "refs" => ["#postView", "#notFoundPost", "#blockedPost"], + "type" => "union" + }, + "root" => %{ + "refs" => ["#postView", "#notFoundPost", "#blockedPost"], + "type" => "union" + } + }, + "required" => ["root", "parent"], + "type" => "object" + }, + "requestLess" => %{ + "description" => "Request that less content like the given feed item be shown in the feed", + "type" => "token" + }, + "requestMore" => %{ + "description" => "Request that more content like the given feed item be shown in the feed", + "type" => "token" + }, + "skeletonFeedPost" => %{ + "properties" => %{ + "feedContext" => %{ + "description" => + "Context that will be passed through to client and may be passed to feed generator back alongside interactions.", + "maxLength" => 2000, + "type" => "string" + }, + "post" => %{"format" => "at-uri", "type" => "string"}, + "reason" => %{ + "refs" => ["#skeletonReasonRepost", "#skeletonReasonPin"], + "type" => "union" + } + }, + "required" => ["post"], + "type" => "object" + }, + "skeletonReasonPin" => %{"properties" => %{}, "type" => "object"}, + "skeletonReasonRepost" => %{ + "properties" => %{ + "repost" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["repost"], + "type" => "object" + }, + "threadContext" => %{ + "description" => "Metadata about this post within the context of the thread it is in.", + "properties" => %{ + "rootAuthorLike" => %{"format" => "at-uri", "type" => "string"} + }, + "type" => "object" + }, + "threadViewPost" => %{ + "properties" => %{ + "parent" => %{ + "refs" => ["#threadViewPost", "#notFoundPost", "#blockedPost"], + "type" => "union" + }, + "post" => %{"ref" => "#postView", "type" => "ref"}, + "replies" => %{ + "items" => %{ + "refs" => ["#threadViewPost", "#notFoundPost", "#blockedPost"], + "type" => "union" + }, + "type" => "array" + }, + "threadContext" => %{"ref" => "#threadContext", "type" => "ref"} + }, + "required" => ["post"], + "type" => "object" + }, + "threadgateView" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "lists" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#listViewBasic", + "type" => "ref" + }, + "type" => "array" + }, + "record" => %{"type" => "unknown"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "type" => "object" + }, + "viewerState" => %{ + "description" => + "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", + "properties" => %{ + "bookmarked" => %{"type" => "boolean"}, + "embeddingDisabled" => %{"type" => "boolean"}, + "like" => %{"format" => "at-uri", "type" => "string"}, + "pinned" => %{"type" => "boolean"}, + "replyDisabled" => %{"type" => "boolean"}, + "repost" => %{"format" => "at-uri", "type" => "string"}, + "threadMuted" => %{"type" => "boolean"} + }, + "type" => "object" + } + }, + "id" => "app.bsky.feed.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "feed" => %{ + "properties" => %{"uri" => %{"format" => "at-uri", "type" => "string"}}, + "required" => ["uri"], + "type" => "object" + }, + "links" => %{ + "properties" => %{ + "privacyPolicy" => %{"type" => "string"}, + "termsOfService" => %{"type" => "string"} + }, + "type" => "object" + }, + "main" => %{ + "description" => + "Get information about a feed generator, including policies and offered feed URIs. Does not require auth; implemented by Feed Generator services (not App View).", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "did" => %{"format" => "did", "type" => "string"}, + "feeds" => %{ + "items" => %{"ref" => "#feed", "type" => "ref"}, + "type" => "array" + }, + "links" => %{"ref" => "#links", "type" => "ref"} + }, + "required" => ["did", "feeds"], + "type" => "object" + } + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.describeFeedGenerator", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record declaring of the existence of a feed generator, and containing metadata about it. The record can exist in any repository.", + "key" => "any", + "record" => %{ + "properties" => %{ + "acceptsInteractions" => %{ + "description" => + "Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions", + "type" => "boolean" + }, + "avatar" => %{ + "accept" => ["image/png", "image/jpeg"], + "maxSize" => 1_000_000, + "type" => "blob" + }, + "contentMode" => %{ + "knownValues" => ["app.bsky.feed.defs#contentModeUnspecified", "app.bsky.feed.defs#contentModeVideo"], + "type" => "string" + }, + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "description" => %{ + "maxGraphemes" => 300, + "maxLength" => 3000, + "type" => "string" + }, + "descriptionFacets" => %{ + "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, + "type" => "array" + }, + "did" => %{"format" => "did", "type" => "string"}, + "displayName" => %{ + "maxGraphemes" => 24, + "maxLength" => 240, + "type" => "string" + }, + "labels" => %{ + "description" => "Self-label values", + "refs" => ["com.atproto.label.defs#selfLabels"], + "type" => "union" + } + }, + "required" => ["did", "displayName", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.feed.generator", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of feeds (feed generator records) created by the actor (in the actor's repo).", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feeds" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feeds"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getActorFeeds", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a list of posts liked by an actor. Requires auth, actor must be the requesting account.", + "errors" => [%{"name" => "BlockedActor"}, %{"name" => "BlockedByActor"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#feedViewPost", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feed"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getActorLikes", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth.", + "errors" => [%{"name" => "BlockedActor"}, %{"name" => "BlockedByActor"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#feedViewPost", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feed"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "filter" => %{ + "default" => "posts_with_replies", + "description" => "Combinations of post/repost types to include in response.", + "knownValues" => [ + "posts_with_replies", + "posts_no_replies", + "posts_with_media", + "posts_and_author_threads", + "posts_with_video" + ], + "type" => "string" + }, + "includePins" => %{"default" => false, "type" => "boolean"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getAuthorFeed", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a hydrated feed from an actor's selected feed generator. Implemented by App View.", + "errors" => [%{"name" => "UnknownFeed"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#feedViewPost", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feed"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{"format" => "at-uri", "type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["feed"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getFeed", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get information about a feed generator. Implemented by AppView.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "isOnline" => %{ + "description" => + "Indicates whether the feed generator service has been online recently, or else seems to be inactive.", + "type" => "boolean" + }, + "isValid" => %{ + "description" => + "Indicates whether the feed generator service is compatible with the record declaration.", + "type" => "boolean" + }, + "view" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + } + }, + "required" => ["view", "isOnline", "isValid"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "feed" => %{ + "description" => "AT-URI of the feed generator record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["feed"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getFeedGenerator", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get information about a list of feed generators.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "feeds" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feeds"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "feeds" => %{ + "items" => %{"format" => "at-uri", "type" => "string"}, + "type" => "array" + } + }, + "required" => ["feeds"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getFeedGenerators", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of a feed provided by a feed generator. Auth is optional, depending on provider requirements, and provides the DID of the requester. Implemented by Feed Generator Service.", + "errors" => [%{"name" => "UnknownFeed"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#skeletonFeedPost", + "type" => "ref" + }, + "type" => "array" + }, + "reqId" => %{ + "description" => "Unique identifier per request that may be passed back alongside interactions.", + "maxLength" => 100, + "type" => "string" + } + }, + "required" => ["feed"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "description" => "Reference to feed generator record describing the specific feed being requested.", + "format" => "at-uri", + "type" => "string" + }, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["feed"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getFeedSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "like" => %{ + "properties" => %{ + "actor" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "indexedAt" => %{"format" => "datetime", "type" => "string"} + }, + "required" => ["indexedAt", "createdAt", "actor"], + "type" => "object" + }, + "main" => %{ + "description" => "Get like records which reference a subject (by AT-URI and CID).", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "likes" => %{ + "items" => %{"ref" => "#like", "type" => "ref"}, + "type" => "array" + }, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "likes"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cid" => %{ + "description" => "CID of the subject record (aka, specific version of record), to filter likes.", + "format" => "cid", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "uri" => %{ + "description" => "AT-URI of the subject (eg, a post record).", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["uri"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getLikes", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a feed of recent posts from a list (posts and reposts from any actors on the list). Does not require auth.", + "errors" => [%{"name" => "UnknownList"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#feedViewPost", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feed"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "list" => %{ + "description" => "Reference (AT-URI) to the list record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["list"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getListFeed", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get posts in a thread. Does not require auth, but additional metadata and filtering will be applied for authed requests.", + "errors" => [%{"name" => "NotFound"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "thread" => %{ + "refs" => [ + "app.bsky.feed.defs#threadViewPost", + "app.bsky.feed.defs#notFoundPost", + "app.bsky.feed.defs#blockedPost" + ], + "type" => "union" + }, + "threadgate" => %{ + "ref" => "app.bsky.feed.defs#threadgateView", + "type" => "ref" + } + }, + "required" => ["thread"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "depth" => %{ + "default" => 6, + "description" => "How many levels of reply depth should be included in response.", + "maximum" => 1000, + "minimum" => 0, + "type" => "integer" + }, + "parentHeight" => %{ + "default" => 80, + "description" => "How many levels of parent (and grandparent, etc) post to include.", + "maximum" => 1000, + "minimum" => 0, + "type" => "integer" + }, + "uri" => %{ + "description" => "Reference (AT-URI) to post record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["uri"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getPostThread", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Gets post views for a specified list of posts (by AT-URI). This is sometimes referred to as 'hydrating' a 'feed skeleton'.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "posts" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#postView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["posts"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "uris" => %{ + "description" => "List of post AT-URIs to return hydrated views for.", + "items" => %{"format" => "at-uri", "type" => "string"}, + "maxLength" => 25, + "type" => "array" + } + }, + "required" => ["uris"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getPosts", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of quotes for a given post.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "posts" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#postView", + "type" => "ref" + }, + "type" => "array" + }, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "posts"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cid" => %{ + "description" => "If supplied, filters to quotes of specific version (by CID) of the post record.", + "format" => "cid", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "uri" => %{ + "description" => "Reference (AT-URI) of post record", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["uri"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getQuotes", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of reposts for a given post.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "repostedBy" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "repostedBy"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cid" => %{ + "description" => "If supplied, filters to reposts of specific version (by CID) of the post record.", + "format" => "cid", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "uri" => %{ + "description" => "Reference (AT-URI) of post record", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["uri"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getRepostedBy", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested feeds (feed generators) for the requesting account.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feeds" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feeds"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getSuggestedFeeds", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feed" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#feedViewPost", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feed"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "algorithm" => %{ + "description" => + "Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism.", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.getTimeline", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Record declaring a 'like' of a piece of subject content.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "subject" => %{ + "ref" => "com.atproto.repo.strongRef", + "type" => "ref" + }, + "via" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + }, + "required" => ["subject", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.feed.like", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "entity" => %{ + "description" => "Deprecated: use facets instead.", + "properties" => %{ + "index" => %{"ref" => "#textSlice", "type" => "ref"}, + "type" => %{ + "description" => "Expected values are 'mention' and 'link'.", + "type" => "string" + }, + "value" => %{"type" => "string"} + }, + "required" => ["index", "type", "value"], + "type" => "object" + }, + "main" => %{ + "description" => "Record containing a Bluesky post.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{ + "description" => "Client-declared timestamp when this post was originally created.", + "format" => "datetime", + "type" => "string" + }, + "embed" => %{ + "refs" => [ + "app.bsky.embed.images", + "app.bsky.embed.video", + "app.bsky.embed.gallery", + "app.bsky.embed.external", + "app.bsky.embed.record", + "app.bsky.embed.recordWithMedia" + ], + "type" => "union" + }, + "entities" => %{ + "description" => "DEPRECATED: replaced by app.bsky.richtext.facet.", + "items" => %{"ref" => "#entity", "type" => "ref"}, + "type" => "array" + }, + "facets" => %{ + "description" => "Annotations of text (mentions, URLs, hashtags, etc)", + "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, + "type" => "array" + }, + "labels" => %{ + "description" => "Self-label values for this post. Effectively content warnings.", + "refs" => ["com.atproto.label.defs#selfLabels"], + "type" => "union" + }, + "langs" => %{ + "description" => "Indicates human language of post primary text content.", + "items" => %{"format" => "language", "type" => "string"}, + "maxLength" => 3, + "type" => "array" + }, + "reply" => %{"ref" => "#replyRef", "type" => "ref"}, + "tags" => %{ + "description" => "Additional hashtags, in addition to any included in post text and facets.", + "items" => %{ + "maxGraphemes" => 64, + "maxLength" => 640, + "type" => "string" + }, + "maxLength" => 8, + "type" => "array" + }, + "text" => %{ + "description" => "The primary post content. May be an empty string, if there are embeds.", + "maxGraphemes" => 300, + "maxLength" => 3000, + "type" => "string" + } + }, + "required" => ["text", "createdAt"], + "type" => "object" + }, + "type" => "record" + }, + "replyRef" => %{ + "properties" => %{ + "parent" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"}, + "root" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + }, + "required" => ["root", "parent"], + "type" => "object" + }, + "textSlice" => %{ + "description" => + "Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.", + "properties" => %{ + "end" => %{"minimum" => 0, "type" => "integer"}, + "start" => %{"minimum" => 0, "type" => "integer"} + }, + "required" => ["start", "end"], + "type" => "object" + } + }, + "id" => "app.bsky.feed.post", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "disableRule" => %{ + "description" => "Disables embedding of this post.", + "properties" => %{}, + "type" => "object" + }, + "main" => %{ + "description" => + "Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "detachedEmbeddingUris" => %{ + "description" => "List of AT-URIs embedding this post that the author has detached from.", + "items" => %{"format" => "at-uri", "type" => "string"}, + "maxLength" => 50, + "type" => "array" + }, + "embeddingRules" => %{ + "description" => + "List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed.", + "items" => %{"refs" => ["#disableRule"], "type" => "union"}, + "maxLength" => 5, + "type" => "array" + }, + "post" => %{ + "description" => "Reference (AT-URI) to the post record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["post", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.feed.postgate", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Record representing a 'repost' of an existing Bluesky post.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "subject" => %{ + "ref" => "com.atproto.repo.strongRef", + "type" => "ref" + }, + "via" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + }, + "required" => ["subject", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.feed.repost", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "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.", + "errors" => [%{"name" => "BadQueryString"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "hitsTotal" => %{ + "description" => + "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.", + "type" => "integer" + }, + "posts" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#postView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["posts"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "author" => %{ + "description" => "Filter to posts by the given account. Handles are resolved to DID before query-time.", + "format" => "at-identifier", + "type" => "string" + }, + "cursor" => %{ + "description" => + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set.", + "type" => "string" + }, + "domain" => %{ + "description" => + "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization.", + "type" => "string" + }, + "lang" => %{ + "description" => + "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection.", + "format" => "language", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "mentions" => %{ + "description" => + "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions.", + "format" => "at-identifier", + "type" => "string" + }, + "q" => %{ + "description" => + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.", + "type" => "string" + }, + "since" => %{ + "description" => + "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD).", + "type" => "string" + }, + "sort" => %{ + "default" => "latest", + "description" => "Specifies the ranking order of results.", + "knownValues" => ["top", "latest"], + "type" => "string" + }, + "tag" => %{ + "description" => + "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", + "items" => %{ + "maxGraphemes" => 64, + "maxLength" => 640, + "type" => "string" + }, + "type" => "array" + }, + "until" => %{ + "description" => + "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD).", + "type" => "string" + }, + "url" => %{ + "description" => + "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching.", + "format" => "uri", + "type" => "string" + } + }, + "required" => ["q"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.feed.searchPosts", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Send information about interactions with feed items back to the feed generator that served them.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "feed" => %{"format" => "at-uri", "type" => "string"}, + "interactions" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#interaction", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["interactions"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{"properties" => %{}, "type" => "object"} + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.feed.sendInteractions", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "followerRule" => %{ + "description" => "Allow replies from actors who follow you.", + "properties" => %{}, + "type" => "object" + }, + "followingRule" => %{ + "description" => "Allow replies from actors you follow.", + "properties" => %{}, + "type" => "object" + }, + "listRule" => %{ + "description" => "Allow replies from actors on a list.", + "properties" => %{"list" => %{"format" => "at-uri", "type" => "string"}}, + "required" => ["list"], + "type" => "object" + }, + "main" => %{ + "description" => + "Record defining interaction gating rules for a thread (aka, reply controls). The record key (rkey) of the threadgate record must match the record key of the thread's root post, and that record must be in the same repository.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "allow" => %{ + "description" => + "List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply.", + "items" => %{ + "refs" => ["#mentionRule", "#followerRule", "#followingRule", "#listRule"], + "type" => "union" + }, + "maxLength" => 5, + "type" => "array" + }, + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "hiddenReplies" => %{ + "description" => "List of hidden reply URIs.", + "items" => %{"format" => "at-uri", "type" => "string"}, + "maxLength" => 300, + "type" => "array" + }, + "post" => %{ + "description" => "Reference (AT-URI) to the post record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["post", "createdAt"], + "type" => "object" + }, + "type" => "record" + }, + "mentionRule" => %{ + "description" => "Allow replies from actors mentioned in your post.", + "properties" => %{}, + "type" => "object" + } + }, + "id" => "app.bsky.feed.threadgate", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record declaring a 'block' relationship against another account. NOTE: blocks are public in Bluesky; see blog posts for details.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "subject" => %{ + "description" => "DID of the account to be blocked.", + "format" => "did", + "type" => "string" + } + }, + "required" => ["subject", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.block", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "curatelist" => %{ + "description" => "A list of actors used for curation purposes such as list feeds or interaction gating.", + "type" => "token" + }, + "listItemView" => %{ + "properties" => %{ + "subject" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "subject"], + "type" => "object" + }, + "listPurpose" => %{ + "knownValues" => [ + "app.bsky.graph.defs#modlist", + "app.bsky.graph.defs#curatelist", + "app.bsky.graph.defs#referencelist" + ], + "type" => "string" + }, + "listView" => %{ + "properties" => %{ + "avatar" => %{"format" => "uri", "type" => "string"}, + "cid" => %{"format" => "cid", "type" => "string"}, + "creator" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "description" => %{ + "maxGraphemes" => 300, + "maxLength" => 3000, + "type" => "string" + }, + "descriptionFacets" => %{ + "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, + "type" => "array" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "listItemCount" => %{"minimum" => 0, "type" => "integer"}, + "name" => %{"maxLength" => 64, "minLength" => 1, "type" => "string"}, + "purpose" => %{"ref" => "#listPurpose", "type" => "ref"}, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "viewer" => %{"ref" => "#listViewerState", "type" => "ref"} + }, + "required" => ["uri", "cid", "creator", "name", "purpose", "indexedAt"], + "type" => "object" + }, + "listViewBasic" => %{ + "properties" => %{ + "avatar" => %{"format" => "uri", "type" => "string"}, + "cid" => %{"format" => "cid", "type" => "string"}, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "listItemCount" => %{"minimum" => 0, "type" => "integer"}, + "name" => %{"maxLength" => 64, "minLength" => 1, "type" => "string"}, + "purpose" => %{"ref" => "#listPurpose", "type" => "ref"}, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "viewer" => %{"ref" => "#listViewerState", "type" => "ref"} + }, + "required" => ["uri", "cid", "name", "purpose"], + "type" => "object" + }, + "listViewerState" => %{ + "properties" => %{ + "blocked" => %{"format" => "at-uri", "type" => "string"}, + "muted" => %{"type" => "boolean"} + }, + "type" => "object" + }, + "modlist" => %{ + "description" => "A list of actors to apply an aggregate moderation action (mute/block) on.", + "type" => "token" + }, + "notFoundActor" => %{ + "description" => "indicates that a handle or DID could not be resolved", + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "notFound" => %{"const" => true, "type" => "boolean"} + }, + "required" => ["actor", "notFound"], + "type" => "object" + }, + "referencelist" => %{ + "description" => "A list of actors used for only for reference purposes such as within a starter pack.", + "type" => "token" + }, + "relationship" => %{ + "description" => + "lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object)", + "properties" => %{ + "blockedBy" => %{ + "description" => "if the actor is blocked by this DID, contains the AT-URI of the block record", + "format" => "at-uri", + "type" => "string" + }, + "blockedByList" => %{ + "description" => + "if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record", + "format" => "at-uri", + "type" => "string" + }, + "blocking" => %{ + "description" => "if the actor blocks this DID, this is the AT-URI of the block record", + "format" => "at-uri", + "type" => "string" + }, + "blockingByList" => %{ + "description" => + "if the actor blocks this DID via a block list, this is the AT-URI of the listblock record", + "format" => "at-uri", + "type" => "string" + }, + "did" => %{"format" => "did", "type" => "string"}, + "followedBy" => %{ + "description" => "if the actor is followed by this DID, contains the AT-URI of the follow record", + "format" => "at-uri", + "type" => "string" + }, + "following" => %{ + "description" => "if the actor follows this DID, this is the AT-URI of the follow record", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["did"], + "type" => "object" + }, + "starterPackView" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "creator" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "feeds" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + }, + "maxLength" => 3, + "type" => "array" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "joinedAllTimeCount" => %{"minimum" => 0, "type" => "integer"}, + "joinedWeekCount" => %{"minimum" => 0, "type" => "integer"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "list" => %{"ref" => "#listViewBasic", "type" => "ref"}, + "listItemsSample" => %{ + "items" => %{"ref" => "#listItemView", "type" => "ref"}, + "maxLength" => 12, + "type" => "array" + }, + "record" => %{"type" => "unknown"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "cid", "record", "creator", "indexedAt"], + "type" => "object" + }, + "starterPackViewBasic" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "creator" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "joinedAllTimeCount" => %{"minimum" => 0, "type" => "integer"}, + "joinedWeekCount" => %{"minimum" => 0, "type" => "integer"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "listItemCount" => %{"minimum" => 0, "type" => "integer"}, + "record" => %{"type" => "unknown"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "cid", "record", "creator", "indexedAt"], + "type" => "object" + } + }, + "id" => "app.bsky.graph.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record declaring a social 'follow' relationship of another account. Duplicate follows will be ignored by the AppView.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "subject" => %{"format" => "did", "type" => "string"}, + "via" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} + }, + "required" => ["subject", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.follow", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of starter packs created by the actor.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "starterPacks" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#starterPackViewBasic", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getActorStarterPacks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Enumerates which accounts the requesting account is currently blocking. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "blocks" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "cursor" => %{"type" => "string"} + }, + "required" => ["blocks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getBlocks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Enumerates accounts which follow a specified account (actor).", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "followers" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "subject" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + } + }, + "required" => ["subject", "followers"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getFollowers", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Enumerates accounts which a specified account (actor) follows.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "follows" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "subject" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + } + }, + "required" => ["subject", "follows"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getFollows", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerates accounts which follow a specified account (actor) and are followed by the viewer.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "followers" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "subject" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + } + }, + "required" => ["subject", "followers"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"}, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getKnownFollowers", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Gets a 'view' (with additional context) of a specified list.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "items" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#listItemView", + "type" => "ref" + }, + "type" => "array" + }, + "list" => %{ + "ref" => "app.bsky.graph.defs#listView", + "type" => "ref" + } + }, + "required" => ["list", "items"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "list" => %{ + "description" => "Reference (AT-URI) of the list record to hydrate.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["list"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getList", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get mod lists that the requesting account (actor) is blocking. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "lists" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#listView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["lists"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getListBlocks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerates mod lists that the requesting account (actor) currently has muted. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "lists" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#listView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["lists"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getListMutes", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Enumerates the lists created by a specified account (actor).", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "lists" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#listView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["lists"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{ + "description" => "The account (actor) to enumerate lists from.", + "format" => "at-identifier", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "purposes" => %{ + "description" => "Optional filter by list purpose. If not specified, all supported types are returned.", + "items" => %{ + "knownValues" => ["modlist", "curatelist"], + "type" => "string" + }, + "type" => "array" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getLists", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "listWithMembership" => %{ + "description" => "A list and an optional list item indicating membership of a target user to that list.", + "properties" => %{ + "list" => %{"ref" => "app.bsky.graph.defs#listView", "type" => "ref"}, + "listItem" => %{ + "ref" => "app.bsky.graph.defs#listItemView", + "type" => "ref" + } + }, + "required" => ["list"], + "type" => "object" + }, + "main" => %{ + "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.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "listsWithMembership" => %{ + "items" => %{"ref" => "#listWithMembership", "type" => "ref"}, + "type" => "array" + } + }, + "required" => ["listsWithMembership"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{ + "description" => "The account (actor) to check for membership.", + "format" => "at-identifier", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "purposes" => %{ + "description" => "Optional filter by list purpose. If not specified, all supported types are returned.", + "items" => %{ + "knownValues" => ["modlist", "curatelist"], + "type" => "string" + }, + "type" => "array" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getListsWithMembership", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerates accounts that the requesting account (actor) currently has muted. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "mutes" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["mutes"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getMutes", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerates public relationships between one account, and a list of other accounts. Does not require auth.", + "errors" => [ + %{ + "description" => "the primary actor at-identifier could not be resolved", + "name" => "ActorNotFound" + } + ], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actor" => %{"format" => "did", "type" => "string"}, + "relationships" => %{ + "items" => %{ + "refs" => ["app.bsky.graph.defs#relationship", "app.bsky.graph.defs#notFoundActor"], + "type" => "union" + }, + "type" => "array" + } + }, + "required" => ["relationships"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{ + "description" => "Primary account requesting relationships for.", + "format" => "at-identifier", + "type" => "string" + }, + "others" => %{ + "description" => "List of 'other' accounts to be related back to the primary.", + "items" => %{"format" => "at-identifier", "type" => "string"}, + "maxLength" => 30, + "type" => "array" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getRelationships", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Gets a view of a starter pack.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "starterPack" => %{ + "ref" => "app.bsky.graph.defs#starterPackView", + "type" => "ref" + } + }, + "required" => ["starterPack"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "starterPack" => %{ + "description" => "Reference (AT-URI) of the starter pack record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["starterPack"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getStarterPack", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get views for a list of starter packs.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "starterPacks" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#starterPackViewBasic", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "uris" => %{ + "items" => %{"format" => "at-uri", "type" => "string"}, + "maxLength" => 25, + "type" => "array" + } + }, + "required" => ["uris"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getStarterPacks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerates the starter packs created by the session user, and includes membership information about `actor` in those starter packs. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "starterPacksWithMembership" => %{ + "items" => %{ + "ref" => "#starterPackWithMembership", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["starterPacksWithMembership"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{ + "description" => "The account (actor) to check for membership.", + "format" => "at-identifier", + "type" => "string" + }, + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + }, + "starterPackWithMembership" => %{ + "description" => + "A starter pack and an optional list item indicating membership of a target user to that starter pack.", + "properties" => %{ + "listItem" => %{ + "ref" => "app.bsky.graph.defs#listItemView", + "type" => "ref" + }, + "starterPack" => %{ + "ref" => "app.bsky.graph.defs#starterPackView", + "type" => "ref" + } + }, + "required" => ["starterPack"], + "type" => "object" + } + }, + "id" => "app.bsky.graph.getStarterPacksWithMembership", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerates follows similar to a given account (actor). Expected use is to recommend additional accounts immediately after following one account.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "isFallback" => %{ + "default" => false, + "description" => + "DEPRECATED, unused. Previously: if true, response has fallen-back to generic results, and is not scoped using relativeToDid", + "type" => "boolean" + }, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", + "type" => "integer" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + }, + "suggestions" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["suggestions"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"} + }, + "required" => ["actor"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.getSuggestedFollowsByActor", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record representing a list of accounts (actors). Scope includes both moderation-oriented lists and curration-oriented lists.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "avatar" => %{ + "accept" => ["image/png", "image/jpeg"], + "maxSize" => 1_000_000, + "type" => "blob" + }, + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "description" => %{ + "maxGraphemes" => 300, + "maxLength" => 3000, + "type" => "string" + }, + "descriptionFacets" => %{ + "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, + "type" => "array" + }, + "labels" => %{ + "refs" => ["com.atproto.label.defs#selfLabels"], + "type" => "union" + }, + "name" => %{ + "description" => "Display name for list; can not be empty.", + "maxLength" => 64, + "minLength" => 1, + "type" => "string" + }, + "purpose" => %{ + "description" => "Defines the purpose of the list (aka, moderation-oriented or curration-oriented)", + "ref" => "app.bsky.graph.defs#listPurpose", + "type" => "ref" + } + }, + "required" => ["name", "purpose", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.list", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record representing a block relationship against an entire an entire list of accounts (actors).", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "subject" => %{ + "description" => "Reference (AT-URI) to the mod list record.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["subject", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.listblock", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record representing an account's inclusion on a specific list. The AppView will ignore duplicate listitem records.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "list" => %{ + "description" => "Reference (AT-URI) to the list record (app.bsky.graph.list).", + "format" => "at-uri", + "type" => "string" + }, + "subject" => %{ + "description" => "The account which is included on the list.", + "format" => "did", + "type" => "string" + } + }, + "required" => ["subject", "list", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.listitem", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Creates a mute relationship for the specified account. Mutes are private in Bluesky. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"} + }, + "required" => ["actor"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.graph.muteActor", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Creates a mute relationship for the specified list of accounts. Mutes are private in Bluesky. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "list" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["list"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.graph.muteActorList", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Mutes a thread preventing notifications from the thread and any of its children. Mutes are private in Bluesky. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "root" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["root"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.graph.muteThread", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Find starter packs matching search criteria. Does not require auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "starterPacks" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#starterPackViewBasic", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 25, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "q" => %{ + "description" => + "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.", + "type" => "string" + } + }, + "required" => ["q"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.graph.searchStarterPacks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "feedItem" => %{ + "properties" => %{"uri" => %{"format" => "at-uri", "type" => "string"}}, + "required" => ["uri"], + "type" => "object" + }, + "main" => %{ + "description" => "Record defining a starter pack of actors and feeds for new users.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "description" => %{ + "maxGraphemes" => 300, + "maxLength" => 3000, + "type" => "string" + }, + "descriptionFacets" => %{ + "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, + "type" => "array" + }, + "feeds" => %{ + "items" => %{"ref" => "#feedItem", "type" => "ref"}, + "maxLength" => 3, + "type" => "array" + }, + "list" => %{ + "description" => "Reference (AT-URI) to the list record.", + "format" => "at-uri", + "type" => "string" + }, + "name" => %{ + "description" => "Display name for starter pack; can not be empty.", + "maxGraphemes" => 50, + "maxLength" => 500, + "minLength" => 1, + "type" => "string" + } + }, + "required" => ["name", "list", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.starterpack", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Unmutes the specified account. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actor" => %{"format" => "at-identifier", "type" => "string"} + }, + "required" => ["actor"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.graph.unmuteActor", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Unmutes the specified list of accounts. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "list" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["list"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.graph.unmuteActorList", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Unmutes the specified thread. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "root" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["root"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.graph.unmuteThread", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Record declaring a verification relationship between two accounts. Verifications are only considered valid by an app if issued by an account the app considers trusted.", + "key" => "tid", + "record" => %{ + "properties" => %{ + "createdAt" => %{ + "description" => "Date of when the verification was created.", + "format" => "datetime", + "type" => "string" + }, + "displayName" => %{ + "description" => + "Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying.", + "type" => "string" + }, + "handle" => %{ + "description" => + "Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying.", + "format" => "handle", + "type" => "string" + }, + "subject" => %{ + "description" => "DID of the subject the verification applies to.", + "format" => "did", + "type" => "string" + } + }, + "required" => ["subject", "handle", "displayName", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.graph.verification", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "labelerPolicies" => %{ + "properties" => %{ + "labelValueDefinitions" => %{ + "description" => + "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", + "items" => %{ + "ref" => "com.atproto.label.defs#labelValueDefinition", + "type" => "ref" + }, + "type" => "array" + }, + "labelValues" => %{ + "description" => "The label values which this labeler publishes. May include global or custom labels.", + "items" => %{ + "ref" => "com.atproto.label.defs#labelValue", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["labelValues"], + "type" => "object" + }, + "labelerView" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "creator" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "likeCount" => %{"minimum" => 0, "type" => "integer"}, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "viewer" => %{"ref" => "#labelerViewerState", "type" => "ref"} + }, + "required" => ["uri", "cid", "creator", "indexedAt"], + "type" => "object" + }, + "labelerViewDetailed" => %{ + "properties" => %{ + "cid" => %{"format" => "cid", "type" => "string"}, + "creator" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "likeCount" => %{"minimum" => 0, "type" => "integer"}, + "policies" => %{ + "ref" => "app.bsky.labeler.defs#labelerPolicies", + "type" => "ref" + }, + "reasonTypes" => %{ + "description" => + "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", + "items" => %{ + "ref" => "com.atproto.moderation.defs#reasonType", + "type" => "ref" + }, + "type" => "array" + }, + "subjectCollections" => %{ + "description" => + "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", + "items" => %{"format" => "nsid", "type" => "string"}, + "type" => "array" + }, + "subjectTypes" => %{ + "description" => "The set of subject types (account, record, etc) this service accepts reports on.", + "items" => %{ + "ref" => "com.atproto.moderation.defs#subjectType", + "type" => "ref" + }, + "type" => "array" + }, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "viewer" => %{"ref" => "#labelerViewerState", "type" => "ref"} + }, + "required" => ["uri", "cid", "creator", "policies", "indexedAt"], + "type" => "object" + }, + "labelerViewerState" => %{ + "properties" => %{"like" => %{"format" => "at-uri", "type" => "string"}}, + "type" => "object" + } + }, + "id" => "app.bsky.labeler.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get information about a list of labeler services.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "views" => %{ + "items" => %{ + "refs" => ["app.bsky.labeler.defs#labelerView", "app.bsky.labeler.defs#labelerViewDetailed"], + "type" => "union" + }, + "type" => "array" + } + }, + "required" => ["views"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "detailed" => %{"default" => false, "type" => "boolean"}, + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + } + }, + "required" => ["dids"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.labeler.getServices", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "A declaration of the existence of labeler service.", + "key" => "literal:self", + "record" => %{ + "properties" => %{ + "createdAt" => %{"format" => "datetime", "type" => "string"}, + "labels" => %{ + "refs" => ["com.atproto.label.defs#selfLabels"], + "type" => "union" + }, + "policies" => %{ + "ref" => "app.bsky.labeler.defs#labelerPolicies", + "type" => "ref" + }, + "reasonTypes" => %{ + "description" => + "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", + "items" => %{ + "ref" => "com.atproto.moderation.defs#reasonType", + "type" => "ref" + }, + "type" => "array" + }, + "subjectCollections" => %{ + "description" => + "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", + "items" => %{"format" => "nsid", "type" => "string"}, + "type" => "array" + }, + "subjectTypes" => %{ + "description" => "The set of subject types (account, record, etc) this service accepts reports on.", + "items" => %{ + "ref" => "com.atproto.moderation.defs#subjectType", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["policies", "createdAt"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.labeler.service", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "A declaration of the user's choices related to notifications that can be produced by them.", + "key" => "literal:self", + "record" => %{ + "properties" => %{ + "allowSubscriptions" => %{ + "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"], + "type" => "string" + } + }, + "required" => ["allowSubscriptions"], + "type" => "object" + }, + "type" => "record" + } + }, + "id" => "app.bsky.notification.declaration", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "activitySubscription" => %{ + "properties" => %{ + "post" => %{"type" => "boolean"}, + "reply" => %{"type" => "boolean"} + }, + "required" => ["post", "reply"], + "type" => "object" + }, + "chatPreference" => %{ + "properties" => %{ + "include" => %{ + "knownValues" => ["all", "accepted"], + "type" => "string" + }, + "push" => %{"type" => "boolean"} + }, + "required" => ["include", "push"], + "type" => "object" + }, + "filterablePreference" => %{ + "properties" => %{ + "include" => %{ + "knownValues" => ["all", "follows"], + "type" => "string" + }, + "list" => %{"type" => "boolean"}, + "push" => %{"type" => "boolean"} + }, + "required" => ["include", "list", "push"], + "type" => "object" + }, + "preference" => %{ + "properties" => %{ + "list" => %{"type" => "boolean"}, + "push" => %{"type" => "boolean"} + }, + "required" => ["list", "push"], + "type" => "object" + }, + "preferences" => %{ + "properties" => %{ + "chat" => %{"ref" => "#chatPreference", "type" => "ref"}, + "follow" => %{"ref" => "#filterablePreference", "type" => "ref"}, + "like" => %{"ref" => "#filterablePreference", "type" => "ref"}, + "likeViaRepost" => %{ + "ref" => "#filterablePreference", + "type" => "ref" + }, + "mention" => %{"ref" => "#filterablePreference", "type" => "ref"}, + "quote" => %{"ref" => "#filterablePreference", "type" => "ref"}, + "reply" => %{"ref" => "#filterablePreference", "type" => "ref"}, + "repost" => %{"ref" => "#filterablePreference", "type" => "ref"}, + "repostViaRepost" => %{ + "ref" => "#filterablePreference", + "type" => "ref" + }, + "starterpackJoined" => %{"ref" => "#preference", "type" => "ref"}, + "subscribedPost" => %{"ref" => "#preference", "type" => "ref"}, + "unverified" => %{"ref" => "#preference", "type" => "ref"}, + "verified" => %{"ref" => "#preference", "type" => "ref"} + }, + "required" => [ + "chat", + "follow", + "like", + "likeViaRepost", + "mention", + "quote", + "reply", + "repost", + "repostViaRepost", + "starterpackJoined", + "subscribedPost", + "unverified", + "verified" + ], + "type" => "object" + }, + "recordDeleted" => %{"properties" => %{}, "type" => "object"}, + "subjectActivitySubscription" => %{ + "description" => "Object used to store activity subscription data in stash.", + "properties" => %{ + "activitySubscription" => %{ + "ref" => "#activitySubscription", + "type" => "ref" + }, + "subject" => %{"format" => "did", "type" => "string"} + }, + "required" => ["subject", "activitySubscription"], + "type" => "object" + } + }, + "id" => "app.bsky.notification.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get notification-related preferences for an account. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "preferences" => %{ + "ref" => "app.bsky.notification.defs#preferences", + "type" => "ref" + } + }, + "required" => ["preferences"], + "type" => "object" + } + }, + "parameters" => %{"properties" => %{}, "type" => "params"}, + "type" => "query" + } + }, + "id" => "app.bsky.notification.getPreferences", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Count the number of unread notifications for the requesting account. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{"count" => %{"type" => "integer"}}, + "required" => ["count"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "priority" => %{"type" => "boolean"}, + "seenAt" => %{"format" => "datetime", "type" => "string"} + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.notification.getUnreadCount", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Enumerate all accounts to which the requesting account is subscribed to receive notifications for. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "subscriptions" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["subscriptions"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.notification.listActivitySubscriptions", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Enumerate notifications for the requesting account. Requires auth.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "notifications" => %{ + "items" => %{"ref" => "#notification", "type" => "ref"}, + "type" => "array" + }, + "priority" => %{"type" => "boolean"}, + "seenAt" => %{"format" => "datetime", "type" => "string"} + }, + "required" => ["notifications"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "priority" => %{"type" => "boolean"}, + "reasons" => %{ + "description" => "Notification reasons to include in response.", + "items" => %{ + "description" => "A reason that matches the reason property of #notification.", + "type" => "string" + }, + "type" => "array" + }, + "seenAt" => %{"format" => "datetime", "type" => "string"} + }, + "type" => "params" + }, + "type" => "query" + }, + "notification" => %{ + "properties" => %{ + "author" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "cid" => %{"format" => "cid", "type" => "string"}, + "indexedAt" => %{"format" => "datetime", "type" => "string"}, + "isRead" => %{"type" => "boolean"}, + "labels" => %{ + "items" => %{ + "ref" => "com.atproto.label.defs#label", + "type" => "ref" + }, + "type" => "array" + }, + "reason" => %{ + "description" => + "The reason why this notification was delivered - e.g. your post was liked, or you received a new follower.", + "knownValues" => [ + "like", + "repost", + "follow", + "mention", + "reply", + "quote", + "starterpack-joined", + "verified", + "unverified", + "like-via-repost", + "repost-via-repost", + "subscribed-post", + "contact-match" + ], + "type" => "string" + }, + "reasonSubject" => %{"format" => "at-uri", "type" => "string"}, + "record" => %{"type" => "unknown"}, + "uri" => %{"format" => "at-uri", "type" => "string"} + }, + "required" => ["uri", "cid", "author", "reason", "record", "isRead", "indexedAt"], + "type" => "object" + } + }, + "id" => "app.bsky.notification.listNotifications", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Puts an activity subscription entry. The key should be omitted for creation and provided for updates. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "activitySubscription" => %{ + "ref" => "app.bsky.notification.defs#activitySubscription", + "type" => "ref" + }, + "subject" => %{"format" => "did", "type" => "string"} + }, + "required" => ["subject", "activitySubscription"], + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "activitySubscription" => %{ + "ref" => "app.bsky.notification.defs#activitySubscription", + "type" => "ref" + }, + "subject" => %{"format" => "did", "type" => "string"} + }, + "required" => ["subject"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.notification.putActivitySubscription", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Set notification-related preferences for an account. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{"priority" => %{"type" => "boolean"}}, + "required" => ["priority"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.notification.putPreferences", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Set notification-related preferences for an account. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "chat" => %{ + "ref" => "app.bsky.notification.defs#chatPreference", + "type" => "ref" + }, + "follow" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "like" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "likeViaRepost" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "mention" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "quote" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "reply" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "repost" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "repostViaRepost" => %{ + "ref" => "app.bsky.notification.defs#filterablePreference", + "type" => "ref" + }, + "starterpackJoined" => %{ + "ref" => "app.bsky.notification.defs#preference", + "type" => "ref" + }, + "subscribedPost" => %{ + "ref" => "app.bsky.notification.defs#preference", + "type" => "ref" + }, + "unverified" => %{ + "ref" => "app.bsky.notification.defs#preference", + "type" => "ref" + }, + "verified" => %{ + "ref" => "app.bsky.notification.defs#preference", + "type" => "ref" + } + }, + "type" => "object" + } + }, + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "preferences" => %{ + "ref" => "app.bsky.notification.defs#preferences", + "type" => "ref" + } + }, + "required" => ["preferences"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.notification.putPreferencesV2", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Register to receive push notifications, via a specified service, for the requesting account. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "ageRestricted" => %{ + "description" => "Set to true when the actor is age restricted", + "type" => "boolean" + }, + "appId" => %{"type" => "string"}, + "platform" => %{ + "knownValues" => ["ios", "android", "web"], + "type" => "string" + }, + "serviceDid" => %{"format" => "did", "type" => "string"}, + "token" => %{"type" => "string"} + }, + "required" => ["serviceDid", "token", "platform", "appId"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.notification.registerPush", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "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" => %{ + "properties" => %{ + "appId" => %{"type" => "string"}, + "platform" => %{ + "knownValues" => ["ios", "android", "web"], + "type" => "string" + }, + "serviceDid" => %{"format" => "did", "type" => "string"}, + "token" => %{"type" => "string"} + }, + "required" => ["serviceDid", "token", "platform", "appId"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.notification.unregisterPush", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Notify server that the requesting account has seen notifications. Requires auth.", + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "seenAt" => %{"format" => "datetime", "type" => "string"} + }, + "required" => ["seenAt"], + "type" => "object" + } + }, + "type" => "procedure" + } + }, + "id" => "app.bsky.notification.updateSeen", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "byteSlice" => %{ + "description" => + "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.", + "properties" => %{ + "byteEnd" => %{"minimum" => 0, "type" => "integer"}, + "byteStart" => %{"minimum" => 0, "type" => "integer"} + }, + "required" => ["byteStart", "byteEnd"], + "type" => "object" + }, + "link" => %{ + "description" => + "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", + "properties" => %{"uri" => %{"format" => "uri", "type" => "string"}}, + "required" => ["uri"], + "type" => "object" + }, + "main" => %{ + "description" => "Annotation of a sub-string within rich text.", + "properties" => %{ + "features" => %{ + "items" => %{ + "refs" => ["#mention", "#link", "#tag"], + "type" => "union" + }, + "type" => "array" + }, + "index" => %{"ref" => "#byteSlice", "type" => "ref"} + }, + "required" => ["index", "features"], + "type" => "object" + }, + "mention" => %{ + "description" => + "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", + "properties" => %{"did" => %{"format" => "did", "type" => "string"}}, + "required" => ["did"], + "type" => "object" + }, + "tag" => %{ + "description" => + "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags').", + "properties" => %{ + "tag" => %{ + "maxGraphemes" => 64, + "maxLength" => 640, + "type" => "string" + } + }, + "required" => ["tag"], + "type" => "object" + } + }, + "id" => "app.bsky.richtext.facet", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "ageAssuranceEvent" => %{ + "description" => "Object used to store age assurance data in stash.", + "properties" => %{ + "attemptId" => %{ + "description" => "The unique identifier for this instance of the age assurance flow, in UUID format.", + "type" => "string" + }, + "completeIp" => %{ + "description" => "The IP address used when completing the AA flow.", + "type" => "string" + }, + "completeUa" => %{ + "description" => "The user agent used when completing the AA flow.", + "type" => "string" + }, + "createdAt" => %{ + "description" => "The date and time of this write operation.", + "format" => "datetime", + "type" => "string" + }, + "email" => %{ + "description" => "The email used for AA.", + "type" => "string" + }, + "initIp" => %{ + "description" => "The IP address used when initiating the AA flow.", + "type" => "string" + }, + "initUa" => %{ + "description" => "The user agent used when initiating the AA flow.", + "type" => "string" + }, + "status" => %{ + "description" => "The status of the age assurance process.", + "knownValues" => ["unknown", "pending", "assured"], + "type" => "string" + } + }, + "required" => ["createdAt", "status", "attemptId"], + "type" => "object" + }, + "ageAssuranceState" => %{ + "description" => + "The computed state of the age assurance process, returned to the user in question on certain authenticated requests.", + "properties" => %{ + "lastInitiatedAt" => %{ + "description" => "The timestamp when this state was last updated.", + "format" => "datetime", + "type" => "string" + }, + "status" => %{ + "description" => "The status of the age assurance process.", + "knownValues" => ["unknown", "pending", "assured", "blocked"], + "type" => "string" + } + }, + "required" => ["status"], + "type" => "object" + }, + "skeletonSearchActor" => %{ + "properties" => %{"did" => %{"format" => "did", "type" => "string"}}, + "required" => ["did"], + "type" => "object" + }, + "skeletonSearchPost" => %{ + "properties" => %{"uri" => %{"format" => "at-uri", "type" => "string"}}, + "required" => ["uri"], + "type" => "object" + }, + "skeletonSearchStarterPack" => %{ + "properties" => %{"uri" => %{"format" => "at-uri", "type" => "string"}}, + "required" => ["uri"], + "type" => "object" + }, + "skeletonTrend" => %{ + "properties" => %{ + "category" => %{"type" => "string"}, + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + }, + "displayName" => %{"type" => "string"}, + "link" => %{"type" => "string"}, + "postCount" => %{"type" => "integer"}, + "startedAt" => %{"format" => "datetime", "type" => "string"}, + "status" => %{"knownValues" => ["hot"], "type" => "string"}, + "topic" => %{"type" => "string"} + }, + "required" => ["topic", "displayName", "link", "startedAt", "postCount", "dids"], + "type" => "object" + }, + "threadItemBlocked" => %{ + "properties" => %{ + "author" => %{ + "ref" => "app.bsky.feed.defs#blockedAuthor", + "type" => "ref" + } + }, + "required" => ["author"], + "type" => "object" + }, + "threadItemNoUnauthenticated" => %{ + "properties" => %{}, + "type" => "object" + }, + "threadItemNotFound" => %{"properties" => %{}, "type" => "object"}, + "threadItemPost" => %{ + "properties" => %{ + "hiddenByThreadgate" => %{ + "description" => + "The threadgate created by the author indicates this post as a reply to be hidden for everyone consuming the thread.", + "type" => "boolean" + }, + "moreParents" => %{ + "description" => + "This post has more parents that were not present in the response. This is just a boolean, without the number of parents.", + "type" => "boolean" + }, + "moreReplies" => %{ + "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.", + "type" => "integer" + }, + "mutedByViewer" => %{ + "description" => "This is by an account muted by the viewer requesting it.", + "type" => "boolean" + }, + "opThread" => %{ + "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.", + "type" => "boolean" + }, + "post" => %{"ref" => "app.bsky.feed.defs#postView", "type" => "ref"} + }, + "required" => ["post", "moreParents", "moreReplies", "opThread", "hiddenByThreadgate", "mutedByViewer"], + "type" => "object" + }, + "trendView" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileViewBasic", + "type" => "ref" + }, + "type" => "array" + }, + "category" => %{"type" => "string"}, + "displayName" => %{"type" => "string"}, + "link" => %{"type" => "string"}, + "postCount" => %{"type" => "integer"}, + "startedAt" => %{"format" => "datetime", "type" => "string"}, + "status" => %{"knownValues" => ["hot"], "type" => "string"}, + "topic" => %{"type" => "string"} + }, + "required" => ["topic", "displayName", "link", "startedAt", "postCount", "actors"], + "type" => "object" + }, + "trendingTopic" => %{ + "properties" => %{ + "description" => %{"type" => "string"}, + "displayName" => %{"type" => "string"}, + "link" => %{"type" => "string"}, + "topic" => %{"type" => "string"} + }, + "required" => ["topic", "link"], + "type" => "object" + } + }, + "id" => "app.bsky.unspecced.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "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" => %{ + "ref" => "app.bsky.unspecced.defs#ageAssuranceState", + "type" => "ref" + } + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getAgeAssuranceState", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "liveNowConfig" => %{ + "properties" => %{ + "did" => %{"format" => "did", "type" => "string"}, + "domains" => %{"items" => %{"type" => "string"}, "type" => "array"} + }, + "required" => ["did", "domains"], + "type" => "object" + }, + "main" => %{ + "description" => "Get miscellaneous runtime configuration.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "checkEmailConfirmed" => %{"type" => "boolean"}, + "liveNow" => %{ + "items" => %{"ref" => "#liveNowConfig", "type" => "ref"}, + "type" => "array" + } + }, + "required" => [], + "type" => "object" + } + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getConfig", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested starterpacks for onboarding", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "starterPacks" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#starterPackView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested starterpacks for onboarding. Intended to be called and hydrated by app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "starterPacks" => %{ + "items" => %{"format" => "at-uri", "type" => "string"}, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested users for onboarding. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedOnboardingUsers", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + }, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", + "type" => "string" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["dids"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "An unspecced view of globally popular feed generators.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "feeds" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feeds"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "query" => %{"type" => "string"} + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getPopularFeedGenerators", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "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.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "thread" => %{ + "description" => + "A flat list of other thread items. The depth of each item is indicated by the depth property inside the item.", + "items" => %{"ref" => "#threadItem", "type" => "ref"}, + "type" => "array" + } + }, + "required" => ["thread"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "anchor" => %{ + "description" => "Reference (AT-URI) to post record. This is the anchor post.", + "format" => "at-uri", + "type" => "string" + } + }, + "required" => ["anchor"], + "type" => "params" + }, + "type" => "query" + }, + "threadItem" => %{ + "properties" => %{ + "depth" => %{ + "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.", + "type" => "integer" + }, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "value" => %{ + "refs" => ["app.bsky.unspecced.defs#threadItemPost"], + "type" => "union" + } + }, + "required" => ["uri", "depth", "value"], + "type" => "object" + } + }, + "id" => "app.bsky.unspecced.getPostThreadOtherV2", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "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.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "hasOtherReplies" => %{ + "description" => + "Whether this thread has additional replies. If true, a call can be made to the `getPostThreadOtherV2` endpoint to retrieve them.", + "type" => "boolean" + }, + "thread" => %{ + "description" => + "A flat list of thread items. The depth of each item is indicated by the depth property inside the item.", + "items" => %{"ref" => "#threadItem", "type" => "ref"}, + "type" => "array" + }, + "threadgate" => %{ + "ref" => "app.bsky.feed.defs#threadgateView", + "type" => "ref" + } + }, + "required" => ["thread", "hasOtherReplies"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "above" => %{ + "default" => true, + "description" => "Whether to include parents above the anchor.", + "type" => "boolean" + }, + "anchor" => %{ + "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.", + "format" => "at-uri", + "type" => "string" + }, + "below" => %{ + "default" => 6, + "description" => "How many levels of replies to include below the anchor.", + "maximum" => 20, + "minimum" => 0, + "type" => "integer" + }, + "branchingFactor" => %{ + "default" => 10, + "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).", + "maximum" => 100, + "minimum" => 0, + "type" => "integer" + }, + "sort" => %{ + "default" => "oldest", + "description" => "Sorting for the thread replies.", + "knownValues" => ["newest", "oldest", "top"], + "type" => "string" + } + }, + "required" => ["anchor"], + "type" => "params" + }, + "type" => "query" + }, + "threadItem" => %{ + "properties" => %{ + "depth" => %{ + "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.", + "type" => "integer" + }, + "uri" => %{"format" => "at-uri", "type" => "string"}, + "value" => %{ "refs" => [ - "app.bsky.embed.images#view", - "app.bsky.embed.video#view", - "app.bsky.embed.gallery#view", - "app.bsky.embed.external#view", - "app.bsky.embed.record#view", - "app.bsky.embed.recordWithMedia#view" + "app.bsky.unspecced.defs#threadItemPost", + "app.bsky.unspecced.defs#threadItemNoUnauthenticated", + "app.bsky.unspecced.defs#threadItemNotFound", + "app.bsky.unspecced.defs#threadItemBlocked" ], "type" => "union" + } + }, + "required" => ["uri", "depth", "value"], + "type" => "object" + } + }, + "id" => "app.bsky.unspecced.getPostThreadV2", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested feeds", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "feeds" => %{ + "items" => %{ + "ref" => "app.bsky.feed.defs#generatorView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["feeds"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + } }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedFeeds", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested feeds. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedFeeds", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "feeds" => %{ + "items" => %{"format" => "at-uri", "type" => "string"}, + "type" => "array" + } }, - "type" => "array" + "required" => ["feeds"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested users for onboarding", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", + "type" => "string" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["actors"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedOnboardingUsers", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested starterpacks", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "starterPacks" => %{ + "items" => %{ + "ref" => "app.bsky.graph.defs#starterPackView", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedStarterPacks", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested starterpacks. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedStarterpacks", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "starterPacks" => %{ + "items" => %{"format" => "at-uri", "type" => "string"}, + "type" => "array" + } + }, + "required" => ["starterPacks"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } }, - "likeCount" => %{"type" => "integer"}, - "quoteCount" => %{"type" => "integer"}, - "record" => %{"type" => "unknown"}, - "replyCount" => %{"type" => "integer"}, - "repostCount" => %{"type" => "integer"}, - "threadgate" => %{"ref" => "#threadgateView", "type" => "ref"}, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "viewer" => %{"ref" => "#viewerState", "type" => "ref"} + "type" => "params" }, - "required" => ["uri", "cid", "author", "record", "indexedAt"], - "type" => "object" - }, - "reasonPin" => %{"properties" => %{}, "type" => "object"}, - "reasonRepost" => %{ - "properties" => %{ - "by" => %{ - "ref" => "app.bsky.actor.defs#profileViewBasic", - "type" => "ref" - }, - "cid" => %{"format" => "cid", "type" => "string"}, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "uri" => %{"format" => "at-uri", "type" => "string"} + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested users", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", + "type" => "string" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["actors"], + "type" => "object" + } }, - "required" => ["by", "indexedAt"], - "type" => "object" - }, - "replyRef" => %{ - "properties" => %{ - "grandparentAuthor" => %{ - "description" => "When parent is a reply to another post, this is the author of that post.", - "ref" => "app.bsky.actor.defs#profileViewBasic", - "type" => "ref" + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + } }, - "parent" => %{ - "refs" => ["#postView", "#notFoundPost", "#blockedPost"], - "type" => "union" + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedUsers", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested users for the Discover page", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["actors"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + } }, - "root" => %{ - "refs" => ["#postView", "#notFoundPost", "#blockedPost"], - "type" => "union" + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedUsersForDiscover", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested users for the Discover page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForDiscover", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["dids"], + "type" => "object" } }, - "required" => ["root", "parent"], - "type" => "object" - }, - "requestLess" => %{ - "description" => "Request that less content like the given feed item be shown in the feed", - "type" => "token" - }, - "requestMore" => %{ - "description" => "Request that more content like the given feed item be shown in the feed", - "type" => "token" - }, - "skeletonFeedPost" => %{ - "properties" => %{ - "feedContext" => %{ - "description" => - "Context that will be passed through to client and may be passed to feed generator back alongside interactions.", - "maxLength" => 2000, - "type" => "string" + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } }, - "post" => %{"format" => "at-uri", "type" => "string"}, - "reason" => %{ - "refs" => ["#skeletonReasonRepost", "#skeletonReasonPin"], - "type" => "union" + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested users for the Explore page", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["actors"], + "type" => "object" } }, - "required" => ["post"], - "type" => "object" - }, - "skeletonReasonPin" => %{"properties" => %{}, "type" => "object"}, - "skeletonReasonRepost" => %{ - "properties" => %{ - "repost" => %{"format" => "at-uri", "type" => "string"} + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + } + }, + "type" => "params" }, - "required" => ["repost"], - "type" => "object" - }, - "threadContext" => %{ - "description" => "Metadata about this post within the context of the thread it is in.", - "properties" => %{ - "rootAuthorLike" => %{"format" => "at-uri", "type" => "string"} + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedUsersForExplore", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested users for the Explore page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForExplore", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["dids"], + "type" => "object" + } }, - "type" => "object" - }, - "threadViewPost" => %{ - "properties" => %{ - "parent" => %{ - "refs" => ["#threadViewPost", "#notFoundPost", "#blockedPost"], - "type" => "union" + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } }, - "post" => %{"ref" => "#postView", "type" => "ref"}, - "replies" => %{ - "items" => %{ - "refs" => ["#threadViewPost", "#notFoundPost", "#blockedPost"], - "type" => "union" + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedUsersForExploreSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggested users for the See More page", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.actor.defs#profileView", + "type" => "ref" + }, + "type" => "array" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } }, - "type" => "array" - }, - "threadContext" => %{"ref" => "#threadContext", "type" => "ref"} + "required" => ["actors"], + "type" => "object" + } }, - "required" => ["post"], - "type" => "object" - }, - "threadgateView" => %{ - "properties" => %{ - "cid" => %{"format" => "cid", "type" => "string"}, - "lists" => %{ - "items" => %{ - "ref" => "app.bsky.graph.defs#listViewBasic", - "type" => "ref" + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" }, - "type" => "array" + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + } }, - "record" => %{"type" => "unknown"}, - "uri" => %{"format" => "at-uri", "type" => "string"} - }, - "type" => "object" - }, - "viewerState" => %{ - "description" => - "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", - "properties" => %{ - "bookmarked" => %{"type" => "boolean"}, - "embeddingDisabled" => %{"type" => "boolean"}, - "like" => %{"format" => "at-uri", "type" => "string"}, - "pinned" => %{"type" => "boolean"}, - "replyDisabled" => %{"type" => "boolean"}, - "repost" => %{"format" => "at-uri", "type" => "string"}, - "threadMuted" => %{"type" => "boolean"} + "type" => "params" }, - "type" => "object" + "type" => "query" } }, - "id" => "app.bsky.feed.defs", + "id" => "app.bsky.unspecced.getSuggestedUsersForSeeMore", "lexicon" => 1 }, %{ "defs" => %{ - "entity" => %{ - "description" => "Deprecated: use facets instead.", - "properties" => %{ - "index" => %{"ref" => "#textSlice", "type" => "ref"}, - "type" => %{ - "description" => "Expected values are 'mention' and 'link'.", - "type" => "string" - }, - "value" => %{"type" => "string"} - }, - "required" => ["index", "type", "value"], - "type" => "object" - }, "main" => %{ - "description" => "Record containing a Bluesky post.", - "key" => "tid", - "record" => %{ + "description" => + "Get a skeleton of suggested users for the See More page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForSeeMore", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } + }, + "required" => ["dids"], + "type" => "object" + } + }, + "parameters" => %{ "properties" => %{ - "createdAt" => %{ - "description" => "Client-declared timestamp when this post was originally created.", - "format" => "datetime", + "category" => %{ + "description" => "Category of users to get suggestions for.", "type" => "string" }, - "embed" => %{ - "refs" => [ - "app.bsky.embed.images", - "app.bsky.embed.video", - "app.bsky.embed.gallery", - "app.bsky.embed.external", - "app.bsky.embed.record", - "app.bsky.embed.recordWithMedia" - ], - "type" => "union" - }, - "entities" => %{ - "description" => "DEPRECATED: replaced by app.bsky.richtext.facet.", - "items" => %{"ref" => "#entity", "type" => "ref"}, - "type" => "array" - }, - "facets" => %{ - "description" => "Annotations of text (mentions, URLs, hashtags, etc)", - "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, - "type" => "array" - }, - "labels" => %{ - "description" => "Self-label values for this post. Effectively content warnings.", - "refs" => ["com.atproto.label.defs#selfLabels"], - "type" => "union" - }, - "langs" => %{ - "description" => "Indicates human language of post primary text content.", - "items" => %{"format" => "language", "type" => "string"}, - "maxLength" => 3, - "type" => "array" + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" }, - "reply" => %{"ref" => "#replyRef", "type" => "ref"}, - "tags" => %{ - "description" => "Additional hashtags, in addition to any included in post text and facets.", - "items" => %{ - "maxGraphemes" => 64, - "maxLength" => 640, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Get a skeleton of suggested users. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsers", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "dids" => %{ + "items" => %{"format" => "did", "type" => "string"}, + "type" => "array" + }, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", "type" => "string" }, - "maxLength" => 8, - "type" => "array" + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + } }, - "text" => %{ - "description" => "The primary post content. May be an empty string, if there are embeds.", - "maxGraphemes" => 300, - "maxLength" => 3000, + "required" => ["dids"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "category" => %{ + "description" => "Category of users to get suggestions for.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 50, + "minimum" => 1, + "type" => "integer" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", "type" => "string" } }, - "required" => ["text", "createdAt"], - "type" => "object" - }, - "type" => "record" - }, - "replyRef" => %{ - "properties" => %{ - "parent" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"}, - "root" => %{"ref" => "com.atproto.repo.strongRef", "type" => "ref"} - }, - "required" => ["root", "parent"], - "type" => "object" - }, - "textSlice" => %{ - "description" => - "Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.", - "properties" => %{ - "end" => %{"minimum" => 0, "type" => "integer"}, - "start" => %{"minimum" => 0, "type" => "integer"} + "type" => "params" }, - "required" => ["start", "end"], - "type" => "object" + "type" => "query" } }, - "id" => "app.bsky.feed.post", + "id" => "app.bsky.unspecced.getSuggestedUsersSkeleton", "lexicon" => 1 }, %{ "defs" => %{ - "disableRule" => %{ - "description" => "Disables embedding of this post.", - "properties" => %{}, - "type" => "object" - }, "main" => %{ "description" => - "Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository.", - "key" => "tid", - "record" => %{ + "Get a skeleton of suggested actors. Intended to be called and then hydrated through app.bsky.actor.getSuggestions", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#skeletonSearchActor", + "type" => "ref" + }, + "type" => "array" + }, + "cursor" => %{"type" => "string"}, + "recId" => %{ + "description" => "DEPRECATED: use recIdStr instead.", + "type" => "integer" + }, + "recIdStr" => %{ + "description" => "Snowflake for this recommendation, use when submitting recommendation events.", + "type" => "string" + }, + "relativeToDid" => %{ + "description" => + "DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer.", + "format" => "did", + "type" => "string" + } + }, + "required" => ["actors"], + "type" => "object" + } + }, + "parameters" => %{ "properties" => %{ - "createdAt" => %{"format" => "datetime", "type" => "string"}, - "detachedEmbeddingUris" => %{ - "description" => "List of AT-URIs embedding this post that the author has detached from.", - "items" => %{"format" => "at-uri", "type" => "string"}, - "maxLength" => 50, - "type" => "array" + "cursor" => %{"type" => "string"}, + "limit" => %{ + "default" => 50, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" }, - "embeddingRules" => %{ + "relativeToDid" => %{ "description" => - "List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed.", - "items" => %{"refs" => ["#disableRule"], "type" => "union"}, - "maxLength" => 5, - "type" => "array" + "DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer.", + "format" => "did", + "type" => "string" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking.", + "format" => "did", + "type" => "string" + } + }, + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getSuggestionsSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get a list of suggestions (feeds and users) tagged with categories", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "suggestions" => %{ + "items" => %{"ref" => "#suggestion", "type" => "ref"}, + "type" => "array" + } }, - "post" => %{ - "description" => "Reference (AT-URI) to the post record.", - "format" => "at-uri", - "type" => "string" - } + "required" => ["suggestions"], + "type" => "object" + } + }, + "parameters" => %{"properties" => %{}, "type" => "params"}, + "type" => "query" + }, + "suggestion" => %{ + "properties" => %{ + "subject" => %{"format" => "uri", "type" => "string"}, + "subjectType" => %{ + "knownValues" => ["actor", "feed"], + "type" => "string" }, - "required" => ["post", "createdAt"], - "type" => "object" + "tag" => %{"type" => "string"} }, - "type" => "record" + "required" => ["tag", "subjectType", "subject"], + "type" => "object" } }, - "id" => "app.bsky.feed.postgate", + "id" => "app.bsky.unspecced.getTaggedSuggestions", "lexicon" => 1 }, %{ "defs" => %{ - "followerRule" => %{ - "description" => "Allow replies from actors who follow you.", - "properties" => %{}, - "type" => "object" - }, - "followingRule" => %{ - "description" => "Allow replies from actors you follow.", - "properties" => %{}, - "type" => "object" - }, - "listRule" => %{ - "description" => "Allow replies from actors on a list.", - "properties" => %{"list" => %{"format" => "at-uri", "type" => "string"}}, - "required" => ["list"], - "type" => "object" - }, "main" => %{ - "description" => - "Record defining interaction gating rules for a thread (aka, reply controls). The record key (rkey) of the threadgate record must match the record key of the thread's root post, and that record must be in the same repository.", - "key" => "tid", - "record" => %{ - "properties" => %{ - "allow" => %{ - "description" => - "List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply.", - "items" => %{ - "refs" => ["#mentionRule", "#followerRule", "#followingRule", "#listRule"], - "type" => "union" + "description" => "Get a list of trending topics", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "suggested" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#trendingTopic", + "type" => "ref" + }, + "type" => "array" }, - "maxLength" => 5, - "type" => "array" + "topics" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#trendingTopic", + "type" => "ref" + }, + "type" => "array" + } }, - "createdAt" => %{"format" => "datetime", "type" => "string"}, - "hiddenReplies" => %{ - "description" => "List of hidden reply URIs.", - "items" => %{"format" => "at-uri", "type" => "string"}, - "maxLength" => 300, - "type" => "array" + "required" => ["topics", "suggested"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" }, - "post" => %{ - "description" => "Reference (AT-URI) to the post record.", - "format" => "at-uri", + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking.", + "format" => "did", "type" => "string" } }, - "required" => ["post", "createdAt"], - "type" => "object" + "type" => "params" }, - "type" => "record" - }, - "mentionRule" => %{ - "description" => "Allow replies from actors mentioned in your post.", - "properties" => %{}, - "type" => "object" + "type" => "query" } }, - "id" => "app.bsky.feed.threadgate", + "id" => "app.bsky.unspecced.getTrendingTopics", "lexicon" => 1 }, %{ "defs" => %{ - "curatelist" => %{ - "description" => "A list of actors used for curation purposes such as list feeds or interaction gating.", - "type" => "token" - }, - "listItemView" => %{ - "properties" => %{ - "subject" => %{ - "ref" => "app.bsky.actor.defs#profileView", - "type" => "ref" - }, - "uri" => %{"format" => "at-uri", "type" => "string"} - }, - "required" => ["uri", "subject"], - "type" => "object" - }, - "listPurpose" => %{ - "knownValues" => [ - "app.bsky.graph.defs#modlist", - "app.bsky.graph.defs#curatelist", - "app.bsky.graph.defs#referencelist" - ], - "type" => "string" - }, - "listView" => %{ - "properties" => %{ - "avatar" => %{"format" => "uri", "type" => "string"}, - "cid" => %{"format" => "cid", "type" => "string"}, - "creator" => %{ - "ref" => "app.bsky.actor.defs#profileView", - "type" => "ref" - }, - "description" => %{ - "maxGraphemes" => 300, - "maxLength" => 3000, - "type" => "string" - }, - "descriptionFacets" => %{ - "items" => %{"ref" => "app.bsky.richtext.facet", "type" => "ref"}, - "type" => "array" - }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" + "main" => %{ + "description" => "Get the current trends on the network", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "trends" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#trendView", + "type" => "ref" + }, + "type" => "array" + } }, - "type" => "array" - }, - "listItemCount" => %{"minimum" => 0, "type" => "integer"}, - "name" => %{"maxLength" => 64, "minLength" => 1, "type" => "string"}, - "purpose" => %{"ref" => "#listPurpose", "type" => "ref"}, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "viewer" => %{"ref" => "#listViewerState", "type" => "ref"} + "required" => ["trends"], + "type" => "object" + } }, - "required" => ["uri", "cid", "creator", "name", "purpose", "indexedAt"], - "type" => "object" - }, - "listViewBasic" => %{ - "properties" => %{ - "avatar" => %{"format" => "uri", "type" => "string"}, - "cid" => %{"format" => "cid", "type" => "string"}, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" - }, - "type" => "array" + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" + } }, - "listItemCount" => %{"minimum" => 0, "type" => "integer"}, - "name" => %{"maxLength" => 64, "minLength" => 1, "type" => "string"}, - "purpose" => %{"ref" => "#listPurpose", "type" => "ref"}, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "viewer" => %{"ref" => "#listViewerState", "type" => "ref"} - }, - "required" => ["uri", "cid", "name", "purpose"], - "type" => "object" - }, - "listViewerState" => %{ - "properties" => %{ - "blocked" => %{"format" => "at-uri", "type" => "string"}, - "muted" => %{"type" => "boolean"} - }, - "type" => "object" - }, - "modlist" => %{ - "description" => "A list of actors to apply an aggregate moderation action (mute/block) on.", - "type" => "token" - }, - "notFoundActor" => %{ - "description" => "indicates that a handle or DID could not be resolved", - "properties" => %{ - "actor" => %{"format" => "at-identifier", "type" => "string"}, - "notFound" => %{"const" => true, "type" => "boolean"} + "type" => "params" }, - "required" => ["actor", "notFound"], - "type" => "object" - }, - "referencelist" => %{ - "description" => "A list of actors used for only for reference purposes such as within a starter pack.", - "type" => "token" - }, - "relationship" => %{ + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getTrends", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ "description" => - "lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object)", - "properties" => %{ - "blockedBy" => %{ - "description" => "if the actor is blocked by this DID, contains the AT-URI of the block record", - "format" => "at-uri", - "type" => "string" - }, - "blockedByList" => %{ - "description" => - "if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record", - "format" => "at-uri", - "type" => "string" - }, - "blocking" => %{ - "description" => "if the actor blocks this DID, this is the AT-URI of the block record", - "format" => "at-uri", - "type" => "string" - }, - "blockingByList" => %{ - "description" => - "if the actor blocks this DID via a block list, this is the AT-URI of the listblock record", - "format" => "at-uri", - "type" => "string" - }, - "did" => %{"format" => "did", "type" => "string"}, - "followedBy" => %{ - "description" => "if the actor is followed by this DID, contains the AT-URI of the follow record", - "format" => "at-uri", - "type" => "string" - }, - "following" => %{ - "description" => "if the actor follows this DID, this is the AT-URI of the follow record", - "format" => "at-uri", - "type" => "string" + "Get the skeleton of trends on the network. Intended to be called and then hydrated through app.bsky.unspecced.getTrends", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "trends" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#skeletonTrend", + "type" => "ref" + }, + "type" => "array" + } + }, + "required" => ["trends"], + "type" => "object" } }, - "required" => ["did"], - "type" => "object" - }, - "starterPackView" => %{ - "properties" => %{ - "cid" => %{"format" => "cid", "type" => "string"}, - "creator" => %{ - "ref" => "app.bsky.actor.defs#profileViewBasic", - "type" => "ref" - }, - "feeds" => %{ - "items" => %{ - "ref" => "app.bsky.feed.defs#generatorView", - "type" => "ref" + "parameters" => %{ + "properties" => %{ + "limit" => %{ + "default" => 10, + "maximum" => 25, + "minimum" => 1, + "type" => "integer" }, - "maxLength" => 3, - "type" => "array" + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "joinedAllTimeCount" => %{"minimum" => 0, "type" => "integer"}, - "joinedWeekCount" => %{"minimum" => 0, "type" => "integer"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.getTrendsSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => + "Initiate age assurance for an account. This is a one-time action that will start the process of verifying the user's age.", + "errors" => [ + %{"name" => "InvalidEmail"}, + %{"name" => "DidTooLong"}, + %{"name" => "InvalidInitiation"} + ], + "input" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "countryCode" => %{ + "description" => "An ISO 3166-1 alpha-2 code of the user's location.", + "type" => "string" + }, + "email" => %{ + "description" => "The user's email address to receive assurance instructions.", + "type" => "string" + }, + "language" => %{ + "description" => "The user's preferred language for communication during the assurance process.", + "type" => "string" + } }, - "type" => "array" - }, - "list" => %{"ref" => "#listViewBasic", "type" => "ref"}, - "listItemsSample" => %{ - "items" => %{"ref" => "#listItemView", "type" => "ref"}, - "maxLength" => 12, - "type" => "array" - }, - "record" => %{"type" => "unknown"}, - "uri" => %{"format" => "at-uri", "type" => "string"} + "required" => ["email", "language", "countryCode"], + "type" => "object" + } }, - "required" => ["uri", "cid", "record", "creator", "indexedAt"], - "type" => "object" - }, - "starterPackViewBasic" => %{ - "properties" => %{ - "cid" => %{"format" => "cid", "type" => "string"}, - "creator" => %{ - "ref" => "app.bsky.actor.defs#profileViewBasic", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "ref" => "app.bsky.unspecced.defs#ageAssuranceState", "type" => "ref" - }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "joinedAllTimeCount" => %{"minimum" => 0, "type" => "integer"}, - "joinedWeekCount" => %{"minimum" => 0, "type" => "integer"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" - }, - "type" => "array" - }, - "listItemCount" => %{"minimum" => 0, "type" => "integer"}, - "record" => %{"type" => "unknown"}, - "uri" => %{"format" => "at-uri", "type" => "string"} + } }, - "required" => ["uri", "cid", "record", "creator", "indexedAt"], - "type" => "object" + "type" => "procedure" } }, - "id" => "app.bsky.graph.defs", + "id" => "app.bsky.unspecced.initAgeAssurance", "lexicon" => 1 }, %{ "defs" => %{ - "labelerPolicies" => %{ - "properties" => %{ - "labelValueDefinitions" => %{ - "description" => - "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", - "items" => %{ - "ref" => "com.atproto.label.defs#labelValueDefinition", - "type" => "ref" + "main" => %{ + "description" => "Backend Actors (profile) search, returns only skeleton.", + "errors" => [%{"name" => "BadQueryString"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "actors" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#skeletonSearchActor", + "type" => "ref" + }, + "type" => "array" + }, + "cursor" => %{"type" => "string"}, + "hitsTotal" => %{ + "description" => + "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.", + "type" => "integer" + } }, - "type" => "array" + "required" => ["actors"], + "type" => "object" + } + }, + "parameters" => %{ + "properties" => %{ + "cursor" => %{ + "description" => + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set.", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "q" => %{ + "description" => + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax.", + "type" => "string" + }, + "typeahead" => %{ + "description" => "If true, acts as fast/simple 'typeahead' query.", + "type" => "boolean" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking.", + "format" => "did", + "type" => "string" + } }, - "labelValues" => %{ - "description" => "The label values which this labeler publishes. May include global or custom labels.", - "items" => %{ - "ref" => "com.atproto.label.defs#labelValue", - "type" => "ref" + "required" => ["q"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.searchActorsSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Backend Posts search, returns only skeleton", + "errors" => [%{"name" => "BadQueryString"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "hitsTotal" => %{ + "description" => + "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.", + "type" => "integer" + }, + "posts" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#skeletonSearchPost", + "type" => "ref" + }, + "type" => "array" + } }, - "type" => "array" + "required" => ["posts"], + "type" => "object" } }, - "required" => ["labelValues"], - "type" => "object" - }, - "labelerView" => %{ - "properties" => %{ - "cid" => %{"format" => "cid", "type" => "string"}, - "creator" => %{ - "ref" => "app.bsky.actor.defs#profileView", - "type" => "ref" + "parameters" => %{ + "properties" => %{ + "author" => %{ + "description" => "Filter to posts by the given account. Handles are resolved to DID before query-time.", + "format" => "at-identifier", + "type" => "string" + }, + "cursor" => %{ + "description" => + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set.", + "type" => "string" + }, + "domain" => %{ + "description" => + "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization.", + "type" => "string" + }, + "lang" => %{ + "description" => + "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection.", + "format" => "language", + "type" => "string" + }, + "limit" => %{ + "default" => 25, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" + }, + "mentions" => %{ + "description" => + "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions.", + "format" => "at-identifier", + "type" => "string" + }, + "q" => %{ + "description" => + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.", + "type" => "string" + }, + "since" => %{ + "description" => + "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD).", + "type" => "string" + }, + "sort" => %{ + "default" => "latest", + "description" => "Specifies the ranking order of results.", + "knownValues" => ["top", "latest"], + "type" => "string" + }, + "tag" => %{ + "description" => + "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", + "items" => %{ + "maxGraphemes" => 64, + "maxLength" => 640, + "type" => "string" + }, + "type" => "array" + }, + "until" => %{ + "description" => + "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD).", + "type" => "string" + }, + "url" => %{ + "description" => + "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching.", + "format" => "uri", + "type" => "string" + }, + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries.", + "format" => "did", + "type" => "string" + } }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" + "required" => ["q"], + "type" => "params" + }, + "type" => "query" + } + }, + "id" => "app.bsky.unspecced.searchPostsSkeleton", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Backend Starter Pack search, returns only skeleton.", + "errors" => [%{"name" => "BadQueryString"}], + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "cursor" => %{"type" => "string"}, + "hitsTotal" => %{ + "description" => + "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.", + "type" => "integer" + }, + "starterPacks" => %{ + "items" => %{ + "ref" => "app.bsky.unspecced.defs#skeletonSearchStarterPack", + "type" => "ref" + }, + "type" => "array" + } }, - "type" => "array" - }, - "likeCount" => %{"minimum" => 0, "type" => "integer"}, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "viewer" => %{"ref" => "#labelerViewerState", "type" => "ref"} + "required" => ["starterPacks"], + "type" => "object" + } }, - "required" => ["uri", "cid", "creator", "indexedAt"], - "type" => "object" - }, - "labelerViewDetailed" => %{ - "properties" => %{ - "cid" => %{"format" => "cid", "type" => "string"}, - "creator" => %{ - "ref" => "app.bsky.actor.defs#profileView", - "type" => "ref" - }, - "indexedAt" => %{"format" => "datetime", "type" => "string"}, - "labels" => %{ - "items" => %{ - "ref" => "com.atproto.label.defs#label", - "type" => "ref" + "parameters" => %{ + "properties" => %{ + "cursor" => %{ + "description" => + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set.", + "type" => "string" }, - "type" => "array" - }, - "likeCount" => %{"minimum" => 0, "type" => "integer"}, - "policies" => %{ - "ref" => "app.bsky.labeler.defs#labelerPolicies", - "type" => "ref" - }, - "reasonTypes" => %{ - "description" => - "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", - "items" => %{ - "ref" => "com.atproto.moderation.defs#reasonType", - "type" => "ref" + "limit" => %{ + "default" => 25, + "maximum" => 100, + "minimum" => 1, + "type" => "integer" }, - "type" => "array" - }, - "subjectCollections" => %{ - "description" => - "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", - "items" => %{"format" => "nsid", "type" => "string"}, - "type" => "array" - }, - "subjectTypes" => %{ - "description" => "The set of subject types (account, record, etc) this service accepts reports on.", - "items" => %{ - "ref" => "com.atproto.moderation.defs#subjectType", - "type" => "ref" + "q" => %{ + "description" => + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.", + "type" => "string" }, - "type" => "array" + "viewer" => %{ + "description" => + "DID of the account making the request (not included for public/unauthenticated queries).", + "format" => "did", + "type" => "string" + } }, - "uri" => %{"format" => "at-uri", "type" => "string"}, - "viewer" => %{"ref" => "#labelerViewerState", "type" => "ref"} + "required" => ["q"], + "type" => "params" }, - "required" => ["uri", "cid", "creator", "policies", "indexedAt"], - "type" => "object" - }, - "labelerViewerState" => %{ - "properties" => %{"like" => %{"format" => "at-uri", "type" => "string"}}, - "type" => "object" + "type" => "query" } }, - "id" => "app.bsky.labeler.defs", + "id" => "app.bsky.unspecced.searchStarterPacksSkeleton", "lexicon" => 1 }, %{ "defs" => %{ - "activitySubscription" => %{ - "properties" => %{ - "post" => %{"type" => "boolean"}, - "reply" => %{"type" => "boolean"} - }, - "required" => ["post", "reply"], - "type" => "object" - }, - "chatPreference" => %{ + "jobStatus" => %{ "properties" => %{ - "include" => %{ - "knownValues" => ["all", "accepted"], - "type" => "string" + "blob" => %{"type" => "blob"}, + "did" => %{"format" => "did", "type" => "string"}, + "error" => %{"type" => "string"}, + "jobId" => %{"type" => "string"}, + "message" => %{"type" => "string"}, + "progress" => %{ + "description" => "Progress within the current processing state.", + "maximum" => 100, + "minimum" => 0, + "type" => "integer" }, - "push" => %{"type" => "boolean"} - }, - "required" => ["include", "push"], - "type" => "object" - }, - "filterablePreference" => %{ - "properties" => %{ - "include" => %{ - "knownValues" => ["all", "follows"], + "state" => %{ + "description" => + "The state of the video processing job. All values not listed as a known value indicate that the job is in process.", + "knownValues" => ["JOB_STATE_COMPLETED", "JOB_STATE_FAILED"], "type" => "string" - }, - "list" => %{"type" => "boolean"}, - "push" => %{"type" => "boolean"} - }, - "required" => ["include", "list", "push"], - "type" => "object" - }, - "preference" => %{ - "properties" => %{ - "list" => %{"type" => "boolean"}, - "push" => %{"type" => "boolean"} + } }, - "required" => ["list", "push"], + "required" => ["jobId", "did", "state"], "type" => "object" - }, - "preferences" => %{ - "properties" => %{ - "chat" => %{"ref" => "#chatPreference", "type" => "ref"}, - "follow" => %{"ref" => "#filterablePreference", "type" => "ref"}, - "like" => %{"ref" => "#filterablePreference", "type" => "ref"}, - "likeViaRepost" => %{ - "ref" => "#filterablePreference", - "type" => "ref" - }, - "mention" => %{"ref" => "#filterablePreference", "type" => "ref"}, - "quote" => %{"ref" => "#filterablePreference", "type" => "ref"}, - "reply" => %{"ref" => "#filterablePreference", "type" => "ref"}, - "repost" => %{"ref" => "#filterablePreference", "type" => "ref"}, - "repostViaRepost" => %{ - "ref" => "#filterablePreference", - "type" => "ref" - }, - "starterpackJoined" => %{"ref" => "#preference", "type" => "ref"}, - "subscribedPost" => %{"ref" => "#preference", "type" => "ref"}, - "unverified" => %{"ref" => "#preference", "type" => "ref"}, - "verified" => %{"ref" => "#preference", "type" => "ref"} + } + }, + "id" => "app.bsky.video.defs", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Get status details for a video processing job.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "jobStatus" => %{ + "ref" => "app.bsky.video.defs#jobStatus", + "type" => "ref" + } + }, + "required" => ["jobStatus"], + "type" => "object" + } }, - "required" => [ - "chat", - "follow", - "like", - "likeViaRepost", - "mention", - "quote", - "reply", - "repost", - "repostViaRepost", - "starterpackJoined", - "subscribedPost", - "unverified", - "verified" - ], - "type" => "object" - }, - "recordDeleted" => %{"properties" => %{}, "type" => "object"}, - "subjectActivitySubscription" => %{ - "description" => "Object used to store activity subscription data in stash.", - "properties" => %{ - "activitySubscription" => %{ - "ref" => "#activitySubscription", - "type" => "ref" - }, - "subject" => %{"format" => "did", "type" => "string"} + "parameters" => %{ + "properties" => %{"jobId" => %{"type" => "string"}}, + "required" => ["jobId"], + "type" => "params" }, - "required" => ["subject", "activitySubscription"], - "type" => "object" + "type" => "query" } }, - "id" => "app.bsky.notification.defs", + "id" => "app.bsky.video.getJobStatus", "lexicon" => 1 }, %{ "defs" => %{ - "byteSlice" => %{ - "description" => - "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.", - "properties" => %{ - "byteEnd" => %{"minimum" => 0, "type" => "integer"}, - "byteStart" => %{"minimum" => 0, "type" => "integer"} - }, - "required" => ["byteStart", "byteEnd"], - "type" => "object" - }, - "link" => %{ - "description" => - "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", - "properties" => %{"uri" => %{"format" => "uri", "type" => "string"}}, - "required" => ["uri"], - "type" => "object" - }, "main" => %{ - "description" => "Annotation of a sub-string within rich text.", - "properties" => %{ - "features" => %{ - "items" => %{ - "refs" => ["#mention", "#link", "#tag"], - "type" => "union" + "description" => "Get video upload limits for the authenticated user.", + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "canUpload" => %{"type" => "boolean"}, + "error" => %{"type" => "string"}, + "message" => %{"type" => "string"}, + "remainingDailyBytes" => %{"type" => "integer"}, + "remainingDailyVideos" => %{"type" => "integer"} }, - "type" => "array" - }, - "index" => %{"ref" => "#byteSlice", "type" => "ref"} + "required" => ["canUpload"], + "type" => "object" + } }, - "required" => ["index", "features"], - "type" => "object" - }, - "mention" => %{ - "description" => - "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", - "properties" => %{"did" => %{"format" => "did", "type" => "string"}}, - "required" => ["did"], - "type" => "object" - }, - "tag" => %{ - "description" => - "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags').", - "properties" => %{ - "tag" => %{ - "maxGraphemes" => 64, - "maxLength" => 640, - "type" => "string" + "type" => "query" + } + }, + "id" => "app.bsky.video.getUploadLimits", + "lexicon" => 1 + }, + %{ + "defs" => %{ + "main" => %{ + "description" => "Upload a video to be processed then stored on the PDS.", + "input" => %{"encoding" => "video/mp4"}, + "output" => %{ + "encoding" => "application/json", + "schema" => %{ + "properties" => %{ + "jobStatus" => %{ + "ref" => "app.bsky.video.defs#jobStatus", + "type" => "ref" + } + }, + "required" => ["jobStatus"], + "type" => "object" } }, - "required" => ["tag"], - "type" => "object" + "type" => "procedure" } }, - "id" => "app.bsky.richtext.facet", + "id" => "app.bsky.video.uploadVideo", "lexicon" => 1 }, %{ diff --git a/lib/tempest/lexicon/document.ex b/lib/tempest/lexicon/document.ex index fff868f..cd208c5 100644 --- a/lib/tempest/lexicon/document.ex +++ b/lib/tempest/lexicon/document.ex @@ -16,7 +16,7 @@ defmodule Tempest.Lexicon.Document do ] @schema_types MapSet.new( - ~w(array blob boolean bytes cid-link integer object params permission procedure query record ref string subscription token union unknown) + ~w(array blob boolean bytes cid-link integer object params permission permission-set procedure query record ref string subscription token union unknown) ) def validate_documents(documents, opts \\ []) diff --git a/lib/tempest/records.ex b/lib/tempest/records.ex index a007587..e92a9a6 100644 --- a/lib/tempest/records.ex +++ b/lib/tempest/records.ex @@ -489,6 +489,7 @@ defmodule Tempest.Records do base = %{ "ops" => ops, "blobs" => [], + "rebase" => false, "tooBig" => false } @@ -521,6 +522,7 @@ defmodule Tempest.Records do "blocks" => Drisl.bytes(car_slice.bytes), "ops" => ops, "blobs" => [], + "rebase" => false, "tooBig" => true } |> put_common_commit_fields(stored) diff --git a/lib/tempest/sync/event_stream.ex b/lib/tempest/sync/event_stream.ex index 56329d6..1bf9d39 100644 --- a/lib/tempest/sync/event_stream.ex +++ b/lib/tempest/sync/event_stream.ex @@ -39,6 +39,7 @@ defmodule Tempest.Sync.EventStream do defp normalize_commit_links(payload) do payload |> update_cid_link("commit") + |> update_cid_link("prevData") |> update_ops() end @@ -56,11 +57,19 @@ defmodule Tempest.Sync.EventStream do end defp update_ops(%{"ops" => ops} = payload) when is_list(ops) do - Map.put(payload, "ops", Enum.map(ops, &update_cid_link(&1, "cid"))) + Map.put(payload, "ops", Enum.map(ops, &normalize_op_links/1)) end defp update_ops(payload), do: payload + defp normalize_op_links(op) when is_map(op) do + op + |> update_cid_link("cid") + |> update_cid_link("prev") + end + + defp normalize_op_links(op), do: op + defp check_frame_size(frame) do if byte_size(frame) <= @max_frame_bytes do :ok diff --git a/priv/lexicons/official/app/bsky/actor/getProfile.json b/priv/lexicons/official/app/bsky/actor/getProfile.json new file mode 100644 index 0000000..15b0fcc --- /dev/null +++ b/priv/lexicons/official/app/bsky/actor/getProfile.json @@ -0,0 +1,28 @@ +{ + "lexicon": 1, + "id": "app.bsky.actor.getProfile", + "defs": { + "main": { + "type": "query", + "description": "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Handle or DID of account to fetch profile of." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewDetailed" + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/actor/getProfiles.json b/priv/lexicons/official/app/bsky/actor/getProfiles.json new file mode 100644 index 0000000..c89622c --- /dev/null +++ b/priv/lexicons/official/app/bsky/actor/getProfiles.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.actor.getProfiles", + "defs": { + "main": { + "type": "query", + "description": "Get detailed profile views of multiple actors.", + "parameters": { + "type": "params", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { "type": "string", "format": "at-identifier" }, + "maxLength": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["profiles"], + "properties": { + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewDetailed" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/actor/getSuggestions.json b/priv/lexicons/official/app/bsky/actor/getSuggestions.json new file mode 100644 index 0000000..070200d --- /dev/null +++ b/priv/lexicons/official/app/bsky/actor/getSuggestions.json @@ -0,0 +1,47 @@ +{ + "lexicon": 1, + "id": "app.bsky.actor.getSuggestions", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested actors. Expected use is discovery of accounts to follow during new account onboarding.", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": { "type": "string" }, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recId": { + "type": "integer", + "description": "DEPRECATED: use recIdStr instead." + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/actor/searchActors.json b/priv/lexicons/official/app/bsky/actor/searchActors.json new file mode 100644 index 0000000..15ccb08 --- /dev/null +++ b/priv/lexicons/official/app/bsky/actor/searchActors.json @@ -0,0 +1,47 @@ +{ + "lexicon": 1, + "id": "app.bsky.actor.searchActors", + "defs": { + "main": { + "type": "query", + "description": "Find actors (profiles) matching search criteria. Does not require auth.", + "parameters": { + "type": "params", + "properties": { + "term": { + "type": "string", + "description": "DEPRECATED: use 'q' instead." + }, + "q": { + "type": "string", + "description": "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": { "type": "string" }, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/actor/searchActorsTypeahead.json b/priv/lexicons/official/app/bsky/actor/searchActorsTypeahead.json new file mode 100644 index 0000000..4e3cb1b --- /dev/null +++ b/priv/lexicons/official/app/bsky/actor/searchActorsTypeahead.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.bsky.actor.searchActorsTypeahead", + "defs": { + "main": { + "type": "query", + "description": "Find actor suggestions for a prefix search term. Expected use is for auto-completion during text field entry. Does not require auth.", + "parameters": { + "type": "params", + "properties": { + "term": { + "type": "string", + "description": "DEPRECATED: use 'q' instead." + }, + "q": { + "type": "string", + "description": "Search query prefix; not a full query string." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewBasic" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/actor/status.json b/priv/lexicons/official/app/bsky/actor/status.json new file mode 100644 index 0000000..1fb76ad --- /dev/null +++ b/priv/lexicons/official/app/bsky/actor/status.json @@ -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." + } + } +} diff --git a/priv/lexicons/official/app/bsky/ageassurance/begin.json b/priv/lexicons/official/app/bsky/ageassurance/begin.json new file mode 100644 index 0000000..7c37744 --- /dev/null +++ b/priv/lexicons/official/app/bsky/ageassurance/begin.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.bsky.ageassurance.begin", + "defs": { + "main": { + "type": "procedure", + "description": "Initiate Age Assurance for an account.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["email", "language", "countryCode"], + "properties": { + "email": { + "type": "string", + "description": "The user's email address to receive Age Assurance instructions." + }, + "language": { + "type": "string", + "description": "The user's preferred language for communication during the Age Assurance process." + }, + "countryCode": { + "type": "string", + "description": "An ISO 3166-1 alpha-2 code of the user's location." + }, + "regionCode": { + "type": "string", + "description": "An optional ISO 3166-2 code of the user's region or state within the country." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#state" + } + }, + "errors": [ + { "name": "InvalidEmail" }, + { "name": "DidTooLong" }, + { "name": "InvalidInitiation" }, + { "name": "RegionNotSupported" } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/ageassurance/defs.json b/priv/lexicons/official/app/bsky/ageassurance/defs.json new file mode 100644 index 0000000..308d0e3 --- /dev/null +++ b/priv/lexicons/official/app/bsky/ageassurance/defs.json @@ -0,0 +1,255 @@ +{ + "lexicon": 1, + "id": "app.bsky.ageassurance.defs", + "defs": { + "access": { + "description": "The access level granted based on Age Assurance data we've processed.", + "type": "string", + "knownValues": ["unknown", "none", "safe", "full"] + }, + "status": { + "type": "string", + "description": "The status of the Age Assurance process.", + "knownValues": ["unknown", "pending", "assured", "blocked"] + }, + "state": { + "type": "object", + "description": "The user's computed Age Assurance state.", + "required": ["status", "access"], + "properties": { + "lastInitiatedAt": { + "type": "string", + "format": "datetime", + "description": "The timestamp when this state was last updated." + }, + "status": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#status" + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "stateMetadata": { + "type": "object", + "description": "Additional metadata needed to compute Age Assurance state client-side.", + "required": [], + "properties": { + "accountCreatedAt": { + "type": "string", + "format": "datetime", + "description": "The account creation timestamp." + } + } + }, + "config": { + "type": "object", + "description": "", + "required": ["regions"], + "properties": { + "regions": { + "type": "array", + "description": "The per-region Age Assurance configuration.", + "items": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#configRegion" + } + } + } + }, + "configRegion": { + "type": "object", + "description": "The Age Assurance configuration for a specific region.", + "required": ["countryCode", "minAccessAge", "rules"], + "properties": { + "countryCode": { + "type": "string", + "description": "The ISO 3166-1 alpha-2 country code this configuration applies to." + }, + "regionCode": { + "type": "string", + "description": "The ISO 3166-2 region code this configuration applies to. If omitted, the configuration applies to the entire country." + }, + "minAccessAge": { + "type": "integer", + "description": "The minimum age (as a whole integer) required to use Bluesky in this region." + }, + "rules": { + "type": "array", + "description": "The ordered list of Age Assurance rules that apply to this region. Rules should be applied in order, and the first matching rule determines the access level granted. The rules array should always include a default rule as the last item.", + "items": { + "type": "union", + "refs": [ + "#configRegionRuleDefault", + "#configRegionRuleIfDeclaredOverAge", + "#configRegionRuleIfDeclaredUnderAge", + "#configRegionRuleIfAssuredOverAge", + "#configRegionRuleIfAssuredUnderAge", + "#configRegionRuleIfAccountNewerThan", + "#configRegionRuleIfAccountOlderThan" + ] + } + } + } + }, + "configRegionRuleDefault": { + "type": "object", + "description": "Age Assurance rule that applies by default.", + "required": ["access"], + "properties": { + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "configRegionRuleIfDeclaredOverAge": { + "type": "object", + "description": "Age Assurance rule that applies if the user has declared themselves equal-to or over a certain age.", + "required": ["age", "access"], + "properties": { + "age": { + "type": "integer", + "description": "The age threshold as a whole integer." + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "configRegionRuleIfDeclaredUnderAge": { + "type": "object", + "description": "Age Assurance rule that applies if the user has declared themselves under a certain age.", + "required": ["age", "access"], + "properties": { + "age": { + "type": "integer", + "description": "The age threshold as a whole integer." + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "configRegionRuleIfAssuredOverAge": { + "type": "object", + "description": "Age Assurance rule that applies if the user has been assured to be equal-to or over a certain age.", + "required": ["age", "access"], + "properties": { + "age": { + "type": "integer", + "description": "The age threshold as a whole integer." + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "configRegionRuleIfAssuredUnderAge": { + "type": "object", + "description": "Age Assurance rule that applies if the user has been assured to be under a certain age.", + "required": ["age", "access"], + "properties": { + "age": { + "type": "integer", + "description": "The age threshold as a whole integer." + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "configRegionRuleIfAccountNewerThan": { + "type": "object", + "description": "Age Assurance rule that applies if the account is equal-to or newer than a certain date.", + "required": ["date", "access"], + "properties": { + "date": { + "type": "string", + "format": "datetime", + "description": "The date threshold as a datetime string." + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "configRegionRuleIfAccountOlderThan": { + "type": "object", + "description": "Age Assurance rule that applies if the account is older than a certain date.", + "required": ["date", "access"], + "properties": { + "date": { + "type": "string", + "format": "datetime", + "description": "The date threshold as a datetime string." + }, + "access": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#access" + } + } + }, + "event": { + "type": "object", + "description": "Object used to store Age Assurance data in stash.", + "required": ["createdAt", "status", "access", "attemptId", "countryCode"], + "properties": { + "createdAt": { + "type": "string", + "format": "datetime", + "description": "The date and time of this write operation." + }, + "attemptId": { + "type": "string", + "description": "The unique identifier for this instance of the Age Assurance flow, in UUID format." + }, + "status": { + "type": "string", + "description": "The status of the Age Assurance process.", + "knownValues": ["unknown", "pending", "assured", "blocked"] + }, + "access": { + "description": "The access level granted based on Age Assurance data we've processed.", + "type": "string", + "knownValues": ["unknown", "none", "safe", "full"] + }, + "countryCode": { + "type": "string", + "description": "The ISO 3166-1 alpha-2 country code provided when beginning the Age Assurance flow." + }, + "regionCode": { + "type": "string", + "description": "The ISO 3166-2 region code provided when beginning the Age Assurance flow." + }, + "email": { + "type": "string", + "description": "The email used for Age Assurance." + }, + "initIp": { + "type": "string", + "description": "The IP address used when initiating the Age Assurance flow." + }, + "initUa": { + "type": "string", + "description": "The user agent used when initiating the Age Assurance flow." + }, + "completeIp": { + "type": "string", + "description": "The IP address used when completing the Age Assurance flow." + }, + "completeUa": { + "type": "string", + "description": "The user agent used when completing the Age Assurance flow." + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/ageassurance/getConfig.json b/priv/lexicons/official/app/bsky/ageassurance/getConfig.json new file mode 100644 index 0000000..ca27af8 --- /dev/null +++ b/priv/lexicons/official/app/bsky/ageassurance/getConfig.json @@ -0,0 +1,17 @@ +{ + "lexicon": 1, + "id": "app.bsky.ageassurance.getConfig", + "defs": { + "main": { + "type": "query", + "description": "Returns Age Assurance configuration for use on the client.", + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#config" + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/ageassurance/getState.json b/priv/lexicons/official/app/bsky/ageassurance/getState.json new file mode 100644 index 0000000..a334969 --- /dev/null +++ b/priv/lexicons/official/app/bsky/ageassurance/getState.json @@ -0,0 +1,35 @@ +{ + "lexicon": 1, + "id": "app.bsky.ageassurance.getState", + "defs": { + "main": { + "type": "query", + "description": "Returns server-computed Age Assurance state, if available, and any additional metadata needed to compute Age Assurance state client-side.", + "parameters": { + "type": "params", + "required": ["countryCode"], + "properties": { + "countryCode": { "type": "string" }, + "regionCode": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["state", "metadata"], + "properties": { + "state": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#state" + }, + "metadata": { + "type": "ref", + "ref": "app.bsky.ageassurance.defs#stateMetadata" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/authCreatePosts.json b/priv/lexicons/official/app/bsky/authCreatePosts.json new file mode 100644 index 0000000..bc1db86 --- /dev/null +++ b/priv/lexicons/official/app/bsky/authCreatePosts.json @@ -0,0 +1,35 @@ +{ + "lexicon": 1, + "id": "app.bsky.authCreatePosts", + "defs": { + "main": { + "type": "permission-set", + "title": "Create Bluesky Posts", + "title:lang": {}, + "detail": "Can not update or delete posts.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "rpc", + "inheritAud": true, + "lxm": [ + "app.bsky.video.uploadVideo", + "app.bsky.video.getJobStatus", + "app.bsky.video.getUploadLimits" + ] + }, + { + "type": "permission", + "resource": "repo", + "action": ["create"], + "collection": [ + "app.bsky.feed.post", + "app.bsky.feed.postgate", + "app.bsky.feed.threadgate" + ] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authDeleteContent.json b/priv/lexicons/official/app/bsky/authDeleteContent.json new file mode 100644 index 0000000..7fd3178 --- /dev/null +++ b/priv/lexicons/official/app/bsky/authDeleteContent.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.bsky.authDeleteContent", + "defs": { + "main": { + "type": "permission-set", + "title": "Delete Bluesky Content", + "title:lang": {}, + "detail": "Clean up public account history: posts, reposts, and likes.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "repo", + "action": ["delete"], + "collection": [ + "app.bsky.feed.like", + "app.bsky.feed.post", + "app.bsky.feed.postgate", + "app.bsky.feed.repost", + "app.bsky.feed.threadgate" + ] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authFullApp.json b/priv/lexicons/official/app/bsky/authFullApp.json new file mode 100644 index 0000000..b6f92e0 --- /dev/null +++ b/priv/lexicons/official/app/bsky/authFullApp.json @@ -0,0 +1,136 @@ +{ + "lexicon": 1, + "id": "app.bsky.authFullApp", + "defs": { + "main": { + "type": "permission-set", + "title": "Full Bluesky Social App Permissions", + "title:lang": {}, + "detail": "Manage all public content and interactions, private preferences and subscriptions, and other Bluesky-specific app features and data.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "rpc", + "inheritAud": true, + "lxm": [ + "app.bsky.actor.getPreferences", + "app.bsky.actor.getProfile", + "app.bsky.actor.getProfiles", + "app.bsky.actor.getSuggestions", + "app.bsky.actor.putPreferences", + "app.bsky.actor.searchActors", + "app.bsky.actor.searchActorsTypeahead", + "app.bsky.bookmark.createBookmark", + "app.bsky.bookmark.deleteBookmark", + "app.bsky.bookmark.getBookmarks", + "app.bsky.contact.dismissMatch", + "app.bsky.contact.getMatches", + "app.bsky.contact.getSyncStatus", + "app.bsky.contact.importContacts", + "app.bsky.contact.removeData", + "app.bsky.contact.startPhoneVerification", + "app.bsky.contact.verifyPhone", + "app.bsky.feed.describeFeedGenerator", + "app.bsky.feed.getActorFeeds", + "app.bsky.feed.getActorLikes", + "app.bsky.feed.getAuthorFeed", + "app.bsky.feed.getFeed", + "app.bsky.feed.getFeedGenerator", + "app.bsky.feed.getFeedGenerators", + "app.bsky.feed.getFeedSkeleton", + "app.bsky.feed.getLikes", + "app.bsky.feed.getListFeed", + "app.bsky.feed.getPostThread", + "app.bsky.feed.getPosts", + "app.bsky.feed.getQuotes", + "app.bsky.feed.getRepostedBy", + "app.bsky.feed.getSuggestedFeeds", + "app.bsky.feed.getTimeline", + "app.bsky.feed.searchPosts", + "app.bsky.feed.sendInteractions", + "app.bsky.graph.getActorStarterPacks", + "app.bsky.graph.getBlocks", + "app.bsky.graph.getFollowers", + "app.bsky.graph.getFollows", + "app.bsky.graph.getKnownFollowers", + "app.bsky.graph.getList", + "app.bsky.graph.getListBlocks", + "app.bsky.graph.getListMutes", + "app.bsky.graph.getLists", + "app.bsky.graph.getListsWithMembership", + "app.bsky.graph.getMutes", + "app.bsky.graph.getRelationships", + "app.bsky.graph.getStarterPack", + "app.bsky.graph.getStarterPacks", + "app.bsky.graph.getStarterPacksWithMembership", + "app.bsky.graph.getSuggestedFollowsByActor", + "app.bsky.graph.muteActor", + "app.bsky.graph.muteActorList", + "app.bsky.graph.muteThread", + "app.bsky.graph.searchStarterPacks", + "app.bsky.graph.unmuteActor", + "app.bsky.graph.unmuteActorList", + "app.bsky.graph.unmuteThread", + "app.bsky.labeler.getServices", + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.putActivitySubscription", + "app.bsky.notification.putPreferences", + "app.bsky.notification.putPreferencesV2", + "app.bsky.notification.registerPush", + "app.bsky.notification.unregisterPush", + "app.bsky.notification.updateSeen", + "app.bsky.unspecced.getAgeAssuranceState", + "app.bsky.unspecced.getConfig", + "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "app.bsky.unspecced.getPopularFeedGenerators", + "app.bsky.unspecced.getPostThreadOtherV2", + "app.bsky.unspecced.getPostThreadV2", + "app.bsky.unspecced.getSuggestedFeeds", + "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "app.bsky.unspecced.getSuggestedStarterPacks", + "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "app.bsky.unspecced.getSuggestedUsers", + "app.bsky.unspecced.getSuggestedUsersSkeleton", + "app.bsky.unspecced.getSuggestionsSkeleton", + "app.bsky.unspecced.getTaggedSuggestions", + "app.bsky.unspecced.getTrendingTopics", + "app.bsky.unspecced.getTrends", + "app.bsky.unspecced.getTrendsSkeleton", + "app.bsky.unspecced.initAgeAssurance", + "app.bsky.unspecced.searchActorsSkeleton", + "app.bsky.unspecced.searchPostsSkeleton", + "app.bsky.unspecced.searchStarterPacksSkeleton", + "app.bsky.video.getJobStatus", + "app.bsky.video.getUploadLimits", + "app.bsky.video.uploadVideo" + ] + }, + { + "type": "permission", + "resource": "repo", + "action": ["create", "update", "delete"], + "collection": [ + "app.bsky.actor.profile", + "app.bsky.actor.status", + "app.bsky.feed.like", + "app.bsky.feed.post", + "app.bsky.feed.postgate", + "app.bsky.feed.repost", + "app.bsky.feed.threadgate", + "app.bsky.graph.block", + "app.bsky.graph.follow", + "app.bsky.graph.list", + "app.bsky.graph.listblock", + "app.bsky.graph.listitem", + "app.bsky.graph.starterpack", + "app.bsky.notification.declaration" + ] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authManageFeedDeclarations.json b/priv/lexicons/official/app/bsky/authManageFeedDeclarations.json new file mode 100644 index 0000000..a94600a --- /dev/null +++ b/priv/lexicons/official/app/bsky/authManageFeedDeclarations.json @@ -0,0 +1,21 @@ +{ + "lexicon": 1, + "id": "app.bsky.authManageFeedDeclarations", + "defs": { + "main": { + "type": "permission-set", + "title": "Manage Hosted Feeds", + "title:lang": {}, + "detail": "Configure feed generator declaration records.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "repo", + "action": ["create", "update", "delete"], + "collection": ["app.bsky.feed.generator"] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authManageLabelerService.json b/priv/lexicons/official/app/bsky/authManageLabelerService.json new file mode 100644 index 0000000..3ccc243 --- /dev/null +++ b/priv/lexicons/official/app/bsky/authManageLabelerService.json @@ -0,0 +1,21 @@ +{ + "lexicon": 1, + "id": "app.bsky.authManageLabelerService", + "defs": { + "main": { + "type": "permission-set", + "title": "Manage Hosted Labeling Service", + "title:lang": {}, + "detail": "Configure labeler declaration records.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "repo", + "action": ["create", "update", "delete"], + "collection": ["app.bsky.labeler.service"] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authManageModeration.json b/priv/lexicons/official/app/bsky/authManageModeration.json new file mode 100644 index 0000000..8b8c252 --- /dev/null +++ b/priv/lexicons/official/app/bsky/authManageModeration.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.bsky.authManageModeration", + "defs": { + "main": { + "type": "permission-set", + "title": "Manage Personal Moderation", + "title:lang": {}, + "detail": "Control over blocks, mutes, mod lists, mod services, and preferences.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "rpc", + "inheritAud": true, + "lxm": [ + "app.bsky.actor.getPreferences", + "app.bsky.actor.putPreferences", + "app.bsky.graph.muteActor", + "app.bsky.graph.muteActorList", + "app.bsky.graph.muteThread", + "app.bsky.graph.unmuteActor", + "app.bsky.graph.unmuteActorList", + "app.bsky.graph.unmuteThread" + ] + }, + { + "type": "permission", + "resource": "repo", + "action": ["create", "update", "delete"], + "collection": ["app.bsky.graph.block", "app.bsky.graph.listblock"] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authManageNotifications.json b/priv/lexicons/official/app/bsky/authManageNotifications.json new file mode 100644 index 0000000..767353d --- /dev/null +++ b/priv/lexicons/official/app/bsky/authManageNotifications.json @@ -0,0 +1,32 @@ +{ + "lexicon": 1, + "id": "app.bsky.authManageNotifications", + "defs": { + "main": { + "type": "permission-set", + "title": "Manage Bluesky Notifications", + "title:lang": {}, + "detail": "View and configure notifications for the Bluesky app.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "rpc", + "inheritAud": true, + "lxm": [ + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.putActivitySubscription", + "app.bsky.notification.putPreferences", + "app.bsky.notification.putPreferencesV2", + "app.bsky.notification.registerPush", + "app.bsky.notification.unregisterPush", + "app.bsky.notification.updateSeen" + ] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authManageProfile.json b/priv/lexicons/official/app/bsky/authManageProfile.json new file mode 100644 index 0000000..ccf4aea --- /dev/null +++ b/priv/lexicons/official/app/bsky/authManageProfile.json @@ -0,0 +1,25 @@ +{ + "lexicon": 1, + "id": "app.bsky.authManageProfile", + "defs": { + "main": { + "type": "permission-set", + "title": "Manage Bluesky Profile", + "title:lang": {}, + "detail": "Update profile data, as well as status and public chat visibility.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "repo", + "action": ["create", "update", "delete"], + "collection": [ + "app.bsky.actor.profile", + "app.bsky.actor.status", + "app.bsky.notification.declaration" + ] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/authViewAll.json b/priv/lexicons/official/app/bsky/authViewAll.json new file mode 100644 index 0000000..dace940 --- /dev/null +++ b/priv/lexicons/official/app/bsky/authViewAll.json @@ -0,0 +1,89 @@ +{ + "lexicon": 1, + "id": "app.bsky.authViewAll", + "defs": { + "main": { + "type": "permission-set", + "title": "Read-only access to all content", + "title:lang": {}, + "detail": "View Bluesky network content from account perspective, and read all notifications and preferences.", + "detail:lang": {}, + "permissions": [ + { + "type": "permission", + "resource": "rpc", + "inheritAud": true, + "lxm": [ + "app.bsky.actor.getPreferences", + "app.bsky.actor.getProfile", + "app.bsky.actor.getProfiles", + "app.bsky.actor.getSuggestions", + "app.bsky.actor.searchActors", + "app.bsky.actor.searchActorsTypeahead", + "app.bsky.bookmark.getBookmarks", + "app.bsky.feed.describeFeedGenerator", + "app.bsky.feed.getActorFeeds", + "app.bsky.feed.getActorLikes", + "app.bsky.feed.getAuthorFeed", + "app.bsky.feed.getFeed", + "app.bsky.feed.getFeedGenerator", + "app.bsky.feed.getFeedGenerators", + "app.bsky.feed.getFeedSkeleton", + "app.bsky.feed.getLikes", + "app.bsky.feed.getListFeed", + "app.bsky.feed.getPostThread", + "app.bsky.feed.getPosts", + "app.bsky.feed.getQuotes", + "app.bsky.feed.getRepostedBy", + "app.bsky.feed.getSuggestedFeeds", + "app.bsky.feed.getTimeline", + "app.bsky.feed.searchPosts", + "app.bsky.graph.getActorStarterPacks", + "app.bsky.graph.getBlocks", + "app.bsky.graph.getFollowers", + "app.bsky.graph.getFollows", + "app.bsky.graph.getKnownFollowers", + "app.bsky.graph.getListBlocks", + "app.bsky.graph.getListMutes", + "app.bsky.graph.getLists", + "app.bsky.graph.getListsWithMembership", + "app.bsky.graph.getMutes", + "app.bsky.graph.getRelationships", + "app.bsky.graph.getStarterPack", + "app.bsky.graph.getStarterPacks", + "app.bsky.graph.getStarterPacksWithMembership", + "app.bsky.graph.getSuggestedFollowsByActor", + "app.bsky.graph.searchStarterPacks", + "app.bsky.labeler.getServices", + "app.bsky.notification.getPreferences", + "app.bsky.notification.getUnreadCount", + "app.bsky.notification.listActivitySubscriptions", + "app.bsky.notification.listNotifications", + "app.bsky.notification.updateSeen", + "app.bsky.unspecced.getAgeAssuranceState", + "app.bsky.unspecced.getConfig", + "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "app.bsky.unspecced.getPopularFeedGenerators", + "app.bsky.unspecced.getPostThreadOtherV2", + "app.bsky.unspecced.getPostThreadV2", + "app.bsky.unspecced.getSuggestedFeeds", + "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "app.bsky.unspecced.getSuggestedStarterPacks", + "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "app.bsky.unspecced.getSuggestedUsers", + "app.bsky.unspecced.getSuggestedUsersSkeleton", + "app.bsky.unspecced.getSuggestionsSkeleton", + "app.bsky.unspecced.getTaggedSuggestions", + "app.bsky.unspecced.getTrendingTopics", + "app.bsky.unspecced.getTrends", + "app.bsky.unspecced.getTrendsSkeleton", + "app.bsky.unspecced.searchActorsSkeleton", + "app.bsky.unspecced.searchPostsSkeleton", + "app.bsky.unspecced.searchStarterPacksSkeleton", + "app.bsky.video.getUploadLimits" + ] + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/bookmark/createBookmark.json b/priv/lexicons/official/app/bsky/bookmark/createBookmark.json new file mode 100644 index 0000000..d8127e6 --- /dev/null +++ b/priv/lexicons/official/app/bsky/bookmark/createBookmark.json @@ -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." + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/bookmark/defs.json b/priv/lexicons/official/app/bsky/bookmark/defs.json new file mode 100644 index 0000000..b084bff --- /dev/null +++ b/priv/lexicons/official/app/bsky/bookmark/defs.json @@ -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" + ] + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/bookmark/deleteBookmark.json b/priv/lexicons/official/app/bsky/bookmark/deleteBookmark.json new file mode 100644 index 0000000..9a61543 --- /dev/null +++ b/priv/lexicons/official/app/bsky/bookmark/deleteBookmark.json @@ -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." + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/bookmark/getBookmarks.json b/priv/lexicons/official/app/bsky/bookmark/getBookmarks.json new file mode 100644 index 0000000..afda97a --- /dev/null +++ b/priv/lexicons/official/app/bsky/bookmark/getBookmarks.json @@ -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" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/defs.json b/priv/lexicons/official/app/bsky/contact/defs.json new file mode 100644 index 0000000..5705814 --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/defs.json @@ -0,0 +1,57 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.defs", + "defs": { + "matchAndContactIndex": { + "description": "Associates a profile with the positional index of the contact import input in the call to `app.bsky.contact.importContacts`, so clients can know which phone caused a particular match.", + "type": "object", + "required": ["match", "contactIndex"], + "properties": { + "match": { + "description": "Profile of the matched user.", + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + }, + "contactIndex": { + "description": "The index of this match in the import contact input.", + "type": "integer", + "minimum": 0, + "maximum": 999 + } + } + }, + "syncStatus": { + "type": "object", + "required": ["syncedAt", "matchesCount"], + "properties": { + "syncedAt": { + "description": "Last date when contacts where imported.", + "type": "string", + "format": "datetime" + }, + "matchesCount": { + "description": "Number of existing contact matches resulting of the user imports and of their imported contacts having imported the user. Matches stop being counted when the user either follows the matched contact or dismisses the match.", + "type": "integer", + "minimum": 0 + } + } + }, + "notification": { + "description": "A stash object to be sent via bsync representing a notification to be created.", + "type": "object", + "required": ["from", "to"], + "properties": { + "from": { + "description": "The DID of who this notification comes from.", + "type": "string", + "format": "did" + }, + "to": { + "description": "The DID of who this notification should go to.", + "type": "string", + "format": "did" + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/dismissMatch.json b/priv/lexicons/official/app/bsky/contact/dismissMatch.json new file mode 100644 index 0000000..66503ce --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/dismissMatch.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.dismissMatch", + "defs": { + "main": { + "type": "procedure", + "description": "Removes a match that was found via contact import. It shouldn't appear again if the same contact is re-imported. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["subject"], + "properties": { + "subject": { + "description": "The subject's DID to dismiss the match with.", + "type": "string", + "format": "did" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + }, + "errors": [ + { + "name": "InvalidDid" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/getMatches.json b/priv/lexicons/official/app/bsky/contact/getMatches.json new file mode 100644 index 0000000..d864606 --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/getMatches.json @@ -0,0 +1,53 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.getMatches", + "defs": { + "main": { + "type": "query", + "description": "Returns the matched contacts (contacts that were mutually imported). Excludes dismissed matches. 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": ["matches"], + "properties": { + "cursor": { "type": "string" }, + "matches": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + }, + "errors": [ + { + "name": "InvalidDid" + }, + { + "name": "InvalidLimit" + }, + { + "name": "InvalidCursor" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/getSyncStatus.json b/priv/lexicons/official/app/bsky/contact/getSyncStatus.json new file mode 100644 index 0000000..03fee00 --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/getSyncStatus.json @@ -0,0 +1,35 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.getSyncStatus", + "defs": { + "main": { + "type": "query", + "description": "Gets the user's current contact import status. Requires authentication.", + "parameters": { + "type": "params", + "properties": {} + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "syncStatus": { + "description": "If present, indicates the user has imported their contacts. If not present, indicates the user never used the feature or called `app.bsky.contact.removeData` and didn't import again since.", + "type": "ref", + "ref": "app.bsky.contact.defs#syncStatus" + } + } + } + }, + "errors": [ + { + "name": "InvalidDid" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/importContacts.json b/priv/lexicons/official/app/bsky/contact/importContacts.json new file mode 100644 index 0000000..ac7449b --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/importContacts.json @@ -0,0 +1,66 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.importContacts", + "defs": { + "main": { + "type": "procedure", + "description": "Import contacts for securely matching with other users. This follows the protocol explained in https://docs.bsky.app/blog/contact-import-rfc. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["token", "contacts"], + "properties": { + "token": { + "description": "JWT to authenticate the call. Use the JWT received as a response to the call to `app.bsky.contact.verifyPhone`.", + "type": "string" + }, + "contacts": { + "description": "List of phone numbers in global E.164 format (e.g., '+12125550123'). Phone numbers that cannot be normalized into a valid phone number will be discarded. Should not repeat the 'phone' input used in `app.bsky.contact.verifyPhone`.", + "type": "array", + "items": { + "type": "string" + }, + "minLength": 1, + "maxLength": 1000 + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["matchesAndContactIndexes"], + "properties": { + "matchesAndContactIndexes": { + "description": "The users that matched during import and their indexes on the input contacts, so the client can correlate with its local list.", + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.contact.defs#matchAndContactIndex" + } + } + } + } + }, + "errors": [ + { + "name": "InvalidDid" + }, + { + "name": "InvalidContacts" + }, + { + "name": "TooManyContacts" + }, + { + "name": "InvalidToken" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/removeData.json b/priv/lexicons/official/app/bsky/contact/removeData.json new file mode 100644 index 0000000..56dd911 --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/removeData.json @@ -0,0 +1,32 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.removeData", + "defs": { + "main": { + "type": "procedure", + "description": "Removes all stored hashes used for contact matching, existing matches, and sync status. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + }, + "errors": [ + { + "name": "InvalidDid" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/sendNotification.json b/priv/lexicons/official/app/bsky/contact/sendNotification.json new file mode 100644 index 0000000..74af1a0 --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/sendNotification.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.sendNotification", + "defs": { + "main": { + "type": "procedure", + "description": "System endpoint to send notifications related to contact imports. Requires role authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["from", "to"], + "properties": { + "from": { + "description": "The DID of who this notification comes from.", + "type": "string", + "format": "did" + }, + "to": { + "description": "The DID of who this notification should go to.", + "type": "string", + "format": "did" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/startPhoneVerification.json b/priv/lexicons/official/app/bsky/contact/startPhoneVerification.json new file mode 100644 index 0000000..b11024c --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/startPhoneVerification.json @@ -0,0 +1,44 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.startPhoneVerification", + "defs": { + "main": { + "type": "procedure", + "description": "Starts a phone verification flow. The phone passed will receive a code via SMS that should be passed to `app.bsky.contact.verifyPhone`. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["phone"], + "properties": { + "phone": { + "description": "The phone number to receive the code via SMS.", + "type": "string" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + }, + "errors": [ + { + "name": "RateLimitExceeded" + }, + { + "name": "InvalidDid" + }, + { + "name": "InvalidPhone" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/contact/verifyPhone.json b/priv/lexicons/official/app/bsky/contact/verifyPhone.json new file mode 100644 index 0000000..fed072e --- /dev/null +++ b/priv/lexicons/official/app/bsky/contact/verifyPhone.json @@ -0,0 +1,57 @@ +{ + "lexicon": 1, + "id": "app.bsky.contact.verifyPhone", + "defs": { + "main": { + "type": "procedure", + "description": "Verifies control over a phone number with a code received via SMS and starts a contact import session. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["phone", "code"], + "properties": { + "phone": { + "description": "The phone number to verify. Should be the same as the one passed to `app.bsky.contact.startPhoneVerification`.", + "type": "string" + }, + "code": { + "description": "The code received via SMS as a result of the call to `app.bsky.contact.startPhoneVerification`.", + "type": "string" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["token"], + "properties": { + "token": { + "description": "JWT to be used in a call to `app.bsky.contact.importContacts`. It is only valid for a single call.", + "type": "string" + } + } + } + }, + "errors": [ + { + "name": "RateLimitExceeded" + }, + { + "name": "InvalidDid" + }, + { + "name": "InvalidPhone" + }, + { + "name": "InvalidCode" + }, + { + "name": "InternalError" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/draft/createDraft.json b/priv/lexicons/official/app/bsky/draft/createDraft.json new file mode 100644 index 0000000..d18239d --- /dev/null +++ b/priv/lexicons/official/app/bsky/draft/createDraft.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.draft.createDraft", + "defs": { + "main": { + "type": "procedure", + "description": "Inserts a draft using private storage (stash). An upper limit of drafts might be enforced. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["draft"], + "properties": { + "draft": { + "type": "ref", + "ref": "app.bsky.draft.defs#draft" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["id"], + "properties": { + "id": { + "type": "string", + "description": "The ID of the created draft." + } + } + } + }, + "errors": [ + { + "name": "DraftLimitReached", + "description": "Trying to insert a new draft when the limit was already reached." + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/draft/defs.json b/priv/lexicons/official/app/bsky/draft/defs.json new file mode 100644 index 0000000..4c6e20c --- /dev/null +++ b/priv/lexicons/official/app/bsky/draft/defs.json @@ -0,0 +1,241 @@ +{ + "lexicon": 1, + "id": "app.bsky.draft.defs", + "defs": { + "draftWithId": { + "description": "A draft with an identifier, used to store drafts in private storage (stash).", + "type": "object", + "required": ["id", "draft"], + "properties": { + "id": { + "description": "A TID to be used as a draft identifier.", + "type": "string", + "format": "tid" + }, + "draft": { + "type": "ref", + "ref": "#draft" + } + } + }, + "draft": { + "description": "A draft containing an array of draft posts.", + "type": "object", + "required": ["posts"], + "properties": { + "deviceId": { + "type": "string", + "description": "UUIDv4 identifier of the device that created this draft.", + "maxLength": 100 + }, + "deviceName": { + "type": "string", + "description": "The device and/or platform on which the draft was created.", + "maxLength": 100 + }, + "posts": { + "description": "Array of draft posts that compose this draft.", + "type": "array", + "minLength": 1, + "maxLength": 100, + "items": { + "type": "ref", + "ref": "#draftPost" + } + }, + "langs": { + "type": "array", + "description": "Indicates human language of posts primary text content.", + "maxLength": 3, + "items": { "type": "string", "format": "language" } + }, + "postgateEmbeddingRules": { + "description": "Embedding rules for the postgates to be created when this draft is published.", + "type": "array", + "maxLength": 5, + "items": { + "type": "union", + "refs": ["app.bsky.feed.postgate#disableRule"] + } + }, + "threadgateAllow": { + "description": "Allow-rules for the threadgate to be created when this draft is published.", + "type": "array", + "maxLength": 5, + "items": { + "type": "union", + "refs": [ + "app.bsky.feed.threadgate#mentionRule", + "app.bsky.feed.threadgate#followerRule", + "app.bsky.feed.threadgate#followingRule", + "app.bsky.feed.threadgate#listRule" + ] + } + } + } + }, + "draftPost": { + "description": "One of the posts that compose a draft.", + "type": "object", + "required": ["text"], + "properties": { + "text": { + "type": "string", + "maxLength": 10000, + "maxGraphemes": 1000, + "description": "The primary post content. It has a higher limit than post contents to allow storing a larger text that can later be refined into smaller posts." + }, + "labels": { + "type": "union", + "description": "Self-label values for this post. Effectively content warnings.", + "refs": ["com.atproto.label.defs#selfLabels"] + }, + "embedImages": { + "type": "array", + "items": { "type": "ref", "ref": "#draftEmbedImage" }, + "maxLength": 4 + }, + "embedGallery": { + "type": "ref", + "ref": "#draftEmbedGallery" + }, + "embedVideos": { + "type": "array", + "items": { "type": "ref", "ref": "#draftEmbedVideo" }, + "maxLength": 1 + }, + "embedExternals": { + "type": "array", + "items": { "type": "ref", "ref": "#draftEmbedExternal" }, + "maxLength": 1 + }, + "embedRecords": { + "type": "array", + "items": { "type": "ref", "ref": "#draftEmbedRecord" }, + "maxLength": 1 + } + } + }, + + "draftView": { + "description": "View to present drafts data to users.", + "type": "object", + "required": ["id", "draft", "createdAt", "updatedAt"], + "properties": { + "id": { + "description": "A TID to be used as a draft identifier.", + "type": "string", + "format": "tid" + }, + "draft": { + "type": "ref", + "ref": "#draft" + }, + "createdAt": { + "description": "The time the draft was created.", + "type": "string", + "format": "datetime" + }, + "updatedAt": { + "description": "The time the draft was last updated.", + "type": "string", + "format": "datetime" + } + } + }, + + "draftEmbedLocalRef": { + "type": "object", + "required": ["path"], + "properties": { + "path": { + "type": "string", + "description": "Local, on-device ref to file to be embedded. Embeds are currently device-bound for drafts.", + "minLength": 1, + "maxLength": 1024 + } + } + }, + "draftEmbedCaption": { + "type": "object", + "required": ["lang", "content"], + "properties": { + "lang": { + "type": "string", + "format": "language" + }, + "content": { + "type": "string", + "maxLength": 10000 + } + } + }, + + "draftEmbedGallery": { + "type": "object", + "required": ["items"], + "properties": { + "items": { + "type": "ref", + "ref": "#draftEmbedGalleryItems" + } + } + }, + "draftEmbedGalleryItems": { + "type": "array", + "items": { "type": "union", "refs": ["#draftEmbedImage"] }, + "maxLength": 20, + "description": "The schema-level maxLength of 20 is a future-proof ceiling. Clients should currently enforce a soft limit of 10 items in authoring UIs." + }, + "draftEmbedImage": { + "type": "object", + "required": ["localRef"], + "properties": { + "localRef": { + "type": "ref", + "ref": "#draftEmbedLocalRef" + }, + "alt": { + "type": "string", + "maxGraphemes": 2000 + } + } + }, + "draftEmbedVideo": { + "type": "object", + "required": ["localRef"], + "properties": { + "localRef": { + "type": "ref", + "ref": "#draftEmbedLocalRef" + }, + "alt": { + "type": "string", + "maxGraphemes": 2000 + }, + "captions": { + "type": "array", + "items": { + "type": "ref", + "ref": "#draftEmbedCaption" + }, + "maxLength": 20 + } + } + }, + "draftEmbedExternal": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": { "type": "string", "format": "uri" } + } + }, + "draftEmbedRecord": { + "type": "object", + "required": ["record"], + "properties": { + "record": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/draft/deleteDraft.json b/priv/lexicons/official/app/bsky/draft/deleteDraft.json new file mode 100644 index 0000000..0445a0f --- /dev/null +++ b/priv/lexicons/official/app/bsky/draft/deleteDraft.json @@ -0,0 +1,23 @@ +{ + "lexicon": 1, + "id": "app.bsky.draft.deleteDraft", + "defs": { + "main": { + "type": "procedure", + "description": "Deletes a draft by ID. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["id"], + "properties": { + "id": { + "type": "string", + "format": "tid" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/draft/getDrafts.json b/priv/lexicons/official/app/bsky/draft/getDrafts.json new file mode 100644 index 0000000..3e60740 --- /dev/null +++ b/priv/lexicons/official/app/bsky/draft/getDrafts.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "app.bsky.draft.getDrafts", + "defs": { + "main": { + "type": "query", + "description": "Gets views of user drafts. 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": ["drafts"], + "properties": { + "cursor": { "type": "string" }, + "drafts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.draft.defs#draftView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/draft/updateDraft.json b/priv/lexicons/official/app/bsky/draft/updateDraft.json new file mode 100644 index 0000000..6b1b6fc --- /dev/null +++ b/priv/lexicons/official/app/bsky/draft/updateDraft.json @@ -0,0 +1,23 @@ +{ + "lexicon": 1, + "id": "app.bsky.draft.updateDraft", + "defs": { + "main": { + "type": "procedure", + "description": "Updates a draft using private storage (stash). If the draft ID points to a non-existing ID, the update will be silently ignored. This is done because updates don't enforce draft limit, so it accepts all writes, but will ignore invalid ones. Requires authentication.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["draft"], + "properties": { + "draft": { + "type": "ref", + "ref": "app.bsky.draft.defs#draftWithId" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/embed/getEmbedExternalView.json b/priv/lexicons/official/app/bsky/embed/getEmbedExternalView.json new file mode 100644 index 0000000..421fd3d --- /dev/null +++ b/priv/lexicons/official/app/bsky/embed/getEmbedExternalView.json @@ -0,0 +1,55 @@ +{ + "lexicon": 1, + "id": "app.bsky.embed.getEmbedExternalView", + "defs": { + "main": { + "type": "query", + "description": "Resolve one or more AT-URIs into the data needed to render an enhanced external embed. Returns `associatedRefs` (strongRefs to embed into a post's external.associatedRefs), the raw `associatedRecords`, and a hydrated `view`. The response is empty (`{}`) when no records were resolvable, or when validation determined the resolved records don't actually back the requested URL; clients should fall back to their own link-card rendering in that case and skip writing strongRefs to the post.", + "parameters": { + "type": "params", + "required": ["url", "uris"], + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The canonical web URL the embed represents (typically the URL the user pasted into the composer). Used as the returned view's `uri`. May be used for validation in the future." + }, + "uris": { + "type": "array", + "description": "AT-URIs of any Atmosphere records that can be resolved and used to construct #externalView views. Example: a site.standard.document and optionally its associated site.standard.publication.", + "items": { "type": "string", "format": "at-uri" }, + "maxLength": 4 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "view": { + "type": "ref", + "ref": "app.bsky.embed.external#view", + "description": "Hydrated view of the embed. Present only when the resolved records back the requested URL and supply enough information to populate the required `viewExternal` fields. Omitted alongside the rest of the response when no records resolved or validation failed." + }, + "associatedRefs": { + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, + "description": "StrongRefs (URI+CID) of the Atmosphere records that backed this view, suitable for embedding into a post's external.associatedRefs." + }, + "associatedRecords": { + "type": "array", + "items": { + "type": "unknown", + "description": "The raw record data of the Atmosphere records that backed this view. This is returned for convenience, to avoid the need for the client to separately fetch the record data for the associatedRefs. Example: the site.standard.document and site.standard.publication records that backed this view." + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/describeFeedGenerator.json b/priv/lexicons/official/app/bsky/feed/describeFeedGenerator.json new file mode 100644 index 0000000..0c7b8c8 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/describeFeedGenerator.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.describeFeedGenerator", + "defs": { + "main": { + "type": "query", + "description": "Get information about a feed generator, including policies and offered feed URIs. Does not require auth; implemented by Feed Generator services (not App View).", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["did", "feeds"], + "properties": { + "did": { "type": "string", "format": "did" }, + "feeds": { + "type": "array", + "items": { "type": "ref", "ref": "#feed" } + }, + "links": { "type": "ref", "ref": "#links" } + } + } + } + }, + "feed": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": { "type": "string", "format": "at-uri" } + } + }, + "links": { + "type": "object", + "properties": { + "privacyPolicy": { "type": "string" }, + "termsOfService": { "type": "string" } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/generator.json b/priv/lexicons/official/app/bsky/feed/generator.json new file mode 100644 index 0000000..fec0c0f --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/generator.json @@ -0,0 +1,54 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.generator", + "defs": { + "main": { + "type": "record", + "description": "Record declaring of the existence of a feed generator, and containing metadata about it. The record can exist in any repository.", + "key": "any", + "record": { + "type": "object", + "required": ["did", "displayName", "createdAt"], + "properties": { + "did": { "type": "string", "format": "did" }, + "displayName": { + "type": "string", + "maxGraphemes": 24, + "maxLength": 240 + }, + "description": { + "type": "string", + "maxGraphemes": 300, + "maxLength": 3000 + }, + "descriptionFacets": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } + }, + "avatar": { + "type": "blob", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "acceptsInteractions": { + "type": "boolean", + "description": "Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions" + }, + "labels": { + "type": "union", + "description": "Self-label values", + "refs": ["com.atproto.label.defs#selfLabels"] + }, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, + "createdAt": { "type": "string", "format": "datetime" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getActorFeeds.json b/priv/lexicons/official/app/bsky/feed/getActorFeeds.json new file mode 100644 index 0000000..9a7dae0 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getActorFeeds.json @@ -0,0 +1,41 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getActorFeeds", + "defs": { + "main": { + "type": "query", + "description": "Get a list of feeds (feed generator records) created by the actor (in the actor's repo).", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feeds"], + "properties": { + "cursor": { "type": "string" }, + "feeds": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getActorLikes.json b/priv/lexicons/official/app/bsky/feed/getActorLikes.json new file mode 100644 index 0000000..f7c0224 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getActorLikes.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getActorLikes", + "defs": { + "main": { + "type": "query", + "description": "Get a list of posts liked by an actor. Requires auth, actor must be the requesting account.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feed"], + "properties": { + "cursor": { "type": "string" }, + "feed": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#feedViewPost" + } + } + } + } + }, + "errors": [{ "name": "BlockedActor" }, { "name": "BlockedByActor" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getAuthorFeed.json b/priv/lexicons/official/app/bsky/feed/getAuthorFeed.json new file mode 100644 index 0000000..c9ef8c5 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getAuthorFeed.json @@ -0,0 +1,58 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getAuthorFeed", + "defs": { + "main": { + "type": "query", + "description": "Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" }, + "filter": { + "type": "string", + "description": "Combinations of post/repost types to include in response.", + "knownValues": [ + "posts_with_replies", + "posts_no_replies", + "posts_with_media", + "posts_and_author_threads", + "posts_with_video" + ], + "default": "posts_with_replies" + }, + "includePins": { + "type": "boolean", + "default": false + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feed"], + "properties": { + "cursor": { "type": "string" }, + "feed": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#feedViewPost" + } + } + } + } + }, + "errors": [{ "name": "BlockedActor" }, { "name": "BlockedByActor" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getFeed.json b/priv/lexicons/official/app/bsky/feed/getFeed.json new file mode 100644 index 0000000..ada3098 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getFeed.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getFeed", + "defs": { + "main": { + "type": "query", + "description": "Get a hydrated feed from an actor's selected feed generator. Implemented by App View.", + "parameters": { + "type": "params", + "required": ["feed"], + "properties": { + "feed": { "type": "string", "format": "at-uri" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feed"], + "properties": { + "cursor": { "type": "string" }, + "feed": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#feedViewPost" + } + } + } + } + }, + "errors": [{ "name": "UnknownFeed" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getFeedGenerator.json b/priv/lexicons/official/app/bsky/feed/getFeedGenerator.json new file mode 100644 index 0000000..190eca8 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getFeedGenerator.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getFeedGenerator", + "defs": { + "main": { + "type": "query", + "description": "Get information about a feed generator. Implemented by AppView.", + "parameters": { + "type": "params", + "required": ["feed"], + "properties": { + "feed": { + "type": "string", + "format": "at-uri", + "description": "AT-URI of the feed generator record." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["view", "isOnline", "isValid"], + "properties": { + "view": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + }, + "isOnline": { + "type": "boolean", + "description": "Indicates whether the feed generator service has been online recently, or else seems to be inactive." + }, + "isValid": { + "type": "boolean", + "description": "Indicates whether the feed generator service is compatible with the record declaration." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getFeedGenerators.json b/priv/lexicons/official/app/bsky/feed/getFeedGenerators.json new file mode 100644 index 0000000..b8e926d --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getFeedGenerators.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getFeedGenerators", + "defs": { + "main": { + "type": "query", + "description": "Get information about a list of feed generators.", + "parameters": { + "type": "params", + "required": ["feeds"], + "properties": { + "feeds": { + "type": "array", + "items": { "type": "string", "format": "at-uri" } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feeds"], + "properties": { + "feeds": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getFeedSkeleton.json b/priv/lexicons/official/app/bsky/feed/getFeedSkeleton.json new file mode 100644 index 0000000..36e9be9 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getFeedSkeleton.json @@ -0,0 +1,51 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getFeedSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of a feed provided by a feed generator. Auth is optional, depending on provider requirements, and provides the DID of the requester. Implemented by Feed Generator Service.", + "parameters": { + "type": "params", + "required": ["feed"], + "properties": { + "feed": { + "type": "string", + "format": "at-uri", + "description": "Reference to feed generator record describing the specific feed being requested." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feed"], + "properties": { + "cursor": { "type": "string" }, + "feed": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#skeletonFeedPost" + } + }, + "reqId": { + "type": "string", + "description": "Unique identifier per request that may be passed back alongside interactions.", + "maxLength": 100 + } + } + } + }, + "errors": [{ "name": "UnknownFeed" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getLikes.json b/priv/lexicons/official/app/bsky/feed/getLikes.json new file mode 100644 index 0000000..d2c5b1a --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getLikes.json @@ -0,0 +1,58 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getLikes", + "defs": { + "main": { + "type": "query", + "description": "Get like records which reference a subject (by AT-URI and CID).", + "parameters": { + "type": "params", + "required": ["uri"], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "AT-URI of the subject (eg, a post record)." + }, + "cid": { + "type": "string", + "format": "cid", + "description": "CID of the subject record (aka, specific version of record), to filter likes." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["uri", "likes"], + "properties": { + "uri": { "type": "string", "format": "at-uri" }, + "cid": { "type": "string", "format": "cid" }, + "cursor": { "type": "string" }, + "likes": { + "type": "array", + "items": { "type": "ref", "ref": "#like" } + } + } + } + } + }, + "like": { + "type": "object", + "required": ["indexedAt", "createdAt", "actor"], + "properties": { + "indexedAt": { "type": "string", "format": "datetime" }, + "createdAt": { "type": "string", "format": "datetime" }, + "actor": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getListFeed.json b/priv/lexicons/official/app/bsky/feed/getListFeed.json new file mode 100644 index 0000000..9dd9fdc --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getListFeed.json @@ -0,0 +1,46 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getListFeed", + "defs": { + "main": { + "type": "query", + "description": "Get a feed of recent posts from a list (posts and reposts from any actors on the list). Does not require auth.", + "parameters": { + "type": "params", + "required": ["list"], + "properties": { + "list": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the list record." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feed"], + "properties": { + "cursor": { "type": "string" }, + "feed": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#feedViewPost" + } + } + } + } + }, + "errors": [{ "name": "UnknownList" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getPostThread.json b/priv/lexicons/official/app/bsky/feed/getPostThread.json new file mode 100644 index 0000000..7efab15 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getPostThread.json @@ -0,0 +1,57 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getPostThread", + "defs": { + "main": { + "type": "query", + "description": "Get posts in a thread. Does not require auth, but additional metadata and filtering will be applied for authed requests.", + "parameters": { + "type": "params", + "required": ["uri"], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to post record." + }, + "depth": { + "type": "integer", + "description": "How many levels of reply depth should be included in response.", + "default": 6, + "minimum": 0, + "maximum": 1000 + }, + "parentHeight": { + "type": "integer", + "description": "How many levels of parent (and grandparent, etc) post to include.", + "default": 80, + "minimum": 0, + "maximum": 1000 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["thread"], + "properties": { + "thread": { + "type": "union", + "refs": [ + "app.bsky.feed.defs#threadViewPost", + "app.bsky.feed.defs#notFoundPost", + "app.bsky.feed.defs#blockedPost" + ] + }, + "threadgate": { + "type": "ref", + "ref": "app.bsky.feed.defs#threadgateView" + } + } + } + }, + "errors": [{ "name": "NotFound" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getPosts.json b/priv/lexicons/official/app/bsky/feed/getPosts.json new file mode 100644 index 0000000..e555ee1 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getPosts.json @@ -0,0 +1,35 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getPosts", + "defs": { + "main": { + "type": "query", + "description": "Gets post views for a specified list of posts (by AT-URI). This is sometimes referred to as 'hydrating' a 'feed skeleton'.", + "parameters": { + "type": "params", + "required": ["uris"], + "properties": { + "uris": { + "type": "array", + "description": "List of post AT-URIs to return hydrated views for.", + "items": { "type": "string", "format": "at-uri" }, + "maxLength": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["posts"], + "properties": { + "posts": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.feed.defs#postView" } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getQuotes.json b/priv/lexicons/official/app/bsky/feed/getQuotes.json new file mode 100644 index 0000000..4ea8b30 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getQuotes.json @@ -0,0 +1,52 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getQuotes", + "defs": { + "main": { + "type": "query", + "description": "Get a list of quotes for a given post.", + "parameters": { + "type": "params", + "required": ["uri"], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) of post record" + }, + "cid": { + "type": "string", + "format": "cid", + "description": "If supplied, filters to quotes of specific version (by CID) of the post record." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["uri", "posts"], + "properties": { + "uri": { "type": "string", "format": "at-uri" }, + "cid": { "type": "string", "format": "cid" }, + "cursor": { "type": "string" }, + "posts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#postView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getRepostedBy.json b/priv/lexicons/official/app/bsky/feed/getRepostedBy.json new file mode 100644 index 0000000..db39534 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getRepostedBy.json @@ -0,0 +1,52 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getRepostedBy", + "defs": { + "main": { + "type": "query", + "description": "Get a list of reposts for a given post.", + "parameters": { + "type": "params", + "required": ["uri"], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) of post record" + }, + "cid": { + "type": "string", + "format": "cid", + "description": "If supplied, filters to reposts of specific version (by CID) of the post record." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["uri", "repostedBy"], + "properties": { + "uri": { "type": "string", "format": "at-uri" }, + "cid": { "type": "string", "format": "cid" }, + "cursor": { "type": "string" }, + "repostedBy": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getSuggestedFeeds.json b/priv/lexicons/official/app/bsky/feed/getSuggestedFeeds.json new file mode 100644 index 0000000..e643d33 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getSuggestedFeeds.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getSuggestedFeeds", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested feeds (feed generators) for the requesting account.", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feeds"], + "properties": { + "cursor": { "type": "string" }, + "feeds": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/getTimeline.json b/priv/lexicons/official/app/bsky/feed/getTimeline.json new file mode 100644 index 0000000..816380f --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/getTimeline.json @@ -0,0 +1,43 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.getTimeline", + "defs": { + "main": { + "type": "query", + "description": "Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.", + "parameters": { + "type": "params", + "properties": { + "algorithm": { + "type": "string", + "description": "Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feed"], + "properties": { + "cursor": { "type": "string" }, + "feed": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#feedViewPost" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/like.json b/priv/lexicons/official/app/bsky/feed/like.json new file mode 100644 index 0000000..0fcb803 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/like.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.like", + "defs": { + "main": { + "type": "record", + "description": "Record declaring a 'like' of a piece of subject content.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "createdAt": { "type": "string", "format": "datetime" }, + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/repost.json b/priv/lexicons/official/app/bsky/feed/repost.json new file mode 100644 index 0000000..cebb526 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/repost.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.repost", + "defs": { + "main": { + "description": "Record representing a 'repost' of an existing Bluesky post.", + "type": "record", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "createdAt": { "type": "string", "format": "datetime" }, + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/searchPosts.json b/priv/lexicons/official/app/bsky/feed/searchPosts.json new file mode 100644 index 0000000..c98be44 --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/searchPosts.json @@ -0,0 +1,99 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.searchPosts", + "defs": { + "main": { + "type": "query", + "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": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "sort": { + "type": "string", + "knownValues": ["top", "latest"], + "default": "latest", + "description": "Specifies the ranking order of results." + }, + "since": { + "type": "string", + "description": "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD)." + }, + "until": { + "type": "string", + "description": "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD)." + }, + "mentions": { + "type": "string", + "format": "at-identifier", + "description": "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions." + }, + "author": { + "type": "string", + "format": "at-identifier", + "description": "Filter to posts by the given account. Handles are resolved to DID before query-time." + }, + "lang": { + "type": "string", + "format": "language", + "description": "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection." + }, + "domain": { + "type": "string", + "description": "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching." + }, + "tag": { + "type": "array", + "items": { + "type": "string", + "maxLength": 640, + "maxGraphemes": 64 + }, + "description": "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + }, + "cursor": { + "type": "string", + "description": "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["posts"], + "properties": { + "cursor": { "type": "string" }, + "hitsTotal": { + "type": "integer", + "description": "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits." + }, + "posts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#postView" + } + } + } + } + }, + "errors": [{ "name": "BadQueryString" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/feed/sendInteractions.json b/priv/lexicons/official/app/bsky/feed/sendInteractions.json new file mode 100644 index 0000000..5490e3c --- /dev/null +++ b/priv/lexicons/official/app/bsky/feed/sendInteractions.json @@ -0,0 +1,34 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.sendInteractions", + "defs": { + "main": { + "type": "procedure", + "description": "Send information about interactions with feed items back to the feed generator that served them.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["interactions"], + "properties": { + "feed": { "type": "string", "format": "at-uri" }, + "interactions": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#interaction" + } + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/block.json b/priv/lexicons/official/app/bsky/graph/block.json new file mode 100644 index 0000000..b64b11a --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/block.json @@ -0,0 +1,23 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.block", + "defs": { + "main": { + "type": "record", + "description": "Record declaring a 'block' relationship against another account. NOTE: blocks are public in Bluesky; see blog posts for details.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { + "type": "string", + "format": "did", + "description": "DID of the account to be blocked." + }, + "createdAt": { "type": "string", "format": "datetime" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/follow.json b/priv/lexicons/official/app/bsky/graph/follow.json new file mode 100644 index 0000000..e0b74be --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/follow.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.follow", + "defs": { + "main": { + "type": "record", + "description": "Record declaring a social 'follow' relationship of another account. Duplicate follows will be ignored by the AppView.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { "type": "string", "format": "did" }, + "createdAt": { "type": "string", "format": "datetime" }, + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getActorStarterPacks.json b/priv/lexicons/official/app/bsky/graph/getActorStarterPacks.json new file mode 100644 index 0000000..e6093b4 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getActorStarterPacks.json @@ -0,0 +1,41 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getActorStarterPacks", + "defs": { + "main": { + "type": "query", + "description": "Get a list of starter packs created by the actor.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "cursor": { "type": "string" }, + "starterPacks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackViewBasic" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getBlocks.json b/priv/lexicons/official/app/bsky/graph/getBlocks.json new file mode 100644 index 0000000..79a28f6 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getBlocks.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getBlocks", + "defs": { + "main": { + "type": "query", + "description": "Enumerates which accounts the requesting account is currently blocking. 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": ["blocks"], + "properties": { + "cursor": { "type": "string" }, + "blocks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getFollowers.json b/priv/lexicons/official/app/bsky/graph/getFollowers.json new file mode 100644 index 0000000..a6c4fac --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getFollowers.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getFollowers", + "defs": { + "main": { + "type": "query", + "description": "Enumerates accounts which follow a specified account (actor).", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["subject", "followers"], + "properties": { + "subject": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + }, + "cursor": { "type": "string" }, + "followers": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getFollows.json b/priv/lexicons/official/app/bsky/graph/getFollows.json new file mode 100644 index 0000000..81f1b6a --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getFollows.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getFollows", + "defs": { + "main": { + "type": "query", + "description": "Enumerates accounts which a specified account (actor) follows.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["subject", "follows"], + "properties": { + "subject": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + }, + "cursor": { "type": "string" }, + "follows": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getKnownFollowers.json b/priv/lexicons/official/app/bsky/graph/getKnownFollowers.json new file mode 100644 index 0000000..dcadba2 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getKnownFollowers.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getKnownFollowers", + "defs": { + "main": { + "type": "query", + "description": "Enumerates accounts which follow a specified account (actor) and are followed by the viewer.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["subject", "followers"], + "properties": { + "subject": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + }, + "cursor": { "type": "string" }, + "followers": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getList.json b/priv/lexicons/official/app/bsky/graph/getList.json new file mode 100644 index 0000000..cb95a00 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getList.json @@ -0,0 +1,46 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getList", + "defs": { + "main": { + "type": "query", + "description": "Gets a 'view' (with additional context) of a specified list.", + "parameters": { + "type": "params", + "required": ["list"], + "properties": { + "list": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) of the list record to hydrate." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["list", "items"], + "properties": { + "cursor": { "type": "string" }, + "list": { "type": "ref", "ref": "app.bsky.graph.defs#listView" }, + "items": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#listItemView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getListBlocks.json b/priv/lexicons/official/app/bsky/graph/getListBlocks.json new file mode 100644 index 0000000..1bc9766 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getListBlocks.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getListBlocks", + "defs": { + "main": { + "type": "query", + "description": "Get mod lists that the requesting account (actor) is blocking. 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": ["lists"], + "properties": { + "cursor": { "type": "string" }, + "lists": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.graph.defs#listView" } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getListMutes.json b/priv/lexicons/official/app/bsky/graph/getListMutes.json new file mode 100644 index 0000000..a56a825 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getListMutes.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getListMutes", + "defs": { + "main": { + "type": "query", + "description": "Enumerates mod lists that the requesting account (actor) currently has muted. 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": ["lists"], + "properties": { + "cursor": { "type": "string" }, + "lists": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.graph.defs#listView" } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getLists.json b/priv/lexicons/official/app/bsky/graph/getLists.json new file mode 100644 index 0000000..5df88df --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getLists.json @@ -0,0 +1,50 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getLists", + "defs": { + "main": { + "type": "query", + "description": "Enumerates the lists created by a specified account (actor).", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { + "type": "string", + "format": "at-identifier", + "description": "The account (actor) to enumerate lists from." + }, + "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": ["lists"], + "properties": { + "cursor": { "type": "string" }, + "lists": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.graph.defs#listView" } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getListsWithMembership.json b/priv/lexicons/official/app/bsky/graph/getListsWithMembership.json new file mode 100644 index 0000000..aedec59 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getListsWithMembership.json @@ -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" + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getMutes.json b/priv/lexicons/official/app/bsky/graph/getMutes.json new file mode 100644 index 0000000..22eaf0d --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getMutes.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getMutes", + "defs": { + "main": { + "type": "query", + "description": "Enumerates accounts that the requesting account (actor) currently has muted. 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": ["mutes"], + "properties": { + "cursor": { "type": "string" }, + "mutes": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getRelationships.json b/priv/lexicons/official/app/bsky/graph/getRelationships.json new file mode 100644 index 0000000..03490a2 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getRelationships.json @@ -0,0 +1,56 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getRelationships", + "defs": { + "main": { + "type": "query", + "description": "Enumerates public relationships between one account, and a list of other accounts. Does not require auth.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Primary account requesting relationships for." + }, + "others": { + "type": "array", + "description": "List of 'other' accounts to be related back to the primary.", + "maxLength": 30, + "items": { + "type": "string", + "format": "at-identifier" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["relationships"], + "properties": { + "actor": { "type": "string", "format": "did" }, + "relationships": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "app.bsky.graph.defs#relationship", + "app.bsky.graph.defs#notFoundActor" + ] + } + } + } + } + }, + "errors": [ + { + "name": "ActorNotFound", + "description": "the primary actor at-identifier could not be resolved" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getStarterPack.json b/priv/lexicons/official/app/bsky/graph/getStarterPack.json new file mode 100644 index 0000000..b4ded4c --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getStarterPack.json @@ -0,0 +1,34 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getStarterPack", + "defs": { + "main": { + "type": "query", + "description": "Gets a view of a starter pack.", + "parameters": { + "type": "params", + "required": ["starterPack"], + "properties": { + "starterPack": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) of the starter pack record." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPack"], + "properties": { + "starterPack": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackView" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getStarterPacks.json b/priv/lexicons/official/app/bsky/graph/getStarterPacks.json new file mode 100644 index 0000000..b57c43a --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getStarterPacks.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getStarterPacks", + "defs": { + "main": { + "type": "query", + "description": "Get views for a list of starter packs.", + "parameters": { + "type": "params", + "required": ["uris"], + "properties": { + "uris": { + "type": "array", + "items": { "type": "string", "format": "at-uri" }, + "maxLength": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "starterPacks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackViewBasic" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getStarterPacksWithMembership.json b/priv/lexicons/official/app/bsky/graph/getStarterPacksWithMembership.json new file mode 100644 index 0000000..914df2f --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getStarterPacksWithMembership.json @@ -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" + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/getSuggestedFollowsByActor.json b/priv/lexicons/official/app/bsky/graph/getSuggestedFollowsByActor.json new file mode 100644 index 0000000..e4df854 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/getSuggestedFollowsByActor.json @@ -0,0 +1,46 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.getSuggestedFollowsByActor", + "defs": { + "main": { + "type": "query", + "description": "Enumerates follows similar to a given account (actor). Expected use is to recommend additional accounts immediately after following one account.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["suggestions"], + "properties": { + "suggestions": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + }, + "isFallback": { + "type": "boolean", + "description": "DEPRECATED, unused. Previously: if true, response has fallen-back to generic results, and is not scoped using relativeToDid", + "default": false + }, + "recId": { + "type": "integer", + "description": "DEPRECATED: use recIdStr instead." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/list.json b/priv/lexicons/official/app/bsky/graph/list.json new file mode 100644 index 0000000..1311141 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/list.json @@ -0,0 +1,47 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.list", + "defs": { + "main": { + "type": "record", + "description": "Record representing a list of accounts (actors). Scope includes both moderation-oriented lists and curration-oriented lists.", + "key": "tid", + "record": { + "type": "object", + "required": ["name", "purpose", "createdAt"], + "properties": { + "purpose": { + "type": "ref", + "description": "Defines the purpose of the list (aka, moderation-oriented or curration-oriented)", + "ref": "app.bsky.graph.defs#listPurpose" + }, + "name": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "description": "Display name for list; can not be empty." + }, + "description": { + "type": "string", + "maxGraphemes": 300, + "maxLength": 3000 + }, + "descriptionFacets": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } + }, + "avatar": { + "type": "blob", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "labels": { + "type": "union", + "refs": ["com.atproto.label.defs#selfLabels"] + }, + "createdAt": { "type": "string", "format": "datetime" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/listblock.json b/priv/lexicons/official/app/bsky/graph/listblock.json new file mode 100644 index 0000000..df2e17f --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/listblock.json @@ -0,0 +1,23 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.listblock", + "defs": { + "main": { + "type": "record", + "description": "Record representing a block relationship against an entire an entire list of accounts (actors).", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the mod list record." + }, + "createdAt": { "type": "string", "format": "datetime" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/listitem.json b/priv/lexicons/official/app/bsky/graph/listitem.json new file mode 100644 index 0000000..adbd96e --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/listitem.json @@ -0,0 +1,28 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.listitem", + "defs": { + "main": { + "type": "record", + "description": "Record representing an account's inclusion on a specific list. The AppView will ignore duplicate listitem records.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "list", "createdAt"], + "properties": { + "subject": { + "type": "string", + "format": "did", + "description": "The account which is included on the list." + }, + "list": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the list record (app.bsky.graph.list)." + }, + "createdAt": { "type": "string", "format": "datetime" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/muteActor.json b/priv/lexicons/official/app/bsky/graph/muteActor.json new file mode 100644 index 0000000..c2bf09a --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/muteActor.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.muteActor", + "defs": { + "main": { + "type": "procedure", + "description": "Creates a mute relationship for the specified account. Mutes are private in Bluesky. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/muteActorList.json b/priv/lexicons/official/app/bsky/graph/muteActorList.json new file mode 100644 index 0000000..ad05e63 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/muteActorList.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.muteActorList", + "defs": { + "main": { + "type": "procedure", + "description": "Creates a mute relationship for the specified list of accounts. Mutes are private in Bluesky. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["list"], + "properties": { + "list": { "type": "string", "format": "at-uri" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/muteThread.json b/priv/lexicons/official/app/bsky/graph/muteThread.json new file mode 100644 index 0000000..a20be82 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/muteThread.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.muteThread", + "defs": { + "main": { + "type": "procedure", + "description": "Mutes a thread preventing notifications from the thread and any of its children. Mutes are private in Bluesky. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["root"], + "properties": { + "root": { "type": "string", "format": "at-uri" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/searchStarterPacks.json b/priv/lexicons/official/app/bsky/graph/searchStarterPacks.json new file mode 100644 index 0000000..66a26ec --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/searchStarterPacks.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.searchStarterPacks", + "defs": { + "main": { + "type": "query", + "description": "Find starter packs matching search criteria. Does not require auth.", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + }, + "cursor": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "cursor": { + "type": "string" + }, + "starterPacks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackViewBasic" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/starterpack.json b/priv/lexicons/official/app/bsky/graph/starterpack.json new file mode 100644 index 0000000..17ee55e --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/starterpack.json @@ -0,0 +1,51 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.starterpack", + "defs": { + "main": { + "type": "record", + "description": "Record defining a starter pack of actors and feeds for new users.", + "key": "tid", + "record": { + "type": "object", + "required": ["name", "list", "createdAt"], + "properties": { + "name": { + "type": "string", + "maxGraphemes": 50, + "maxLength": 500, + "minLength": 1, + "description": "Display name for starter pack; can not be empty." + }, + "description": { + "type": "string", + "maxGraphemes": 300, + "maxLength": 3000 + }, + "descriptionFacets": { + "type": "array", + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } + }, + "list": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the list record." + }, + "feeds": { + "type": "array", + "maxLength": 3, + "items": { "type": "ref", "ref": "#feedItem" } + }, + "createdAt": { "type": "string", "format": "datetime" } + } + } + }, + "feedItem": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": { "type": "string", "format": "at-uri" } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/unmuteActor.json b/priv/lexicons/official/app/bsky/graph/unmuteActor.json new file mode 100644 index 0000000..bcea72d --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/unmuteActor.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.unmuteActor", + "defs": { + "main": { + "type": "procedure", + "description": "Unmutes the specified account. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actor"], + "properties": { + "actor": { "type": "string", "format": "at-identifier" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/unmuteActorList.json b/priv/lexicons/official/app/bsky/graph/unmuteActorList.json new file mode 100644 index 0000000..a597838 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/unmuteActorList.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.unmuteActorList", + "defs": { + "main": { + "type": "procedure", + "description": "Unmutes the specified list of accounts. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["list"], + "properties": { + "list": { "type": "string", "format": "at-uri" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/unmuteThread.json b/priv/lexicons/official/app/bsky/graph/unmuteThread.json new file mode 100644 index 0000000..6450a65 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/unmuteThread.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.unmuteThread", + "defs": { + "main": { + "type": "procedure", + "description": "Unmutes the specified thread. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["root"], + "properties": { + "root": { "type": "string", "format": "at-uri" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/graph/verification.json b/priv/lexicons/official/app/bsky/graph/verification.json new file mode 100644 index 0000000..407da18 --- /dev/null +++ b/priv/lexicons/official/app/bsky/graph/verification.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "app.bsky.graph.verification", + "defs": { + "main": { + "type": "record", + "description": "Record declaring a verification relationship between two accounts. Verifications are only considered valid by an app if issued by an account the app considers trusted.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "handle", "displayName", "createdAt"], + "properties": { + "subject": { + "description": "DID of the subject the verification applies to.", + "type": "string", + "format": "did" + }, + "handle": { + "description": "Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying.", + "type": "string", + "format": "handle" + }, + "displayName": { + "description": "Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying.", + "type": "string" + }, + "createdAt": { + "description": "Date of when the verification was created.", + "type": "string", + "format": "datetime" + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/labeler/getServices.json b/priv/lexicons/official/app/bsky/labeler/getServices.json new file mode 100644 index 0000000..df6844e --- /dev/null +++ b/priv/lexicons/official/app/bsky/labeler/getServices.json @@ -0,0 +1,43 @@ +{ + "lexicon": 1, + "id": "app.bsky.labeler.getServices", + "defs": { + "main": { + "type": "query", + "description": "Get information about a list of labeler services.", + "parameters": { + "type": "params", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": { "type": "string", "format": "did" } + }, + "detailed": { + "type": "boolean", + "default": false + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["views"], + "properties": { + "views": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "app.bsky.labeler.defs#labelerView", + "app.bsky.labeler.defs#labelerViewDetailed" + ] + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/labeler/service.json b/priv/lexicons/official/app/bsky/labeler/service.json new file mode 100644 index 0000000..becf1a1 --- /dev/null +++ b/priv/lexicons/official/app/bsky/labeler/service.json @@ -0,0 +1,47 @@ +{ + "lexicon": 1, + "id": "app.bsky.labeler.service", + "defs": { + "main": { + "type": "record", + "description": "A declaration of the existence of labeler service.", + "key": "literal:self", + "record": { + "type": "object", + "required": ["policies", "createdAt"], + "properties": { + "policies": { + "type": "ref", + "ref": "app.bsky.labeler.defs#labelerPolicies" + }, + "labels": { + "type": "union", + "refs": ["com.atproto.label.defs#selfLabels"] + }, + "createdAt": { "type": "string", "format": "datetime" }, + "reasonTypes": { + "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.moderation.defs#reasonType" + } + }, + "subjectTypes": { + "description": "The set of subject types (account, record, etc) this service accepts reports on.", + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.moderation.defs#subjectType" + } + }, + "subjectCollections": { + "type": "array", + "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", + "items": { "type": "string", "format": "nsid" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/declaration.json b/priv/lexicons/official/app/bsky/notification/declaration.json new file mode 100644 index 0000000..6e6013e --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/declaration.json @@ -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"] + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/getPreferences.json b/priv/lexicons/official/app/bsky/notification/getPreferences.json new file mode 100644 index 0000000..b482b3d --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/getPreferences.json @@ -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" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/getUnreadCount.json b/priv/lexicons/official/app/bsky/notification/getUnreadCount.json new file mode 100644 index 0000000..c5e2df1 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/getUnreadCount.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "app.bsky.notification.getUnreadCount", + "defs": { + "main": { + "type": "query", + "description": "Count the number of unread notifications for the requesting account. Requires auth.", + "parameters": { + "type": "params", + "properties": { + "priority": { "type": "boolean" }, + "seenAt": { "type": "string", "format": "datetime" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["count"], + "properties": { + "count": { "type": "integer" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/listActivitySubscriptions.json b/priv/lexicons/official/app/bsky/notification/listActivitySubscriptions.json new file mode 100644 index 0000000..1f408d8 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/listActivitySubscriptions.json @@ -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" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/listNotifications.json b/priv/lexicons/official/app/bsky/notification/listNotifications.json new file mode 100644 index 0000000..2227e7e --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/listNotifications.json @@ -0,0 +1,92 @@ +{ + "lexicon": 1, + "id": "app.bsky.notification.listNotifications", + "defs": { + "main": { + "type": "query", + "description": "Enumerate notifications for the requesting account. Requires auth.", + "parameters": { + "type": "params", + "properties": { + "reasons": { + "description": "Notification reasons to include in response.", + "type": "array", + "items": { + "type": "string", + "description": "A reason that matches the reason property of #notification." + } + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "priority": { "type": "boolean" }, + "cursor": { "type": "string" }, + "seenAt": { "type": "string", "format": "datetime" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["notifications"], + "properties": { + "cursor": { "type": "string" }, + "notifications": { + "type": "array", + "items": { "type": "ref", "ref": "#notification" } + }, + "priority": { "type": "boolean" }, + "seenAt": { "type": "string", "format": "datetime" } + } + } + } + }, + "notification": { + "type": "object", + "required": [ + "uri", + "cid", + "author", + "reason", + "record", + "isRead", + "indexedAt" + ], + "properties": { + "uri": { "type": "string", "format": "at-uri" }, + "cid": { "type": "string", "format": "cid" }, + "author": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, + "reason": { + "type": "string", + "description": "The reason why this notification was delivered - e.g. your post was liked, or you received a new follower.", + "knownValues": [ + "like", + "repost", + "follow", + "mention", + "reply", + "quote", + "starterpack-joined", + "verified", + "unverified", + "like-via-repost", + "repost-via-repost", + "subscribed-post", + "contact-match" + ] + }, + "reasonSubject": { "type": "string", "format": "at-uri" }, + "record": { "type": "unknown" }, + "isRead": { "type": "boolean" }, + "indexedAt": { "type": "string", "format": "datetime" }, + "labels": { + "type": "array", + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/putActivitySubscription.json b/priv/lexicons/official/app/bsky/notification/putActivitySubscription.json new file mode 100644 index 0000000..afc29d5 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/putActivitySubscription.json @@ -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" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/putPreferences.json b/priv/lexicons/official/app/bsky/notification/putPreferences.json new file mode 100644 index 0000000..65ae024 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/putPreferences.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.notification.putPreferences", + "defs": { + "main": { + "type": "procedure", + "description": "Set notification-related preferences for an account. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["priority"], + "properties": { + "priority": { "type": "boolean" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/putPreferencesV2.json b/priv/lexicons/official/app/bsky/notification/putPreferencesV2.json new file mode 100644 index 0000000..5a11b95 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/putPreferencesV2.json @@ -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" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/registerPush.json b/priv/lexicons/official/app/bsky/notification/registerPush.json new file mode 100644 index 0000000..6891c87 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/registerPush.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "app.bsky.notification.registerPush", + "defs": { + "main": { + "type": "procedure", + "description": "Register to receive push notifications, via a specified service, 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" }, + "ageRestricted": { + "type": "boolean", + "description": "Set to true when the actor is age restricted" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/unregisterPush.json b/priv/lexicons/official/app/bsky/notification/unregisterPush.json new file mode 100644 index 0000000..b3dcef8 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/unregisterPush.json @@ -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" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/notification/updateSeen.json b/priv/lexicons/official/app/bsky/notification/updateSeen.json new file mode 100644 index 0000000..84bb0e7 --- /dev/null +++ b/priv/lexicons/official/app/bsky/notification/updateSeen.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.notification.updateSeen", + "defs": { + "main": { + "type": "procedure", + "description": "Notify server that the requesting account has seen notifications. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["seenAt"], + "properties": { + "seenAt": { "type": "string", "format": "datetime" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/defs.json b/priv/lexicons/official/app/bsky/unspecced/defs.json new file mode 100644 index 0000000..5b6bacc --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/defs.json @@ -0,0 +1,198 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.defs", + "defs": { + "skeletonSearchPost": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": { "type": "string", "format": "at-uri" } + } + }, + "skeletonSearchActor": { + "type": "object", + "required": ["did"], + "properties": { + "did": { "type": "string", "format": "did" } + } + }, + "skeletonSearchStarterPack": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": { "type": "string", "format": "at-uri" } + } + }, + "trendingTopic": { + "type": "object", + "required": ["topic", "link"], + "properties": { + "topic": { "type": "string" }, + "displayName": { "type": "string" }, + "description": { "type": "string" }, + "link": { "type": "string" } + } + }, + "skeletonTrend": { + "type": "object", + "required": [ + "topic", + "displayName", + "link", + "startedAt", + "postCount", + "dids" + ], + "properties": { + "topic": { "type": "string" }, + "displayName": { "type": "string" }, + "link": { "type": "string" }, + "startedAt": { "type": "string", "format": "datetime" }, + "postCount": { "type": "integer" }, + "status": { "type": "string", "knownValues": ["hot"] }, + "category": { "type": "string" }, + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + } + } + } + }, + "trendView": { + "type": "object", + "required": [ + "topic", + "displayName", + "link", + "startedAt", + "postCount", + "actors" + ], + "properties": { + "topic": { "type": "string" }, + "displayName": { "type": "string" }, + "link": { "type": "string" }, + "startedAt": { "type": "string", "format": "datetime" }, + "postCount": { "type": "integer" }, + "status": { "type": "string", "knownValues": ["hot"] }, + "category": { "type": "string" }, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewBasic" + } + } + } + }, + "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." + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getAgeAssuranceState.json b/priv/lexicons/official/app/bsky/unspecced/getAgeAssuranceState.json new file mode 100644 index 0000000..3bd42b3 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getAgeAssuranceState.json @@ -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" + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getConfig.json b/priv/lexicons/official/app/bsky/unspecced/getConfig.json new file mode 100644 index 0000000..286bc48 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getConfig.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getConfig", + "defs": { + "main": { + "type": "query", + "description": "Get miscellaneous runtime configuration.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [], + "properties": { + "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" + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.json b/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.json new file mode 100644 index 0000000..60b1490 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested starterpacks for onboarding", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "starterPacks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.json new file mode 100644 index 0000000..40f3a76 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested starterpacks for onboarding. Intended to be called and hydrated by app.bsky.unspecced.getOnboardingSuggestedStarterPacks", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "starterPacks": { + "type": "array", + "items": { + "type": "string", + "format": "at-uri" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.json new file mode 100644 index 0000000..1303ac1 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.json @@ -0,0 +1,54 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested users for onboarding. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedOnboardingUsers", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + } + }, + "recId": { + "type": "string", + "description": "DEPRECATED: use recIdStr instead." + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getPopularFeedGenerators.json b/priv/lexicons/official/app/bsky/unspecced/getPopularFeedGenerators.json new file mode 100644 index 0000000..ee05c16 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getPopularFeedGenerators.json @@ -0,0 +1,40 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getPopularFeedGenerators", + "defs": { + "main": { + "type": "query", + "description": "An unspecced view of globally popular feed generators.", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" }, + "query": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feeds"], + "properties": { + "cursor": { "type": "string" }, + "feeds": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getPostThreadOtherV2.json b/priv/lexicons/official/app/bsky/unspecced/getPostThreadOtherV2.json new file mode 100644 index 0000000..7fab28b --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getPostThreadOtherV2.json @@ -0,0 +1,56 @@ +{ + "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." + } + } + }, + "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"] + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getPostThreadV2.json b/priv/lexicons/official/app/bsky/unspecced/getPostThreadV2.json new file mode 100644 index 0000000..e38dfde --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getPostThreadV2.json @@ -0,0 +1,94 @@ +{ + "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 + }, + "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" + ] + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedFeeds.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedFeeds.json new file mode 100644 index 0000000..1a723a0 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedFeeds.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedFeeds", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested feeds", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feeds"], + "properties": { + "feeds": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedFeedsSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedFeedsSkeleton.json new file mode 100644 index 0000000..c0b72da --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedFeedsSkeleton.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedFeedsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested feeds. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedFeeds", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["feeds"], + "properties": { + "feeds": { + "type": "array", + "items": { + "type": "string", + "format": "at-uri" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedOnboardingUsers.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedOnboardingUsers.json new file mode 100644 index 0000000..24e4556 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedOnboardingUsers.json @@ -0,0 +1,49 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedOnboardingUsers", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested users for onboarding", + "parameters": { + "type": "params", + "properties": { + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recId": { + "type": "string", + "description": "DEPRECATED: use recIdStr instead." + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedStarterPacks.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedStarterPacks.json new file mode 100644 index 0000000..d4bdd22 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedStarterPacks.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedStarterPacks", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested starterpacks", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "starterPacks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.json new file mode 100644 index 0000000..cf5d88e --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedStarterPacksSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested starterpacks. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedStarterpacks", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "starterPacks": { + "type": "array", + "items": { + "type": "string", + "format": "at-uri" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsers.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsers.json new file mode 100644 index 0000000..705e21c --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsers.json @@ -0,0 +1,49 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsers", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested users", + "parameters": { + "type": "params", + "properties": { + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recId": { + "type": "string", + "description": "DEPRECATED: use recIdStr instead." + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForDiscover.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForDiscover.json new file mode 100644 index 0000000..7d0f289 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForDiscover.json @@ -0,0 +1,41 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersForDiscover", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested users for the Discover page", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.json new file mode 100644 index 0000000..7f017ca --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.json @@ -0,0 +1,46 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested users for the Discover page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForDiscover", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForExplore.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForExplore.json new file mode 100644 index 0000000..a37a21a --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForExplore.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersForExplore", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested users for the Explore page", + "parameters": { + "type": "params", + "properties": { + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.json new file mode 100644 index 0000000..b3f3186 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.json @@ -0,0 +1,50 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersForExploreSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested users for the Explore page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForExplore", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForSeeMore.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForSeeMore.json new file mode 100644 index 0000000..1938df7 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForSeeMore.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersForSeeMore", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggested users for the See More page", + "parameters": { + "type": "params", + "properties": { + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.json new file mode 100644 index 0000000..954b518 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.json @@ -0,0 +1,50 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested users for the See More page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForSeeMore", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + } + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersSkeleton.json new file mode 100644 index 0000000..3fed8dd --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestedUsersSkeleton.json @@ -0,0 +1,54 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestedUsersSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested users. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsers", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "category": { + "type": "string", + "description": "Category of users to get suggestions for." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "default": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + } + }, + "recId": { + "type": "string", + "description": "DEPRECATED: use recIdStr instead." + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getSuggestionsSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getSuggestionsSkeleton.json new file mode 100644 index 0000000..f97504c --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getSuggestionsSkeleton.json @@ -0,0 +1,62 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestionsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get a skeleton of suggested actors. Intended to be called and then hydrated through app.bsky.actor.getSuggestions", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" }, + "relativeToDid": { + "type": "string", + "format": "did", + "description": "DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": { "type": "string" }, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchActor" + } + }, + "relativeToDid": { + "type": "string", + "format": "did", + "description": "DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer." + }, + "recId": { + "type": "integer", + "description": "DEPRECATED: use recIdStr instead." + }, + "recIdStr": { + "type": "string", + "description": "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getTaggedSuggestions.json b/priv/lexicons/official/app/bsky/unspecced/getTaggedSuggestions.json new file mode 100644 index 0000000..9fd98ff --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getTaggedSuggestions.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getTaggedSuggestions", + "defs": { + "main": { + "type": "query", + "description": "Get a list of suggestions (feeds and users) tagged with categories", + "parameters": { + "type": "params", + "properties": {} + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["suggestions"], + "properties": { + "suggestions": { + "type": "array", + "items": { + "type": "ref", + "ref": "#suggestion" + } + } + } + } + } + }, + "suggestion": { + "type": "object", + "required": ["tag", "subjectType", "subject"], + "properties": { + "tag": { "type": "string" }, + "subjectType": { + "type": "string", + "knownValues": ["actor", "feed"] + }, + "subject": { "type": "string", "format": "uri" } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getTrendingTopics.json b/priv/lexicons/official/app/bsky/unspecced/getTrendingTopics.json new file mode 100644 index 0000000..097dc1c --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getTrendingTopics.json @@ -0,0 +1,49 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getTrendingTopics", + "defs": { + "main": { + "type": "query", + "description": "Get a list of trending topics", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["topics", "suggested"], + "properties": { + "topics": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#trendingTopic" + } + }, + "suggested": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#trendingTopic" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getTrends.json b/priv/lexicons/official/app/bsky/unspecced/getTrends.json new file mode 100644 index 0000000..1c11421 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getTrends.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getTrends", + "defs": { + "main": { + "type": "query", + "description": "Get the current trends on the network", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["trends"], + "properties": { + "trends": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#trendView" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/getTrendsSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/getTrendsSkeleton.json new file mode 100644 index 0000000..d0b6272 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/getTrendsSkeleton.json @@ -0,0 +1,42 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.getTrendsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Get the skeleton of trends on the network. Intended to be called and then hydrated through app.bsky.unspecced.getTrends", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 25, + "default": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["trends"], + "properties": { + "trends": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonTrend" + } + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/initAgeAssurance.json b/priv/lexicons/official/app/bsky/unspecced/initAgeAssurance.json new file mode 100644 index 0000000..43c4d3c --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/initAgeAssurance.json @@ -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" } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/searchActorsSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/searchActorsSkeleton.json new file mode 100644 index 0000000..f648914 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/searchActorsSkeleton.json @@ -0,0 +1,61 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.searchActorsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Backend Actors (profile) search, returns only skeleton.", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax." + }, + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + }, + "typeahead": { + "type": "boolean", + "description": "If true, acts as fast/simple 'typeahead' query." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + }, + "cursor": { + "type": "string", + "description": "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": { "type": "string" }, + "hitsTotal": { + "type": "integer", + "description": "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits." + }, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchActor" + } + } + } + } + }, + "errors": [{ "name": "BadQueryString" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/searchPostsSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/searchPostsSkeleton.json new file mode 100644 index 0000000..3be2c1b --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/searchPostsSkeleton.json @@ -0,0 +1,104 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.searchPostsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Backend Posts search, returns only skeleton", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "sort": { + "type": "string", + "knownValues": ["top", "latest"], + "default": "latest", + "description": "Specifies the ranking order of results." + }, + "since": { + "type": "string", + "description": "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD)." + }, + "until": { + "type": "string", + "description": "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD)." + }, + "mentions": { + "type": "string", + "format": "at-identifier", + "description": "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions." + }, + "author": { + "type": "string", + "format": "at-identifier", + "description": "Filter to posts by the given account. Handles are resolved to DID before query-time." + }, + "lang": { + "type": "string", + "format": "language", + "description": "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection." + }, + "domain": { + "type": "string", + "description": "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization." + }, + "url": { + "type": "string", + "format": "uri", + "description": "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching." + }, + "tag": { + "type": "array", + "items": { + "type": "string", + "maxLength": 640, + "maxGraphemes": 64 + }, + "description": "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching." + }, + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + }, + "cursor": { + "type": "string", + "description": "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["posts"], + "properties": { + "cursor": { "type": "string" }, + "hitsTotal": { + "type": "integer", + "description": "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits." + }, + "posts": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchPost" + } + } + } + } + }, + "errors": [{ "name": "BadQueryString" }] + } + } +} diff --git a/priv/lexicons/official/app/bsky/unspecced/searchStarterPacksSkeleton.json b/priv/lexicons/official/app/bsky/unspecced/searchStarterPacksSkeleton.json new file mode 100644 index 0000000..80c1b88 --- /dev/null +++ b/priv/lexicons/official/app/bsky/unspecced/searchStarterPacksSkeleton.json @@ -0,0 +1,63 @@ +{ + "lexicon": 1, + "id": "app.bsky.unspecced.searchStarterPacksSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Backend Starter Pack search, returns only skeleton.", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "viewer": { + "type": "string", + "format": "did", + "description": "DID of the account making the request (not included for public/unauthenticated queries)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + }, + "cursor": { + "type": "string", + "description": "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["starterPacks"], + "properties": { + "cursor": { + "type": "string" + }, + "hitsTotal": { + "type": "integer", + "description": "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits." + }, + "starterPacks": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchStarterPack" + } + } + } + } + }, + "errors": [ + { + "name": "BadQueryString" + } + ] + } + } +} diff --git a/priv/lexicons/official/app/bsky/video/defs.json b/priv/lexicons/official/app/bsky/video/defs.json new file mode 100644 index 0000000..8c846cc --- /dev/null +++ b/priv/lexicons/official/app/bsky/video/defs.json @@ -0,0 +1,28 @@ +{ + "lexicon": 1, + "id": "app.bsky.video.defs", + "defs": { + "jobStatus": { + "type": "object", + "required": ["jobId", "did", "state"], + "properties": { + "jobId": { "type": "string" }, + "did": { "type": "string", "format": "did" }, + "state": { + "type": "string", + "description": "The state of the video processing job. All values not listed as a known value indicate that the job is in process.", + "knownValues": ["JOB_STATE_COMPLETED", "JOB_STATE_FAILED"] + }, + "progress": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Progress within the current processing state." + }, + "blob": { "type": "blob" }, + "error": { "type": "string" }, + "message": { "type": "string" } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/video/getJobStatus.json b/priv/lexicons/official/app/bsky/video/getJobStatus.json new file mode 100644 index 0000000..ff3076f --- /dev/null +++ b/priv/lexicons/official/app/bsky/video/getJobStatus.json @@ -0,0 +1,32 @@ +{ + "lexicon": 1, + "id": "app.bsky.video.getJobStatus", + "defs": { + "main": { + "type": "query", + "description": "Get status details for a video processing job.", + "parameters": { + "type": "params", + "required": ["jobId"], + "properties": { + "jobId": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["jobStatus"], + "properties": { + "jobStatus": { + "type": "ref", + "ref": "app.bsky.video.defs#jobStatus" + } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/video/getUploadLimits.json b/priv/lexicons/official/app/bsky/video/getUploadLimits.json new file mode 100644 index 0000000..bcba18e --- /dev/null +++ b/priv/lexicons/official/app/bsky/video/getUploadLimits.json @@ -0,0 +1,24 @@ +{ + "lexicon": 1, + "id": "app.bsky.video.getUploadLimits", + "defs": { + "main": { + "type": "query", + "description": "Get video upload limits for the authenticated user.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["canUpload"], + "properties": { + "canUpload": { "type": "boolean" }, + "remainingDailyVideos": { "type": "integer" }, + "remainingDailyBytes": { "type": "integer" }, + "message": { "type": "string" }, + "error": { "type": "string" } + } + } + } + } + } +} diff --git a/priv/lexicons/official/app/bsky/video/uploadVideo.json b/priv/lexicons/official/app/bsky/video/uploadVideo.json new file mode 100644 index 0000000..8ffc264 --- /dev/null +++ b/priv/lexicons/official/app/bsky/video/uploadVideo.json @@ -0,0 +1,26 @@ +{ + "lexicon": 1, + "id": "app.bsky.video.uploadVideo", + "defs": { + "main": { + "type": "procedure", + "description": "Upload a video to be processed then stored on the PDS.", + "input": { + "encoding": "video/mp4" + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["jobStatus"], + "properties": { + "jobStatus": { + "type": "ref", + "ref": "app.bsky.video.defs#jobStatus" + } + } + } + } + } + } +} diff --git a/priv/lexicons/smoke/app/bsky/feed/like.json b/priv/lexicons/smoke/app/bsky/feed/like.json new file mode 100644 index 0000000..0fcb803 --- /dev/null +++ b/priv/lexicons/smoke/app/bsky/feed/like.json @@ -0,0 +1,20 @@ +{ + "lexicon": 1, + "id": "app.bsky.feed.like", + "defs": { + "main": { + "type": "record", + "description": "Record declaring a 'like' of a piece of subject content.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "createdAt": { "type": "string", "format": "datetime" }, + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + } + } + } + } +} diff --git a/test/tempest_web/firehose_socket_test.exs b/test/tempest_web/firehose_socket_test.exs index b47743e..0fb3c86 100644 --- a/test/tempest_web/firehose_socket_test.exs +++ b/test/tempest_web/firehose_socket_test.exs @@ -1,7 +1,7 @@ defmodule TempestWeb.FirehoseSocketTest do use TempestWeb.ConnCase, async: false - alias Tempest.RepoCore.{Cid, Drisl} + alias Tempest.RepoCore.{Car, CarVerifier, Cid, Commit, Drisl} alias Tempest.Sequencer alias TempestWeb.FirehoseSocket @@ -66,11 +66,98 @@ defmodule TempestWeb.FirehoseSocketTest do assert byte_size(blocks) > 0 assert [%{"action" => "create", "path" => "app.tempest.note/live", "cid" => %Cid{}}] = decoded["ops"] assert decoded["blobs"] == [] + assert decoded["rebase"] == false assert decoded["tooBig"] == false + assert_valid_commit_frame!(decoded, account["did"], event.commit_cid, event.rev) refute Map.has_key?(decoded, "$type") refute Map.has_key?(decoded, "did") end + test "commit frames carry a coherent since and prevData chain", %{conn: conn} do + account = create_account!(conn, "firehose-chain.test", "firehose-chain@example.com") + + assert {:ok, current_seq} = Sequencer.current_seq() + assert {:ok, %FirehoseSocket{last_seq: ^current_seq} = state} = FirehoseSocket.init(%{cursor: nil}) + + first = create_note!(conn, account, "first", "first post") + first_event = receive_commit_event!() + {first_state, first_frame} = push_commit_event!(state, first_event) + first_commit = commit_from_frame!(first_frame) + + second = create_note!(conn, account, "second", "second post") + second_event = receive_commit_event!() + {_second_state, second_frame} = push_commit_event!(first_state, second_event) + + assert second_frame["since"] == first["commit"]["rev"] + assert second_frame["prevData"] == first_commit.data + assert_valid_commit_frame!(first_frame, account["did"], first["commit"]["cid"], first["commit"]["rev"]) + assert_valid_commit_frame!(second_frame, account["did"], second["commit"]["cid"], second["commit"]["rev"]) + end + + test "update and delete commit ops include the previous record CID", %{conn: conn} do + account = create_account!(conn, "firehose-prev.test", "firehose-prev@example.com") + + assert {:ok, current_seq} = Sequencer.current_seq() + assert {:ok, %FirehoseSocket{last_seq: ^current_seq} = state} = FirehoseSocket.init(%{cursor: nil}) + + created = create_note!(conn, account, "mutable", "before") + create_event = receive_commit_event!() + {state, _create_frame} = push_commit_event!(state, create_event) + + updated = put_note!(conn, account, "mutable", "after", created) + update_event = receive_commit_event!() + {state, update_frame} = push_commit_event!(state, update_event) + + assert [update_op] = update_frame["ops"] + assert update_op["action"] == "update" + assert update_op["path"] == "app.tempest.note/mutable" + assert Cid.to_string(update_op["cid"]) == updated["cid"] + assert Cid.to_string(update_op["prev"]) == created["cid"] + assert update_frame["since"] == created["commit"]["rev"] + assert_valid_commit_frame!(update_frame, account["did"], updated["commit"]["cid"], updated["commit"]["rev"]) + + deleted = delete_note!(conn, account, "mutable", updated) + delete_event = receive_commit_event!() + {_state, delete_frame} = push_commit_event!(state, delete_event) + + assert [delete_op] = delete_frame["ops"] + assert delete_op["action"] == "delete" + assert delete_op["path"] == "app.tempest.note/mutable" + assert delete_op["cid"] == nil + assert Cid.to_string(delete_op["prev"]) == updated["cid"] + assert delete_frame["since"] == updated["commit"]["rev"] + assert deleted["commit"]["cid"] == delete_event.commit_cid + assert_valid_commit_frame!(delete_frame, account["did"], deleted["commit"]["cid"], deleted["commit"]["rev"]) + end + + test "bsky post and like writes produce valid commit frames", %{conn: conn} do + account = create_account!(conn, "firehose-bsky.test", "firehose-bsky@example.com") + + assert {:ok, current_seq} = Sequencer.current_seq() + assert {:ok, %FirehoseSocket{last_seq: ^current_seq} = state} = FirehoseSocket.init(%{cursor: nil}) + + post = create_bsky_post!(conn, account, "3mo7hac7efyou", "firehose-visible post") + post_event = receive_commit_event!() + {state, post_frame} = push_commit_event!(state, post_event) + + assert [%{"action" => "create", "path" => "app.bsky.feed.post/3mo7hac7efyou", "cid" => post_cid}] = + post_frame["ops"] + + assert Cid.to_string(post_cid) == post["cid"] + assert_valid_commit_frame!(post_frame, account["did"], post["commit"]["cid"], post["commit"]["rev"]) + + like = create_bsky_like!(conn, account, "3mo7hac7egabc", post) + like_event = receive_commit_event!() + {_state, like_frame} = push_commit_event!(state, like_event) + + assert [%{"action" => "create", "path" => "app.bsky.feed.like/3mo7hac7egabc", "cid" => like_cid}] = + like_frame["ops"] + + assert Cid.to_string(like_cid) == like["cid"] + assert like_frame["since"] == post["commit"]["rev"] + assert_valid_commit_frame!(like_frame, account["did"], like["commit"]["cid"], like["commit"]["rev"]) + end + test "deactivated accounts emit account frames with no repo content", %{conn: conn} do account = create_account!(conn, "firehose-deactivated.test", "firehose-deactivated@example.com") @@ -108,6 +195,45 @@ defmodule TempestWeb.FirehoseSocketTest do {header, payload} end + defp push_commit_event!(%FirehoseSocket{} = state, %Sequencer.Event{event_type: "#commit"} = event) do + assert {:push, {:binary, frame}, %FirehoseSocket{} = state} = + FirehoseSocket.handle_info({:tempest_firehose_event, event}, state) + + assert {%{"op" => 1, "t" => "#commit"}, decoded} = decode_frame!(frame, "#commit") + {state, decoded} + end + + defp receive_commit_event! do + assert_receive {:tempest_firehose_event, %Sequencer.Event{event_type: "#commit"} = event} + event + end + + defp assert_valid_commit_frame!(payload, did, commit_cid, rev) do + assert payload["repo"] == did + assert payload["commit"] == Cid.parse!(commit_cid) + assert payload["rev"] == rev + assert payload["rebase"] == false + assert payload["tooBig"] == false + assert is_list(payload["ops"]) + assert is_list(payload["blobs"]) + + verifier_payload = Map.merge(payload, %{"did" => did, "commit" => commit_cid, "rev" => rev}) + assert :ok = CarVerifier.verify_commit_event(verifier_payload) + + assert {:ok, car} = Car.decode(payload["blocks"].bytes) + commit = payload["commit"] + assert [^commit | _rest] = car.roots + assert Enum.any?(car.blocks, &(&1.cid == commit)) + end + + defp commit_from_frame!(payload) do + assert {:ok, car} = Car.decode(payload["blocks"].bytes) + assert [commit_cid | _rest] = car.roots + assert %{data: commit_bytes} = Enum.find(car.blocks, &(&1.cid == commit_cid)) + assert {:ok, commit} = Commit.decode(commit_bytes) + commit + end + defp create_account!(conn, handle, email) do conn |> put_req_header("content-type", "application/json") @@ -141,4 +267,72 @@ defmodule TempestWeb.FirehoseSocketTest do }) |> json_response(200) end + + defp put_note!(conn, account, rkey, text, previous) do + conn + |> auth_json(account) + |> post(~p"/xrpc/com.atproto.repo.putRecord", %{ + "repo" => account["did"], + "collection" => "app.tempest.note", + "rkey" => rkey, + "validate" => false, + "swapRecord" => previous["cid"], + "swapCommit" => previous["commit"]["cid"], + "record" => %{ + "$type" => "app.tempest.note", + "text" => text + } + }) + |> json_response(200) + end + + defp delete_note!(conn, account, rkey, previous) do + conn + |> auth_json(account) + |> post(~p"/xrpc/com.atproto.repo.deleteRecord", %{ + "repo" => account["did"], + "collection" => "app.tempest.note", + "rkey" => rkey, + "swapRecord" => previous["cid"], + "swapCommit" => previous["commit"]["cid"] + }) + |> json_response(200) + end + + defp create_bsky_post!(conn, account, rkey, text) do + conn + |> auth_json(account) + |> post(~p"/xrpc/com.atproto.repo.createRecord", %{ + "repo" => account["did"], + "collection" => "app.bsky.feed.post", + "rkey" => rkey, + "validate" => true, + "record" => %{ + "$type" => "app.bsky.feed.post", + "text" => text, + "createdAt" => "2026-06-14T00:00:00.000Z" + } + }) + |> json_response(200) + end + + defp create_bsky_like!(conn, account, rkey, post) do + conn + |> auth_json(account) + |> post(~p"/xrpc/com.atproto.repo.createRecord", %{ + "repo" => account["did"], + "collection" => "app.bsky.feed.like", + "rkey" => rkey, + "validate" => true, + "record" => %{ + "$type" => "app.bsky.feed.like", + "subject" => %{ + "uri" => post["uri"], + "cid" => post["cid"] + }, + "createdAt" => "2026-06-14T00:00:01.000Z" + } + }) + |> json_response(200) + end end diff --git a/test/tempest_web/xrpc/records_test.exs b/test/tempest_web/xrpc/records_test.exs index 6365ce2..cde8ade 100644 --- a/test/tempest_web/xrpc/records_test.exs +++ b/test/tempest_web/xrpc/records_test.exs @@ -198,6 +198,62 @@ defmodule TempestWeb.Xrpc.RecordsTest do assert response["value"]["text"] == "hello from bsky-shaped post" end + test "createRecord validates and persists Bluesky like records", %{conn: conn} do + account = create_account!(conn, "records-bsky-like.test", "records-bsky-like@example.com") + + post = + conn + |> auth_json(account) + |> post(~p"/xrpc/com.atproto.repo.createRecord", %{ + "repo" => account["did"], + "collection" => "app.bsky.feed.post", + "rkey" => "3mo7hac7efyou", + "validate" => true, + "record" => %{ + "$type" => "app.bsky.feed.post", + "text" => "liked post", + "createdAt" => "2026-06-13T19:45:00.000Z" + } + }) + |> json_response(200) + + liked_uri = "at://#{account["did"]}/app.bsky.feed.post/3mo7hac7efyou" + + liked = + conn + |> auth_json(account) + |> post(~p"/xrpc/com.atproto.repo.createRecord", %{ + "repo" => account["did"], + "collection" => "app.bsky.feed.like", + "rkey" => "3mo7hac7egabc", + "validate" => true, + "record" => %{ + "$type" => "app.bsky.feed.like", + "subject" => %{"uri" => liked_uri, "cid" => post["cid"]}, + "createdAt" => "2026-06-13T19:46:00.000Z" + } + }) + |> json_response(200) + + assert liked["uri"] == "at://#{account["did"]}/app.bsky.feed.like/3mo7hac7egabc" + assert liked["validationStatus"] == "valid" + assert scalar(repo_db(account["did"]), "SELECT COUNT(*) FROM records") == 2 + + response = + conn + |> recycle() + |> get(~p"/xrpc/com.atproto.repo.getRecord", %{ + "repo" => account["did"], + "collection" => "app.bsky.feed.like", + "rkey" => "3mo7hac7egabc" + }) + |> json_response(200) + + assert response["cid"] == liked["cid"] + assert response["value"]["subject"]["uri"] == liked_uri + assert response["value"]["subject"]["cid"] == post["cid"] + end + test "putRecord enforces swapRecord and swapCommit before replacing a record", %{conn: conn} do account = create_account!(conn, "records-erin.test", "records-erin@example.com") created = create_profile!(conn, account, "Erin")