An app using Slices to show last played teal.fm tracks across the Atmosphere
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

connect teal

+1119 -721
+94
lexicons/fm/teal/alpha/feed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.feed.defs", 4 + "defs": { 5 + "playView": { 6 + "type": "object", 7 + "required": [ 8 + "trackName", 9 + "artists" 10 + ], 11 + "properties": { 12 + "trackName": { 13 + "type": "string", 14 + "minLength": 1, 15 + "maxLength": 256, 16 + "maxGraphemes": 2560, 17 + "description": "The name of the track" 18 + }, 19 + "trackMbId": { 20 + "type": "string", 21 + "description": "The Musicbrainz ID of the track" 22 + }, 23 + "recordingMbId": { 24 + "type": "string", 25 + "description": "The Musicbrainz recording ID of the track" 26 + }, 27 + "duration": { 28 + "type": "integer", 29 + "description": "The length of the track in seconds" 30 + }, 31 + "artists": { 32 + "type": "array", 33 + "items": { 34 + "type": "ref", 35 + "ref": "#artist" 36 + }, 37 + "description": "Array of artists in order of original appearance." 38 + }, 39 + "releaseName": { 40 + "type": "string", 41 + "maxLength": 256, 42 + "maxGraphemes": 2560, 43 + "description": "The name of the release/album" 44 + }, 45 + "releaseMbId": { 46 + "type": "string", 47 + "description": "The Musicbrainz release ID" 48 + }, 49 + "isrc": { 50 + "type": "string", 51 + "description": "The ISRC code associated with the recording" 52 + }, 53 + "originUrl": { 54 + "type": "string", 55 + "description": "The URL associated with this track" 56 + }, 57 + "musicServiceBaseDomain": { 58 + "type": "string", 59 + "description": "The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if not provided." 60 + }, 61 + "submissionClientAgent": { 62 + "type": "string", 63 + "maxLength": 256, 64 + "maxGraphemes": 2560, 65 + "description": "A user-agent style string specifying the user agent. e.g. tealtracker/0.0.1b (Linux; Android 13; SM-A715F). Defaults to 'manual/unknown' if not provided." 66 + }, 67 + "playedTime": { 68 + "type": "string", 69 + "format": "datetime", 70 + "description": "The unix timestamp of when the track was played" 71 + } 72 + } 73 + }, 74 + "artist": { 75 + "type": "object", 76 + "required": [ 77 + "artistName" 78 + ], 79 + "properties": { 80 + "artistName": { 81 + "type": "string", 82 + "minLength": 1, 83 + "maxLength": 256, 84 + "maxGraphemes": 2560, 85 + "description": "The name of the artist" 86 + }, 87 + "artistMbId": { 88 + "type": "string", 89 + "description": "The Musicbrainz ID of the artist" 90 + } 91 + } 92 + } 93 + } 94 + }
+95
lexicons/fm/teal/alpha/feed/play.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.feed.play", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "record": { 9 + "type": "object", 10 + "required": [ 11 + "trackName" 12 + ], 13 + "properties": { 14 + "trackName": { 15 + "type": "string", 16 + "minLength": 1, 17 + "maxLength": 256, 18 + "maxGraphemes": 2560, 19 + "description": "The name of the track" 20 + }, 21 + "trackMbId": { 22 + "type": "string", 23 + "description": "The Musicbrainz ID of the track" 24 + }, 25 + "recordingMbId": { 26 + "type": "string", 27 + "description": "The Musicbrainz recording ID of the track" 28 + }, 29 + "duration": { 30 + "type": "integer", 31 + "description": "The length of the track in seconds" 32 + }, 33 + "artistNames": { 34 + "type": "array", 35 + "items": { 36 + "type": "string", 37 + "minLength": 1, 38 + "maxLength": 256, 39 + "maxGraphemes": 2560 40 + }, 41 + "description": "Array of artist names in order of original appearance. Prefer using 'artists'." 42 + }, 43 + "artistMbIds": { 44 + "type": "array", 45 + "items": { 46 + "type": "string" 47 + }, 48 + "description": "Array of Musicbrainz artist IDs. Prefer using 'artists'." 49 + }, 50 + "artists": { 51 + "type": "array", 52 + "items": { 53 + "type": "ref", 54 + "ref": "fm.teal.alpha.feed.defs#artist" 55 + }, 56 + "description": "Array of artists in order of original appearance." 57 + }, 58 + "releaseName": { 59 + "type": "string", 60 + "maxLength": 256, 61 + "maxGraphemes": 2560, 62 + "description": "The name of the release/album" 63 + }, 64 + "releaseMbId": { 65 + "type": "string", 66 + "description": "The Musicbrainz release ID" 67 + }, 68 + "isrc": { 69 + "type": "string", 70 + "description": "The ISRC code associated with the recording" 71 + }, 72 + "originUrl": { 73 + "type": "string", 74 + "description": "The URL associated with this track" 75 + }, 76 + "musicServiceBaseDomain": { 77 + "type": "string", 78 + "description": "The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if unavailable or not provided." 79 + }, 80 + "submissionClientAgent": { 81 + "type": "string", 82 + "maxLength": 256, 83 + "maxGraphemes": 2560, 84 + "description": "A metadata string specifying the user agent where the format is `<app-identifier>/<version> (<kernel/OS-base>; <platform/OS-version>; <device-model>)`. If string is provided, only `app-identifier` and `version` are required. `app-identifier` is recommended to be in reverse dns format. Defaults to 'manual/unknown' if unavailable or not provided." 85 + }, 86 + "playedTime": { 87 + "type": "string", 88 + "format": "datetime", 89 + "description": "The unix timestamp of when the track was played" 90 + } 91 + } 92 + } 93 + } 94 + } 95 + }
+22 -16
src/features/dashboard/handlers.tsx
··· 4 4 import { DashboardPage } from "./templates/DashboardPage.tsx"; 5 5 import { publicClient } from "../../config.ts"; 6 6 import { recordBlobToCdnUrl } from "@slices/client"; 7 - import { AppBskyActorProfile } from "../../generated_client.ts"; 8 7 9 8 async function handleDashboard(req: Request): Promise<Response> { 10 9 const context = await withAuth(req); ··· 13 12 return Response.redirect(new URL("/login", req.url), 302); 14 13 } 15 14 16 - let profile: AppBskyActorProfile | undefined; 17 15 let avatarUrl: string | undefined; 18 - try { 19 - const profileResult = await publicClient.app.bsky.actor.profile.getRecord({ 20 - uri: `at://${context.currentUser.sub}/app.bsky.actor.profile/self`, 21 - }); 16 + const profileRecord = await publicClient.app.bsky.actor.profile.getRecord({ 17 + uri: `at://${context.currentUser.sub}/app.bsky.actor.profile/self`, 18 + }); 19 + const profile = profileRecord.value; 20 + if (profile.avatar) { 21 + avatarUrl = recordBlobToCdnUrl(profileRecord, profile.avatar, "avatar"); 22 + } 22 23 23 - if (profileResult) { 24 - profile = profileResult.value; 25 - 26 - if (profile.avatar) { 27 - avatarUrl = recordBlobToCdnUrl(profileResult, profile.avatar, "avatar"); 24 + const plays = await publicClient.fm.teal.alpha.feed.play.getRecords({ 25 + sortBy: [{ 26 + direction: 'desc', 27 + field: 'playedTime' 28 + }] 29 + }); 30 + const authorProfiles = await publicClient.app.bsky.actor.profile.getRecords({ 31 + where: { 32 + did: { 33 + in: Array.from(new Set(plays.records.map(rec => rec.did))) 28 34 } 29 - } 30 - } catch (error) { 31 - console.error("Error fetching profile:", error); 32 - } 35 + }, 36 + }) 33 37 34 38 return renderHTML( 35 39 <DashboardPage 36 40 currentUser={context.currentUser} 37 41 profile={profile} 38 42 avatarUrl={avatarUrl} 39 - /> 43 + plays={plays} 44 + authorProfiles={authorProfiles} 45 + />, 40 46 ); 41 47 } 42 48
+26 -23
src/features/dashboard/templates/DashboardPage.tsx
··· 1 1 import { Layout } from "../../../shared/fragments/Layout.tsx"; 2 2 import { Button } from "../../../shared/fragments/Button.tsx"; 3 - import type { AppBskyActorProfile } from "../../../generated_client.ts"; 3 + import type { AppBskyActorProfile, FmTealAlphaFeedPlay, } from "../../../generated_client.ts"; 4 + import { GetRecordsResponse } from "@slices/client"; 5 + import { recordBlobToCdnUrl } from "@slices/client"; 4 6 5 7 interface DashboardPageProps { 6 8 currentUser: { ··· 9 11 }; 10 12 profile?: AppBskyActorProfile; 11 13 avatarUrl?: string; 14 + plays: GetRecordsResponse<FmTealAlphaFeedPlay> 15 + authorProfiles: GetRecordsResponse<AppBskyActorProfile> 12 16 } 13 17 14 18 export function DashboardPage({ 15 - currentUser, 16 - profile, 17 - avatarUrl, 19 + plays, 20 + authorProfiles, 18 21 }: DashboardPageProps) { 19 22 return ( 20 23 <Layout title="Dashboard"> ··· 22 25 <div className="max-w-2xl mx-auto"> 23 26 <div className="bg-white rounded-lg shadow p-6"> 24 27 <div className="flex justify-between items-center mb-6"> 25 - <h1 className="text-2xl font-bold">Dashboard</h1> 28 + <h1 className="text-2xl font-bold">What's playing?</h1> 26 29 <form method="post" action="/logout"> 27 30 <Button type="submit" variant="secondary"> 28 31 Logout 29 32 </Button> 30 33 </form> 31 34 </div> 32 - 33 - <div className="mb-6"> 34 - {avatarUrl && ( 35 - <img 36 - src={avatarUrl} 37 - alt="Profile" 38 - className="w-20 h-20 rounded-full mb-4" 39 - /> 40 - )} 41 - <h2 className="text-xl font-semibold mb-2"> 42 - {profile?.displayName || currentUser.name || currentUser.sub} 43 - </h2> 44 - {currentUser.name && ( 45 - <p className="text-gray-600 mb-2">@{currentUser.name}</p> 46 - )} 47 - {profile?.description && ( 48 - <p className="text-gray-700 mt-2">{profile.description}</p> 49 - )} 35 + <div> 36 + <ul> 37 + {plays && plays.records.map(rec => { 38 + const author = (authorProfiles?.records || []).find(a => a.did === rec.did)! 39 + const avi = recordBlobToCdnUrl(author, author.value.avatar!, 'avatar') 40 + return ( 41 + <li key={rec.uri} className="mb-2"> 42 + <a href={"https://bsky.app/profile/" + author.did} target="_blank"> 43 + <img src={avi} width={32} height={32} style={{borderRadius: '50%', display: 'inline'}} />{' '} 44 + <b>{author.value.displayName}{' '}</b> 45 + </a> 46 + <i>is listening to{' '}</i> 47 + <b>{(rec.value.artists ?? []).map(a => a.artistName).join(', ')}</b> — {rec.value.trackName} 48 + </li> 49 + ) 50 + } 51 + )} 52 + </ul> 50 53 </div> 51 54 </div> 52 55 </div>
+882 -682
src/generated_client.ts
··· 1 1 // Generated TypeScript client for AT Protocol records 2 - // Generated at: 2025-10-01 14:14:55 UTC 3 - // Lexicons: 16 2 + // Generated at: 2025-10-01 14:35:19 UTC 3 + // Lexicons: 18 4 4 5 5 /** 6 6 * @example Usage ··· 12 12 * 'at://did:plc:fpruhuo22xkm5o7ttr2ktxdo/network.slices.slice/3m257yljpbg2a' 13 13 * ); 14 14 * 15 - * // Get records from the app.bsky.feed.postgate collection 16 - * const records = await client.app.bsky.feed.postgate.getRecords(); 15 + * // Get records from the fm.teal.alpha.feed.play collection 16 + * const records = await client.fm.teal.alpha.feed.play.getRecords(); 17 17 * 18 18 * // Get a specific record 19 - * const record = await client.app.bsky.feed.postgate.getRecord({ 20 - * uri: 'at://did:plc:example/app.bsky.feed.postgate/3abc123' 19 + * const record = await client.fm.teal.alpha.feed.play.getRecord({ 20 + * uri: 'at://did:plc:example/fm.teal.alpha.feed.play/3abc123' 21 21 * }); 22 22 * 23 23 * // Get records with filtering and search 24 - * const filteredRecords = await client.app.bsky.feed.postgate.getRecords({ 24 + * const filteredRecords = await client.fm.teal.alpha.feed.play.getRecords({ 25 25 * where: { 26 26 * text: { contains: "example search term" } 27 27 * } 28 28 * }); 29 29 * 30 30 * // Use slice-level methods for cross-collection queries with type safety 31 - * const sliceRecords = await client.network.slices.slice.getSliceRecords<AppBskyFeedPostgate>({ 31 + * const sliceRecords = await client.network.slices.slice.getSliceRecords<FmTealAlphaFeedPlay>({ 32 32 * where: { 33 - * collection: { eq: 'app.bsky.feed.postgate' } 33 + * collection: { eq: 'fm.teal.alpha.feed.play' } 34 34 * } 35 35 * }); 36 36 * 37 37 * // Search across multiple collections using union types 38 - * const multiCollectionRecords = await client.network.slices.slice.getSliceRecords<AppBskyFeedPostgate | AppBskyActorProfile>({ 38 + * const multiCollectionRecords = await client.network.slices.slice.getSliceRecords<FmTealAlphaFeedPlay | AppBskyActorProfile>({ 39 39 * where: { 40 - * collection: { in: ['app.bsky.feed.postgate', 'app.bsky.actor.profile'] }, 40 + * collection: { in: ['fm.teal.alpha.feed.play', 'app.bsky.actor.profile'] }, 41 41 * text: { contains: 'example search term' }, 42 42 * did: { in: ['did:plc:user1', 'did:plc:user2'] } 43 43 * }, ··· 63 63 } from "@slices/client"; 64 64 import type { OAuthClient } from "@slices/oauth"; 65 65 66 - export type AppBskyGraphDefsListPurpose = 67 - | "app.bsky.graph.defs#modlist" 68 - | "app.bsky.graph.defs#curatelist" 69 - | "app.bsky.graph.defs#referencelist" 66 + export type ComAtprotoLabelDefsLabelValue = 67 + | "!hide" 68 + | "!no-promote" 69 + | "!warn" 70 + | "!no-unauthenticated" 71 + | "dmca-violation" 72 + | "doxxing" 73 + | "porn" 74 + | "sexual" 75 + | "nudity" 76 + | "nsfl" 77 + | "gore" 70 78 | (string & Record<string, never>); 71 79 72 - export type AppBskyFeedDefsEvent = 73 - | "app.bsky.feed.defs#requestLess" 74 - | "app.bsky.feed.defs#requestMore" 75 - | "app.bsky.feed.defs#clickthroughItem" 76 - | "app.bsky.feed.defs#clickthroughAuthor" 77 - | "app.bsky.feed.defs#clickthroughReposter" 78 - | "app.bsky.feed.defs#clickthroughEmbed" 79 - | "app.bsky.feed.defs#interactionSeen" 80 - | "app.bsky.feed.defs#interactionLike" 81 - | "app.bsky.feed.defs#interactionRepost" 82 - | "app.bsky.feed.defs#interactionReply" 83 - | "app.bsky.feed.defs#interactionQuote" 84 - | "app.bsky.feed.defs#interactionShare" 80 + export type ComAtprotoLabelDefsBlurs = 81 + | "content" 82 + | "media" 83 + | "none" 84 + | (string & Record<string, never>); 85 + 86 + export type ComAtprotoLabelDefsSeverity = 87 + | "inform" 88 + | "alert" 89 + | "none" 85 90 | (string & Record<string, never>); 86 91 87 - export type AppBskyFeedDefsContentMode = 88 - | "app.bsky.feed.defs#contentModeUnspecified" 89 - | "app.bsky.feed.defs#contentModeVideo" 92 + export type ComAtprotoLabelDefsDefaultSetting = 93 + | "ignore" 94 + | "warn" 95 + | "hide" 90 96 | (string & Record<string, never>); 91 97 92 98 export type AppBskyActorDefsActorTarget = ··· 126 132 | "following" 127 133 | (string & Record<string, never>); 128 134 129 - export type ComAtprotoLabelDefsLabelValue = 130 - | "!hide" 131 - | "!no-promote" 132 - | "!warn" 133 - | "!no-unauthenticated" 134 - | "dmca-violation" 135 - | "doxxing" 136 - | "porn" 137 - | "sexual" 138 - | "nudity" 139 - | "nsfl" 140 - | "gore" 135 + export type AppBskyFeedDefsEvent = 136 + | "app.bsky.feed.defs#requestLess" 137 + | "app.bsky.feed.defs#requestMore" 138 + | "app.bsky.feed.defs#clickthroughItem" 139 + | "app.bsky.feed.defs#clickthroughAuthor" 140 + | "app.bsky.feed.defs#clickthroughReposter" 141 + | "app.bsky.feed.defs#clickthroughEmbed" 142 + | "app.bsky.feed.defs#interactionSeen" 143 + | "app.bsky.feed.defs#interactionLike" 144 + | "app.bsky.feed.defs#interactionRepost" 145 + | "app.bsky.feed.defs#interactionReply" 146 + | "app.bsky.feed.defs#interactionQuote" 147 + | "app.bsky.feed.defs#interactionShare" 141 148 | (string & Record<string, never>); 142 149 143 - export type ComAtprotoLabelDefsBlurs = 144 - | "content" 145 - | "media" 146 - | "none" 150 + export type AppBskyFeedDefsContentMode = 151 + | "app.bsky.feed.defs#contentModeUnspecified" 152 + | "app.bsky.feed.defs#contentModeVideo" 147 153 | (string & Record<string, never>); 148 154 149 - export type ComAtprotoLabelDefsSeverity = 150 - | "inform" 151 - | "alert" 152 - | "none" 155 + export type AppBskyGraphDefsListPurpose = 156 + | "app.bsky.graph.defs#modlist" 157 + | "app.bsky.graph.defs#curatelist" 158 + | "app.bsky.graph.defs#referencelist" 153 159 | (string & Record<string, never>); 154 160 155 - export type ComAtprotoLabelDefsDefaultSetting = 156 - | "ignore" 157 - | "warn" 158 - | "hide" 159 - | (string & Record<string, never>); 161 + export interface FmTealAlphaFeedDefsPlayView { 162 + /** The name of the track */ 163 + trackName: string; 164 + /** The Musicbrainz ID of the track */ 165 + trackMbId?: string; 166 + /** The Musicbrainz recording ID of the track */ 167 + recordingMbId?: string; 168 + /** The length of the track in seconds */ 169 + duration?: number; 170 + /** Array of artists in order of original appearance. */ 171 + artists: FmTealAlphaFeedDefs["Artist"][]; 172 + /** The name of the release/album */ 173 + releaseName?: string; 174 + /** The Musicbrainz release ID */ 175 + releaseMbId?: string; 176 + /** The ISRC code associated with the recording */ 177 + isrc?: string; 178 + /** The URL associated with this track */ 179 + originUrl?: string; 180 + /** The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if not provided. */ 181 + musicServiceBaseDomain?: string; 182 + /** A user-agent style string specifying the user agent. e.g. tealtracker/0.0.1b (Linux; Android 13; SM-A715F). Defaults to 'manual/unknown' if not provided. */ 183 + submissionClientAgent?: string; 184 + /** The unix timestamp of when the track was played */ 185 + playedTime?: string; 186 + } 187 + 188 + export interface FmTealAlphaFeedDefsArtist { 189 + /** The name of the artist */ 190 + artistName: string; 191 + /** The Musicbrainz ID of the artist */ 192 + artistMbId?: string; 193 + } 194 + 195 + export interface FmTealAlphaFeedPlay { 196 + /** The name of the track */ 197 + trackName: string; 198 + /** The Musicbrainz ID of the track */ 199 + trackMbId?: string; 200 + /** The Musicbrainz recording ID of the track */ 201 + recordingMbId?: string; 202 + /** The length of the track in seconds */ 203 + duration?: number; 204 + /** Array of artist names in order of original appearance. Prefer using 'artists'. */ 205 + artistNames?: string[]; 206 + /** Array of Musicbrainz artist IDs. Prefer using 'artists'. */ 207 + artistMbIds?: string[]; 208 + /** Array of artists in order of original appearance. */ 209 + artists?: FmTealAlphaFeedDefs["Artist"][]; 210 + /** The name of the release/album */ 211 + releaseName?: string; 212 + /** The Musicbrainz release ID */ 213 + releaseMbId?: string; 214 + /** The ISRC code associated with the recording */ 215 + isrc?: string; 216 + /** The URL associated with this track */ 217 + originUrl?: string; 218 + /** The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if unavailable or not provided. */ 219 + musicServiceBaseDomain?: string; 220 + /** A metadata string specifying the user agent where the format is `<app-identifier>/<version> (<kernel/OS-base>; <platform/OS-version>; <device-model>)`. If string is provided, only `app-identifier` and `version` are required. `app-identifier` is recommended to be in reverse dns format. Defaults to 'manual/unknown' if unavailable or not provided. */ 221 + submissionClientAgent?: string; 222 + /** The unix timestamp of when the track was played */ 223 + playedTime?: string; 224 + } 225 + 226 + export type FmTealAlphaFeedPlaySortFields = 227 + | "trackName" 228 + | "trackMbId" 229 + | "recordingMbId" 230 + | "duration" 231 + | "releaseName" 232 + | "releaseMbId" 233 + | "isrc" 234 + | "originUrl" 235 + | "musicServiceBaseDomain" 236 + | "submissionClientAgent" 237 + | "playedTime"; 238 + 239 + export interface ComAtprotoRepoStrongRef { 240 + cid: string; 241 + uri: string; 242 + } 243 + 244 + export interface ComAtprotoLabelDefsLabel { 245 + /** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */ 246 + cid?: string; 247 + /** Timestamp when this label was created. */ 248 + cts?: string; 249 + /** Timestamp at which this label expires (no longer applies). */ 250 + exp?: string; 251 + /** If true, this is a negation label, overwriting a previous label. */ 252 + neg?: boolean; 253 + /** Signature of dag-cbor encoded label. */ 254 + sig?: string; 255 + /** DID of the actor who created this label. */ 256 + src: string; 257 + /** AT URI of the record, repository (account), or other resource that this label applies to. */ 258 + uri: string; 259 + /** The short string name of the value or type of this label. */ 260 + val: string; 261 + /** The AT Protocol version of the label object. */ 262 + ver?: number; 263 + } 160 264 161 - export interface AppBskyEmbedDefsAspectRatio { 162 - width: number; 163 - height: number; 265 + export interface ComAtprotoLabelDefsSelfLabel { 266 + /** The short string name of the value or type of this label. */ 267 + val: string; 164 268 } 165 269 166 - export interface AppBskyEmbedRecordMain { 167 - record: ComAtprotoRepoStrongRef; 270 + export interface ComAtprotoLabelDefsSelfLabels { 271 + values: ComAtprotoLabelDefs["SelfLabel"][]; 168 272 } 169 273 170 - export interface AppBskyEmbedRecordView { 171 - record: 172 - | AppBskyEmbedRecord["ViewRecord"] 173 - | AppBskyEmbedRecord["ViewNotFound"] 174 - | AppBskyEmbedRecord["ViewBlocked"] 175 - | AppBskyEmbedRecord["ViewDetached"] 176 - | AppBskyFeedDefs["GeneratorView"] 177 - | AppBskyGraphDefs["ListView"] 178 - | AppBskyLabelerDefs["LabelerView"] 179 - | AppBskyGraphDefs["StarterPackViewBasic"] 180 - | { $type: string; [key: string]: unknown }; 274 + export interface ComAtprotoLabelDefsLabelValueDefinition { 275 + /** What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing. */ 276 + blurs: ComAtprotoLabelDefsBlurs; 277 + locales: ComAtprotoLabelDefs["LabelValueDefinitionStrings"][]; 278 + /** How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. */ 279 + severity: ComAtprotoLabelDefsSeverity; 280 + /** Does the user need to have adult content enabled in order to configure this label? */ 281 + adultOnly?: boolean; 282 + /** The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). */ 283 + identifier: string; 284 + /** The default setting for this label. */ 285 + defaultSetting?: ComAtprotoLabelDefsDefaultSetting; 286 + } 287 + 288 + export interface ComAtprotoLabelDefsLabelValueDefinitionStrings { 289 + /** The code of the language these strings are written in. */ 290 + lang: string; 291 + /** A short human-readable name for the label. */ 292 + name: string; 293 + /** A longer description of what the label means and why it might be applied. */ 294 + description: string; 181 295 } 182 296 183 - export interface AppBskyEmbedRecordViewRecord { 297 + export interface AppBskyLabelerDefsLabelerView { 184 298 cid: string; 185 299 uri: string; 186 - /** The record data itself. */ 187 - value: unknown; 188 - author: AppBskyActorDefs["ProfileViewBasic"]; 189 - embeds?: 190 - | AppBskyEmbedImages["View"] 191 - | AppBskyEmbedVideo["View"] 192 - | AppBskyEmbedExternal["View"] 193 - | AppBskyEmbedRecord["View"] 194 - | AppBskyEmbedRecordWithMedia["View"] 195 - | { $type: string; [key: string]: unknown }[]; 196 300 labels?: ComAtprotoLabelDefs["Label"][]; 301 + viewer?: AppBskyLabelerDefs["LabelerViewerState"]; 302 + creator: AppBskyActorDefs["ProfileView"]; 197 303 indexedAt: string; 198 304 likeCount?: number; 199 - quoteCount?: number; 200 - replyCount?: number; 201 - repostCount?: number; 202 305 } 203 306 204 - export interface AppBskyEmbedRecordViewBlocked { 205 - uri: string; 206 - author: AppBskyFeedDefs["BlockedAuthor"]; 207 - blocked: boolean; 307 + export interface AppBskyLabelerDefsLabelerPolicies { 308 + /** The label values which this labeler publishes. May include global or custom labels. */ 309 + labelValues: ComAtprotoLabelDefs["LabelValue"][]; 310 + /** Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler. */ 311 + labelValueDefinitions?: ComAtprotoLabelDefs["LabelValueDefinition"][]; 208 312 } 209 313 210 - export interface AppBskyEmbedRecordViewDetached { 211 - uri: string; 212 - detached: boolean; 314 + export interface AppBskyLabelerDefsLabelerViewerState { 315 + like?: string; 213 316 } 214 317 215 - export interface AppBskyEmbedRecordViewNotFound { 318 + export interface AppBskyLabelerDefsLabelerViewDetailed { 319 + cid: string; 216 320 uri: string; 217 - notFound: boolean; 321 + labels?: ComAtprotoLabelDefs["Label"][]; 322 + viewer?: AppBskyLabelerDefs["LabelerViewerState"]; 323 + creator: AppBskyActorDefs["ProfileView"]; 324 + policies: AppBskyLabelerDefs["LabelerPolicies"]; 325 + indexedAt: string; 326 + likeCount?: number; 218 327 } 219 328 220 - export interface AppBskyEmbedImagesMain { 221 - images: AppBskyEmbedImages["Image"][]; 329 + export interface AppBskyActorProfile { 330 + /** Small image to be displayed next to posts from account. AKA, 'profile picture' */ 331 + avatar?: BlobRef; 332 + /** Larger horizontal image to display behind profile view. */ 333 + banner?: BlobRef; 334 + /** Self-label values, specific to the Bluesky application, on the overall account. */ 335 + labels?: ComAtprotoLabelDefs["SelfLabels"] | { 336 + $type: string; 337 + [key: string]: unknown; 338 + }; 339 + createdAt?: string; 340 + pinnedPost?: ComAtprotoRepoStrongRef; 341 + /** Free-form profile description text. */ 342 + description?: string; 343 + displayName?: string; 344 + joinedViaStarterPack?: ComAtprotoRepoStrongRef; 222 345 } 223 346 224 - export interface AppBskyEmbedImagesView { 225 - images: AppBskyEmbedImages["ViewImage"][]; 347 + export type AppBskyActorProfileSortFields = 348 + | "createdAt" 349 + | "description" 350 + | "displayName"; 351 + 352 + export interface AppBskyActorDefsNux { 353 + id: string; 354 + /** Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters. */ 355 + data?: string; 356 + completed: boolean; 357 + /** The date and time at which the NUX will expire and should be considered completed. */ 358 + expiresAt?: string; 226 359 } 227 360 228 - export interface AppBskyEmbedImagesImage { 229 - /** Alt text description of the image, for accessibility. */ 230 - alt: string; 231 - image: BlobRef; 232 - aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 361 + export interface AppBskyActorDefsMutedWord { 362 + id?: string; 363 + /** The muted word itself. */ 364 + value: string; 365 + /** The intended targets of the muted word. */ 366 + targets: AppBskyActorDefs["MutedWordTarget"][]; 367 + /** The date and time at which the muted word will expire and no longer be applied. */ 368 + expiresAt?: string; 369 + /** Groups of users to apply the muted word to. If undefined, applies to all users. */ 370 + actorTarget?: AppBskyActorDefsActorTarget; 233 371 } 234 372 235 - export interface AppBskyEmbedImagesViewImage { 236 - /** Alt text description of the image, for accessibility. */ 237 - alt: string; 238 - /** Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View. */ 239 - thumb: string; 240 - /** 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. */ 241 - fullsize: string; 242 - aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 373 + export interface AppBskyActorDefsSavedFeed { 374 + id: string; 375 + type: AppBskyActorDefsType; 376 + value: string; 377 + pinned: boolean; 243 378 } 244 379 245 - export interface AppBskyEmbedRecordWithMediaMain { 246 - media: 247 - | AppBskyEmbedImages["Main"] 248 - | AppBskyEmbedVideo["Main"] 249 - | AppBskyEmbedExternal["Main"] 250 - | { $type: string; [key: string]: unknown }; 251 - record: AppBskyEmbedRecord["Main"]; 380 + export type AppBskyActorDefsPreferences = 381 + | AppBskyActorDefs["AdultContentPref"] 382 + | AppBskyActorDefs["ContentLabelPref"] 383 + | AppBskyActorDefs["SavedFeedsPref"] 384 + | AppBskyActorDefs["SavedFeedsPrefV2"] 385 + | AppBskyActorDefs["PersonalDetailsPref"] 386 + | AppBskyActorDefs["FeedViewPref"] 387 + | AppBskyActorDefs["ThreadViewPref"] 388 + | AppBskyActorDefs["InterestsPref"] 389 + | AppBskyActorDefs["MutedWordsPref"] 390 + | AppBskyActorDefs["HiddenPostsPref"] 391 + | AppBskyActorDefs["BskyAppStatePref"] 392 + | AppBskyActorDefs["LabelersPref"] 393 + | AppBskyActorDefs["PostInteractionSettingsPref"] 394 + | { $type: string; [key: string]: unknown }[]; 395 + 396 + export interface AppBskyActorDefsProfileView { 397 + did: string; 398 + avatar?: string; 399 + handle: string; 400 + labels?: ComAtprotoLabelDefs["Label"][]; 401 + viewer?: AppBskyActorDefs["ViewerState"]; 402 + createdAt?: string; 403 + indexedAt?: string; 404 + associated?: AppBskyActorDefs["ProfileAssociated"]; 405 + description?: string; 406 + displayName?: string; 252 407 } 253 408 254 - export interface AppBskyEmbedRecordWithMediaView { 255 - media: 256 - | AppBskyEmbedImages["View"] 257 - | AppBskyEmbedVideo["View"] 258 - | AppBskyEmbedExternal["View"] 259 - | { $type: string; [key: string]: unknown }; 260 - record: AppBskyEmbedRecord["View"]; 409 + export interface AppBskyActorDefsViewerState { 410 + muted?: boolean; 411 + blocking?: string; 412 + blockedBy?: boolean; 413 + following?: string; 414 + followedBy?: string; 415 + mutedByList?: AppBskyGraphDefs["ListViewBasic"]; 416 + blockingByList?: AppBskyGraphDefs["ListViewBasic"]; 417 + knownFollowers?: AppBskyActorDefs["KnownFollowers"]; 261 418 } 262 419 263 - export interface AppBskyEmbedVideoMain { 264 - /** Alt text description of the video, for accessibility. */ 265 - alt?: string; 266 - video: BlobRef; 267 - captions?: AppBskyEmbedVideo["Caption"][]; 268 - aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 420 + export interface AppBskyActorDefsFeedViewPref { 421 + /** The URI of the feed, or an identifier which describes the feed. */ 422 + feed: string; 423 + /** Hide replies in the feed. */ 424 + hideReplies?: boolean; 425 + /** Hide reposts in the feed. */ 426 + hideReposts?: boolean; 427 + /** Hide quote posts in the feed. */ 428 + hideQuotePosts?: boolean; 429 + /** Hide replies in the feed if they do not have this number of likes. */ 430 + hideRepliesByLikeCount?: number; 431 + /** Hide replies in the feed if they are not by followed users. */ 432 + hideRepliesByUnfollowed?: boolean; 269 433 } 270 434 271 - export interface AppBskyEmbedVideoView { 272 - alt?: string; 273 - cid: string; 274 - playlist: string; 275 - thumbnail?: string; 276 - aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 435 + export interface AppBskyActorDefsLabelersPref { 436 + labelers: AppBskyActorDefs["LabelerPrefItem"][]; 277 437 } 278 438 279 - export interface AppBskyEmbedVideoCaption { 280 - file: BlobRef; 281 - lang: string; 439 + export interface AppBskyActorDefsInterestsPref { 440 + /** A list of tags which describe the account owner's interests gathered during onboarding. */ 441 + tags: string[]; 282 442 } 283 443 284 - export interface AppBskyEmbedExternalMain { 285 - external: AppBskyEmbedExternal["External"]; 444 + export interface AppBskyActorDefsKnownFollowers { 445 + count: number; 446 + followers: AppBskyActorDefs["ProfileViewBasic"][]; 447 + } 448 + 449 + export interface AppBskyActorDefsMutedWordsPref { 450 + /** A list of words the account owner has muted. */ 451 + items: AppBskyActorDefs["MutedWord"][]; 452 + } 453 + 454 + export interface AppBskyActorDefsSavedFeedsPref { 455 + saved: string[]; 456 + pinned: string[]; 457 + timelineIndex?: number; 286 458 } 287 459 288 - export interface AppBskyEmbedExternalView { 289 - external: AppBskyEmbedExternal["ViewExternal"]; 460 + export interface AppBskyActorDefsThreadViewPref { 461 + /** Sorting mode for threads. */ 462 + sort?: AppBskyActorDefsSort; 463 + /** Show followed users at the top of all replies. */ 464 + prioritizeFollowedUsers?: boolean; 290 465 } 291 466 292 - export interface AppBskyEmbedExternalExternal { 293 - uri: string; 294 - thumb?: BlobRef; 295 - title: string; 296 - description: string; 467 + export interface AppBskyActorDefsHiddenPostsPref { 468 + /** A list of URIs of posts the account owner has hidden. */ 469 + items: string[]; 297 470 } 298 471 299 - export interface AppBskyEmbedExternalViewExternal { 300 - uri: string; 301 - thumb?: string; 302 - title: string; 303 - description: string; 472 + export interface AppBskyActorDefsLabelerPrefItem { 473 + did: string; 304 474 } 305 475 306 - export type AppBskyGraphDefsModlist = "app.bsky.graph.defs#modlist"; 476 + export interface AppBskyActorDefsAdultContentPref { 477 + enabled: boolean; 478 + } 307 479 308 - export interface AppBskyGraphDefsListView { 309 - cid: string; 310 - uri: string; 311 - name: string; 480 + export interface AppBskyActorDefsBskyAppStatePref { 481 + /** Storage for NUXs the user has encountered. */ 482 + nuxs?: AppBskyActorDefs["Nux"][]; 483 + /** An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user. */ 484 + queuedNudges?: string[]; 485 + activeProgressGuide?: AppBskyActorDefs["BskyAppProgressGuide"]; 486 + } 487 + 488 + export interface AppBskyActorDefsContentLabelPref { 489 + label: string; 490 + /** Which labeler does this preference apply to? If undefined, applies globally. */ 491 + labelerDid?: string; 492 + visibility: AppBskyActorDefsVisibility; 493 + } 494 + 495 + export interface AppBskyActorDefsProfileViewBasic { 496 + did: string; 312 497 avatar?: string; 498 + handle: string; 313 499 labels?: ComAtprotoLabelDefs["Label"][]; 314 - viewer?: AppBskyGraphDefs["ListViewerState"]; 315 - creator: AppBskyActorDefs["ProfileView"]; 316 - purpose: AppBskyGraphDefs["ListPurpose"]; 317 - indexedAt: string; 318 - description?: string; 319 - listItemCount?: number; 320 - descriptionFacets?: AppBskyRichtextFacet["Main"][]; 500 + viewer?: AppBskyActorDefs["ViewerState"]; 501 + createdAt?: string; 502 + associated?: AppBskyActorDefs["ProfileAssociated"]; 503 + displayName?: string; 321 504 } 322 505 323 - export type AppBskyGraphDefsCuratelist = "app.bsky.graph.defs#curatelist"; 506 + export interface AppBskyActorDefsSavedFeedsPrefV2 { 507 + items: AppBskyActorDefs["SavedFeed"][]; 508 + } 324 509 325 - export interface AppBskyGraphDefsListItemView { 326 - uri: string; 327 - subject: AppBskyActorDefs["ProfileView"]; 510 + export interface AppBskyActorDefsProfileAssociated { 511 + chat?: AppBskyActorDefs["ProfileAssociatedChat"]; 512 + lists?: number; 513 + labeler?: boolean; 514 + feedgens?: number; 515 + starterPacks?: number; 328 516 } 329 517 330 - export interface AppBskyGraphDefsRelationship { 331 - did: string; 332 - /** if the actor follows this DID, this is the AT-URI of the follow record */ 333 - following?: string; 334 - /** if the actor is followed by this DID, contains the AT-URI of the follow record */ 335 - followedBy?: string; 518 + export interface AppBskyActorDefsPersonalDetailsPref { 519 + /** The birth date of account owner. */ 520 + birthDate?: string; 336 521 } 337 522 338 - export interface AppBskyGraphDefsListViewBasic { 339 - cid: string; 340 - uri: string; 341 - name: string; 523 + export interface AppBskyActorDefsProfileViewDetailed { 524 + did: string; 342 525 avatar?: string; 526 + banner?: string; 527 + handle: string; 343 528 labels?: ComAtprotoLabelDefs["Label"][]; 344 - viewer?: AppBskyGraphDefs["ListViewerState"]; 345 - purpose: AppBskyGraphDefs["ListPurpose"]; 529 + viewer?: AppBskyActorDefs["ViewerState"]; 530 + createdAt?: string; 346 531 indexedAt?: string; 347 - listItemCount?: number; 532 + associated?: AppBskyActorDefs["ProfileAssociated"]; 533 + pinnedPost?: ComAtprotoRepoStrongRef; 534 + postsCount?: number; 535 + description?: string; 536 + displayName?: string; 537 + followsCount?: number; 538 + followersCount?: number; 539 + joinedViaStarterPack?: AppBskyGraphDefs["StarterPackViewBasic"]; 540 + } 541 + 542 + export interface AppBskyActorDefsBskyAppProgressGuide { 543 + guide: string; 348 544 } 349 545 350 - export interface AppBskyGraphDefsNotFoundActor { 351 - actor: string; 352 - notFound: boolean; 546 + export interface AppBskyActorDefsProfileAssociatedChat { 547 + allowIncoming: AppBskyActorDefsAllowIncoming; 353 548 } 354 549 355 - export type AppBskyGraphDefsReferencelist = "app.bsky.graph.defs#referencelist"; 550 + export interface AppBskyActorDefsPostInteractionSettingsPref { 551 + /** Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply. */ 552 + threadgateAllowRules?: 553 + | AppBskyFeedThreadgate["MentionRule"] 554 + | AppBskyFeedThreadgate["FollowerRule"] 555 + | AppBskyFeedThreadgate["FollowingRule"] 556 + | AppBskyFeedThreadgate["ListRule"] 557 + | { $type: string; [key: string]: unknown }[]; 558 + /** Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed. */ 559 + postgateEmbeddingRules?: AppBskyFeedPostgate["DisableRule"] | { 560 + $type: string; 561 + [key: string]: unknown; 562 + }[]; 563 + } 356 564 357 - export interface AppBskyGraphDefsListViewerState { 358 - muted?: boolean; 359 - blocked?: string; 565 + export interface AppBskyRichtextFacetTag { 566 + tag: string; 360 567 } 361 568 362 - export interface AppBskyGraphDefsStarterPackView { 363 - cid: string; 569 + export interface AppBskyRichtextFacetLink { 364 570 uri: string; 365 - list?: AppBskyGraphDefs["ListViewBasic"]; 366 - feeds?: AppBskyFeedDefs["GeneratorView"][]; 367 - labels?: ComAtprotoLabelDefs["Label"][]; 368 - record: unknown; 369 - creator: AppBskyActorDefs["ProfileViewBasic"]; 370 - indexedAt: string; 371 - joinedWeekCount?: number; 372 - listItemsSample?: AppBskyGraphDefs["ListItemView"][]; 373 - joinedAllTimeCount?: number; 571 + } 572 + 573 + export interface AppBskyRichtextFacetMain { 574 + index: AppBskyRichtextFacet["ByteSlice"]; 575 + features: 576 + | AppBskyRichtextFacet["Mention"] 577 + | AppBskyRichtextFacet["Link"] 578 + | AppBskyRichtextFacet["Tag"] 579 + | { $type: string; [key: string]: unknown }[]; 580 + } 581 + 582 + export interface AppBskyRichtextFacetMention { 583 + did: string; 584 + } 585 + 586 + export interface AppBskyRichtextFacetByteSlice { 587 + byteEnd: number; 588 + byteStart: number; 589 + } 590 + 591 + export interface AppBskyFeedThreadgate { 592 + /** Reference (AT-URI) to the post record. */ 593 + post: string; 594 + /** 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. */ 595 + allow?: 596 + | AppBskyFeedThreadgate["MentionRule"] 597 + | AppBskyFeedThreadgate["FollowerRule"] 598 + | AppBskyFeedThreadgate["FollowingRule"] 599 + | AppBskyFeedThreadgate["ListRule"] 600 + | { $type: string; [key: string]: unknown }[]; 601 + createdAt: string; 602 + /** List of hidden reply URIs. */ 603 + hiddenReplies?: string[]; 604 + } 605 + 606 + export type AppBskyFeedThreadgateSortFields = "post" | "createdAt"; 607 + 608 + export interface AppBskyFeedThreadgateListRule { 609 + list: string; 374 610 } 375 611 376 - export interface AppBskyGraphDefsStarterPackViewBasic { 377 - cid: string; 378 - uri: string; 379 - labels?: ComAtprotoLabelDefs["Label"][]; 380 - record: unknown; 381 - creator: AppBskyActorDefs["ProfileViewBasic"]; 382 - indexedAt: string; 383 - listItemCount?: number; 384 - joinedWeekCount?: number; 385 - joinedAllTimeCount?: number; 612 + export type AppBskyFeedThreadgateMentionRule = Record<string, never>; 613 + export type AppBskyFeedThreadgateFollowerRule = Record<string, never>; 614 + export type AppBskyFeedThreadgateFollowingRule = Record<string, never>; 615 + 616 + export interface AppBskyFeedPostgate { 617 + /** Reference (AT-URI) to the post record. */ 618 + post: string; 619 + createdAt: string; 620 + /** 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. */ 621 + embeddingRules?: AppBskyFeedPostgate["DisableRule"] | { 622 + $type: string; 623 + [key: string]: unknown; 624 + }[]; 625 + /** List of AT-URIs embedding this post that the author has detached from. */ 626 + detachedEmbeddingUris?: string[]; 386 627 } 628 + 629 + export type AppBskyFeedPostgateSortFields = "post" | "createdAt"; 630 + export type AppBskyFeedPostgateDisableRule = Record<string, never>; 387 631 388 632 export interface AppBskyFeedDefsPostView { 389 633 cid: string; ··· 563 807 564 808 export type AppBskyFeedDefsContentModeUnspecified = 565 809 "app.bsky.feed.defs#contentModeUnspecified"; 810 + export type AppBskyGraphDefsModlist = "app.bsky.graph.defs#modlist"; 566 811 567 - export interface AppBskyFeedPostgate { 568 - /** Reference (AT-URI) to the post record. */ 569 - post: string; 570 - createdAt: string; 571 - /** 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. */ 572 - embeddingRules?: AppBskyFeedPostgate["DisableRule"] | { 573 - $type: string; 574 - [key: string]: unknown; 575 - }[]; 576 - /** List of AT-URIs embedding this post that the author has detached from. */ 577 - detachedEmbeddingUris?: string[]; 812 + export interface AppBskyGraphDefsListView { 813 + cid: string; 814 + uri: string; 815 + name: string; 816 + avatar?: string; 817 + labels?: ComAtprotoLabelDefs["Label"][]; 818 + viewer?: AppBskyGraphDefs["ListViewerState"]; 819 + creator: AppBskyActorDefs["ProfileView"]; 820 + purpose: AppBskyGraphDefs["ListPurpose"]; 821 + indexedAt: string; 822 + description?: string; 823 + listItemCount?: number; 824 + descriptionFacets?: AppBskyRichtextFacet["Main"][]; 578 825 } 579 826 580 - export type AppBskyFeedPostgateSortFields = "post" | "createdAt"; 581 - export type AppBskyFeedPostgateDisableRule = Record<string, never>; 582 - 583 - export interface AppBskyFeedThreadgate { 584 - /** Reference (AT-URI) to the post record. */ 585 - post: string; 586 - /** 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. */ 587 - allow?: 588 - | AppBskyFeedThreadgate["MentionRule"] 589 - | AppBskyFeedThreadgate["FollowerRule"] 590 - | AppBskyFeedThreadgate["FollowingRule"] 591 - | AppBskyFeedThreadgate["ListRule"] 592 - | { $type: string; [key: string]: unknown }[]; 593 - createdAt: string; 594 - /** List of hidden reply URIs. */ 595 - hiddenReplies?: string[]; 596 - } 597 - 598 - export type AppBskyFeedThreadgateSortFields = "post" | "createdAt"; 599 - 600 - export interface AppBskyFeedThreadgateListRule { 601 - list: string; 602 - } 603 - 604 - export type AppBskyFeedThreadgateMentionRule = Record<string, never>; 605 - export type AppBskyFeedThreadgateFollowerRule = Record<string, never>; 606 - export type AppBskyFeedThreadgateFollowingRule = Record<string, never>; 607 - 608 - export interface AppBskyRichtextFacetTag { 609 - tag: string; 610 - } 827 + export type AppBskyGraphDefsCuratelist = "app.bsky.graph.defs#curatelist"; 611 828 612 - export interface AppBskyRichtextFacetLink { 829 + export interface AppBskyGraphDefsListItemView { 613 830 uri: string; 831 + subject: AppBskyActorDefs["ProfileView"]; 614 832 } 615 833 616 - export interface AppBskyRichtextFacetMain { 617 - index: AppBskyRichtextFacet["ByteSlice"]; 618 - features: 619 - | AppBskyRichtextFacet["Mention"] 620 - | AppBskyRichtextFacet["Link"] 621 - | AppBskyRichtextFacet["Tag"] 622 - | { $type: string; [key: string]: unknown }[]; 623 - } 624 - 625 - export interface AppBskyRichtextFacetMention { 834 + export interface AppBskyGraphDefsRelationship { 626 835 did: string; 627 - } 628 - 629 - export interface AppBskyRichtextFacetByteSlice { 630 - byteEnd: number; 631 - byteStart: number; 836 + /** if the actor follows this DID, this is the AT-URI of the follow record */ 837 + following?: string; 838 + /** if the actor is followed by this DID, contains the AT-URI of the follow record */ 839 + followedBy?: string; 632 840 } 633 841 634 - export interface AppBskyActorDefsNux { 635 - id: string; 636 - /** Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters. */ 637 - data?: string; 638 - completed: boolean; 639 - /** The date and time at which the NUX will expire and should be considered completed. */ 640 - expiresAt?: string; 641 - } 642 - 643 - export interface AppBskyActorDefsMutedWord { 644 - id?: string; 645 - /** The muted word itself. */ 646 - value: string; 647 - /** The intended targets of the muted word. */ 648 - targets: AppBskyActorDefs["MutedWordTarget"][]; 649 - /** The date and time at which the muted word will expire and no longer be applied. */ 650 - expiresAt?: string; 651 - /** Groups of users to apply the muted word to. If undefined, applies to all users. */ 652 - actorTarget?: AppBskyActorDefsActorTarget; 653 - } 654 - 655 - export interface AppBskyActorDefsSavedFeed { 656 - id: string; 657 - type: AppBskyActorDefsType; 658 - value: string; 659 - pinned: boolean; 660 - } 661 - 662 - export type AppBskyActorDefsPreferences = 663 - | AppBskyActorDefs["AdultContentPref"] 664 - | AppBskyActorDefs["ContentLabelPref"] 665 - | AppBskyActorDefs["SavedFeedsPref"] 666 - | AppBskyActorDefs["SavedFeedsPrefV2"] 667 - | AppBskyActorDefs["PersonalDetailsPref"] 668 - | AppBskyActorDefs["FeedViewPref"] 669 - | AppBskyActorDefs["ThreadViewPref"] 670 - | AppBskyActorDefs["InterestsPref"] 671 - | AppBskyActorDefs["MutedWordsPref"] 672 - | AppBskyActorDefs["HiddenPostsPref"] 673 - | AppBskyActorDefs["BskyAppStatePref"] 674 - | AppBskyActorDefs["LabelersPref"] 675 - | AppBskyActorDefs["PostInteractionSettingsPref"] 676 - | { $type: string; [key: string]: unknown }[]; 677 - 678 - export interface AppBskyActorDefsProfileView { 679 - did: string; 842 + export interface AppBskyGraphDefsListViewBasic { 843 + cid: string; 844 + uri: string; 845 + name: string; 680 846 avatar?: string; 681 - handle: string; 682 847 labels?: ComAtprotoLabelDefs["Label"][]; 683 - viewer?: AppBskyActorDefs["ViewerState"]; 684 - createdAt?: string; 848 + viewer?: AppBskyGraphDefs["ListViewerState"]; 849 + purpose: AppBskyGraphDefs["ListPurpose"]; 685 850 indexedAt?: string; 686 - associated?: AppBskyActorDefs["ProfileAssociated"]; 687 - description?: string; 688 - displayName?: string; 851 + listItemCount?: number; 689 852 } 690 853 691 - export interface AppBskyActorDefsViewerState { 692 - muted?: boolean; 693 - blocking?: string; 694 - blockedBy?: boolean; 695 - following?: string; 696 - followedBy?: string; 697 - mutedByList?: AppBskyGraphDefs["ListViewBasic"]; 698 - blockingByList?: AppBskyGraphDefs["ListViewBasic"]; 699 - knownFollowers?: AppBskyActorDefs["KnownFollowers"]; 854 + export interface AppBskyGraphDefsNotFoundActor { 855 + actor: string; 856 + notFound: boolean; 700 857 } 701 858 702 - export interface AppBskyActorDefsFeedViewPref { 703 - /** The URI of the feed, or an identifier which describes the feed. */ 704 - feed: string; 705 - /** Hide replies in the feed. */ 706 - hideReplies?: boolean; 707 - /** Hide reposts in the feed. */ 708 - hideReposts?: boolean; 709 - /** Hide quote posts in the feed. */ 710 - hideQuotePosts?: boolean; 711 - /** Hide replies in the feed if they do not have this number of likes. */ 712 - hideRepliesByLikeCount?: number; 713 - /** Hide replies in the feed if they are not by followed users. */ 714 - hideRepliesByUnfollowed?: boolean; 715 - } 859 + export type AppBskyGraphDefsReferencelist = "app.bsky.graph.defs#referencelist"; 716 860 717 - export interface AppBskyActorDefsLabelersPref { 718 - labelers: AppBskyActorDefs["LabelerPrefItem"][]; 861 + export interface AppBskyGraphDefsListViewerState { 862 + muted?: boolean; 863 + blocked?: string; 719 864 } 720 865 721 - export interface AppBskyActorDefsInterestsPref { 722 - /** A list of tags which describe the account owner's interests gathered during onboarding. */ 723 - tags: string[]; 866 + export interface AppBskyGraphDefsStarterPackView { 867 + cid: string; 868 + uri: string; 869 + list?: AppBskyGraphDefs["ListViewBasic"]; 870 + feeds?: AppBskyFeedDefs["GeneratorView"][]; 871 + labels?: ComAtprotoLabelDefs["Label"][]; 872 + record: unknown; 873 + creator: AppBskyActorDefs["ProfileViewBasic"]; 874 + indexedAt: string; 875 + joinedWeekCount?: number; 876 + listItemsSample?: AppBskyGraphDefs["ListItemView"][]; 877 + joinedAllTimeCount?: number; 724 878 } 725 879 726 - export interface AppBskyActorDefsKnownFollowers { 727 - count: number; 728 - followers: AppBskyActorDefs["ProfileViewBasic"][]; 880 + export interface AppBskyGraphDefsStarterPackViewBasic { 881 + cid: string; 882 + uri: string; 883 + labels?: ComAtprotoLabelDefs["Label"][]; 884 + record: unknown; 885 + creator: AppBskyActorDefs["ProfileViewBasic"]; 886 + indexedAt: string; 887 + listItemCount?: number; 888 + joinedWeekCount?: number; 889 + joinedAllTimeCount?: number; 729 890 } 730 891 731 - export interface AppBskyActorDefsMutedWordsPref { 732 - /** A list of words the account owner has muted. */ 733 - items: AppBskyActorDefs["MutedWord"][]; 892 + export interface AppBskyEmbedExternalMain { 893 + external: AppBskyEmbedExternal["External"]; 734 894 } 735 895 736 - export interface AppBskyActorDefsSavedFeedsPref { 737 - saved: string[]; 738 - pinned: string[]; 739 - timelineIndex?: number; 896 + export interface AppBskyEmbedExternalView { 897 + external: AppBskyEmbedExternal["ViewExternal"]; 740 898 } 741 899 742 - export interface AppBskyActorDefsThreadViewPref { 743 - /** Sorting mode for threads. */ 744 - sort?: AppBskyActorDefsSort; 745 - /** Show followed users at the top of all replies. */ 746 - prioritizeFollowedUsers?: boolean; 900 + export interface AppBskyEmbedExternalExternal { 901 + uri: string; 902 + thumb?: BlobRef; 903 + title: string; 904 + description: string; 747 905 } 748 906 749 - export interface AppBskyActorDefsHiddenPostsPref { 750 - /** A list of URIs of posts the account owner has hidden. */ 751 - items: string[]; 907 + export interface AppBskyEmbedExternalViewExternal { 908 + uri: string; 909 + thumb?: string; 910 + title: string; 911 + description: string; 752 912 } 753 913 754 - export interface AppBskyActorDefsLabelerPrefItem { 755 - did: string; 914 + export interface AppBskyEmbedVideoMain { 915 + /** Alt text description of the video, for accessibility. */ 916 + alt?: string; 917 + video: BlobRef; 918 + captions?: AppBskyEmbedVideo["Caption"][]; 919 + aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 756 920 } 757 921 758 - export interface AppBskyActorDefsAdultContentPref { 759 - enabled: boolean; 922 + export interface AppBskyEmbedVideoView { 923 + alt?: string; 924 + cid: string; 925 + playlist: string; 926 + thumbnail?: string; 927 + aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 760 928 } 761 929 762 - export interface AppBskyActorDefsBskyAppStatePref { 763 - /** Storage for NUXs the user has encountered. */ 764 - nuxs?: AppBskyActorDefs["Nux"][]; 765 - /** An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user. */ 766 - queuedNudges?: string[]; 767 - activeProgressGuide?: AppBskyActorDefs["BskyAppProgressGuide"]; 930 + export interface AppBskyEmbedVideoCaption { 931 + file: BlobRef; 932 + lang: string; 768 933 } 769 934 770 - export interface AppBskyActorDefsContentLabelPref { 771 - label: string; 772 - /** Which labeler does this preference apply to? If undefined, applies globally. */ 773 - labelerDid?: string; 774 - visibility: AppBskyActorDefsVisibility; 935 + export interface AppBskyEmbedRecordWithMediaMain { 936 + media: 937 + | AppBskyEmbedImages["Main"] 938 + | AppBskyEmbedVideo["Main"] 939 + | AppBskyEmbedExternal["Main"] 940 + | { $type: string; [key: string]: unknown }; 941 + record: AppBskyEmbedRecord["Main"]; 775 942 } 776 943 777 - export interface AppBskyActorDefsProfileViewBasic { 778 - did: string; 779 - avatar?: string; 780 - handle: string; 781 - labels?: ComAtprotoLabelDefs["Label"][]; 782 - viewer?: AppBskyActorDefs["ViewerState"]; 783 - createdAt?: string; 784 - associated?: AppBskyActorDefs["ProfileAssociated"]; 785 - displayName?: string; 944 + export interface AppBskyEmbedRecordWithMediaView { 945 + media: 946 + | AppBskyEmbedImages["View"] 947 + | AppBskyEmbedVideo["View"] 948 + | AppBskyEmbedExternal["View"] 949 + | { $type: string; [key: string]: unknown }; 950 + record: AppBskyEmbedRecord["View"]; 786 951 } 787 952 788 - export interface AppBskyActorDefsSavedFeedsPrefV2 { 789 - items: AppBskyActorDefs["SavedFeed"][]; 953 + export interface AppBskyEmbedImagesMain { 954 + images: AppBskyEmbedImages["Image"][]; 790 955 } 791 956 792 - export interface AppBskyActorDefsProfileAssociated { 793 - chat?: AppBskyActorDefs["ProfileAssociatedChat"]; 794 - lists?: number; 795 - labeler?: boolean; 796 - feedgens?: number; 797 - starterPacks?: number; 957 + export interface AppBskyEmbedImagesView { 958 + images: AppBskyEmbedImages["ViewImage"][]; 798 959 } 799 960 800 - export interface AppBskyActorDefsPersonalDetailsPref { 801 - /** The birth date of account owner. */ 802 - birthDate?: string; 961 + export interface AppBskyEmbedImagesImage { 962 + /** Alt text description of the image, for accessibility. */ 963 + alt: string; 964 + image: BlobRef; 965 + aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 803 966 } 804 967 805 - export interface AppBskyActorDefsProfileViewDetailed { 806 - did: string; 807 - avatar?: string; 808 - banner?: string; 809 - handle: string; 810 - labels?: ComAtprotoLabelDefs["Label"][]; 811 - viewer?: AppBskyActorDefs["ViewerState"]; 812 - createdAt?: string; 813 - indexedAt?: string; 814 - associated?: AppBskyActorDefs["ProfileAssociated"]; 815 - pinnedPost?: ComAtprotoRepoStrongRef; 816 - postsCount?: number; 817 - description?: string; 818 - displayName?: string; 819 - followsCount?: number; 820 - followersCount?: number; 821 - joinedViaStarterPack?: AppBskyGraphDefs["StarterPackViewBasic"]; 968 + export interface AppBskyEmbedImagesViewImage { 969 + /** Alt text description of the image, for accessibility. */ 970 + alt: string; 971 + /** Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View. */ 972 + thumb: string; 973 + /** 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. */ 974 + fullsize: string; 975 + aspectRatio?: AppBskyEmbedDefs["AspectRatio"]; 822 976 } 823 977 824 - export interface AppBskyActorDefsBskyAppProgressGuide { 825 - guide: string; 826 - } 827 - 828 - export interface AppBskyActorDefsProfileAssociatedChat { 829 - allowIncoming: AppBskyActorDefsAllowIncoming; 978 + export interface AppBskyEmbedRecordMain { 979 + record: ComAtprotoRepoStrongRef; 830 980 } 831 981 832 - export interface AppBskyActorDefsPostInteractionSettingsPref { 833 - /** Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply. */ 834 - threadgateAllowRules?: 835 - | AppBskyFeedThreadgate["MentionRule"] 836 - | AppBskyFeedThreadgate["FollowerRule"] 837 - | AppBskyFeedThreadgate["FollowingRule"] 838 - | AppBskyFeedThreadgate["ListRule"] 839 - | { $type: string; [key: string]: unknown }[]; 840 - /** Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed. */ 841 - postgateEmbeddingRules?: AppBskyFeedPostgate["DisableRule"] | { 842 - $type: string; 843 - [key: string]: unknown; 844 - }[]; 845 - } 846 - 847 - export interface AppBskyActorProfile { 848 - /** Small image to be displayed next to posts from account. AKA, 'profile picture' */ 849 - avatar?: BlobRef; 850 - /** Larger horizontal image to display behind profile view. */ 851 - banner?: BlobRef; 852 - /** Self-label values, specific to the Bluesky application, on the overall account. */ 853 - labels?: ComAtprotoLabelDefs["SelfLabels"] | { 854 - $type: string; 855 - [key: string]: unknown; 856 - }; 857 - createdAt?: string; 858 - pinnedPost?: ComAtprotoRepoStrongRef; 859 - /** Free-form profile description text. */ 860 - description?: string; 861 - displayName?: string; 862 - joinedViaStarterPack?: ComAtprotoRepoStrongRef; 982 + export interface AppBskyEmbedRecordView { 983 + record: 984 + | AppBskyEmbedRecord["ViewRecord"] 985 + | AppBskyEmbedRecord["ViewNotFound"] 986 + | AppBskyEmbedRecord["ViewBlocked"] 987 + | AppBskyEmbedRecord["ViewDetached"] 988 + | AppBskyFeedDefs["GeneratorView"] 989 + | AppBskyGraphDefs["ListView"] 990 + | AppBskyLabelerDefs["LabelerView"] 991 + | AppBskyGraphDefs["StarterPackViewBasic"] 992 + | { $type: string; [key: string]: unknown }; 863 993 } 864 994 865 - export type AppBskyActorProfileSortFields = 866 - | "createdAt" 867 - | "description" 868 - | "displayName"; 869 - 870 - export interface AppBskyLabelerDefsLabelerView { 995 + export interface AppBskyEmbedRecordViewRecord { 871 996 cid: string; 872 997 uri: string; 998 + /** The record data itself. */ 999 + value: unknown; 1000 + author: AppBskyActorDefs["ProfileViewBasic"]; 1001 + embeds?: 1002 + | AppBskyEmbedImages["View"] 1003 + | AppBskyEmbedVideo["View"] 1004 + | AppBskyEmbedExternal["View"] 1005 + | AppBskyEmbedRecord["View"] 1006 + | AppBskyEmbedRecordWithMedia["View"] 1007 + | { $type: string; [key: string]: unknown }[]; 873 1008 labels?: ComAtprotoLabelDefs["Label"][]; 874 - viewer?: AppBskyLabelerDefs["LabelerViewerState"]; 875 - creator: AppBskyActorDefs["ProfileView"]; 876 1009 indexedAt: string; 877 1010 likeCount?: number; 1011 + quoteCount?: number; 1012 + replyCount?: number; 1013 + repostCount?: number; 878 1014 } 879 1015 880 - export interface AppBskyLabelerDefsLabelerPolicies { 881 - /** The label values which this labeler publishes. May include global or custom labels. */ 882 - labelValues: ComAtprotoLabelDefs["LabelValue"][]; 883 - /** Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler. */ 884 - labelValueDefinitions?: ComAtprotoLabelDefs["LabelValueDefinition"][]; 1016 + export interface AppBskyEmbedRecordViewBlocked { 1017 + uri: string; 1018 + author: AppBskyFeedDefs["BlockedAuthor"]; 1019 + blocked: boolean; 885 1020 } 886 1021 887 - export interface AppBskyLabelerDefsLabelerViewerState { 888 - like?: string; 889 - } 890 - 891 - export interface AppBskyLabelerDefsLabelerViewDetailed { 892 - cid: string; 1022 + export interface AppBskyEmbedRecordViewDetached { 893 1023 uri: string; 894 - labels?: ComAtprotoLabelDefs["Label"][]; 895 - viewer?: AppBskyLabelerDefs["LabelerViewerState"]; 896 - creator: AppBskyActorDefs["ProfileView"]; 897 - policies: AppBskyLabelerDefs["LabelerPolicies"]; 898 - indexedAt: string; 899 - likeCount?: number; 1024 + detached: boolean; 900 1025 } 901 1026 902 - export interface ComAtprotoLabelDefsLabel { 903 - /** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */ 904 - cid?: string; 905 - /** Timestamp when this label was created. */ 906 - cts?: string; 907 - /** Timestamp at which this label expires (no longer applies). */ 908 - exp?: string; 909 - /** If true, this is a negation label, overwriting a previous label. */ 910 - neg?: boolean; 911 - /** Signature of dag-cbor encoded label. */ 912 - sig?: string; 913 - /** DID of the actor who created this label. */ 914 - src: string; 915 - /** AT URI of the record, repository (account), or other resource that this label applies to. */ 1027 + export interface AppBskyEmbedRecordViewNotFound { 916 1028 uri: string; 917 - /** The short string name of the value or type of this label. */ 918 - val: string; 919 - /** The AT Protocol version of the label object. */ 920 - ver?: number; 1029 + notFound: boolean; 921 1030 } 922 1031 923 - export interface ComAtprotoLabelDefsSelfLabel { 924 - /** The short string name of the value or type of this label. */ 925 - val: string; 1032 + export interface AppBskyEmbedDefsAspectRatio { 1033 + width: number; 1034 + height: number; 926 1035 } 927 1036 928 - export interface ComAtprotoLabelDefsSelfLabels { 929 - values: ComAtprotoLabelDefs["SelfLabel"][]; 1037 + export interface FmTealAlphaFeedDefs { 1038 + readonly PlayView: FmTealAlphaFeedDefsPlayView; 1039 + readonly Artist: FmTealAlphaFeedDefsArtist; 930 1040 } 931 1041 932 - export interface ComAtprotoLabelDefsLabelValueDefinition { 933 - /** What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing. */ 934 - blurs: ComAtprotoLabelDefsBlurs; 935 - locales: ComAtprotoLabelDefs["LabelValueDefinitionStrings"][]; 936 - /** How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. */ 937 - severity: ComAtprotoLabelDefsSeverity; 938 - /** Does the user need to have adult content enabled in order to configure this label? */ 939 - adultOnly?: boolean; 940 - /** The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). */ 941 - identifier: string; 942 - /** The default setting for this label. */ 943 - defaultSetting?: ComAtprotoLabelDefsDefaultSetting; 944 - } 945 - 946 - export interface ComAtprotoLabelDefsLabelValueDefinitionStrings { 947 - /** The code of the language these strings are written in. */ 948 - lang: string; 949 - /** A short human-readable name for the label. */ 950 - name: string; 951 - /** A longer description of what the label means and why it might be applied. */ 952 - description: string; 953 - } 954 - 955 - export interface ComAtprotoRepoStrongRef { 956 - cid: string; 957 - uri: string; 958 - } 959 - 960 - export interface AppBskyEmbedDefs { 961 - readonly AspectRatio: AppBskyEmbedDefsAspectRatio; 962 - } 963 - 964 - export interface AppBskyEmbedRecord { 965 - readonly Main: AppBskyEmbedRecordMain; 966 - readonly View: AppBskyEmbedRecordView; 967 - readonly ViewRecord: AppBskyEmbedRecordViewRecord; 968 - readonly ViewBlocked: AppBskyEmbedRecordViewBlocked; 969 - readonly ViewDetached: AppBskyEmbedRecordViewDetached; 970 - readonly ViewNotFound: AppBskyEmbedRecordViewNotFound; 1042 + export interface ComAtprotoLabelDefs { 1043 + readonly Label: ComAtprotoLabelDefsLabel; 1044 + readonly SelfLabel: ComAtprotoLabelDefsSelfLabel; 1045 + readonly LabelValue: ComAtprotoLabelDefsLabelValue; 1046 + readonly SelfLabels: ComAtprotoLabelDefsSelfLabels; 1047 + readonly LabelValueDefinition: ComAtprotoLabelDefsLabelValueDefinition; 1048 + readonly LabelValueDefinitionStrings: 1049 + ComAtprotoLabelDefsLabelValueDefinitionStrings; 971 1050 } 972 1051 973 - export interface AppBskyEmbedImages { 974 - readonly Main: AppBskyEmbedImagesMain; 975 - readonly View: AppBskyEmbedImagesView; 976 - readonly Image: AppBskyEmbedImagesImage; 977 - readonly ViewImage: AppBskyEmbedImagesViewImage; 1052 + export interface AppBskyLabelerDefs { 1053 + readonly LabelerView: AppBskyLabelerDefsLabelerView; 1054 + readonly LabelerPolicies: AppBskyLabelerDefsLabelerPolicies; 1055 + readonly LabelerViewerState: AppBskyLabelerDefsLabelerViewerState; 1056 + readonly LabelerViewDetailed: AppBskyLabelerDefsLabelerViewDetailed; 978 1057 } 979 1058 980 - export interface AppBskyEmbedRecordWithMedia { 981 - readonly Main: AppBskyEmbedRecordWithMediaMain; 982 - readonly View: AppBskyEmbedRecordWithMediaView; 1059 + export interface AppBskyActorDefs { 1060 + readonly Nux: AppBskyActorDefsNux; 1061 + readonly MutedWord: AppBskyActorDefsMutedWord; 1062 + readonly SavedFeed: AppBskyActorDefsSavedFeed; 1063 + readonly Preferences: AppBskyActorDefsPreferences; 1064 + readonly ProfileView: AppBskyActorDefsProfileView; 1065 + readonly ViewerState: AppBskyActorDefsViewerState; 1066 + readonly FeedViewPref: AppBskyActorDefsFeedViewPref; 1067 + readonly LabelersPref: AppBskyActorDefsLabelersPref; 1068 + readonly InterestsPref: AppBskyActorDefsInterestsPref; 1069 + readonly KnownFollowers: AppBskyActorDefsKnownFollowers; 1070 + readonly MutedWordsPref: AppBskyActorDefsMutedWordsPref; 1071 + readonly SavedFeedsPref: AppBskyActorDefsSavedFeedsPref; 1072 + readonly ThreadViewPref: AppBskyActorDefsThreadViewPref; 1073 + readonly HiddenPostsPref: AppBskyActorDefsHiddenPostsPref; 1074 + readonly LabelerPrefItem: AppBskyActorDefsLabelerPrefItem; 1075 + readonly MutedWordTarget: AppBskyActorDefsMutedWordTarget; 1076 + readonly AdultContentPref: AppBskyActorDefsAdultContentPref; 1077 + readonly BskyAppStatePref: AppBskyActorDefsBskyAppStatePref; 1078 + readonly ContentLabelPref: AppBskyActorDefsContentLabelPref; 1079 + readonly ProfileViewBasic: AppBskyActorDefsProfileViewBasic; 1080 + readonly SavedFeedsPrefV2: AppBskyActorDefsSavedFeedsPrefV2; 1081 + readonly ProfileAssociated: AppBskyActorDefsProfileAssociated; 1082 + readonly PersonalDetailsPref: AppBskyActorDefsPersonalDetailsPref; 1083 + readonly ProfileViewDetailed: AppBskyActorDefsProfileViewDetailed; 1084 + readonly BskyAppProgressGuide: AppBskyActorDefsBskyAppProgressGuide; 1085 + readonly ProfileAssociatedChat: AppBskyActorDefsProfileAssociatedChat; 1086 + readonly PostInteractionSettingsPref: 1087 + AppBskyActorDefsPostInteractionSettingsPref; 983 1088 } 984 1089 985 - export interface AppBskyEmbedVideo { 986 - readonly Main: AppBskyEmbedVideoMain; 987 - readonly View: AppBskyEmbedVideoView; 988 - readonly Caption: AppBskyEmbedVideoCaption; 1090 + export interface AppBskyRichtextFacet { 1091 + readonly Tag: AppBskyRichtextFacetTag; 1092 + readonly Link: AppBskyRichtextFacetLink; 1093 + readonly Main: AppBskyRichtextFacetMain; 1094 + readonly Mention: AppBskyRichtextFacetMention; 1095 + readonly ByteSlice: AppBskyRichtextFacetByteSlice; 989 1096 } 990 1097 991 - export interface AppBskyEmbedExternal { 992 - readonly Main: AppBskyEmbedExternalMain; 993 - readonly View: AppBskyEmbedExternalView; 994 - readonly External: AppBskyEmbedExternalExternal; 995 - readonly ViewExternal: AppBskyEmbedExternalViewExternal; 1098 + export interface AppBskyFeedThreadgate { 1099 + readonly Main: AppBskyFeedThreadgate; 1100 + readonly ListRule: AppBskyFeedThreadgateListRule; 1101 + readonly MentionRule: AppBskyFeedThreadgateMentionRule; 1102 + readonly FollowerRule: AppBskyFeedThreadgateFollowerRule; 1103 + readonly FollowingRule: AppBskyFeedThreadgateFollowingRule; 996 1104 } 997 1105 998 - export interface AppBskyGraphDefs { 999 - readonly Modlist: AppBskyGraphDefsModlist; 1000 - readonly ListView: AppBskyGraphDefsListView; 1001 - readonly Curatelist: AppBskyGraphDefsCuratelist; 1002 - readonly ListPurpose: AppBskyGraphDefsListPurpose; 1003 - readonly ListItemView: AppBskyGraphDefsListItemView; 1004 - readonly Relationship: AppBskyGraphDefsRelationship; 1005 - readonly ListViewBasic: AppBskyGraphDefsListViewBasic; 1006 - readonly NotFoundActor: AppBskyGraphDefsNotFoundActor; 1007 - readonly Referencelist: AppBskyGraphDefsReferencelist; 1008 - readonly ListViewerState: AppBskyGraphDefsListViewerState; 1009 - readonly StarterPackView: AppBskyGraphDefsStarterPackView; 1010 - readonly StarterPackViewBasic: AppBskyGraphDefsStarterPackViewBasic; 1106 + export interface AppBskyFeedPostgate { 1107 + readonly Main: AppBskyFeedPostgate; 1108 + readonly DisableRule: AppBskyFeedPostgateDisableRule; 1011 1109 } 1012 1110 1013 1111 export interface AppBskyFeedDefs { ··· 1045 1143 readonly ContentModeUnspecified: AppBskyFeedDefsContentModeUnspecified; 1046 1144 } 1047 1145 1048 - export interface AppBskyFeedPostgate { 1049 - readonly Main: AppBskyFeedPostgate; 1050 - readonly DisableRule: AppBskyFeedPostgateDisableRule; 1146 + export interface AppBskyGraphDefs { 1147 + readonly Modlist: AppBskyGraphDefsModlist; 1148 + readonly ListView: AppBskyGraphDefsListView; 1149 + readonly Curatelist: AppBskyGraphDefsCuratelist; 1150 + readonly ListPurpose: AppBskyGraphDefsListPurpose; 1151 + readonly ListItemView: AppBskyGraphDefsListItemView; 1152 + readonly Relationship: AppBskyGraphDefsRelationship; 1153 + readonly ListViewBasic: AppBskyGraphDefsListViewBasic; 1154 + readonly NotFoundActor: AppBskyGraphDefsNotFoundActor; 1155 + readonly Referencelist: AppBskyGraphDefsReferencelist; 1156 + readonly ListViewerState: AppBskyGraphDefsListViewerState; 1157 + readonly StarterPackView: AppBskyGraphDefsStarterPackView; 1158 + readonly StarterPackViewBasic: AppBskyGraphDefsStarterPackViewBasic; 1051 1159 } 1052 1160 1053 - export interface AppBskyFeedThreadgate { 1054 - readonly Main: AppBskyFeedThreadgate; 1055 - readonly ListRule: AppBskyFeedThreadgateListRule; 1056 - readonly MentionRule: AppBskyFeedThreadgateMentionRule; 1057 - readonly FollowerRule: AppBskyFeedThreadgateFollowerRule; 1058 - readonly FollowingRule: AppBskyFeedThreadgateFollowingRule; 1161 + export interface AppBskyEmbedExternal { 1162 + readonly Main: AppBskyEmbedExternalMain; 1163 + readonly View: AppBskyEmbedExternalView; 1164 + readonly External: AppBskyEmbedExternalExternal; 1165 + readonly ViewExternal: AppBskyEmbedExternalViewExternal; 1166 + } 1167 + 1168 + export interface AppBskyEmbedVideo { 1169 + readonly Main: AppBskyEmbedVideoMain; 1170 + readonly View: AppBskyEmbedVideoView; 1171 + readonly Caption: AppBskyEmbedVideoCaption; 1172 + } 1173 + 1174 + export interface AppBskyEmbedRecordWithMedia { 1175 + readonly Main: AppBskyEmbedRecordWithMediaMain; 1176 + readonly View: AppBskyEmbedRecordWithMediaView; 1177 + } 1178 + 1179 + export interface AppBskyEmbedImages { 1180 + readonly Main: AppBskyEmbedImagesMain; 1181 + readonly View: AppBskyEmbedImagesView; 1182 + readonly Image: AppBskyEmbedImagesImage; 1183 + readonly ViewImage: AppBskyEmbedImagesViewImage; 1184 + } 1185 + 1186 + export interface AppBskyEmbedRecord { 1187 + readonly Main: AppBskyEmbedRecordMain; 1188 + readonly View: AppBskyEmbedRecordView; 1189 + readonly ViewRecord: AppBskyEmbedRecordViewRecord; 1190 + readonly ViewBlocked: AppBskyEmbedRecordViewBlocked; 1191 + readonly ViewDetached: AppBskyEmbedRecordViewDetached; 1192 + readonly ViewNotFound: AppBskyEmbedRecordViewNotFound; 1193 + } 1194 + 1195 + export interface AppBskyEmbedDefs { 1196 + readonly AspectRatio: AppBskyEmbedDefsAspectRatio; 1197 + } 1198 + 1199 + class PlayFeedAlphaTealFmClient { 1200 + private readonly client: SlicesClient; 1201 + 1202 + constructor(client: SlicesClient) { 1203 + this.client = client; 1204 + } 1205 + 1206 + async getRecords( 1207 + params?: { 1208 + limit?: number; 1209 + cursor?: string; 1210 + where?: { 1211 + [K in FmTealAlphaFeedPlaySortFields | IndexedRecordFields]?: 1212 + WhereCondition; 1213 + }; 1214 + orWhere?: { 1215 + [K in FmTealAlphaFeedPlaySortFields | IndexedRecordFields]?: 1216 + WhereCondition; 1217 + }; 1218 + sortBy?: SortField<FmTealAlphaFeedPlaySortFields>[]; 1219 + }, 1220 + ): Promise<GetRecordsResponse<FmTealAlphaFeedPlay>> { 1221 + return await this.client.getRecords("fm.teal.alpha.feed.play", params); 1222 + } 1223 + 1224 + async getRecord( 1225 + params: GetRecordParams, 1226 + ): Promise<RecordResponse<FmTealAlphaFeedPlay>> { 1227 + return await this.client.getRecord("fm.teal.alpha.feed.play", params); 1228 + } 1229 + 1230 + async countRecords( 1231 + params?: { 1232 + limit?: number; 1233 + cursor?: string; 1234 + where?: { 1235 + [K in FmTealAlphaFeedPlaySortFields | IndexedRecordFields]?: 1236 + WhereCondition; 1237 + }; 1238 + orWhere?: { 1239 + [K in FmTealAlphaFeedPlaySortFields | IndexedRecordFields]?: 1240 + WhereCondition; 1241 + }; 1242 + sortBy?: SortField<FmTealAlphaFeedPlaySortFields>[]; 1243 + }, 1244 + ): Promise<CountRecordsResponse> { 1245 + return await this.client.countRecords("fm.teal.alpha.feed.play", params); 1246 + } 1247 + 1248 + async createRecord( 1249 + record: FmTealAlphaFeedPlay, 1250 + useSelfRkey?: boolean, 1251 + ): Promise<{ uri: string; cid: string }> { 1252 + return await this.client.createRecord( 1253 + "fm.teal.alpha.feed.play", 1254 + record, 1255 + useSelfRkey, 1256 + ); 1257 + } 1258 + 1259 + async updateRecord( 1260 + rkey: string, 1261 + record: FmTealAlphaFeedPlay, 1262 + ): Promise<{ uri: string; cid: string }> { 1263 + return await this.client.updateRecord( 1264 + "fm.teal.alpha.feed.play", 1265 + rkey, 1266 + record, 1267 + ); 1268 + } 1269 + 1270 + async deleteRecord(rkey: string): Promise<void> { 1271 + return await this.client.deleteRecord("fm.teal.alpha.feed.play", rkey); 1272 + } 1059 1273 } 1060 1274 1061 - export interface AppBskyRichtextFacet { 1062 - readonly Tag: AppBskyRichtextFacetTag; 1063 - readonly Link: AppBskyRichtextFacetLink; 1064 - readonly Main: AppBskyRichtextFacetMain; 1065 - readonly Mention: AppBskyRichtextFacetMention; 1066 - readonly ByteSlice: AppBskyRichtextFacetByteSlice; 1275 + class FeedAlphaTealFmClient { 1276 + readonly play: PlayFeedAlphaTealFmClient; 1277 + private readonly client: SlicesClient; 1278 + 1279 + constructor(client: SlicesClient) { 1280 + this.client = client; 1281 + this.play = new PlayFeedAlphaTealFmClient(client); 1282 + } 1067 1283 } 1068 1284 1069 - export interface AppBskyActorDefs { 1070 - readonly Nux: AppBskyActorDefsNux; 1071 - readonly MutedWord: AppBskyActorDefsMutedWord; 1072 - readonly SavedFeed: AppBskyActorDefsSavedFeed; 1073 - readonly Preferences: AppBskyActorDefsPreferences; 1074 - readonly ProfileView: AppBskyActorDefsProfileView; 1075 - readonly ViewerState: AppBskyActorDefsViewerState; 1076 - readonly FeedViewPref: AppBskyActorDefsFeedViewPref; 1077 - readonly LabelersPref: AppBskyActorDefsLabelersPref; 1078 - readonly InterestsPref: AppBskyActorDefsInterestsPref; 1079 - readonly KnownFollowers: AppBskyActorDefsKnownFollowers; 1080 - readonly MutedWordsPref: AppBskyActorDefsMutedWordsPref; 1081 - readonly SavedFeedsPref: AppBskyActorDefsSavedFeedsPref; 1082 - readonly ThreadViewPref: AppBskyActorDefsThreadViewPref; 1083 - readonly HiddenPostsPref: AppBskyActorDefsHiddenPostsPref; 1084 - readonly LabelerPrefItem: AppBskyActorDefsLabelerPrefItem; 1085 - readonly MutedWordTarget: AppBskyActorDefsMutedWordTarget; 1086 - readonly AdultContentPref: AppBskyActorDefsAdultContentPref; 1087 - readonly BskyAppStatePref: AppBskyActorDefsBskyAppStatePref; 1088 - readonly ContentLabelPref: AppBskyActorDefsContentLabelPref; 1089 - readonly ProfileViewBasic: AppBskyActorDefsProfileViewBasic; 1090 - readonly SavedFeedsPrefV2: AppBskyActorDefsSavedFeedsPrefV2; 1091 - readonly ProfileAssociated: AppBskyActorDefsProfileAssociated; 1092 - readonly PersonalDetailsPref: AppBskyActorDefsPersonalDetailsPref; 1093 - readonly ProfileViewDetailed: AppBskyActorDefsProfileViewDetailed; 1094 - readonly BskyAppProgressGuide: AppBskyActorDefsBskyAppProgressGuide; 1095 - readonly ProfileAssociatedChat: AppBskyActorDefsProfileAssociatedChat; 1096 - readonly PostInteractionSettingsPref: 1097 - AppBskyActorDefsPostInteractionSettingsPref; 1285 + class AlphaTealFmClient { 1286 + readonly feed: FeedAlphaTealFmClient; 1287 + private readonly client: SlicesClient; 1288 + 1289 + constructor(client: SlicesClient) { 1290 + this.client = client; 1291 + this.feed = new FeedAlphaTealFmClient(client); 1292 + } 1098 1293 } 1099 1294 1100 - export interface AppBskyLabelerDefs { 1101 - readonly LabelerView: AppBskyLabelerDefsLabelerView; 1102 - readonly LabelerPolicies: AppBskyLabelerDefsLabelerPolicies; 1103 - readonly LabelerViewerState: AppBskyLabelerDefsLabelerViewerState; 1104 - readonly LabelerViewDetailed: AppBskyLabelerDefsLabelerViewDetailed; 1295 + class TealFmClient { 1296 + readonly alpha: AlphaTealFmClient; 1297 + private readonly client: SlicesClient; 1298 + 1299 + constructor(client: SlicesClient) { 1300 + this.client = client; 1301 + this.alpha = new AlphaTealFmClient(client); 1302 + } 1105 1303 } 1106 1304 1107 - export interface ComAtprotoLabelDefs { 1108 - readonly Label: ComAtprotoLabelDefsLabel; 1109 - readonly SelfLabel: ComAtprotoLabelDefsSelfLabel; 1110 - readonly LabelValue: ComAtprotoLabelDefsLabelValue; 1111 - readonly SelfLabels: ComAtprotoLabelDefsSelfLabels; 1112 - readonly LabelValueDefinition: ComAtprotoLabelDefsLabelValueDefinition; 1113 - readonly LabelValueDefinitionStrings: 1114 - ComAtprotoLabelDefsLabelValueDefinitionStrings; 1305 + class FmClient { 1306 + readonly teal: TealFmClient; 1307 + private readonly client: SlicesClient; 1308 + 1309 + constructor(client: SlicesClient) { 1310 + this.client = client; 1311 + this.teal = new TealFmClient(client); 1312 + } 1115 1313 } 1116 1314 1117 - class PostgateFeedBskyAppClient { 1315 + class ProfileActorBskyAppClient { 1118 1316 private readonly client: SlicesClient; 1119 1317 1120 1318 constructor(client: SlicesClient) { ··· 1126 1324 limit?: number; 1127 1325 cursor?: string; 1128 1326 where?: { 1129 - [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1327 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1130 1328 WhereCondition; 1131 1329 }; 1132 1330 orWhere?: { 1133 - [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1331 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1134 1332 WhereCondition; 1135 1333 }; 1136 - sortBy?: SortField<AppBskyFeedPostgateSortFields>[]; 1334 + sortBy?: SortField<AppBskyActorProfileSortFields>[]; 1137 1335 }, 1138 - ): Promise<GetRecordsResponse<AppBskyFeedPostgate>> { 1139 - return await this.client.getRecords("app.bsky.feed.postgate", params); 1336 + ): Promise<GetRecordsResponse<AppBskyActorProfile>> { 1337 + return await this.client.getRecords("app.bsky.actor.profile", params); 1140 1338 } 1141 1339 1142 1340 async getRecord( 1143 1341 params: GetRecordParams, 1144 - ): Promise<RecordResponse<AppBskyFeedPostgate>> { 1145 - return await this.client.getRecord("app.bsky.feed.postgate", params); 1342 + ): Promise<RecordResponse<AppBskyActorProfile>> { 1343 + return await this.client.getRecord("app.bsky.actor.profile", params); 1146 1344 } 1147 1345 1148 1346 async countRecords( ··· 1150 1348 limit?: number; 1151 1349 cursor?: string; 1152 1350 where?: { 1153 - [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1351 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1154 1352 WhereCondition; 1155 1353 }; 1156 1354 orWhere?: { 1157 - [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1355 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1158 1356 WhereCondition; 1159 1357 }; 1160 - sortBy?: SortField<AppBskyFeedPostgateSortFields>[]; 1358 + sortBy?: SortField<AppBskyActorProfileSortFields>[]; 1161 1359 }, 1162 1360 ): Promise<CountRecordsResponse> { 1163 - return await this.client.countRecords("app.bsky.feed.postgate", params); 1361 + return await this.client.countRecords("app.bsky.actor.profile", params); 1164 1362 } 1165 1363 1166 1364 async createRecord( 1167 - record: AppBskyFeedPostgate, 1365 + record: AppBskyActorProfile, 1168 1366 useSelfRkey?: boolean, 1169 1367 ): Promise<{ uri: string; cid: string }> { 1170 1368 return await this.client.createRecord( 1171 - "app.bsky.feed.postgate", 1369 + "app.bsky.actor.profile", 1172 1370 record, 1173 1371 useSelfRkey, 1174 1372 ); ··· 1176 1374 1177 1375 async updateRecord( 1178 1376 rkey: string, 1179 - record: AppBskyFeedPostgate, 1377 + record: AppBskyActorProfile, 1180 1378 ): Promise<{ uri: string; cid: string }> { 1181 1379 return await this.client.updateRecord( 1182 - "app.bsky.feed.postgate", 1380 + "app.bsky.actor.profile", 1183 1381 rkey, 1184 1382 record, 1185 1383 ); 1186 1384 } 1187 1385 1188 1386 async deleteRecord(rkey: string): Promise<void> { 1189 - return await this.client.deleteRecord("app.bsky.feed.postgate", rkey); 1387 + return await this.client.deleteRecord("app.bsky.actor.profile", rkey); 1388 + } 1389 + } 1390 + 1391 + class ActorBskyAppClient { 1392 + readonly profile: ProfileActorBskyAppClient; 1393 + private readonly client: SlicesClient; 1394 + 1395 + constructor(client: SlicesClient) { 1396 + this.client = client; 1397 + this.profile = new ProfileActorBskyAppClient(client); 1190 1398 } 1191 1399 } 1192 1400 ··· 1266 1474 } 1267 1475 } 1268 1476 1269 - class FeedBskyAppClient { 1270 - readonly postgate: PostgateFeedBskyAppClient; 1271 - readonly threadgate: ThreadgateFeedBskyAppClient; 1272 - private readonly client: SlicesClient; 1273 - 1274 - constructor(client: SlicesClient) { 1275 - this.client = client; 1276 - this.postgate = new PostgateFeedBskyAppClient(client); 1277 - this.threadgate = new ThreadgateFeedBskyAppClient(client); 1278 - } 1279 - } 1280 - 1281 - class ProfileActorBskyAppClient { 1477 + class PostgateFeedBskyAppClient { 1282 1478 private readonly client: SlicesClient; 1283 1479 1284 1480 constructor(client: SlicesClient) { ··· 1290 1486 limit?: number; 1291 1487 cursor?: string; 1292 1488 where?: { 1293 - [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1489 + [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1294 1490 WhereCondition; 1295 1491 }; 1296 1492 orWhere?: { 1297 - [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1493 + [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1298 1494 WhereCondition; 1299 1495 }; 1300 - sortBy?: SortField<AppBskyActorProfileSortFields>[]; 1496 + sortBy?: SortField<AppBskyFeedPostgateSortFields>[]; 1301 1497 }, 1302 - ): Promise<GetRecordsResponse<AppBskyActorProfile>> { 1303 - return await this.client.getRecords("app.bsky.actor.profile", params); 1498 + ): Promise<GetRecordsResponse<AppBskyFeedPostgate>> { 1499 + return await this.client.getRecords("app.bsky.feed.postgate", params); 1304 1500 } 1305 1501 1306 1502 async getRecord( 1307 1503 params: GetRecordParams, 1308 - ): Promise<RecordResponse<AppBskyActorProfile>> { 1309 - return await this.client.getRecord("app.bsky.actor.profile", params); 1504 + ): Promise<RecordResponse<AppBskyFeedPostgate>> { 1505 + return await this.client.getRecord("app.bsky.feed.postgate", params); 1310 1506 } 1311 1507 1312 1508 async countRecords( ··· 1314 1510 limit?: number; 1315 1511 cursor?: string; 1316 1512 where?: { 1317 - [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1513 + [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1318 1514 WhereCondition; 1319 1515 }; 1320 1516 orWhere?: { 1321 - [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 1517 + [K in AppBskyFeedPostgateSortFields | IndexedRecordFields]?: 1322 1518 WhereCondition; 1323 1519 }; 1324 - sortBy?: SortField<AppBskyActorProfileSortFields>[]; 1520 + sortBy?: SortField<AppBskyFeedPostgateSortFields>[]; 1325 1521 }, 1326 1522 ): Promise<CountRecordsResponse> { 1327 - return await this.client.countRecords("app.bsky.actor.profile", params); 1523 + return await this.client.countRecords("app.bsky.feed.postgate", params); 1328 1524 } 1329 1525 1330 1526 async createRecord( 1331 - record: AppBskyActorProfile, 1527 + record: AppBskyFeedPostgate, 1332 1528 useSelfRkey?: boolean, 1333 1529 ): Promise<{ uri: string; cid: string }> { 1334 1530 return await this.client.createRecord( 1335 - "app.bsky.actor.profile", 1531 + "app.bsky.feed.postgate", 1336 1532 record, 1337 1533 useSelfRkey, 1338 1534 ); ··· 1340 1536 1341 1537 async updateRecord( 1342 1538 rkey: string, 1343 - record: AppBskyActorProfile, 1539 + record: AppBskyFeedPostgate, 1344 1540 ): Promise<{ uri: string; cid: string }> { 1345 1541 return await this.client.updateRecord( 1346 - "app.bsky.actor.profile", 1542 + "app.bsky.feed.postgate", 1347 1543 rkey, 1348 1544 record, 1349 1545 ); 1350 1546 } 1351 1547 1352 1548 async deleteRecord(rkey: string): Promise<void> { 1353 - return await this.client.deleteRecord("app.bsky.actor.profile", rkey); 1549 + return await this.client.deleteRecord("app.bsky.feed.postgate", rkey); 1354 1550 } 1355 1551 } 1356 1552 1357 - class ActorBskyAppClient { 1358 - readonly profile: ProfileActorBskyAppClient; 1553 + class FeedBskyAppClient { 1554 + readonly threadgate: ThreadgateFeedBskyAppClient; 1555 + readonly postgate: PostgateFeedBskyAppClient; 1359 1556 private readonly client: SlicesClient; 1360 1557 1361 1558 constructor(client: SlicesClient) { 1362 1559 this.client = client; 1363 - this.profile = new ProfileActorBskyAppClient(client); 1560 + this.threadgate = new ThreadgateFeedBskyAppClient(client); 1561 + this.postgate = new PostgateFeedBskyAppClient(client); 1364 1562 } 1365 1563 } 1366 1564 1367 1565 class BskyAppClient { 1368 - readonly feed: FeedBskyAppClient; 1369 1566 readonly actor: ActorBskyAppClient; 1567 + readonly feed: FeedBskyAppClient; 1370 1568 private readonly client: SlicesClient; 1371 1569 1372 1570 constructor(client: SlicesClient) { 1373 1571 this.client = client; 1374 - this.feed = new FeedBskyAppClient(client); 1375 1572 this.actor = new ActorBskyAppClient(client); 1573 + this.feed = new FeedBskyAppClient(client); 1376 1574 } 1377 1575 } 1378 1576 ··· 1387 1585 } 1388 1586 1389 1587 export class AtProtoClient extends SlicesClient { 1588 + readonly fm: FmClient; 1390 1589 readonly app: AppClient; 1391 1590 readonly oauth?: OAuthClient | AuthProvider; 1392 1591 ··· 1396 1595 oauthClient?: OAuthClient | AuthProvider, 1397 1596 ) { 1398 1597 super(baseUrl, sliceUri, oauthClient); 1598 + this.fm = new FmClient(this); 1399 1599 this.app = new AppClient(this); 1400 1600 this.oauth = oauthClient; 1401 1601 }