a calm atproto client

added lexicons

goose.art 79d719cc ea366918

verified
+6496 -48
+3 -36
README.md
··· 1 - # sv 2 - 3 - Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). 4 - 5 - ## Creating a project 6 - 7 - If you're seeing this, you've probably already done this step. Congrats! 8 - 9 - ```sh 10 - # create a new project in the current directory 11 - npx sv create 12 - 13 - # create a new project in my-app 14 - npx sv create my-app 15 - ``` 1 + # sunrise 16 2 17 - ## Developing 3 + a cross-lexicon atproto viewer. powered by quickslice (hopefully). 18 4 19 - Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 - 21 - ```sh 22 - npm run dev 23 - 24 - # or start the server and open the app in a new browser tab 25 - npm run dev -- --open 26 - ``` 27 - 28 - ## Building 29 - 30 - To create a production version of your app: 31 - 32 - ```sh 33 - npm run build 34 - ``` 35 - 36 - You can preview the production build with `npm run preview`. 37 - 38 - > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. 5 + collecting lexicons in the `lexicons/` directory and implementing a subset of these lexicons for display in a simple feed.
+666
lexicons/app/bsky/actor/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.actor.defs", 4 + "defs": { 5 + "profileViewBasic": { 6 + "type": "object", 7 + "required": ["did", "handle"], 8 + "properties": { 9 + "did": { "type": "string", "format": "did" }, 10 + "handle": { "type": "string", "format": "handle" }, 11 + "displayName": { 12 + "type": "string", 13 + "maxGraphemes": 64, 14 + "maxLength": 640 15 + }, 16 + "pronouns": { "type": "string" }, 17 + "avatar": { "type": "string", "format": "uri" }, 18 + "associated": { 19 + "type": "ref", 20 + "ref": "#profileAssociated" 21 + }, 22 + "viewer": { "type": "ref", "ref": "#viewerState" }, 23 + "labels": { 24 + "type": "array", 25 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 26 + }, 27 + "createdAt": { "type": "string", "format": "datetime" }, 28 + "verification": { 29 + "type": "ref", 30 + "ref": "#verificationState" 31 + }, 32 + "status": { 33 + "type": "ref", 34 + "ref": "#statusView" 35 + }, 36 + "debug": { 37 + "type": "unknown", 38 + "description": "Debug information for internal development" 39 + } 40 + } 41 + }, 42 + "profileView": { 43 + "type": "object", 44 + "required": ["did", "handle"], 45 + "properties": { 46 + "did": { "type": "string", "format": "did" }, 47 + "handle": { "type": "string", "format": "handle" }, 48 + "displayName": { 49 + "type": "string", 50 + "maxGraphemes": 64, 51 + "maxLength": 640 52 + }, 53 + "pronouns": { "type": "string" }, 54 + "description": { 55 + "type": "string", 56 + "maxGraphemes": 256, 57 + "maxLength": 2560 58 + }, 59 + "avatar": { "type": "string", "format": "uri" }, 60 + "associated": { 61 + "type": "ref", 62 + "ref": "#profileAssociated" 63 + }, 64 + "indexedAt": { "type": "string", "format": "datetime" }, 65 + "createdAt": { "type": "string", "format": "datetime" }, 66 + "viewer": { "type": "ref", "ref": "#viewerState" }, 67 + "labels": { 68 + "type": "array", 69 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 70 + }, 71 + "verification": { 72 + "type": "ref", 73 + "ref": "#verificationState" 74 + }, 75 + "status": { 76 + "type": "ref", 77 + "ref": "#statusView" 78 + }, 79 + "debug": { 80 + "type": "unknown", 81 + "description": "Debug information for internal development" 82 + } 83 + } 84 + }, 85 + "profileViewDetailed": { 86 + "type": "object", 87 + "required": ["did", "handle"], 88 + "properties": { 89 + "did": { "type": "string", "format": "did" }, 90 + "handle": { "type": "string", "format": "handle" }, 91 + "displayName": { 92 + "type": "string", 93 + "maxGraphemes": 64, 94 + "maxLength": 640 95 + }, 96 + "description": { 97 + "type": "string", 98 + "maxGraphemes": 256, 99 + "maxLength": 2560 100 + }, 101 + "pronouns": { "type": "string" }, 102 + "website": { "type": "string", "format": "uri" }, 103 + "avatar": { "type": "string", "format": "uri" }, 104 + "banner": { "type": "string", "format": "uri" }, 105 + "followersCount": { "type": "integer" }, 106 + "followsCount": { "type": "integer" }, 107 + "postsCount": { "type": "integer" }, 108 + "associated": { 109 + "type": "ref", 110 + "ref": "#profileAssociated" 111 + }, 112 + "joinedViaStarterPack": { 113 + "type": "ref", 114 + "ref": "app.bsky.graph.defs#starterPackViewBasic" 115 + }, 116 + "indexedAt": { "type": "string", "format": "datetime" }, 117 + "createdAt": { "type": "string", "format": "datetime" }, 118 + "viewer": { "type": "ref", "ref": "#viewerState" }, 119 + "labels": { 120 + "type": "array", 121 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 122 + }, 123 + "pinnedPost": { 124 + "type": "ref", 125 + "ref": "com.atproto.repo.strongRef" 126 + }, 127 + "verification": { 128 + "type": "ref", 129 + "ref": "#verificationState" 130 + }, 131 + "status": { 132 + "type": "ref", 133 + "ref": "#statusView" 134 + }, 135 + "debug": { 136 + "type": "unknown", 137 + "description": "Debug information for internal development" 138 + } 139 + } 140 + }, 141 + "profileAssociated": { 142 + "type": "object", 143 + "properties": { 144 + "lists": { "type": "integer" }, 145 + "feedgens": { "type": "integer" }, 146 + "starterPacks": { "type": "integer" }, 147 + "labeler": { "type": "boolean" }, 148 + "chat": { "type": "ref", "ref": "#profileAssociatedChat" }, 149 + "activitySubscription": { 150 + "type": "ref", 151 + "ref": "#profileAssociatedActivitySubscription" 152 + } 153 + } 154 + }, 155 + "profileAssociatedChat": { 156 + "type": "object", 157 + "required": ["allowIncoming"], 158 + "properties": { 159 + "allowIncoming": { 160 + "type": "string", 161 + "knownValues": ["all", "none", "following"] 162 + } 163 + } 164 + }, 165 + "profileAssociatedActivitySubscription": { 166 + "type": "object", 167 + "required": ["allowSubscriptions"], 168 + "properties": { 169 + "allowSubscriptions": { 170 + "type": "string", 171 + "knownValues": ["followers", "mutuals", "none"] 172 + } 173 + } 174 + }, 175 + "viewerState": { 176 + "type": "object", 177 + "description": "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.", 178 + "properties": { 179 + "muted": { "type": "boolean" }, 180 + "mutedByList": { 181 + "type": "ref", 182 + "ref": "app.bsky.graph.defs#listViewBasic" 183 + }, 184 + "blockedBy": { "type": "boolean" }, 185 + "blocking": { "type": "string", "format": "at-uri" }, 186 + "blockingByList": { 187 + "type": "ref", 188 + "ref": "app.bsky.graph.defs#listViewBasic" 189 + }, 190 + "following": { "type": "string", "format": "at-uri" }, 191 + "followedBy": { "type": "string", "format": "at-uri" }, 192 + "knownFollowers": { 193 + "description": "This property is present only in selected cases, as an optimization.", 194 + "type": "ref", 195 + "ref": "#knownFollowers" 196 + }, 197 + "activitySubscription": { 198 + "description": "This property is present only in selected cases, as an optimization.", 199 + "type": "ref", 200 + "ref": "app.bsky.notification.defs#activitySubscription" 201 + } 202 + } 203 + }, 204 + "knownFollowers": { 205 + "type": "object", 206 + "description": "The subject's followers whom you also follow", 207 + "required": ["count", "followers"], 208 + "properties": { 209 + "count": { "type": "integer" }, 210 + "followers": { 211 + "type": "array", 212 + "minLength": 0, 213 + "maxLength": 5, 214 + "items": { 215 + "type": "ref", 216 + "ref": "#profileViewBasic" 217 + } 218 + } 219 + } 220 + }, 221 + "verificationState": { 222 + "type": "object", 223 + "description": "Represents the verification information about the user this object is attached to.", 224 + "required": ["verifications", "verifiedStatus", "trustedVerifierStatus"], 225 + "properties": { 226 + "verifications": { 227 + "type": "array", 228 + "description": "All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included.", 229 + "items": { "type": "ref", "ref": "#verificationView" } 230 + }, 231 + "verifiedStatus": { 232 + "type": "string", 233 + "description": "The user's status as a verified account.", 234 + "knownValues": ["valid", "invalid", "none"] 235 + }, 236 + "trustedVerifierStatus": { 237 + "type": "string", 238 + "description": "The user's status as a trusted verifier.", 239 + "knownValues": ["valid", "invalid", "none"] 240 + } 241 + } 242 + }, 243 + "verificationView": { 244 + "type": "object", 245 + "description": "An individual verification for an associated subject.", 246 + "required": ["issuer", "uri", "isValid", "createdAt"], 247 + "properties": { 248 + "issuer": { 249 + "type": "string", 250 + "description": "The user who issued this verification.", 251 + "format": "did" 252 + }, 253 + "uri": { 254 + "type": "string", 255 + "description": "The AT-URI of the verification record.", 256 + "format": "at-uri" 257 + }, 258 + "isValid": { 259 + "type": "boolean", 260 + "description": "True if the verification passes validation, otherwise false." 261 + }, 262 + "createdAt": { 263 + "type": "string", 264 + "description": "Timestamp when the verification was created.", 265 + "format": "datetime" 266 + } 267 + } 268 + }, 269 + "preferences": { 270 + "type": "array", 271 + "items": { 272 + "type": "union", 273 + "refs": [ 274 + "#adultContentPref", 275 + "#contentLabelPref", 276 + "#savedFeedsPref", 277 + "#savedFeedsPrefV2", 278 + "#personalDetailsPref", 279 + "#declaredAgePref", 280 + "#feedViewPref", 281 + "#threadViewPref", 282 + "#interestsPref", 283 + "#mutedWordsPref", 284 + "#hiddenPostsPref", 285 + "#bskyAppStatePref", 286 + "#labelersPref", 287 + "#postInteractionSettingsPref", 288 + "#verificationPrefs" 289 + ] 290 + } 291 + }, 292 + "adultContentPref": { 293 + "type": "object", 294 + "required": ["enabled"], 295 + "properties": { 296 + "enabled": { "type": "boolean", "default": false } 297 + } 298 + }, 299 + "contentLabelPref": { 300 + "type": "object", 301 + "required": ["label", "visibility"], 302 + "properties": { 303 + "labelerDid": { 304 + "type": "string", 305 + "description": "Which labeler does this preference apply to? If undefined, applies globally.", 306 + "format": "did" 307 + }, 308 + "label": { "type": "string" }, 309 + "visibility": { 310 + "type": "string", 311 + "knownValues": ["ignore", "show", "warn", "hide"] 312 + } 313 + } 314 + }, 315 + "savedFeed": { 316 + "type": "object", 317 + "required": ["id", "type", "value", "pinned"], 318 + "properties": { 319 + "id": { 320 + "type": "string" 321 + }, 322 + "type": { 323 + "type": "string", 324 + "knownValues": ["feed", "list", "timeline"] 325 + }, 326 + "value": { 327 + "type": "string" 328 + }, 329 + "pinned": { 330 + "type": "boolean" 331 + } 332 + } 333 + }, 334 + "savedFeedsPrefV2": { 335 + "type": "object", 336 + "required": ["items"], 337 + "properties": { 338 + "items": { 339 + "type": "array", 340 + "items": { 341 + "type": "ref", 342 + "ref": "app.bsky.actor.defs#savedFeed" 343 + } 344 + } 345 + } 346 + }, 347 + "savedFeedsPref": { 348 + "type": "object", 349 + "required": ["pinned", "saved"], 350 + "properties": { 351 + "pinned": { 352 + "type": "array", 353 + "items": { 354 + "type": "string", 355 + "format": "at-uri" 356 + } 357 + }, 358 + "saved": { 359 + "type": "array", 360 + "items": { 361 + "type": "string", 362 + "format": "at-uri" 363 + } 364 + }, 365 + "timelineIndex": { 366 + "type": "integer" 367 + } 368 + } 369 + }, 370 + "personalDetailsPref": { 371 + "type": "object", 372 + "properties": { 373 + "birthDate": { 374 + "type": "string", 375 + "format": "datetime", 376 + "description": "The birth date of account owner." 377 + } 378 + } 379 + }, 380 + "declaredAgePref": { 381 + "type": "object", 382 + "description": "Read-only preference containing value(s) inferred from the user's declared birthdate. Absence of this preference object in the response indicates that the user has not made a declaration.", 383 + "properties": { 384 + "isOverAge13": { 385 + "type": "boolean", 386 + "description": "Indicates if the user has declared that they are over 13 years of age." 387 + }, 388 + "isOverAge16": { 389 + "type": "boolean", 390 + "description": "Indicates if the user has declared that they are over 16 years of age." 391 + }, 392 + "isOverAge18": { 393 + "type": "boolean", 394 + "description": "Indicates if the user has declared that they are over 18 years of age." 395 + } 396 + } 397 + }, 398 + "feedViewPref": { 399 + "type": "object", 400 + "required": ["feed"], 401 + "properties": { 402 + "feed": { 403 + "type": "string", 404 + "description": "The URI of the feed, or an identifier which describes the feed." 405 + }, 406 + "hideReplies": { 407 + "type": "boolean", 408 + "description": "Hide replies in the feed." 409 + }, 410 + "hideRepliesByUnfollowed": { 411 + "type": "boolean", 412 + "description": "Hide replies in the feed if they are not by followed users.", 413 + "default": true 414 + }, 415 + "hideRepliesByLikeCount": { 416 + "type": "integer", 417 + "description": "Hide replies in the feed if they do not have this number of likes." 418 + }, 419 + "hideReposts": { 420 + "type": "boolean", 421 + "description": "Hide reposts in the feed." 422 + }, 423 + "hideQuotePosts": { 424 + "type": "boolean", 425 + "description": "Hide quote posts in the feed." 426 + } 427 + } 428 + }, 429 + "threadViewPref": { 430 + "type": "object", 431 + "properties": { 432 + "sort": { 433 + "type": "string", 434 + "description": "Sorting mode for threads.", 435 + "knownValues": ["oldest", "newest", "most-likes", "random", "hotness"] 436 + } 437 + } 438 + }, 439 + "interestsPref": { 440 + "type": "object", 441 + "required": ["tags"], 442 + "properties": { 443 + "tags": { 444 + "type": "array", 445 + "maxLength": 100, 446 + "items": { "type": "string", "maxLength": 640, "maxGraphemes": 64 }, 447 + "description": "A list of tags which describe the account owner's interests gathered during onboarding." 448 + } 449 + } 450 + }, 451 + "mutedWordTarget": { 452 + "type": "string", 453 + "knownValues": ["content", "tag"], 454 + "maxLength": 640, 455 + "maxGraphemes": 64 456 + }, 457 + "mutedWord": { 458 + "type": "object", 459 + "description": "A word that the account owner has muted.", 460 + "required": ["value", "targets"], 461 + "properties": { 462 + "id": { "type": "string" }, 463 + "value": { 464 + "type": "string", 465 + "description": "The muted word itself.", 466 + "maxLength": 10000, 467 + "maxGraphemes": 1000 468 + }, 469 + "targets": { 470 + "type": "array", 471 + "description": "The intended targets of the muted word.", 472 + "items": { 473 + "type": "ref", 474 + "ref": "app.bsky.actor.defs#mutedWordTarget" 475 + } 476 + }, 477 + "actorTarget": { 478 + "type": "string", 479 + "description": "Groups of users to apply the muted word to. If undefined, applies to all users.", 480 + "knownValues": ["all", "exclude-following"], 481 + "default": "all" 482 + }, 483 + "expiresAt": { 484 + "type": "string", 485 + "format": "datetime", 486 + "description": "The date and time at which the muted word will expire and no longer be applied." 487 + } 488 + } 489 + }, 490 + "mutedWordsPref": { 491 + "type": "object", 492 + "required": ["items"], 493 + "properties": { 494 + "items": { 495 + "type": "array", 496 + "items": { 497 + "type": "ref", 498 + "ref": "app.bsky.actor.defs#mutedWord" 499 + }, 500 + "description": "A list of words the account owner has muted." 501 + } 502 + } 503 + }, 504 + "hiddenPostsPref": { 505 + "type": "object", 506 + "required": ["items"], 507 + "properties": { 508 + "items": { 509 + "type": "array", 510 + "items": { "type": "string", "format": "at-uri" }, 511 + "description": "A list of URIs of posts the account owner has hidden." 512 + } 513 + } 514 + }, 515 + "labelersPref": { 516 + "type": "object", 517 + "required": ["labelers"], 518 + "properties": { 519 + "labelers": { 520 + "type": "array", 521 + "items": { 522 + "type": "ref", 523 + "ref": "#labelerPrefItem" 524 + } 525 + } 526 + } 527 + }, 528 + "labelerPrefItem": { 529 + "type": "object", 530 + "required": ["did"], 531 + "properties": { 532 + "did": { 533 + "type": "string", 534 + "format": "did" 535 + } 536 + } 537 + }, 538 + "bskyAppStatePref": { 539 + "description": "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this.", 540 + "type": "object", 541 + "properties": { 542 + "activeProgressGuide": { 543 + "type": "ref", 544 + "ref": "#bskyAppProgressGuide" 545 + }, 546 + "queuedNudges": { 547 + "description": "An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user.", 548 + "type": "array", 549 + "maxLength": 1000, 550 + "items": { "type": "string", "maxLength": 100 } 551 + }, 552 + "nuxs": { 553 + "description": "Storage for NUXs the user has encountered.", 554 + "type": "array", 555 + "maxLength": 100, 556 + "items": { 557 + "type": "ref", 558 + "ref": "app.bsky.actor.defs#nux" 559 + } 560 + } 561 + } 562 + }, 563 + "bskyAppProgressGuide": { 564 + "description": "If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress.", 565 + "type": "object", 566 + "required": ["guide"], 567 + "properties": { 568 + "guide": { "type": "string", "maxLength": 100 } 569 + } 570 + }, 571 + "nux": { 572 + "type": "object", 573 + "description": "A new user experiences (NUX) storage object", 574 + "required": ["id", "completed"], 575 + "properties": { 576 + "id": { 577 + "type": "string", 578 + "maxLength": 100 579 + }, 580 + "completed": { 581 + "type": "boolean", 582 + "default": false 583 + }, 584 + "data": { 585 + "description": "Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.", 586 + "type": "string", 587 + "maxLength": 3000, 588 + "maxGraphemes": 300 589 + }, 590 + "expiresAt": { 591 + "type": "string", 592 + "format": "datetime", 593 + "description": "The date and time at which the NUX will expire and should be considered completed." 594 + } 595 + } 596 + }, 597 + "verificationPrefs": { 598 + "type": "object", 599 + "description": "Preferences for how verified accounts appear in the app.", 600 + "required": [], 601 + "properties": { 602 + "hideBadges": { 603 + "description": "Hide the blue check badges for verified accounts and trusted verifiers.", 604 + "type": "boolean", 605 + "default": false 606 + } 607 + } 608 + }, 609 + "postInteractionSettingsPref": { 610 + "type": "object", 611 + "description": "Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly.", 612 + "required": [], 613 + "properties": { 614 + "threadgateAllowRules": { 615 + "description": "Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply.", 616 + "type": "array", 617 + "maxLength": 5, 618 + "items": { 619 + "type": "union", 620 + "refs": [ 621 + "app.bsky.feed.threadgate#mentionRule", 622 + "app.bsky.feed.threadgate#followerRule", 623 + "app.bsky.feed.threadgate#followingRule", 624 + "app.bsky.feed.threadgate#listRule" 625 + ] 626 + } 627 + }, 628 + "postgateEmbeddingRules": { 629 + "description": "Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed.", 630 + "type": "array", 631 + "maxLength": 5, 632 + "items": { 633 + "type": "union", 634 + "refs": ["app.bsky.feed.postgate#disableRule"] 635 + } 636 + } 637 + } 638 + }, 639 + "statusView": { 640 + "type": "object", 641 + "required": ["status", "record"], 642 + "properties": { 643 + "status": { 644 + "type": "string", 645 + "description": "The status for the account.", 646 + "knownValues": ["app.bsky.actor.status#live"] 647 + }, 648 + "record": { "type": "unknown" }, 649 + "embed": { 650 + "type": "union", 651 + "description": "An optional embed associated with the status.", 652 + "refs": ["app.bsky.embed.external#view"] 653 + }, 654 + "expiresAt": { 655 + "type": "string", 656 + "description": "The date when this status will expire. The application might choose to no longer return the status after expiration.", 657 + "format": "datetime" 658 + }, 659 + "isActive": { 660 + "type": "boolean", 661 + "description": "True if the status is not expired, false if it is expired. Only present if expiration was set." 662 + } 663 + } 664 + } 665 + } 666 + }
+57
lexicons/app/bsky/contact/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.contact.defs", 4 + "defs": { 5 + "matchAndContactIndex": { 6 + "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.", 7 + "type": "object", 8 + "required": ["match", "contactIndex"], 9 + "properties": { 10 + "match": { 11 + "description": "Profile of the matched user.", 12 + "type": "ref", 13 + "ref": "app.bsky.actor.defs#profileView" 14 + }, 15 + "contactIndex": { 16 + "description": "The index of this match in the import contact input.", 17 + "type": "integer", 18 + "minimum": 0, 19 + "maximum": 999 20 + } 21 + } 22 + }, 23 + "syncStatus": { 24 + "type": "object", 25 + "required": ["syncedAt", "matchesCount"], 26 + "properties": { 27 + "syncedAt": { 28 + "description": "Last date when contacts where imported.", 29 + "type": "string", 30 + "format": "datetime" 31 + }, 32 + "matchesCount": { 33 + "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.", 34 + "type": "integer", 35 + "minimum": 0 36 + } 37 + } 38 + }, 39 + "notification": { 40 + "description": "A stash object to be sent via bsync representing a notification to be created.", 41 + "type": "object", 42 + "required": ["from", "to"], 43 + "properties": { 44 + "from": { 45 + "description": "The DID of who this notification comes from.", 46 + "type": "string", 47 + "format": "did" 48 + }, 49 + "to": { 50 + "description": "The DID of who this notification should go to.", 51 + "type": "string", 52 + "format": "did" 53 + } 54 + } 55 + } 56 + } 57 + }
+15
lexicons/app/bsky/embed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.defs", 4 + "defs": { 5 + "aspectRatio": { 6 + "type": "object", 7 + "description": "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.", 8 + "required": ["width", "height"], 9 + "properties": { 10 + "width": { "type": "integer", "minimum": 1 }, 11 + "height": { "type": "integer", "minimum": 1 } 12 + } 13 + } 14 + } 15 + }
+51
lexicons/app/bsky/embed/external.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.external", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", 8 + "required": ["external"], 9 + "properties": { 10 + "external": { 11 + "type": "ref", 12 + "ref": "#external" 13 + } 14 + } 15 + }, 16 + "external": { 17 + "type": "object", 18 + "required": ["uri", "title", "description"], 19 + "properties": { 20 + "uri": { "type": "string", "format": "uri" }, 21 + "title": { "type": "string" }, 22 + "description": { "type": "string" }, 23 + "thumb": { 24 + "type": "blob", 25 + "accept": ["image/*"], 26 + "maxSize": 1000000 27 + } 28 + } 29 + }, 30 + "view": { 31 + "type": "object", 32 + "required": ["external"], 33 + "properties": { 34 + "external": { 35 + "type": "ref", 36 + "ref": "#viewExternal" 37 + } 38 + } 39 + }, 40 + "viewExternal": { 41 + "type": "object", 42 + "required": ["uri", "title", "description"], 43 + "properties": { 44 + "uri": { "type": "string", "format": "uri" }, 45 + "title": { "type": "string" }, 46 + "description": { "type": "string" }, 47 + "thumb": { "type": "string", "format": "uri" } 48 + } 49 + } 50 + } 51 + }
+72
lexicons/app/bsky/embed/images.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.images", 4 + "description": "A set of images embedded in a Bluesky record (eg, a post).", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["images"], 9 + "properties": { 10 + "images": { 11 + "type": "array", 12 + "items": { "type": "ref", "ref": "#image" }, 13 + "maxLength": 4 14 + } 15 + } 16 + }, 17 + "image": { 18 + "type": "object", 19 + "required": ["image", "alt"], 20 + "properties": { 21 + "image": { 22 + "type": "blob", 23 + "accept": ["image/*"], 24 + "maxSize": 1000000 25 + }, 26 + "alt": { 27 + "type": "string", 28 + "description": "Alt text description of the image, for accessibility." 29 + }, 30 + "aspectRatio": { 31 + "type": "ref", 32 + "ref": "app.bsky.embed.defs#aspectRatio" 33 + } 34 + } 35 + }, 36 + "view": { 37 + "type": "object", 38 + "required": ["images"], 39 + "properties": { 40 + "images": { 41 + "type": "array", 42 + "items": { "type": "ref", "ref": "#viewImage" }, 43 + "maxLength": 4 44 + } 45 + } 46 + }, 47 + "viewImage": { 48 + "type": "object", 49 + "required": ["thumb", "fullsize", "alt"], 50 + "properties": { 51 + "thumb": { 52 + "type": "string", 53 + "format": "uri", 54 + "description": "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View." 55 + }, 56 + "fullsize": { 57 + "type": "string", 58 + "format": "uri", 59 + "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." 60 + }, 61 + "alt": { 62 + "type": "string", 63 + "description": "Alt text description of the image, for accessibility." 64 + }, 65 + "aspectRatio": { 66 + "type": "ref", 67 + "ref": "app.bsky.embed.defs#aspectRatio" 68 + } 69 + } 70 + } 71 + } 72 + }
+96
lexicons/app/bsky/embed/record.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.record", 4 + "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.", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["record"], 9 + "properties": { 10 + "record": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 11 + } 12 + }, 13 + "view": { 14 + "type": "object", 15 + "required": ["record"], 16 + "properties": { 17 + "record": { 18 + "type": "union", 19 + "refs": [ 20 + "#viewRecord", 21 + "#viewNotFound", 22 + "#viewBlocked", 23 + "#viewDetached", 24 + "app.bsky.feed.defs#generatorView", 25 + "app.bsky.graph.defs#listView", 26 + "app.bsky.labeler.defs#labelerView", 27 + "app.bsky.graph.defs#starterPackViewBasic" 28 + ] 29 + } 30 + } 31 + }, 32 + "viewRecord": { 33 + "type": "object", 34 + "required": ["uri", "cid", "author", "value", "indexedAt"], 35 + "properties": { 36 + "uri": { "type": "string", "format": "at-uri" }, 37 + "cid": { "type": "string", "format": "cid" }, 38 + "author": { 39 + "type": "ref", 40 + "ref": "app.bsky.actor.defs#profileViewBasic" 41 + }, 42 + "value": { 43 + "type": "unknown", 44 + "description": "The record data itself." 45 + }, 46 + "labels": { 47 + "type": "array", 48 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 49 + }, 50 + "replyCount": { "type": "integer" }, 51 + "repostCount": { "type": "integer" }, 52 + "likeCount": { "type": "integer" }, 53 + "quoteCount": { "type": "integer" }, 54 + "embeds": { 55 + "type": "array", 56 + "items": { 57 + "type": "union", 58 + "refs": [ 59 + "app.bsky.embed.images#view", 60 + "app.bsky.embed.video#view", 61 + "app.bsky.embed.external#view", 62 + "app.bsky.embed.record#view", 63 + "app.bsky.embed.recordWithMedia#view" 64 + ] 65 + } 66 + }, 67 + "indexedAt": { "type": "string", "format": "datetime" } 68 + } 69 + }, 70 + "viewNotFound": { 71 + "type": "object", 72 + "required": ["uri", "notFound"], 73 + "properties": { 74 + "uri": { "type": "string", "format": "at-uri" }, 75 + "notFound": { "type": "boolean", "const": true } 76 + } 77 + }, 78 + "viewBlocked": { 79 + "type": "object", 80 + "required": ["uri", "blocked", "author"], 81 + "properties": { 82 + "uri": { "type": "string", "format": "at-uri" }, 83 + "blocked": { "type": "boolean", "const": true }, 84 + "author": { "type": "ref", "ref": "app.bsky.feed.defs#blockedAuthor" } 85 + } 86 + }, 87 + "viewDetached": { 88 + "type": "object", 89 + "required": ["uri", "detached"], 90 + "properties": { 91 + "uri": { "type": "string", "format": "at-uri" }, 92 + "detached": { "type": "boolean", "const": true } 93 + } 94 + } 95 + } 96 + }
+43
lexicons/app/bsky/embed/recordWithMedia.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.recordWithMedia", 4 + "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.", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["record", "media"], 9 + "properties": { 10 + "record": { 11 + "type": "ref", 12 + "ref": "app.bsky.embed.record" 13 + }, 14 + "media": { 15 + "type": "union", 16 + "refs": [ 17 + "app.bsky.embed.images", 18 + "app.bsky.embed.video", 19 + "app.bsky.embed.external" 20 + ] 21 + } 22 + } 23 + }, 24 + "view": { 25 + "type": "object", 26 + "required": ["record", "media"], 27 + "properties": { 28 + "record": { 29 + "type": "ref", 30 + "ref": "app.bsky.embed.record#view" 31 + }, 32 + "media": { 33 + "type": "union", 34 + "refs": [ 35 + "app.bsky.embed.images#view", 36 + "app.bsky.embed.video#view", 37 + "app.bsky.embed.external#view" 38 + ] 39 + } 40 + } 41 + } 42 + } 43 + }
+331
lexicons/app/bsky/feed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.defs", 4 + "defs": { 5 + "postView": { 6 + "type": "object", 7 + "required": ["uri", "cid", "author", "record", "indexedAt"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "author": { 12 + "type": "ref", 13 + "ref": "app.bsky.actor.defs#profileViewBasic" 14 + }, 15 + "record": { "type": "unknown" }, 16 + "embed": { 17 + "type": "union", 18 + "refs": [ 19 + "app.bsky.embed.images#view", 20 + "app.bsky.embed.video#view", 21 + "app.bsky.embed.external#view", 22 + "app.bsky.embed.record#view", 23 + "app.bsky.embed.recordWithMedia#view" 24 + ] 25 + }, 26 + "bookmarkCount": { "type": "integer" }, 27 + "replyCount": { "type": "integer" }, 28 + "repostCount": { "type": "integer" }, 29 + "likeCount": { "type": "integer" }, 30 + "quoteCount": { "type": "integer" }, 31 + "indexedAt": { "type": "string", "format": "datetime" }, 32 + "viewer": { "type": "ref", "ref": "#viewerState" }, 33 + "labels": { 34 + "type": "array", 35 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 36 + }, 37 + "threadgate": { "type": "ref", "ref": "#threadgateView" }, 38 + "debug": { 39 + "type": "unknown", 40 + "description": "Debug information for internal development" 41 + } 42 + } 43 + }, 44 + "viewerState": { 45 + "type": "object", 46 + "description": "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", 47 + "properties": { 48 + "repost": { "type": "string", "format": "at-uri" }, 49 + "like": { "type": "string", "format": "at-uri" }, 50 + "bookmarked": { "type": "boolean" }, 51 + "threadMuted": { "type": "boolean" }, 52 + "replyDisabled": { "type": "boolean" }, 53 + "embeddingDisabled": { "type": "boolean" }, 54 + "pinned": { "type": "boolean" } 55 + } 56 + }, 57 + "threadContext": { 58 + "type": "object", 59 + "description": "Metadata about this post within the context of the thread it is in.", 60 + "properties": { 61 + "rootAuthorLike": { "type": "string", "format": "at-uri" } 62 + } 63 + }, 64 + "feedViewPost": { 65 + "type": "object", 66 + "required": ["post"], 67 + "properties": { 68 + "post": { "type": "ref", "ref": "#postView" }, 69 + "reply": { "type": "ref", "ref": "#replyRef" }, 70 + "reason": { "type": "union", "refs": ["#reasonRepost", "#reasonPin"] }, 71 + "feedContext": { 72 + "type": "string", 73 + "description": "Context provided by feed generator that may be passed back alongside interactions.", 74 + "maxLength": 2000 75 + }, 76 + "reqId": { 77 + "type": "string", 78 + "description": "Unique identifier per request that may be passed back alongside interactions.", 79 + "maxLength": 100 80 + } 81 + } 82 + }, 83 + "replyRef": { 84 + "type": "object", 85 + "required": ["root", "parent"], 86 + "properties": { 87 + "root": { 88 + "type": "union", 89 + "refs": ["#postView", "#notFoundPost", "#blockedPost"] 90 + }, 91 + "parent": { 92 + "type": "union", 93 + "refs": ["#postView", "#notFoundPost", "#blockedPost"] 94 + }, 95 + "grandparentAuthor": { 96 + "type": "ref", 97 + "ref": "app.bsky.actor.defs#profileViewBasic", 98 + "description": "When parent is a reply to another post, this is the author of that post." 99 + } 100 + } 101 + }, 102 + "reasonRepost": { 103 + "type": "object", 104 + "required": ["by", "indexedAt"], 105 + "properties": { 106 + "by": { "type": "ref", "ref": "app.bsky.actor.defs#profileViewBasic" }, 107 + "uri": { "type": "string", "format": "at-uri" }, 108 + "cid": { "type": "string", "format": "cid" }, 109 + "indexedAt": { "type": "string", "format": "datetime" } 110 + } 111 + }, 112 + "reasonPin": { 113 + "type": "object", 114 + "properties": {} 115 + }, 116 + "threadViewPost": { 117 + "type": "object", 118 + "required": ["post"], 119 + "properties": { 120 + "post": { "type": "ref", "ref": "#postView" }, 121 + "parent": { 122 + "type": "union", 123 + "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] 124 + }, 125 + "replies": { 126 + "type": "array", 127 + "items": { 128 + "type": "union", 129 + "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] 130 + } 131 + }, 132 + "threadContext": { "type": "ref", "ref": "#threadContext" } 133 + } 134 + }, 135 + "notFoundPost": { 136 + "type": "object", 137 + "required": ["uri", "notFound"], 138 + "properties": { 139 + "uri": { "type": "string", "format": "at-uri" }, 140 + "notFound": { "type": "boolean", "const": true } 141 + } 142 + }, 143 + "blockedPost": { 144 + "type": "object", 145 + "required": ["uri", "blocked", "author"], 146 + "properties": { 147 + "uri": { "type": "string", "format": "at-uri" }, 148 + "blocked": { "type": "boolean", "const": true }, 149 + "author": { "type": "ref", "ref": "#blockedAuthor" } 150 + } 151 + }, 152 + "blockedAuthor": { 153 + "type": "object", 154 + "required": ["did"], 155 + "properties": { 156 + "did": { "type": "string", "format": "did" }, 157 + "viewer": { "type": "ref", "ref": "app.bsky.actor.defs#viewerState" } 158 + } 159 + }, 160 + "generatorView": { 161 + "type": "object", 162 + "required": ["uri", "cid", "did", "creator", "displayName", "indexedAt"], 163 + "properties": { 164 + "uri": { "type": "string", "format": "at-uri" }, 165 + "cid": { "type": "string", "format": "cid" }, 166 + "did": { "type": "string", "format": "did" }, 167 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 168 + "displayName": { "type": "string" }, 169 + "description": { 170 + "type": "string", 171 + "maxGraphemes": 300, 172 + "maxLength": 3000 173 + }, 174 + "descriptionFacets": { 175 + "type": "array", 176 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 177 + }, 178 + "avatar": { "type": "string", "format": "uri" }, 179 + "likeCount": { "type": "integer", "minimum": 0 }, 180 + "acceptsInteractions": { "type": "boolean" }, 181 + "labels": { 182 + "type": "array", 183 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 184 + }, 185 + "viewer": { "type": "ref", "ref": "#generatorViewerState" }, 186 + "contentMode": { 187 + "type": "string", 188 + "knownValues": [ 189 + "app.bsky.feed.defs#contentModeUnspecified", 190 + "app.bsky.feed.defs#contentModeVideo" 191 + ] 192 + }, 193 + "indexedAt": { "type": "string", "format": "datetime" } 194 + } 195 + }, 196 + "generatorViewerState": { 197 + "type": "object", 198 + "properties": { 199 + "like": { "type": "string", "format": "at-uri" } 200 + } 201 + }, 202 + "skeletonFeedPost": { 203 + "type": "object", 204 + "required": ["post"], 205 + "properties": { 206 + "post": { "type": "string", "format": "at-uri" }, 207 + "reason": { 208 + "type": "union", 209 + "refs": ["#skeletonReasonRepost", "#skeletonReasonPin"] 210 + }, 211 + "feedContext": { 212 + "type": "string", 213 + "description": "Context that will be passed through to client and may be passed to feed generator back alongside interactions.", 214 + "maxLength": 2000 215 + } 216 + } 217 + }, 218 + "skeletonReasonRepost": { 219 + "type": "object", 220 + "required": ["repost"], 221 + "properties": { 222 + "repost": { "type": "string", "format": "at-uri" } 223 + } 224 + }, 225 + "skeletonReasonPin": { 226 + "type": "object", 227 + "properties": {} 228 + }, 229 + "threadgateView": { 230 + "type": "object", 231 + "properties": { 232 + "uri": { "type": "string", "format": "at-uri" }, 233 + "cid": { "type": "string", "format": "cid" }, 234 + "record": { "type": "unknown" }, 235 + "lists": { 236 + "type": "array", 237 + "items": { "type": "ref", "ref": "app.bsky.graph.defs#listViewBasic" } 238 + } 239 + } 240 + }, 241 + "interaction": { 242 + "type": "object", 243 + "properties": { 244 + "item": { "type": "string", "format": "at-uri" }, 245 + "event": { 246 + "type": "string", 247 + "knownValues": [ 248 + "app.bsky.feed.defs#requestLess", 249 + "app.bsky.feed.defs#requestMore", 250 + "app.bsky.feed.defs#clickthroughItem", 251 + "app.bsky.feed.defs#clickthroughAuthor", 252 + "app.bsky.feed.defs#clickthroughReposter", 253 + "app.bsky.feed.defs#clickthroughEmbed", 254 + "app.bsky.feed.defs#interactionSeen", 255 + "app.bsky.feed.defs#interactionLike", 256 + "app.bsky.feed.defs#interactionRepost", 257 + "app.bsky.feed.defs#interactionReply", 258 + "app.bsky.feed.defs#interactionQuote", 259 + "app.bsky.feed.defs#interactionShare" 260 + ] 261 + }, 262 + "feedContext": { 263 + "type": "string", 264 + "description": "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", 265 + "maxLength": 2000 266 + }, 267 + "reqId": { 268 + "type": "string", 269 + "description": "Unique identifier per request that may be passed back alongside interactions.", 270 + "maxLength": 100 271 + } 272 + } 273 + }, 274 + "requestLess": { 275 + "type": "token", 276 + "description": "Request that less content like the given feed item be shown in the feed" 277 + }, 278 + "requestMore": { 279 + "type": "token", 280 + "description": "Request that more content like the given feed item be shown in the feed" 281 + }, 282 + "clickthroughItem": { 283 + "type": "token", 284 + "description": "User clicked through to the feed item" 285 + }, 286 + "clickthroughAuthor": { 287 + "type": "token", 288 + "description": "User clicked through to the author of the feed item" 289 + }, 290 + "clickthroughReposter": { 291 + "type": "token", 292 + "description": "User clicked through to the reposter of the feed item" 293 + }, 294 + "clickthroughEmbed": { 295 + "type": "token", 296 + "description": "User clicked through to the embedded content of the feed item" 297 + }, 298 + "contentModeUnspecified": { 299 + "type": "token", 300 + "description": "Declares the feed generator returns any types of posts." 301 + }, 302 + "contentModeVideo": { 303 + "type": "token", 304 + "description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds." 305 + }, 306 + "interactionSeen": { 307 + "type": "token", 308 + "description": "Feed item was seen by user" 309 + }, 310 + "interactionLike": { 311 + "type": "token", 312 + "description": "User liked the feed item" 313 + }, 314 + "interactionRepost": { 315 + "type": "token", 316 + "description": "User reposted the feed item" 317 + }, 318 + "interactionReply": { 319 + "type": "token", 320 + "description": "User replied to the feed item" 321 + }, 322 + "interactionQuote": { 323 + "type": "token", 324 + "description": "User quoted the feed item" 325 + }, 326 + "interactionShare": { 327 + "type": "token", 328 + "description": "User shared the feed item" 329 + } 330 + } 331 + }
+96
lexicons/app/bsky/feed/post.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.post", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record containing a Bluesky post.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["text", "createdAt"], 12 + "properties": { 13 + "text": { 14 + "type": "string", 15 + "maxLength": 3000, 16 + "maxGraphemes": 300, 17 + "description": "The primary post content. May be an empty string, if there are embeds." 18 + }, 19 + "entities": { 20 + "type": "array", 21 + "description": "DEPRECATED: replaced by app.bsky.richtext.facet.", 22 + "items": { "type": "ref", "ref": "#entity" } 23 + }, 24 + "facets": { 25 + "type": "array", 26 + "description": "Annotations of text (mentions, URLs, hashtags, etc)", 27 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 28 + }, 29 + "reply": { "type": "ref", "ref": "#replyRef" }, 30 + "embed": { 31 + "type": "union", 32 + "refs": [ 33 + "app.bsky.embed.images", 34 + "app.bsky.embed.video", 35 + "app.bsky.embed.external", 36 + "app.bsky.embed.record", 37 + "app.bsky.embed.recordWithMedia" 38 + ] 39 + }, 40 + "langs": { 41 + "type": "array", 42 + "description": "Indicates human language of post primary text content.", 43 + "maxLength": 3, 44 + "items": { "type": "string", "format": "language" } 45 + }, 46 + "labels": { 47 + "type": "union", 48 + "description": "Self-label values for this post. Effectively content warnings.", 49 + "refs": ["com.atproto.label.defs#selfLabels"] 50 + }, 51 + "tags": { 52 + "type": "array", 53 + "description": "Additional hashtags, in addition to any included in post text and facets.", 54 + "maxLength": 8, 55 + "items": { "type": "string", "maxLength": 640, "maxGraphemes": 64 } 56 + }, 57 + "createdAt": { 58 + "type": "string", 59 + "format": "datetime", 60 + "description": "Client-declared timestamp when this post was originally created." 61 + } 62 + } 63 + } 64 + }, 65 + "replyRef": { 66 + "type": "object", 67 + "required": ["root", "parent"], 68 + "properties": { 69 + "root": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, 70 + "parent": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 71 + } 72 + }, 73 + "entity": { 74 + "type": "object", 75 + "description": "Deprecated: use facets instead.", 76 + "required": ["index", "type", "value"], 77 + "properties": { 78 + "index": { "type": "ref", "ref": "#textSlice" }, 79 + "type": { 80 + "type": "string", 81 + "description": "Expected values are 'mention' and 'link'." 82 + }, 83 + "value": { "type": "string" } 84 + } 85 + }, 86 + "textSlice": { 87 + "type": "object", 88 + "description": "Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.", 89 + "required": ["start", "end"], 90 + "properties": { 91 + "start": { "type": "integer", "minimum": 0 }, 92 + "end": { "type": "integer", "minimum": 0 } 93 + } 94 + } 95 + } 96 + }
+46
lexicons/app/bsky/feed/postgate.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.postgate", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "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.", 9 + "record": { 10 + "type": "object", 11 + "required": ["post", "createdAt"], 12 + "properties": { 13 + "createdAt": { "type": "string", "format": "datetime" }, 14 + "post": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "Reference (AT-URI) to the post record." 18 + }, 19 + "detachedEmbeddingUris": { 20 + "type": "array", 21 + "maxLength": 50, 22 + "items": { 23 + "type": "string", 24 + "format": "at-uri" 25 + }, 26 + "description": "List of AT-URIs embedding this post that the author has detached from." 27 + }, 28 + "embeddingRules": { 29 + "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.", 30 + "type": "array", 31 + "maxLength": 5, 32 + "items": { 33 + "type": "union", 34 + "refs": ["#disableRule"] 35 + } 36 + } 37 + } 38 + } 39 + }, 40 + "disableRule": { 41 + "type": "object", 42 + "description": "Disables embedding of this post.", 43 + "properties": {} 44 + } 45 + } 46 + }
+69
lexicons/app/bsky/feed/threadgate.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.threadgate", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "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.", 9 + "record": { 10 + "type": "object", 11 + "required": ["post", "createdAt"], 12 + "properties": { 13 + "post": { 14 + "type": "string", 15 + "format": "at-uri", 16 + "description": "Reference (AT-URI) to the post record." 17 + }, 18 + "allow": { 19 + "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.", 20 + "type": "array", 21 + "maxLength": 5, 22 + "items": { 23 + "type": "union", 24 + "refs": [ 25 + "#mentionRule", 26 + "#followerRule", 27 + "#followingRule", 28 + "#listRule" 29 + ] 30 + } 31 + }, 32 + "createdAt": { "type": "string", "format": "datetime" }, 33 + "hiddenReplies": { 34 + "type": "array", 35 + "maxLength": 300, 36 + "items": { 37 + "type": "string", 38 + "format": "at-uri" 39 + }, 40 + "description": "List of hidden reply URIs." 41 + } 42 + } 43 + } 44 + }, 45 + "mentionRule": { 46 + "type": "object", 47 + "description": "Allow replies from actors mentioned in your post.", 48 + "properties": {} 49 + }, 50 + "followerRule": { 51 + "type": "object", 52 + "description": "Allow replies from actors who follow you.", 53 + "properties": {} 54 + }, 55 + "followingRule": { 56 + "type": "object", 57 + "description": "Allow replies from actors you follow.", 58 + "properties": {} 59 + }, 60 + "listRule": { 61 + "type": "object", 62 + "description": "Allow replies from actors on a list.", 63 + "required": ["list"], 64 + "properties": { 65 + "list": { "type": "string", "format": "at-uri" } 66 + } 67 + } 68 + } 69 + }
+186
lexicons/app/bsky/graph/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.graph.defs", 4 + "defs": { 5 + "listViewBasic": { 6 + "type": "object", 7 + "required": ["uri", "cid", "name", "purpose"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "name": { "type": "string", "maxLength": 64, "minLength": 1 }, 12 + "purpose": { "type": "ref", "ref": "#listPurpose" }, 13 + "avatar": { "type": "string", "format": "uri" }, 14 + "listItemCount": { "type": "integer", "minimum": 0 }, 15 + "labels": { 16 + "type": "array", 17 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 18 + }, 19 + "viewer": { "type": "ref", "ref": "#listViewerState" }, 20 + "indexedAt": { "type": "string", "format": "datetime" } 21 + } 22 + }, 23 + "listView": { 24 + "type": "object", 25 + "required": ["uri", "cid", "creator", "name", "purpose", "indexedAt"], 26 + "properties": { 27 + "uri": { "type": "string", "format": "at-uri" }, 28 + "cid": { "type": "string", "format": "cid" }, 29 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 30 + "name": { "type": "string", "maxLength": 64, "minLength": 1 }, 31 + "purpose": { "type": "ref", "ref": "#listPurpose" }, 32 + "description": { 33 + "type": "string", 34 + "maxGraphemes": 300, 35 + "maxLength": 3000 36 + }, 37 + "descriptionFacets": { 38 + "type": "array", 39 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 40 + }, 41 + "avatar": { "type": "string", "format": "uri" }, 42 + "listItemCount": { "type": "integer", "minimum": 0 }, 43 + "labels": { 44 + "type": "array", 45 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 46 + }, 47 + "viewer": { "type": "ref", "ref": "#listViewerState" }, 48 + "indexedAt": { "type": "string", "format": "datetime" } 49 + } 50 + }, 51 + "listItemView": { 52 + "type": "object", 53 + "required": ["uri", "subject"], 54 + "properties": { 55 + "uri": { "type": "string", "format": "at-uri" }, 56 + "subject": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" } 57 + } 58 + }, 59 + "starterPackView": { 60 + "type": "object", 61 + "required": ["uri", "cid", "record", "creator", "indexedAt"], 62 + "properties": { 63 + "uri": { "type": "string", "format": "at-uri" }, 64 + "cid": { "type": "string", "format": "cid" }, 65 + "record": { "type": "unknown" }, 66 + "creator": { 67 + "type": "ref", 68 + "ref": "app.bsky.actor.defs#profileViewBasic" 69 + }, 70 + "list": { "type": "ref", "ref": "#listViewBasic" }, 71 + "listItemsSample": { 72 + "type": "array", 73 + "maxLength": 12, 74 + "items": { "type": "ref", "ref": "#listItemView" } 75 + }, 76 + "feeds": { 77 + "type": "array", 78 + "maxLength": 3, 79 + "items": { "type": "ref", "ref": "app.bsky.feed.defs#generatorView" } 80 + }, 81 + "joinedWeekCount": { "type": "integer", "minimum": 0 }, 82 + "joinedAllTimeCount": { "type": "integer", "minimum": 0 }, 83 + "labels": { 84 + "type": "array", 85 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 86 + }, 87 + "indexedAt": { "type": "string", "format": "datetime" } 88 + } 89 + }, 90 + "starterPackViewBasic": { 91 + "type": "object", 92 + "required": ["uri", "cid", "record", "creator", "indexedAt"], 93 + "properties": { 94 + "uri": { "type": "string", "format": "at-uri" }, 95 + "cid": { "type": "string", "format": "cid" }, 96 + "record": { "type": "unknown" }, 97 + "creator": { 98 + "type": "ref", 99 + "ref": "app.bsky.actor.defs#profileViewBasic" 100 + }, 101 + "listItemCount": { "type": "integer", "minimum": 0 }, 102 + "joinedWeekCount": { "type": "integer", "minimum": 0 }, 103 + "joinedAllTimeCount": { "type": "integer", "minimum": 0 }, 104 + "labels": { 105 + "type": "array", 106 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 107 + }, 108 + "indexedAt": { "type": "string", "format": "datetime" } 109 + } 110 + }, 111 + "listPurpose": { 112 + "type": "string", 113 + "knownValues": [ 114 + "app.bsky.graph.defs#modlist", 115 + "app.bsky.graph.defs#curatelist", 116 + "app.bsky.graph.defs#referencelist" 117 + ] 118 + }, 119 + "modlist": { 120 + "type": "token", 121 + "description": "A list of actors to apply an aggregate moderation action (mute/block) on." 122 + }, 123 + "curatelist": { 124 + "type": "token", 125 + "description": "A list of actors used for curation purposes such as list feeds or interaction gating." 126 + }, 127 + "referencelist": { 128 + "type": "token", 129 + "description": "A list of actors used for only for reference purposes such as within a starter pack." 130 + }, 131 + "listViewerState": { 132 + "type": "object", 133 + "properties": { 134 + "muted": { "type": "boolean" }, 135 + "blocked": { "type": "string", "format": "at-uri" } 136 + } 137 + }, 138 + "notFoundActor": { 139 + "type": "object", 140 + "description": "indicates that a handle or DID could not be resolved", 141 + "required": ["actor", "notFound"], 142 + "properties": { 143 + "actor": { "type": "string", "format": "at-identifier" }, 144 + "notFound": { "type": "boolean", "const": true } 145 + } 146 + }, 147 + "relationship": { 148 + "type": "object", 149 + "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)", 150 + "required": ["did"], 151 + "properties": { 152 + "did": { "type": "string", "format": "did" }, 153 + "following": { 154 + "type": "string", 155 + "format": "at-uri", 156 + "description": "if the actor follows this DID, this is the AT-URI of the follow record" 157 + }, 158 + "followedBy": { 159 + "type": "string", 160 + "format": "at-uri", 161 + "description": "if the actor is followed by this DID, contains the AT-URI of the follow record" 162 + }, 163 + "blocking": { 164 + "type": "string", 165 + "format": "at-uri", 166 + "description": "if the actor blocks this DID, this is the AT-URI of the block record" 167 + }, 168 + "blockedBy": { 169 + "type": "string", 170 + "format": "at-uri", 171 + "description": "if the actor is blocked by this DID, contains the AT-URI of the block record" 172 + }, 173 + "blockingByList": { 174 + "type": "string", 175 + "format": "at-uri", 176 + "description": "if the actor blocks this DID via a block list, this is the AT-URI of the listblock record" 177 + }, 178 + "blockedByList": { 179 + "type": "string", 180 + "format": "at-uri", 181 + "description": "if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record" 182 + } 183 + } 184 + } 185 + } 186 + }
+91
lexicons/app/bsky/labeler/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.labeler.defs", 4 + "defs": { 5 + "labelerView": { 6 + "type": "object", 7 + "required": ["uri", "cid", "creator", "indexedAt"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 12 + "likeCount": { "type": "integer", "minimum": 0 }, 13 + "viewer": { "type": "ref", "ref": "#labelerViewerState" }, 14 + "indexedAt": { "type": "string", "format": "datetime" }, 15 + "labels": { 16 + "type": "array", 17 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 18 + } 19 + } 20 + }, 21 + "labelerViewDetailed": { 22 + "type": "object", 23 + "required": ["uri", "cid", "creator", "policies", "indexedAt"], 24 + "properties": { 25 + "uri": { "type": "string", "format": "at-uri" }, 26 + "cid": { "type": "string", "format": "cid" }, 27 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 28 + "policies": { 29 + "type": "ref", 30 + "ref": "app.bsky.labeler.defs#labelerPolicies" 31 + }, 32 + "likeCount": { "type": "integer", "minimum": 0 }, 33 + "viewer": { "type": "ref", "ref": "#labelerViewerState" }, 34 + "indexedAt": { "type": "string", "format": "datetime" }, 35 + "labels": { 36 + "type": "array", 37 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 38 + }, 39 + "reasonTypes": { 40 + "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.", 41 + "type": "array", 42 + "items": { 43 + "type": "ref", 44 + "ref": "com.atproto.moderation.defs#reasonType" 45 + } 46 + }, 47 + "subjectTypes": { 48 + "description": "The set of subject types (account, record, etc) this service accepts reports on.", 49 + "type": "array", 50 + "items": { 51 + "type": "ref", 52 + "ref": "com.atproto.moderation.defs#subjectType" 53 + } 54 + }, 55 + "subjectCollections": { 56 + "type": "array", 57 + "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.", 58 + "items": { "type": "string", "format": "nsid" } 59 + } 60 + } 61 + }, 62 + "labelerViewerState": { 63 + "type": "object", 64 + "properties": { 65 + "like": { "type": "string", "format": "at-uri" } 66 + } 67 + }, 68 + "labelerPolicies": { 69 + "type": "object", 70 + "required": ["labelValues"], 71 + "properties": { 72 + "labelValues": { 73 + "type": "array", 74 + "description": "The label values which this labeler publishes. May include global or custom labels.", 75 + "items": { 76 + "type": "ref", 77 + "ref": "com.atproto.label.defs#labelValue" 78 + } 79 + }, 80 + "labelValueDefinitions": { 81 + "type": "array", 82 + "description": "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", 83 + "items": { 84 + "type": "ref", 85 + "ref": "com.atproto.label.defs#labelValueDefinition" 86 + } 87 + } 88 + } 89 + } 90 + } 91 + }
+88
lexicons/app/bsky/notification/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.notification.defs", 4 + "defs": { 5 + "recordDeleted": { 6 + "type": "object", 7 + "properties": {} 8 + }, 9 + "chatPreference": { 10 + "type": "object", 11 + "required": ["include", "push"], 12 + "properties": { 13 + "include": { "type": "string", "knownValues": ["all", "accepted"] }, 14 + "push": { "type": "boolean" } 15 + } 16 + }, 17 + "filterablePreference": { 18 + "type": "object", 19 + "required": ["include", "list", "push"], 20 + "properties": { 21 + "include": { "type": "string", "knownValues": ["all", "follows"] }, 22 + "list": { "type": "boolean" }, 23 + "push": { "type": "boolean" } 24 + } 25 + }, 26 + "preference": { 27 + "type": "object", 28 + "required": ["list", "push"], 29 + "properties": { 30 + "list": { "type": "boolean" }, 31 + "push": { "type": "boolean" } 32 + } 33 + }, 34 + "preferences": { 35 + "type": "object", 36 + "required": [ 37 + "chat", 38 + "follow", 39 + "like", 40 + "likeViaRepost", 41 + "mention", 42 + "quote", 43 + "reply", 44 + "repost", 45 + "repostViaRepost", 46 + "starterpackJoined", 47 + "subscribedPost", 48 + "unverified", 49 + "verified" 50 + ], 51 + "properties": { 52 + "chat": { "type": "ref", "ref": "#chatPreference" }, 53 + "follow": { "type": "ref", "ref": "#filterablePreference" }, 54 + "like": { "type": "ref", "ref": "#filterablePreference" }, 55 + "likeViaRepost": { "type": "ref", "ref": "#filterablePreference" }, 56 + "mention": { "type": "ref", "ref": "#filterablePreference" }, 57 + "quote": { "type": "ref", "ref": "#filterablePreference" }, 58 + "reply": { "type": "ref", "ref": "#filterablePreference" }, 59 + "repost": { "type": "ref", "ref": "#filterablePreference" }, 60 + "repostViaRepost": { "type": "ref", "ref": "#filterablePreference" }, 61 + "starterpackJoined": { "type": "ref", "ref": "#preference" }, 62 + "subscribedPost": { "type": "ref", "ref": "#preference" }, 63 + "unverified": { "type": "ref", "ref": "#preference" }, 64 + "verified": { "type": "ref", "ref": "#preference" } 65 + } 66 + }, 67 + "activitySubscription": { 68 + "type": "object", 69 + "required": ["post", "reply"], 70 + "properties": { 71 + "post": { "type": "boolean" }, 72 + "reply": { "type": "boolean" } 73 + } 74 + }, 75 + "subjectActivitySubscription": { 76 + "description": "Object used to store activity subscription data in stash.", 77 + "type": "object", 78 + "required": ["subject", "activitySubscription"], 79 + "properties": { 80 + "subject": { "type": "string", "format": "did" }, 81 + "activitySubscription": { 82 + "type": "ref", 83 + "ref": "#activitySubscription" 84 + } 85 + } 86 + } 87 + } 88 + }
+51
lexicons/app/bsky/richtext/facet.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.richtext.facet", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "Annotation of a sub-string within rich text.", 8 + "required": ["index", "features"], 9 + "properties": { 10 + "index": { "type": "ref", "ref": "#byteSlice" }, 11 + "features": { 12 + "type": "array", 13 + "items": { "type": "union", "refs": ["#mention", "#link", "#tag"] } 14 + } 15 + } 16 + }, 17 + "mention": { 18 + "type": "object", 19 + "description": "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", 20 + "required": ["did"], 21 + "properties": { 22 + "did": { "type": "string", "format": "did" } 23 + } 24 + }, 25 + "link": { 26 + "type": "object", 27 + "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", 28 + "required": ["uri"], 29 + "properties": { 30 + "uri": { "type": "string", "format": "uri" } 31 + } 32 + }, 33 + "tag": { 34 + "type": "object", 35 + "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').", 36 + "required": ["tag"], 37 + "properties": { 38 + "tag": { "type": "string", "maxLength": 640, "maxGraphemes": 64 } 39 + } 40 + }, 41 + "byteSlice": { 42 + "type": "object", 43 + "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.", 44 + "required": ["byteStart", "byteEnd"], 45 + "properties": { 46 + "byteStart": { "type": "integer", "minimum": 0 }, 47 + "byteEnd": { "type": "integer", "minimum": 0 } 48 + } 49 + } 50 + } 51 + }
+28
lexicons/app/bsky/video/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.video.defs", 4 + "defs": { 5 + "jobStatus": { 6 + "type": "object", 7 + "required": ["jobId", "did", "state"], 8 + "properties": { 9 + "jobId": { "type": "string" }, 10 + "did": { "type": "string", "format": "did" }, 11 + "state": { 12 + "type": "string", 13 + "description": "The state of the video processing job. All values not listed as a known value indicate that the job is in process.", 14 + "knownValues": ["JOB_STATE_COMPLETED", "JOB_STATE_FAILED"] 15 + }, 16 + "progress": { 17 + "type": "integer", 18 + "minimum": 0, 19 + "maximum": 100, 20 + "description": "Progress within the current processing state." 21 + }, 22 + "blob": { "type": "blob" }, 23 + "error": { "type": "string" }, 24 + "message": { "type": "string" } 25 + } 26 + } 27 + } 28 + }
+67
lexicons/app/bsky/video/video.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.video", 4 + "description": "A video embedded in a Bluesky record (eg, a post).", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["video"], 9 + "properties": { 10 + "video": { 11 + "type": "blob", 12 + "description": "The mp4 video file. May be up to 100mb, formerly limited to 50mb.", 13 + "accept": ["video/mp4"], 14 + "maxSize": 100000000 15 + }, 16 + "captions": { 17 + "type": "array", 18 + "items": { "type": "ref", "ref": "#caption" }, 19 + "maxLength": 20 20 + }, 21 + "alt": { 22 + "type": "string", 23 + "description": "Alt text description of the video, for accessibility.", 24 + "maxGraphemes": 1000, 25 + "maxLength": 10000 26 + }, 27 + "aspectRatio": { 28 + "type": "ref", 29 + "ref": "app.bsky.embed.defs#aspectRatio" 30 + } 31 + } 32 + }, 33 + "caption": { 34 + "type": "object", 35 + "required": ["lang", "file"], 36 + "properties": { 37 + "lang": { 38 + "type": "string", 39 + "format": "language" 40 + }, 41 + "file": { 42 + "type": "blob", 43 + "accept": ["text/vtt"], 44 + "maxSize": 20000 45 + } 46 + } 47 + }, 48 + "view": { 49 + "type": "object", 50 + "required": ["cid", "playlist"], 51 + "properties": { 52 + "cid": { "type": "string", "format": "cid" }, 53 + "playlist": { "type": "string", "format": "uri" }, 54 + "thumbnail": { "type": "string", "format": "uri" }, 55 + "alt": { 56 + "type": "string", 57 + "maxGraphemes": 1000, 58 + "maxLength": 10000 59 + }, 60 + "aspectRatio": { 61 + "type": "ref", 62 + "ref": "app.bsky.embed.defs#aspectRatio" 63 + } 64 + } 65 + } 66 + } 67 + }
+71
lexicons/com/atproto/admin/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.defs", 4 + "defs": { 5 + "statusAttr": { 6 + "type": "object", 7 + "required": ["applied"], 8 + "properties": { 9 + "applied": { "type": "boolean" }, 10 + "ref": { "type": "string" } 11 + } 12 + }, 13 + "accountView": { 14 + "type": "object", 15 + "required": ["did", "handle", "indexedAt"], 16 + "properties": { 17 + "did": { "type": "string", "format": "did" }, 18 + "handle": { "type": "string", "format": "handle" }, 19 + "email": { "type": "string" }, 20 + "relatedRecords": { "type": "array", "items": { "type": "unknown" } }, 21 + "indexedAt": { "type": "string", "format": "datetime" }, 22 + "invitedBy": { 23 + "type": "ref", 24 + "ref": "com.atproto.server.defs#inviteCode" 25 + }, 26 + "invites": { 27 + "type": "array", 28 + "items": { 29 + "type": "ref", 30 + "ref": "com.atproto.server.defs#inviteCode" 31 + } 32 + }, 33 + "invitesDisabled": { "type": "boolean" }, 34 + "emailConfirmedAt": { "type": "string", "format": "datetime" }, 35 + "inviteNote": { "type": "string" }, 36 + "deactivatedAt": { "type": "string", "format": "datetime" }, 37 + "threatSignatures": { 38 + "type": "array", 39 + "items": { 40 + "type": "ref", 41 + "ref": "#threatSignature" 42 + } 43 + } 44 + } 45 + }, 46 + "repoRef": { 47 + "type": "object", 48 + "required": ["did"], 49 + "properties": { 50 + "did": { "type": "string", "format": "did" } 51 + } 52 + }, 53 + "repoBlobRef": { 54 + "type": "object", 55 + "required": ["did", "cid"], 56 + "properties": { 57 + "did": { "type": "string", "format": "did" }, 58 + "cid": { "type": "string", "format": "cid" }, 59 + "recordUri": { "type": "string", "format": "at-uri" } 60 + } 61 + }, 62 + "threatSignature": { 63 + "type": "object", 64 + "required": ["property", "value"], 65 + "properties": { 66 + "property": { "type": "string" }, 67 + "value": { "type": "string" } 68 + } 69 + } 70 + } 71 + }
+22
lexicons/com/atproto/identity/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.defs", 4 + "defs": { 5 + "identityInfo": { 6 + "type": "object", 7 + "required": ["did", "handle", "didDoc"], 8 + "properties": { 9 + "did": { "type": "string", "format": "did" }, 10 + "handle": { 11 + "type": "string", 12 + "format": "handle", 13 + "description": "The validated handle of the account; or 'handle.invalid' if the handle did not bi-directionally match the DID document." 14 + }, 15 + "didDoc": { 16 + "type": "unknown", 17 + "description": "The complete DID document for the identity." 18 + } 19 + } 20 + } 21 + } 22 + }
+156
lexicons/com/atproto/label/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.defs", 4 + "defs": { 5 + "label": { 6 + "type": "object", 7 + "description": "Metadata tag on an atproto resource (eg, repo or record).", 8 + "required": ["src", "uri", "val", "cts"], 9 + "properties": { 10 + "ver": { 11 + "type": "integer", 12 + "description": "The AT Protocol version of the label object." 13 + }, 14 + "src": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the actor who created this label." 18 + }, 19 + "uri": { 20 + "type": "string", 21 + "format": "uri", 22 + "description": "AT URI of the record, repository (account), or other resource that this label applies to." 23 + }, 24 + "cid": { 25 + "type": "string", 26 + "format": "cid", 27 + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 28 + }, 29 + "val": { 30 + "type": "string", 31 + "maxLength": 128, 32 + "description": "The short string name of the value or type of this label." 33 + }, 34 + "neg": { 35 + "type": "boolean", 36 + "description": "If true, this is a negation label, overwriting a previous label." 37 + }, 38 + "cts": { 39 + "type": "string", 40 + "format": "datetime", 41 + "description": "Timestamp when this label was created." 42 + }, 43 + "exp": { 44 + "type": "string", 45 + "format": "datetime", 46 + "description": "Timestamp at which this label expires (no longer applies)." 47 + }, 48 + "sig": { 49 + "type": "bytes", 50 + "description": "Signature of dag-cbor encoded label." 51 + } 52 + } 53 + }, 54 + "selfLabels": { 55 + "type": "object", 56 + "description": "Metadata tags on an atproto record, published by the author within the record.", 57 + "required": ["values"], 58 + "properties": { 59 + "values": { 60 + "type": "array", 61 + "items": { "type": "ref", "ref": "#selfLabel" }, 62 + "maxLength": 10 63 + } 64 + } 65 + }, 66 + "selfLabel": { 67 + "type": "object", 68 + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.", 69 + "required": ["val"], 70 + "properties": { 71 + "val": { 72 + "type": "string", 73 + "maxLength": 128, 74 + "description": "The short string name of the value or type of this label." 75 + } 76 + } 77 + }, 78 + "labelValueDefinition": { 79 + "type": "object", 80 + "description": "Declares a label value and its expected interpretations and behaviors.", 81 + "required": ["identifier", "severity", "blurs", "locales"], 82 + "properties": { 83 + "identifier": { 84 + "type": "string", 85 + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 86 + "maxLength": 100, 87 + "maxGraphemes": 100 88 + }, 89 + "severity": { 90 + "type": "string", 91 + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 92 + "knownValues": ["inform", "alert", "none"] 93 + }, 94 + "blurs": { 95 + "type": "string", 96 + "description": "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.", 97 + "knownValues": ["content", "media", "none"] 98 + }, 99 + "defaultSetting": { 100 + "type": "string", 101 + "description": "The default setting for this label.", 102 + "knownValues": ["ignore", "warn", "hide"], 103 + "default": "warn" 104 + }, 105 + "adultOnly": { 106 + "type": "boolean", 107 + "description": "Does the user need to have adult content enabled in order to configure this label?" 108 + }, 109 + "locales": { 110 + "type": "array", 111 + "items": { "type": "ref", "ref": "#labelValueDefinitionStrings" } 112 + } 113 + } 114 + }, 115 + "labelValueDefinitionStrings": { 116 + "type": "object", 117 + "description": "Strings which describe the label in the UI, localized into a specific language.", 118 + "required": ["lang", "name", "description"], 119 + "properties": { 120 + "lang": { 121 + "type": "string", 122 + "description": "The code of the language these strings are written in.", 123 + "format": "language" 124 + }, 125 + "name": { 126 + "type": "string", 127 + "description": "A short human-readable name for the label.", 128 + "maxGraphemes": 64, 129 + "maxLength": 640 130 + }, 131 + "description": { 132 + "type": "string", 133 + "description": "A longer description of what the label means and why it might be applied.", 134 + "maxGraphemes": 10000, 135 + "maxLength": 100000 136 + } 137 + } 138 + }, 139 + "labelValue": { 140 + "type": "string", 141 + "knownValues": [ 142 + "!hide", 143 + "!no-promote", 144 + "!warn", 145 + "!no-unauthenticated", 146 + "dmca-violation", 147 + "doxxing", 148 + "porn", 149 + "sexual", 150 + "nudity", 151 + "nsfl", 152 + "gore" 153 + ] 154 + } 155 + } 156 + }
+99
lexicons/com/atproto/moderation/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.moderation.defs", 4 + "defs": { 5 + "reasonType": { 6 + "type": "string", 7 + "knownValues": [ 8 + "com.atproto.moderation.defs#reasonSpam", 9 + "com.atproto.moderation.defs#reasonViolation", 10 + "com.atproto.moderation.defs#reasonMisleading", 11 + "com.atproto.moderation.defs#reasonSexual", 12 + "com.atproto.moderation.defs#reasonRude", 13 + "com.atproto.moderation.defs#reasonOther", 14 + "com.atproto.moderation.defs#reasonAppeal", 15 + 16 + "tools.ozone.report.defs#reasonAppeal", 17 + "tools.ozone.report.defs#reasonOther", 18 + 19 + "tools.ozone.report.defs#reasonViolenceAnimal", 20 + "tools.ozone.report.defs#reasonViolenceThreats", 21 + "tools.ozone.report.defs#reasonViolenceGraphicContent", 22 + "tools.ozone.report.defs#reasonViolenceGlorification", 23 + "tools.ozone.report.defs#reasonViolenceExtremistContent", 24 + "tools.ozone.report.defs#reasonViolenceTrafficking", 25 + "tools.ozone.report.defs#reasonViolenceOther", 26 + 27 + "tools.ozone.report.defs#reasonSexualAbuseContent", 28 + "tools.ozone.report.defs#reasonSexualNCII", 29 + "tools.ozone.report.defs#reasonSexualDeepfake", 30 + "tools.ozone.report.defs#reasonSexualAnimal", 31 + "tools.ozone.report.defs#reasonSexualUnlabeled", 32 + "tools.ozone.report.defs#reasonSexualOther", 33 + 34 + "tools.ozone.report.defs#reasonChildSafetyCSAM", 35 + "tools.ozone.report.defs#reasonChildSafetyGroom", 36 + "tools.ozone.report.defs#reasonChildSafetyPrivacy", 37 + "tools.ozone.report.defs#reasonChildSafetyHarassment", 38 + "tools.ozone.report.defs#reasonChildSafetyOther", 39 + 40 + "tools.ozone.report.defs#reasonHarassmentTroll", 41 + "tools.ozone.report.defs#reasonHarassmentTargeted", 42 + "tools.ozone.report.defs#reasonHarassmentHateSpeech", 43 + "tools.ozone.report.defs#reasonHarassmentDoxxing", 44 + "tools.ozone.report.defs#reasonHarassmentOther", 45 + 46 + "tools.ozone.report.defs#reasonMisleadingBot", 47 + "tools.ozone.report.defs#reasonMisleadingImpersonation", 48 + "tools.ozone.report.defs#reasonMisleadingSpam", 49 + "tools.ozone.report.defs#reasonMisleadingScam", 50 + "tools.ozone.report.defs#reasonMisleadingElections", 51 + "tools.ozone.report.defs#reasonMisleadingOther", 52 + 53 + "tools.ozone.report.defs#reasonRuleSiteSecurity", 54 + "tools.ozone.report.defs#reasonRuleProhibitedSales", 55 + "tools.ozone.report.defs#reasonRuleBanEvasion", 56 + "tools.ozone.report.defs#reasonRuleOther", 57 + 58 + "tools.ozone.report.defs#reasonSelfHarmContent", 59 + "tools.ozone.report.defs#reasonSelfHarmED", 60 + "tools.ozone.report.defs#reasonSelfHarmStunts", 61 + "tools.ozone.report.defs#reasonSelfHarmSubstances", 62 + "tools.ozone.report.defs#reasonSelfHarmOther" 63 + ] 64 + }, 65 + "reasonSpam": { 66 + "type": "token", 67 + "description": "Spam: frequent unwanted promotion, replies, mentions. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingSpam`." 68 + }, 69 + "reasonViolation": { 70 + "type": "token", 71 + "description": "Direct violation of server rules, laws, terms of service. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`." 72 + }, 73 + "reasonMisleading": { 74 + "type": "token", 75 + "description": "Misleading identity, affiliation, or content. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingOther`." 76 + }, 77 + "reasonSexual": { 78 + "type": "token", 79 + "description": "Unwanted or mislabeled sexual content. Prefer new lexicon definition `tools.ozone.report.defs#reasonSexualUnlabeled`." 80 + }, 81 + "reasonRude": { 82 + "type": "token", 83 + "description": "Rude, harassing, explicit, or otherwise unwelcoming behavior. Prefer new lexicon definition `tools.ozone.report.defs#reasonHarassmentOther`." 84 + }, 85 + "reasonOther": { 86 + "type": "token", 87 + "description": "Reports not falling under another report category. Prefer new lexicon definition `tools.ozone.report.defs#reasonOther`." 88 + }, 89 + "reasonAppeal": { 90 + "type": "token", 91 + "description": "Appeal a previously taken moderation action" 92 + }, 93 + "subjectType": { 94 + "type": "string", 95 + "description": "Tag describing a type of subject that might be reported.", 96 + "knownValues": ["account", "record", "chat"] 97 + } 98 + } 99 + }
+14
lexicons/com/atproto/repo/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.defs", 4 + "defs": { 5 + "commitMeta": { 6 + "type": "object", 7 + "required": ["cid", "rev"], 8 + "properties": { 9 + "cid": { "type": "string", "format": "cid" }, 10 + "rev": { "type": "string", "format": "tid" } 11 + } 12 + } 13 + } 14 + }
+15
lexicons/com/atproto/repo/strongRef.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.strongRef", 4 + "description": "A URI with a content-hash fingerprint.", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["uri", "cid"], 9 + "properties": { 10 + "uri": { "type": "string", "format": "at-uri" }, 11 + "cid": { "type": "string", "format": "cid" } 12 + } 13 + } 14 + } 15 + }
+38
lexicons/com/atproto/server/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.defs", 4 + "defs": { 5 + "inviteCode": { 6 + "type": "object", 7 + "required": [ 8 + "code", 9 + "available", 10 + "disabled", 11 + "forAccount", 12 + "createdBy", 13 + "createdAt", 14 + "uses" 15 + ], 16 + "properties": { 17 + "code": { "type": "string" }, 18 + "available": { "type": "integer" }, 19 + "disabled": { "type": "boolean" }, 20 + "forAccount": { "type": "string" }, 21 + "createdBy": { "type": "string" }, 22 + "createdAt": { "type": "string", "format": "datetime" }, 23 + "uses": { 24 + "type": "array", 25 + "items": { "type": "ref", "ref": "#inviteCodeUse" } 26 + } 27 + } 28 + }, 29 + "inviteCodeUse": { 30 + "type": "object", 31 + "required": ["usedBy", "usedAt"], 32 + "properties": { 33 + "usedBy": { "type": "string", "format": "did" }, 34 + "usedAt": { "type": "string", "format": "datetime" } 35 + } 36 + } 37 + } 38 + }
+10
lexicons/com/atproto/sync/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.defs", 4 + "defs": { 5 + "hostStatus": { 6 + "type": "string", 7 + "knownValues": ["active", "idle", "offline", "throttled", "banned"] 8 + } 9 + } 10 + }
+34
lexicons/org/tangled/feed/reaction.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.feed.reaction", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "reaction", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "subject": { 19 + "type": "string", 20 + "format": "at-uri" 21 + }, 22 + "reaction": { 23 + "type": "string", 24 + "enum": [ "👍", "👎", "😆", "🎉", "🫤", "❤️", "🚀", "👀" ] 25 + }, 26 + "createdAt": { 27 + "type": "string", 28 + "format": "datetime" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+29
lexicons/org/tangled/feed/star.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.feed.star", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "createdAt" 15 + ], 16 + "properties": { 17 + "subject": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "createdAt": { 22 + "type": "string", 23 + "format": "datetime" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + }
+12
lexicons/org/tangled/issue/closed.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.issue.state.closed", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "token", 9 + "description": "closed issue" 10 + } 11 + } 12 + }
+51
lexicons/org/tangled/issue/comment.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.issue.comment", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "issue", 14 + "body", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "issue": { 19 + "type": "string", 20 + "format": "at-uri" 21 + }, 22 + "body": { 23 + "type": "string" 24 + }, 25 + "createdAt": { 26 + "type": "string", 27 + "format": "datetime" 28 + }, 29 + "replyTo": { 30 + "type": "string", 31 + "format": "at-uri" 32 + }, 33 + "mentions": { 34 + "type": "array", 35 + "items": { 36 + "type": "string", 37 + "format": "did" 38 + } 39 + }, 40 + "references": { 41 + "type": "array", 42 + "items": { 43 + "type": "string", 44 + "format": "at-uri" 45 + } 46 + } 47 + } 48 + } 49 + } 50 + } 51 + }
+46
lexicons/org/tangled/issue/issue.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.issue", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["repo", "title", "createdAt"], 13 + "properties": { 14 + "repo": { 15 + "type": "string", 16 + "format": "at-uri" 17 + }, 18 + "title": { 19 + "type": "string" 20 + }, 21 + "body": { 22 + "type": "string" 23 + }, 24 + "createdAt": { 25 + "type": "string", 26 + "format": "datetime" 27 + }, 28 + "mentions": { 29 + "type": "array", 30 + "items": { 31 + "type": "string", 32 + "format": "did" 33 + } 34 + }, 35 + "references": { 36 + "type": "array", 37 + "items": { 38 + "type": "string", 39 + "format": "at-uri" 40 + } 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+12
lexicons/org/tangled/issue/open.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.issue.state.open", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "token", 9 + "description": "open issue" 10 + } 11 + } 12 + }
+34
lexicons/org/tangled/issue/state.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.issue.state", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "issue", 14 + "state" 15 + ], 16 + "properties": { 17 + "issue": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "state": { 22 + "type": "string", 23 + "description": "state of the issue", 24 + "knownValues": [ 25 + "sh.tangled.repo.issue.state.open", 26 + "sh.tangled.repo.issue.state.closed" 27 + ], 28 + "default": "sh.tangled.repo.issue.state.open" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+24
lexicons/org/tangled/knot/knot.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.knot", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "any", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "createdAt": { 17 + "type": "string", 18 + "format": "datetime" 19 + } 20 + } 21 + } 22 + } 23 + } 24 + }
+73
lexicons/org/tangled/knot/listKeys.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.knot.listKeys", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "List all public keys stored in the knot server", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "description": "Maximum number of keys to return", 14 + "minimum": 1, 15 + "maximum": 1000, 16 + "default": 100 17 + }, 18 + "cursor": { 19 + "type": "string", 20 + "description": "Pagination cursor" 21 + } 22 + } 23 + }, 24 + "output": { 25 + "encoding": "application/json", 26 + "schema": { 27 + "type": "object", 28 + "required": ["keys"], 29 + "properties": { 30 + "keys": { 31 + "type": "array", 32 + "items": { 33 + "type": "ref", 34 + "ref": "#publicKey" 35 + } 36 + }, 37 + "cursor": { 38 + "type": "string", 39 + "description": "Pagination cursor for next page" 40 + } 41 + } 42 + } 43 + }, 44 + "errors": [ 45 + { 46 + "name": "InternalServerError", 47 + "description": "Failed to retrieve public keys" 48 + } 49 + ] 50 + }, 51 + "publicKey": { 52 + "type": "object", 53 + "required": ["did", "key", "createdAt"], 54 + "properties": { 55 + "did": { 56 + "type": "string", 57 + "format": "did", 58 + "description": "DID associated with the public key" 59 + }, 60 + "key": { 61 + "type": "string", 62 + "maxLength": 4096, 63 + "description": "Public key contents" 64 + }, 65 + "createdAt": { 66 + "type": "string", 67 + "format": "datetime", 68 + "description": "Key upload timestamp" 69 + } 70 + } 71 + } 72 + } 73 + }
+34
lexicons/org/tangled/knot/member.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.knot.member", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "domain", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "subject": { 19 + "type": "string", 20 + "format": "did" 21 + }, 22 + "domain": { 23 + "type": "string", 24 + "description": "domain that this member now belongs to" 25 + }, 26 + "createdAt": { 27 + "type": "string", 28 + "format": "datetime" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+25
lexicons/org/tangled/knot/version.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.knot.version", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the version of a knot", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "version" 14 + ], 15 + "properties": { 16 + "version": { 17 + "type": "string" 18 + } 19 + } 20 + } 21 + }, 22 + "errors": [] 23 + } 24 + } 25 + }
+89
lexicons/org/tangled/label/definition.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.label.definition", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "any", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "name", 14 + "valueType", 15 + "scope", 16 + "createdAt" 17 + ], 18 + "properties": { 19 + "name": { 20 + "type": "string", 21 + "description": "The display name of this label.", 22 + "minGraphemes": 1, 23 + "maxGraphemes": 40 24 + }, 25 + "valueType": { 26 + "type": "ref", 27 + "ref": "#valueType", 28 + "description": "The type definition of this label. Appviews may allow sorting for certain types." 29 + }, 30 + "scope": { 31 + "type": "array", 32 + "description": "The areas of the repo this label may apply to, eg.: sh.tangled.repo.issue. Appviews may choose to respect this.", 33 + "items": { 34 + "type": "string", 35 + "format": "nsid" 36 + } 37 + }, 38 + "color": { 39 + "type": "string", 40 + "description": "The hex value for the background color for the label. Appviews may choose to respect this." 41 + }, 42 + "createdAt": { 43 + "type": "string", 44 + "format": "datetime" 45 + }, 46 + "multiple": { 47 + "type": "boolean", 48 + "description": "Whether this label can be repeated for a given entity, eg.: [reviewer:foo, reviewer:bar]" 49 + } 50 + } 51 + } 52 + }, 53 + "valueType": { 54 + "type": "object", 55 + "required": [ 56 + "type", 57 + "format" 58 + ], 59 + "properties": { 60 + "type": { 61 + "type": "string", 62 + "enum": [ 63 + "null", 64 + "boolean", 65 + "integer", 66 + "string" 67 + ], 68 + "description": "The concrete type of this label's value." 69 + }, 70 + "format": { 71 + "type": "string", 72 + "enum": [ 73 + "any", 74 + "did", 75 + "nsid" 76 + ], 77 + "description": "An optional constraint that can be applied on string concrete types." 78 + }, 79 + "enum": { 80 + "type": "array", 81 + "description": "Closed set of values that this label can take.", 82 + "items": { 83 + "type": "string" 84 + } 85 + } 86 + } 87 + } 88 + } 89 + }
+64
lexicons/org/tangled/label/op.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.label.op", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "add", 15 + "delete", 16 + "performedAt" 17 + ], 18 + "properties": { 19 + "subject": { 20 + "type": "string", 21 + "format": "at-uri", 22 + "description": "The subject (task, pull or discussion) of this label. Appviews may apply a `scope` check and refuse this op." 23 + }, 24 + "performedAt": { 25 + "type": "string", 26 + "format": "datetime" 27 + }, 28 + "add": { 29 + "type": "array", 30 + "items": { 31 + "type": "ref", 32 + "ref": "#operand" 33 + } 34 + }, 35 + "delete": { 36 + "type": "array", 37 + "items": { 38 + "type": "ref", 39 + "ref": "#operand" 40 + } 41 + } 42 + } 43 + } 44 + }, 45 + "operand": { 46 + "type": "object", 47 + "required": [ 48 + "key", 49 + "value" 50 + ], 51 + "properties": { 52 + "key": { 53 + "type": "string", 54 + "format": "at-uri", 55 + "description": "ATURI to the label definition" 56 + }, 57 + "value": { 58 + "type": "string", 59 + "description": "Stringified value of the label. This is first unstringed by appviews and then interpreted as a concrete value." 60 + } 61 + } 62 + } 63 + } 64 + }
+31
lexicons/org/tangled/owner.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.owner", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the owner of a service", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "owner" 14 + ], 15 + "properties": { 16 + "owner": { 17 + "type": "string", 18 + "format": "did" 19 + } 20 + } 21 + } 22 + }, 23 + "errors": [ 24 + { 25 + "name": "OwnerNotFound", 26 + "description": "Owner is not set for this service" 27 + } 28 + ] 29 + } 30 + } 31 + }
+207
lexicons/org/tangled/pipeline/pipeline.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.pipeline", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "triggerMetadata", 14 + "workflows" 15 + ], 16 + "properties": { 17 + "triggerMetadata": { 18 + "type": "ref", 19 + "ref": "#triggerMetadata" 20 + }, 21 + "workflows": { 22 + "type": "array", 23 + "items": { 24 + "type": "ref", 25 + "ref": "#workflow" 26 + } 27 + } 28 + } 29 + } 30 + }, 31 + "triggerMetadata": { 32 + "type": "object", 33 + "required": [ 34 + "kind", 35 + "repo" 36 + ], 37 + "properties": { 38 + "kind": { 39 + "type": "string", 40 + "enum": [ 41 + "push", 42 + "pull_request", 43 + "manual" 44 + ] 45 + }, 46 + "repo": { 47 + "type": "ref", 48 + "ref": "#triggerRepo" 49 + }, 50 + "push": { 51 + "type": "ref", 52 + "ref": "#pushTriggerData" 53 + }, 54 + "pullRequest": { 55 + "type": "ref", 56 + "ref": "#pullRequestTriggerData" 57 + }, 58 + "manual": { 59 + "type": "ref", 60 + "ref": "#manualTriggerData" 61 + } 62 + } 63 + }, 64 + "triggerRepo": { 65 + "type": "object", 66 + "required": [ 67 + "knot", 68 + "did", 69 + "repo", 70 + "defaultBranch" 71 + ], 72 + "properties": { 73 + "knot": { 74 + "type": "string" 75 + }, 76 + "did": { 77 + "type": "string", 78 + "format": "did" 79 + }, 80 + "repo": { 81 + "type": "string" 82 + }, 83 + "defaultBranch": { 84 + "type": "string" 85 + } 86 + } 87 + }, 88 + "pushTriggerData": { 89 + "type": "object", 90 + "required": [ 91 + "ref", 92 + "newSha", 93 + "oldSha" 94 + ], 95 + "properties": { 96 + "ref": { 97 + "type": "string" 98 + }, 99 + "newSha": { 100 + "type": "string", 101 + "minLength": 40, 102 + "maxLength": 40 103 + }, 104 + "oldSha": { 105 + "type": "string", 106 + "minLength": 40, 107 + "maxLength": 40 108 + } 109 + } 110 + }, 111 + "pullRequestTriggerData": { 112 + "type": "object", 113 + "required": [ 114 + "sourceBranch", 115 + "targetBranch", 116 + "sourceSha", 117 + "action" 118 + ], 119 + "properties": { 120 + "sourceBranch": { 121 + "type": "string" 122 + }, 123 + "targetBranch": { 124 + "type": "string" 125 + }, 126 + "sourceSha": { 127 + "type": "string", 128 + "minLength": 40, 129 + "maxLength": 40 130 + }, 131 + "action": { 132 + "type": "string" 133 + } 134 + } 135 + }, 136 + "manualTriggerData": { 137 + "type": "object", 138 + "properties": { 139 + "inputs": { 140 + "type": "array", 141 + "items": { 142 + "type": "ref", 143 + "ref": "#pair" 144 + } 145 + } 146 + } 147 + }, 148 + "workflow": { 149 + "type": "object", 150 + "required": [ 151 + "name", 152 + "engine", 153 + "clone", 154 + "raw" 155 + ], 156 + "properties": { 157 + "name": { 158 + "type": "string" 159 + }, 160 + "engine": { 161 + "type": "string" 162 + }, 163 + "clone": { 164 + "type": "ref", 165 + "ref": "#cloneOpts" 166 + }, 167 + "raw": { 168 + "type": "string" 169 + } 170 + } 171 + }, 172 + "cloneOpts": { 173 + "type": "object", 174 + "required": [ 175 + "skip", 176 + "depth", 177 + "submodules" 178 + ], 179 + "properties": { 180 + "skip": { 181 + "type": "boolean" 182 + }, 183 + "depth": { 184 + "type": "integer" 185 + }, 186 + "submodules": { 187 + "type": "boolean" 188 + } 189 + } 190 + }, 191 + "pair": { 192 + "type": "object", 193 + "required": [ 194 + "key", 195 + "value" 196 + ], 197 + "properties": { 198 + "key": { 199 + "type": "string" 200 + }, 201 + "value": { 202 + "type": "string" 203 + } 204 + } 205 + } 206 + } 207 + }
+53
lexicons/org/tangled/pipeline/status.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.pipeline.status", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["pipeline", "workflow", "status", "createdAt"], 13 + "properties": { 14 + "pipeline": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "ATURI of the pipeline" 18 + }, 19 + "workflow": { 20 + "type": "string", 21 + "format": "at-uri", 22 + "description": "name of the workflow within this pipeline" 23 + }, 24 + "status": { 25 + "type": "string", 26 + "description": "status of the workflow", 27 + "enum": [ 28 + "pending", 29 + "running", 30 + "failed", 31 + "timeout", 32 + "cancelled", 33 + "success" 34 + ] 35 + }, 36 + "createdAt": { 37 + "type": "string", 38 + "format": "datetime", 39 + "description": "time of creation of this status update" 40 + }, 41 + "error": { 42 + "type": "string", 43 + "description": "error message if failed" 44 + }, 45 + "exitCode": { 46 + "type": "integer", 47 + "description": "exit code if failed" 48 + } 49 + } 50 + } 51 + } 52 + } 53 + }
+36
lexicons/org/tangled/publicKey.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.publicKey", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "key", 14 + "name", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "key": { 19 + "type": "string", 20 + "maxLength": 4096, 21 + "description": "public key contents" 22 + }, 23 + "name": { 24 + "type": "string", 25 + "description": "human-readable name for this key" 26 + }, 27 + "createdAt": { 28 + "type": "string", 29 + "format": "datetime", 30 + "description": "key upload timestamp" 31 + } 32 + } 33 + } 34 + } 35 + } 36 + }
+12
lexicons/org/tangled/pulls/closed.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.pull.status.closed", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "token", 9 + "description": "closed pull request" 10 + } 11 + } 12 + }
+47
lexicons/org/tangled/pulls/comment.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.pull.comment", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "pull", 14 + "body", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "pull": { 19 + "type": "string", 20 + "format": "at-uri" 21 + }, 22 + "body": { 23 + "type": "string" 24 + }, 25 + "createdAt": { 26 + "type": "string", 27 + "format": "datetime" 28 + }, 29 + "mentions": { 30 + "type": "array", 31 + "items": { 32 + "type": "string", 33 + "format": "did" 34 + } 35 + }, 36 + "references": { 37 + "type": "array", 38 + "items": { 39 + "type": "string", 40 + "format": "at-uri" 41 + } 42 + } 43 + } 44 + } 45 + } 46 + } 47 + }
+12
lexicons/org/tangled/pulls/merged.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.pull.status.merged", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "token", 9 + "description": "merged pull request" 10 + } 11 + } 12 + }
+12
lexicons/org/tangled/pulls/open.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.pull.status.open", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "token", 9 + "description": "open pull request" 10 + } 11 + } 12 + }
+95
lexicons/org/tangled/pulls/pull.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.pull", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "target", 14 + "title", 15 + "patch", 16 + "createdAt" 17 + ], 18 + "properties": { 19 + "target": { 20 + "type": "ref", 21 + "ref": "#target" 22 + }, 23 + "title": { 24 + "type": "string" 25 + }, 26 + "body": { 27 + "type": "string" 28 + }, 29 + "patch": { 30 + "type": "string" 31 + }, 32 + "source": { 33 + "type": "ref", 34 + "ref": "#source" 35 + }, 36 + "createdAt": { 37 + "type": "string", 38 + "format": "datetime" 39 + }, 40 + "mentions": { 41 + "type": "array", 42 + "items": { 43 + "type": "string", 44 + "format": "did" 45 + } 46 + }, 47 + "references": { 48 + "type": "array", 49 + "items": { 50 + "type": "string", 51 + "format": "at-uri" 52 + } 53 + } 54 + } 55 + } 56 + }, 57 + "target": { 58 + "type": "object", 59 + "required": [ 60 + "repo", 61 + "branch" 62 + ], 63 + "properties": { 64 + "repo": { 65 + "type": "string", 66 + "format": "at-uri" 67 + }, 68 + "branch": { 69 + "type": "string" 70 + } 71 + } 72 + }, 73 + "source": { 74 + "type": "object", 75 + "required": [ 76 + "branch", 77 + "sha" 78 + ], 79 + "properties": { 80 + "branch": { 81 + "type": "string" 82 + }, 83 + "sha": { 84 + "type": "string", 85 + "minLength": 40, 86 + "maxLength": 40 87 + }, 88 + "repo": { 89 + "type": "string", 90 + "format": "at-uri" 91 + } 92 + } 93 + } 94 + } 95 + }
+35
lexicons/org/tangled/pulls/state.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.pull.status", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "pull", 14 + "status" 15 + ], 16 + "properties": { 17 + "pull": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "status": { 22 + "type": "string", 23 + "description": "status of the pull request", 24 + "knownValues": [ 25 + "sh.tangled.repo.pull.status.open", 26 + "sh.tangled.repo.pull.status.closed", 27 + "sh.tangled.repo.pull.status.merged" 28 + ], 29 + "default": "sh.tangled.repo.pull.status.open" 30 + } 31 + } 32 + } 33 + } 34 + } 35 + }
+37
lexicons/org/tangled/repo/addSecret.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.addSecret", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Add a CI secret", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "repo", 14 + "key", 15 + "value" 16 + ], 17 + "properties": { 18 + "repo": { 19 + "type": "string", 20 + "format": "at-uri" 21 + }, 22 + "key": { 23 + "type": "string", 24 + "maxLength": 50, 25 + "minLength": 1 26 + }, 27 + "value": { 28 + "type": "string", 29 + "maxLength": 200, 30 + "minLength": 1 31 + } 32 + } 33 + } 34 + } 35 + } 36 + } 37 + }
+55
lexicons/org/tangled/repo/archive.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.archive", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo", "ref"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "ref": { 16 + "type": "string", 17 + "description": "Git reference (branch, tag, or commit SHA)" 18 + }, 19 + "format": { 20 + "type": "string", 21 + "description": "Archive format", 22 + "enum": ["tar", "zip", "tar.gz", "tar.bz2", "tar.xz"], 23 + "default": "tar.gz" 24 + }, 25 + "prefix": { 26 + "type": "string", 27 + "description": "Prefix for files in the archive" 28 + } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "*/*", 33 + "description": "Binary archive data" 34 + }, 35 + "errors": [ 36 + { 37 + "name": "RepoNotFound", 38 + "description": "Repository not found or access denied" 39 + }, 40 + { 41 + "name": "RefNotFound", 42 + "description": "Git reference not found" 43 + }, 44 + { 45 + "name": "InvalidRequest", 46 + "description": "Invalid request parameters" 47 + }, 48 + { 49 + "name": "ArchiveError", 50 + "description": "Failed to create archive" 51 + } 52 + ] 53 + } 54 + } 55 + }
+52
lexicons/org/tangled/repo/artifact.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.artifact", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "name", 14 + "repo", 15 + "tag", 16 + "createdAt", 17 + "artifact" 18 + ], 19 + "properties": { 20 + "name": { 21 + "type": "string", 22 + "description": "name of the artifact" 23 + }, 24 + "repo": { 25 + "type": "string", 26 + "format": "at-uri", 27 + "description": "repo that this artifact is being uploaded to" 28 + }, 29 + "tag": { 30 + "type": "bytes", 31 + "description": "hash of the tag object that this artifact is attached to (only annotated tags are supported)", 32 + "minLength": 20, 33 + "maxLength": 20 34 + }, 35 + "createdAt": { 36 + "type": "string", 37 + "format": "datetime", 38 + "description": "time of creation of this artifact" 39 + }, 40 + "artifact": { 41 + "type": "blob", 42 + "description": "the artifact", 43 + "accept": [ 44 + "*/*" 45 + ], 46 + "maxSize": 52428800 47 + } 48 + } 49 + } 50 + } 51 + } 52 + }
+182
lexicons/org/tangled/repo/blob.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.blob", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": [ 10 + "repo", 11 + "ref", 12 + "path" 13 + ], 14 + "properties": { 15 + "repo": { 16 + "type": "string", 17 + "description": "Repository identifier in format 'did:plc:.../repoName'" 18 + }, 19 + "ref": { 20 + "type": "string", 21 + "description": "Git reference (branch, tag, or commit SHA)" 22 + }, 23 + "path": { 24 + "type": "string", 25 + "description": "Path to the file within the repository" 26 + }, 27 + "raw": { 28 + "type": "boolean", 29 + "description": "Return raw file content instead of JSON response", 30 + "default": false 31 + } 32 + } 33 + }, 34 + "output": { 35 + "encoding": "application/json", 36 + "schema": { 37 + "type": "object", 38 + "required": [ 39 + "ref", 40 + "path" 41 + ], 42 + "properties": { 43 + "ref": { 44 + "type": "string", 45 + "description": "The git reference used" 46 + }, 47 + "path": { 48 + "type": "string", 49 + "description": "The file path" 50 + }, 51 + "content": { 52 + "type": "string", 53 + "description": "File content (base64 encoded for binary files)" 54 + }, 55 + "encoding": { 56 + "type": "string", 57 + "description": "Content encoding", 58 + "enum": [ 59 + "utf-8", 60 + "base64" 61 + ] 62 + }, 63 + "size": { 64 + "type": "integer", 65 + "description": "File size in bytes" 66 + }, 67 + "isBinary": { 68 + "type": "boolean", 69 + "description": "Whether the file is binary" 70 + }, 71 + "mimeType": { 72 + "type": "string", 73 + "description": "MIME type of the file" 74 + }, 75 + "submodule": { 76 + "type": "ref", 77 + "ref": "#submodule", 78 + "description": "Submodule information if path is a submodule" 79 + }, 80 + "lastCommit": { 81 + "type": "ref", 82 + "ref": "#lastCommit" 83 + } 84 + } 85 + } 86 + }, 87 + "errors": [ 88 + { 89 + "name": "RepoNotFound", 90 + "description": "Repository not found or access denied" 91 + }, 92 + { 93 + "name": "RefNotFound", 94 + "description": "Git reference not found" 95 + }, 96 + { 97 + "name": "FileNotFound", 98 + "description": "File not found at the specified path" 99 + }, 100 + { 101 + "name": "InvalidRequest", 102 + "description": "Invalid request parameters" 103 + } 104 + ] 105 + }, 106 + "lastCommit": { 107 + "type": "object", 108 + "required": [ 109 + "hash", 110 + "message", 111 + "when" 112 + ], 113 + "properties": { 114 + "hash": { 115 + "type": "string", 116 + "description": "Commit hash" 117 + }, 118 + "shortHash": { 119 + "type": "string", 120 + "description": "Short commit hash" 121 + }, 122 + "message": { 123 + "type": "string", 124 + "description": "Commit message" 125 + }, 126 + "author": { 127 + "type": "ref", 128 + "ref": "#signature" 129 + }, 130 + "when": { 131 + "type": "string", 132 + "format": "datetime", 133 + "description": "Commit timestamp" 134 + } 135 + } 136 + }, 137 + "signature": { 138 + "type": "object", 139 + "required": [ 140 + "name", 141 + "email", 142 + "when" 143 + ], 144 + "properties": { 145 + "name": { 146 + "type": "string", 147 + "description": "Author name" 148 + }, 149 + "email": { 150 + "type": "string", 151 + "description": "Author email" 152 + }, 153 + "when": { 154 + "type": "string", 155 + "format": "datetime", 156 + "description": "Author timestamp" 157 + } 158 + } 159 + }, 160 + "submodule": { 161 + "type": "object", 162 + "required": [ 163 + "name", 164 + "url" 165 + ], 166 + "properties": { 167 + "name": { 168 + "type": "string", 169 + "description": "Submodule name" 170 + }, 171 + "url": { 172 + "type": "string", 173 + "description": "Submodule repository URL" 174 + }, 175 + "branch": { 176 + "type": "string", 177 + "description": "Branch to track in the submodule" 178 + } 179 + } 180 + } 181 + } 182 + }
+94
lexicons/org/tangled/repo/branch.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.branch", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo", "name"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "name": { 16 + "type": "string", 17 + "description": "Branch name to get information for" 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "object", 25 + "required": ["name", "hash", "when"], 26 + "properties": { 27 + "name": { 28 + "type": "string", 29 + "description": "Branch name" 30 + }, 31 + "hash": { 32 + "type": "string", 33 + "description": "Latest commit hash on this branch" 34 + }, 35 + "shortHash": { 36 + "type": "string", 37 + "description": "Short commit hash" 38 + }, 39 + "when": { 40 + "type": "string", 41 + "format": "datetime", 42 + "description": "Timestamp of latest commit" 43 + }, 44 + "message": { 45 + "type": "string", 46 + "description": "Latest commit message" 47 + }, 48 + "author": { 49 + "type": "ref", 50 + "ref": "#signature" 51 + }, 52 + "isDefault": { 53 + "type": "boolean", 54 + "description": "Whether this is the default branch" 55 + } 56 + } 57 + } 58 + }, 59 + "errors": [ 60 + { 61 + "name": "RepoNotFound", 62 + "description": "Repository not found or access denied" 63 + }, 64 + { 65 + "name": "BranchNotFound", 66 + "description": "Branch not found" 67 + }, 68 + { 69 + "name": "InvalidRequest", 70 + "description": "Invalid request parameters" 71 + } 72 + ] 73 + }, 74 + "signature": { 75 + "type": "object", 76 + "required": ["name", "email", "when"], 77 + "properties": { 78 + "name": { 79 + "type": "string", 80 + "description": "Author name" 81 + }, 82 + "email": { 83 + "type": "string", 84 + "description": "Author email" 85 + }, 86 + "when": { 87 + "type": "string", 88 + "format": "datetime", 89 + "description": "Author timestamp" 90 + } 91 + } 92 + } 93 + } 94 + }
+43
lexicons/org/tangled/repo/branches.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.branches", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "limit": { 16 + "type": "integer", 17 + "description": "Maximum number of branches to return", 18 + "minimum": 1, 19 + "maximum": 100, 20 + "default": 50 21 + }, 22 + "cursor": { 23 + "type": "string", 24 + "description": "Pagination cursor" 25 + } 26 + } 27 + }, 28 + "output": { 29 + "encoding": "*/*" 30 + }, 31 + "errors": [ 32 + { 33 + "name": "RepoNotFound", 34 + "description": "Repository not found or access denied" 35 + }, 36 + { 37 + "name": "InvalidRequest", 38 + "description": "Invalid request parameters" 39 + } 40 + ] 41 + } 42 + } 43 + }
+36
lexicons/org/tangled/repo/collaborator.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.collaborator", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "repo", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "subject": { 19 + "type": "string", 20 + "format": "did" 21 + }, 22 + "repo": { 23 + "type": "string", 24 + "description": "repo to add this user to", 25 + "format": "at-uri" 26 + }, 27 + "createdAt": { 28 + "type": "string", 29 + "format": "datetime" 30 + } 31 + } 32 + } 33 + } 34 + } 35 + } 36 +
+49
lexicons/org/tangled/repo/compare.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.compare", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo", "rev1", "rev2"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "rev1": { 16 + "type": "string", 17 + "description": "First revision (commit, branch, or tag)" 18 + }, 19 + "rev2": { 20 + "type": "string", 21 + "description": "Second revision (commit, branch, or tag)" 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "*/*", 27 + "description": "Compare output in application/json" 28 + }, 29 + "errors": [ 30 + { 31 + "name": "RepoNotFound", 32 + "description": "Repository not found or access denied" 33 + }, 34 + { 35 + "name": "RevisionNotFound", 36 + "description": "One or both revisions not found" 37 + }, 38 + { 39 + "name": "InvalidRequest", 40 + "description": "Invalid request parameters" 41 + }, 42 + { 43 + "name": "CompareError", 44 + "description": "Failed to compare revisions" 45 + } 46 + ] 47 + } 48 + } 49 + }
+33
lexicons/org/tangled/repo/create.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.create", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create a new repository", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "rkey" 14 + ], 15 + "properties": { 16 + "rkey": { 17 + "type": "string", 18 + "description": "Rkey of the repository record" 19 + }, 20 + "defaultBranch": { 21 + "type": "string", 22 + "description": "Default branch to push to" 23 + }, 24 + "source": { 25 + "type": "string", 26 + "description": "A source URL to clone from, populate this when forking or importing a repository." 27 + } 28 + } 29 + } 30 + } 31 + } 32 + } 33 + }
+29
lexicons/org/tangled/repo/defaultBranch.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.setDefaultBranch", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Set the default branch for a repository", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "repo", 14 + "defaultBranch" 15 + ], 16 + "properties": { 17 + "repo": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "defaultBranch": { 22 + "type": "string" 23 + } 24 + } 25 + } 26 + } 27 + } 28 + } 29 + }
+32
lexicons/org/tangled/repo/delete.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.delete", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete a repository", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "name", "rkey"], 13 + "properties": { 14 + "did": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the repository owner" 18 + }, 19 + "name": { 20 + "type": "string", 21 + "description": "Name of the repository to delete" 22 + }, 23 + "rkey": { 24 + "type": "string", 25 + "description": "Rkey of the repository record" 26 + } 27 + } 28 + } 29 + } 30 + } 31 + } 32 + }
+30
lexicons/org/tangled/repo/deleteBranch.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.deleteBranch", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete a branch on this repository", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "repo", 14 + "branch" 15 + ], 16 + "properties": { 17 + "repo": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "branch": { 22 + "type": "string" 23 + } 24 + } 25 + } 26 + } 27 + } 28 + } 29 + } 30 +
+40
lexicons/org/tangled/repo/diff.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.diff", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo", "ref"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "ref": { 16 + "type": "string", 17 + "description": "Git reference (branch, tag, or commit SHA)" 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "*/*" 23 + }, 24 + "errors": [ 25 + { 26 + "name": "RepoNotFound", 27 + "description": "Repository not found or access denied" 28 + }, 29 + { 30 + "name": "RefNotFound", 31 + "description": "Git reference not found" 32 + }, 33 + { 34 + "name": "InvalidRequest", 35 + "description": "Invalid request parameters" 36 + } 37 + ] 38 + } 39 + } 40 + }
+53
lexicons/org/tangled/repo/forkStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.forkStatus", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Check fork status relative to upstream source", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "name", "source", "branch", "hiddenRef"], 13 + "properties": { 14 + "did": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the fork owner" 18 + }, 19 + "name": { 20 + "type": "string", 21 + "description": "Name of the forked repository" 22 + }, 23 + "source": { 24 + "type": "string", 25 + "description": "Source repository URL" 26 + }, 27 + "branch": { 28 + "type": "string", 29 + "description": "Branch to check status for" 30 + }, 31 + "hiddenRef": { 32 + "type": "string", 33 + "description": "Hidden ref to use for comparison" 34 + } 35 + } 36 + } 37 + }, 38 + "output": { 39 + "encoding": "application/json", 40 + "schema": { 41 + "type": "object", 42 + "required": ["status"], 43 + "properties": { 44 + "status": { 45 + "type": "integer", 46 + "description": "Fork status: 0=UpToDate, 1=FastForwardable, 2=Conflict, 3=MissingBranch" 47 + } 48 + } 49 + } 50 + } 51 + } 52 + } 53 + }
+42
lexicons/org/tangled/repo/forkSync.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.forkSync", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Sync a forked repository with its upstream source", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "did", 14 + "source", 15 + "name", 16 + "branch" 17 + ], 18 + "properties": { 19 + "did": { 20 + "type": "string", 21 + "format": "did", 22 + "description": "DID of the fork owner" 23 + }, 24 + "source": { 25 + "type": "string", 26 + "format": "at-uri", 27 + "description": "AT-URI of the source repository" 28 + }, 29 + "name": { 30 + "type": "string", 31 + "description": "Name of the forked repository" 32 + }, 33 + "branch": { 34 + "type": "string", 35 + "description": "Branch to sync" 36 + } 37 + } 38 + } 39 + } 40 + } 41 + } 42 + }
+82
lexicons/org/tangled/repo/getDefaultBranch.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.getDefaultBranch", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + } 15 + } 16 + }, 17 + "output": { 18 + "encoding": "application/json", 19 + "schema": { 20 + "type": "object", 21 + "required": ["name", "hash", "when"], 22 + "properties": { 23 + "name": { 24 + "type": "string", 25 + "description": "Default branch name" 26 + }, 27 + "hash": { 28 + "type": "string", 29 + "description": "Latest commit hash on default branch" 30 + }, 31 + "shortHash": { 32 + "type": "string", 33 + "description": "Short commit hash" 34 + }, 35 + "when": { 36 + "type": "string", 37 + "format": "datetime", 38 + "description": "Timestamp of latest commit" 39 + }, 40 + "message": { 41 + "type": "string", 42 + "description": "Latest commit message" 43 + }, 44 + "author": { 45 + "type": "ref", 46 + "ref": "#signature" 47 + } 48 + } 49 + } 50 + }, 51 + "errors": [ 52 + { 53 + "name": "RepoNotFound", 54 + "description": "Repository not found or access denied" 55 + }, 56 + { 57 + "name": "InvalidRequest", 58 + "description": "Invalid request parameters" 59 + } 60 + ] 61 + }, 62 + "signature": { 63 + "type": "object", 64 + "required": ["name", "email", "when"], 65 + "properties": { 66 + "name": { 67 + "type": "string", 68 + "description": "Author name" 69 + }, 70 + "email": { 71 + "type": "string", 72 + "description": "Author email" 73 + }, 74 + "when": { 75 + "type": "string", 76 + "format": "datetime", 77 + "description": "Author timestamp" 78 + } 79 + } 80 + } 81 + } 82 + }
+59
lexicons/org/tangled/repo/hiddenRef.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.hiddenRef", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create a hidden ref in a repository", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "repo", 14 + "forkRef", 15 + "remoteRef" 16 + ], 17 + "properties": { 18 + "repo": { 19 + "type": "string", 20 + "format": "at-uri", 21 + "description": "AT-URI of the repository" 22 + }, 23 + "forkRef": { 24 + "type": "string", 25 + "description": "Fork reference name" 26 + }, 27 + "remoteRef": { 28 + "type": "string", 29 + "description": "Remote reference name" 30 + } 31 + } 32 + } 33 + }, 34 + "output": { 35 + "encoding": "application/json", 36 + "schema": { 37 + "type": "object", 38 + "required": [ 39 + "success" 40 + ], 41 + "properties": { 42 + "success": { 43 + "type": "boolean", 44 + "description": "Whether the hidden ref was created successfully" 45 + }, 46 + "ref": { 47 + "type": "string", 48 + "description": "The created hidden ref name" 49 + }, 50 + "error": { 51 + "type": "string", 52 + "description": "Error message if creation failed" 53 + } 54 + } 55 + } 56 + } 57 + } 58 + } 59 + }
+99
lexicons/org/tangled/repo/languages.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.languages", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "ref": { 16 + "type": "string", 17 + "description": "Git reference (branch, tag, or commit SHA)", 18 + "default": "HEAD" 19 + } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "required": ["ref", "languages"], 27 + "properties": { 28 + "ref": { 29 + "type": "string", 30 + "description": "The git reference used" 31 + }, 32 + "languages": { 33 + "type": "array", 34 + "items": { 35 + "type": "ref", 36 + "ref": "#language" 37 + } 38 + }, 39 + "totalSize": { 40 + "type": "integer", 41 + "description": "Total size of all analyzed files in bytes" 42 + }, 43 + "totalFiles": { 44 + "type": "integer", 45 + "description": "Total number of files analyzed" 46 + } 47 + } 48 + } 49 + }, 50 + "errors": [ 51 + { 52 + "name": "RepoNotFound", 53 + "description": "Repository not found or access denied" 54 + }, 55 + { 56 + "name": "RefNotFound", 57 + "description": "Git reference not found" 58 + }, 59 + { 60 + "name": "InvalidRequest", 61 + "description": "Invalid request parameters" 62 + } 63 + ] 64 + }, 65 + "language": { 66 + "type": "object", 67 + "required": ["name", "size", "percentage"], 68 + "properties": { 69 + "name": { 70 + "type": "string", 71 + "description": "Programming language name" 72 + }, 73 + "size": { 74 + "type": "integer", 75 + "description": "Total size of files in this language (bytes)" 76 + }, 77 + "percentage": { 78 + "type": "integer", 79 + "description": "Percentage of total codebase (0-100)" 80 + }, 81 + "fileCount": { 82 + "type": "integer", 83 + "description": "Number of files in this language" 84 + }, 85 + "color": { 86 + "type": "string", 87 + "description": "Hex color code for this language" 88 + }, 89 + "extensions": { 90 + "type": "array", 91 + "items": { 92 + "type": "string" 93 + }, 94 + "description": "File extensions associated with this language" 95 + } 96 + } 97 + } 98 + } 99 + }
+67
lexicons/org/tangled/repo/listSecrets.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.listSecrets", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": [ 10 + "repo" 11 + ], 12 + "properties": { 13 + "repo": { 14 + "type": "string", 15 + "format": "at-uri" 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": [ 24 + "secrets" 25 + ], 26 + "properties": { 27 + "secrets": { 28 + "type": "array", 29 + "items": { 30 + "type": "ref", 31 + "ref": "#secret" 32 + } 33 + } 34 + } 35 + } 36 + } 37 + }, 38 + "secret": { 39 + "type": "object", 40 + "required": [ 41 + "repo", 42 + "key", 43 + "createdAt", 44 + "createdBy" 45 + ], 46 + "properties": { 47 + "repo": { 48 + "type": "string", 49 + "format": "at-uri" 50 + }, 51 + "key": { 52 + "type": "string", 53 + "maxLength": 50, 54 + "minLength": 1 55 + }, 56 + "createdAt": { 57 + "type": "string", 58 + "format": "datetime" 59 + }, 60 + "createdBy": { 61 + "type": "string", 62 + "format": "did" 63 + } 64 + } 65 + } 66 + } 67 + }
+60
lexicons/org/tangled/repo/log.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.log", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo", "ref"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "ref": { 16 + "type": "string", 17 + "description": "Git reference (branch, tag, or commit SHA)" 18 + }, 19 + "path": { 20 + "type": "string", 21 + "description": "Path to filter commits by", 22 + "default": "" 23 + }, 24 + "limit": { 25 + "type": "integer", 26 + "description": "Maximum number of commits to return", 27 + "minimum": 1, 28 + "maximum": 100, 29 + "default": 50 30 + }, 31 + "cursor": { 32 + "type": "string", 33 + "description": "Pagination cursor (commit SHA)" 34 + } 35 + } 36 + }, 37 + "output": { 38 + "encoding": "*/*" 39 + }, 40 + "errors": [ 41 + { 42 + "name": "RepoNotFound", 43 + "description": "Repository not found or access denied" 44 + }, 45 + { 46 + "name": "RefNotFound", 47 + "description": "Git reference not found" 48 + }, 49 + { 50 + "name": "PathNotFound", 51 + "description": "Path not found in repository" 52 + }, 53 + { 54 + "name": "InvalidRequest", 55 + "description": "Invalid request parameters" 56 + } 57 + ] 58 + } 59 + } 60 + }
+52
lexicons/org/tangled/repo/merge.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.merge", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Merge a patch into a repository branch", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "name", "patch", "branch"], 13 + "properties": { 14 + "did": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the repository owner" 18 + }, 19 + "name": { 20 + "type": "string", 21 + "description": "Name of the repository" 22 + }, 23 + "patch": { 24 + "type": "string", 25 + "description": "Patch content to merge" 26 + }, 27 + "branch": { 28 + "type": "string", 29 + "description": "Target branch to merge into" 30 + }, 31 + "authorName": { 32 + "type": "string", 33 + "description": "Author name for the merge commit" 34 + }, 35 + "authorEmail": { 36 + "type": "string", 37 + "description": "Author email for the merge commit" 38 + }, 39 + "commitBody": { 40 + "type": "string", 41 + "description": "Additional commit message body" 42 + }, 43 + "commitMessage": { 44 + "type": "string", 45 + "description": "Merge commit message" 46 + } 47 + } 48 + } 49 + } 50 + } 51 + } 52 + }
+79
lexicons/org/tangled/repo/mergeCheck.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.mergeCheck", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Check if a merge is possible between two branches", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "name", "patch", "branch"], 13 + "properties": { 14 + "did": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the repository owner" 18 + }, 19 + "name": { 20 + "type": "string", 21 + "description": "Name of the repository" 22 + }, 23 + "patch": { 24 + "type": "string", 25 + "description": "Patch or pull request to check for merge conflicts" 26 + }, 27 + "branch": { 28 + "type": "string", 29 + "description": "Target branch to merge into" 30 + } 31 + } 32 + } 33 + }, 34 + "output": { 35 + "encoding": "application/json", 36 + "schema": { 37 + "type": "object", 38 + "required": ["is_conflicted"], 39 + "properties": { 40 + "is_conflicted": { 41 + "type": "boolean", 42 + "description": "Whether the merge has conflicts" 43 + }, 44 + "conflicts": { 45 + "type": "array", 46 + "description": "List of files with merge conflicts", 47 + "items": { 48 + "type": "ref", 49 + "ref": "#conflictInfo" 50 + } 51 + }, 52 + "message": { 53 + "type": "string", 54 + "description": "Additional message about the merge check" 55 + }, 56 + "error": { 57 + "type": "string", 58 + "description": "Error message if check failed" 59 + } 60 + } 61 + } 62 + } 63 + }, 64 + "conflictInfo": { 65 + "type": "object", 66 + "required": ["filename", "reason"], 67 + "properties": { 68 + "filename": { 69 + "type": "string", 70 + "description": "Name of the conflicted file" 71 + }, 72 + "reason": { 73 + "type": "string", 74 + "description": "Reason for the conflict" 75 + } 76 + } 77 + } 78 + } 79 + }
+31
lexicons/org/tangled/repo/removeSecret.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.removeSecret", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Remove a CI secret", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "repo", 14 + "key" 15 + ], 16 + "properties": { 17 + "repo": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "key": { 22 + "type": "string", 23 + "maxLength": 50, 24 + "minLength": 1 25 + } 26 + } 27 + } 28 + } 29 + } 30 + } 31 + }
+71
lexicons/org/tangled/repo/repo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "name", 14 + "knot", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "name": { 19 + "type": "string", 20 + "description": "name of the repo" 21 + }, 22 + "knot": { 23 + "type": "string", 24 + "description": "knot where the repo was created" 25 + }, 26 + "spindle": { 27 + "type": "string", 28 + "description": "CI runner to send jobs to and receive results from" 29 + }, 30 + "description": { 31 + "type": "string", 32 + "minGraphemes": 1, 33 + "maxGraphemes": 140 34 + }, 35 + "website": { 36 + "type": "string", 37 + "format": "uri", 38 + "description": "Any URI related to the repo" 39 + }, 40 + "topics": { 41 + "type": "array", 42 + "description": "Topics related to the repo", 43 + "items": { 44 + "type": "string", 45 + "minLength": 1, 46 + "maxLength": 50 47 + }, 48 + "maxLength": 50 49 + }, 50 + "source": { 51 + "type": "string", 52 + "format": "uri", 53 + "description": "source of the repo" 54 + }, 55 + "labels": { 56 + "type": "array", 57 + "description": "List of labels that this repo subscribes to", 58 + "items": { 59 + "type": "string", 60 + "format": "at-uri" 61 + } 62 + }, 63 + "createdAt": { 64 + "type": "string", 65 + "format": "datetime" 66 + } 67 + } 68 + } 69 + } 70 + } 71 + }
+43
lexicons/org/tangled/repo/tags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.tags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "limit": { 16 + "type": "integer", 17 + "description": "Maximum number of tags to return", 18 + "minimum": 1, 19 + "maximum": 100, 20 + "default": 50 21 + }, 22 + "cursor": { 23 + "type": "string", 24 + "description": "Pagination cursor" 25 + } 26 + } 27 + }, 28 + "output": { 29 + "encoding": "*/*" 30 + }, 31 + "errors": [ 32 + { 33 + "name": "RepoNotFound", 34 + "description": "Repository not found or access denied" 35 + }, 36 + { 37 + "name": "InvalidRequest", 38 + "description": "Invalid request parameters" 39 + } 40 + ] 41 + } 42 + } 43 + }
+134
lexicons/org/tangled/repo/tree.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.tree", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "parameters": { 8 + "type": "params", 9 + "required": ["repo", "ref"], 10 + "properties": { 11 + "repo": { 12 + "type": "string", 13 + "description": "Repository identifier in format 'did:plc:.../repoName'" 14 + }, 15 + "ref": { 16 + "type": "string", 17 + "description": "Git reference (branch, tag, or commit SHA)" 18 + }, 19 + "path": { 20 + "type": "string", 21 + "description": "Path within the repository tree", 22 + "default": "" 23 + } 24 + } 25 + }, 26 + "output": { 27 + "encoding": "application/json", 28 + "schema": { 29 + "type": "object", 30 + "required": ["ref", "files"], 31 + "properties": { 32 + "ref": { 33 + "type": "string", 34 + "description": "The git reference used" 35 + }, 36 + "parent": { 37 + "type": "string", 38 + "description": "The parent path in the tree" 39 + }, 40 + "dotdot": { 41 + "type": "string", 42 + "description": "Parent directory path" 43 + }, 44 + "readme": { 45 + "type": "ref", 46 + "ref": "#readme", 47 + "description": "Readme for this file tree" 48 + }, 49 + "files": { 50 + "type": "array", 51 + "items": { 52 + "type": "ref", 53 + "ref": "#treeEntry" 54 + } 55 + } 56 + } 57 + } 58 + }, 59 + "errors": [ 60 + { 61 + "name": "RepoNotFound", 62 + "description": "Repository not found or access denied" 63 + }, 64 + { 65 + "name": "RefNotFound", 66 + "description": "Git reference not found" 67 + }, 68 + { 69 + "name": "PathNotFound", 70 + "description": "Path not found in repository tree" 71 + }, 72 + { 73 + "name": "InvalidRequest", 74 + "description": "Invalid request parameters" 75 + } 76 + ] 77 + }, 78 + "readme": { 79 + "type": "object", 80 + "required": ["filename", "contents"], 81 + "properties": { 82 + "filename": { 83 + "type": "string", 84 + "description": "Name of the readme file" 85 + }, 86 + "contents": { 87 + "type": "string", 88 + "description": "Contents of the readme file" 89 + } 90 + } 91 + }, 92 + "treeEntry": { 93 + "type": "object", 94 + "required": ["name", "mode", "size"], 95 + "properties": { 96 + "name": { 97 + "type": "string", 98 + "description": "Relative file or directory name" 99 + }, 100 + "mode": { 101 + "type": "string", 102 + "description": "File mode" 103 + }, 104 + "size": { 105 + "type": "integer", 106 + "description": "File size in bytes" 107 + }, 108 + "last_commit": { 109 + "type": "ref", 110 + "ref": "#lastCommit" 111 + } 112 + } 113 + }, 114 + "lastCommit": { 115 + "type": "object", 116 + "required": ["hash", "message", "when"], 117 + "properties": { 118 + "hash": { 119 + "type": "string", 120 + "description": "Commit hash" 121 + }, 122 + "message": { 123 + "type": "string", 124 + "description": "Commit message" 125 + }, 126 + "when": { 127 + "type": "string", 128 + "format": "datetime", 129 + "description": "Commit timestamp" 130 + } 131 + } 132 + } 133 + } 134 + }
+34
lexicons/org/tangled/spindle/member.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.spindle.member", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "instance", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "subject": { 19 + "type": "string", 20 + "format": "did" 21 + }, 22 + "instance": { 23 + "type": "string", 24 + "description": "spindle instance that the subject is now a member of" 25 + }, 26 + "createdAt": { 27 + "type": "string", 28 + "format": "datetime" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+25
lexicons/org/tangled/spindle/spindle.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.spindle", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "any", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "createdAt": { 17 + "type": "string", 18 + "format": "datetime" 19 + } 20 + } 21 + } 22 + } 23 + } 24 + } 25 +
+40
lexicons/org/tangled/string/string.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.string", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "filename", 14 + "description", 15 + "createdAt", 16 + "contents" 17 + ], 18 + "properties": { 19 + "filename": { 20 + "type": "string", 21 + "maxGraphemes": 140, 22 + "minGraphemes": 1 23 + }, 24 + "description": { 25 + "type": "string", 26 + "maxGraphemes": 280 27 + }, 28 + "createdAt": { 29 + "type": "string", 30 + "format": "datetime" 31 + }, 32 + "contents": { 33 + "type": "string", 34 + "minGraphemes": 1 35 + } 36 + } 37 + } 38 + } 39 + } 40 + }
+24
lexicons/pub/leaflet/blocks/blockquote.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.blockquote", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "plaintext" 9 + ], 10 + "properties": { 11 + "plaintext": { 12 + "type": "string" 13 + }, 14 + "facets": { 15 + "type": "array", 16 + "items": { 17 + "type": "ref", 18 + "ref": "pub.leaflet.richtext.facet" 19 + } 20 + } 21 + } 22 + } 23 + } 24 + }
+18
lexicons/pub/leaflet/blocks/bskyPost.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.bskyPost", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "postRef" 9 + ], 10 + "properties": { 11 + "postRef": { 12 + "type": "ref", 13 + "ref": "com.atproto.repo.strongRef" 14 + } 15 + } 16 + } 17 + } 18 + }
+22
lexicons/pub/leaflet/blocks/button.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.button", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "text", 9 + "url" 10 + ], 11 + "properties": { 12 + "text": { 13 + "type": "string" 14 + }, 15 + "url": { 16 + "type": "string", 17 + "format": "uri" 18 + } 19 + } 20 + } 21 + } 22 + }
+23
lexicons/pub/leaflet/blocks/code.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.code", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "plaintext" 9 + ], 10 + "properties": { 11 + "plaintext": { 12 + "type": "string" 13 + }, 14 + "language": { 15 + "type": "string" 16 + }, 17 + "syntaxHighlightingTheme": { 18 + "type": "string" 19 + } 20 + } 21 + } 22 + } 23 + }
+29
lexicons/pub/leaflet/blocks/header.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.header", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "plaintext" 9 + ], 10 + "properties": { 11 + "level": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 6 15 + }, 16 + "plaintext": { 17 + "type": "string" 18 + }, 19 + "facets": { 20 + "type": "array", 21 + "items": { 22 + "type": "ref", 23 + "ref": "pub.leaflet.richtext.facet" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + }
+11
lexicons/pub/leaflet/blocks/horizontalRule.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.horizontalRule", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [], 8 + "properties": {} 9 + } 10 + } 11 + }
+23
lexicons/pub/leaflet/blocks/iframe.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.iframe", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "url" 9 + ], 10 + "properties": { 11 + "url": { 12 + "type": "string", 13 + "format": "uri" 14 + }, 15 + "height": { 16 + "type": "integer", 17 + "minimum": 16, 18 + "maximum": 1600 19 + } 20 + } 21 + } 22 + } 23 + }
+45
lexicons/pub/leaflet/blocks/image.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.image", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "image", 9 + "aspectRatio" 10 + ], 11 + "properties": { 12 + "image": { 13 + "type": "blob", 14 + "accept": [ 15 + "image/*" 16 + ], 17 + "maxSize": 1000000 18 + }, 19 + "alt": { 20 + "type": "string", 21 + "description": "Alt text description of the image, for accessibility." 22 + }, 23 + "aspectRatio": { 24 + "type": "ref", 25 + "ref": "#aspectRatio" 26 + } 27 + } 28 + }, 29 + "aspectRatio": { 30 + "type": "object", 31 + "required": [ 32 + "width", 33 + "height" 34 + ], 35 + "properties": { 36 + "width": { 37 + "type": "integer" 38 + }, 39 + "height": { 40 + "type": "integer" 41 + } 42 + } 43 + } 44 + } 45 + }
+17
lexicons/pub/leaflet/blocks/math.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.math", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "tex" 9 + ], 10 + "properties": { 11 + "tex": { 12 + "type": "string" 13 + } 14 + } 15 + } 16 + } 17 + }
+17
lexicons/pub/leaflet/blocks/page.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.page", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "id" 9 + ], 10 + "properties": { 11 + "id": { 12 + "type": "string" 13 + } 14 + } 15 + } 16 + } 17 + }
+18
lexicons/pub/leaflet/blocks/poll.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.poll", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "pollRef" 9 + ], 10 + "properties": { 11 + "pollRef": { 12 + "type": "ref", 13 + "ref": "com.atproto.repo.strongRef" 14 + } 15 + } 16 + } 17 + } 18 + }
+24
lexicons/pub/leaflet/blocks/text.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.text", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "plaintext" 9 + ], 10 + "properties": { 11 + "plaintext": { 12 + "type": "string" 13 + }, 14 + "facets": { 15 + "type": "array", 16 + "items": { 17 + "type": "ref", 18 + "ref": "pub.leaflet.richtext.facet" 19 + } 20 + } 21 + } 22 + } 23 + } 24 + }
+44
lexicons/pub/leaflet/blocks/unorderedList.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.unorderedList", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "children" 9 + ], 10 + "properties": { 11 + "children": { 12 + "type": "array", 13 + "items": { 14 + "type": "ref", 15 + "ref": "#listItem" 16 + } 17 + } 18 + } 19 + }, 20 + "listItem": { 21 + "type": "object", 22 + "required": [ 23 + "content" 24 + ], 25 + "properties": { 26 + "content": { 27 + "type": "union", 28 + "refs": [ 29 + "pub.leaflet.blocks.text", 30 + "pub.leaflet.blocks.header", 31 + "pub.leaflet.blocks.image" 32 + ] 33 + }, 34 + "children": { 35 + "type": "array", 36 + "items": { 37 + "type": "ref", 38 + "ref": "#listItem" 39 + } 40 + } 41 + } 42 + } 43 + } 44 + }
+31
lexicons/pub/leaflet/blocks/website.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.blocks.website", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "src" 9 + ], 10 + "properties": { 11 + "previewImage": { 12 + "type": "blob", 13 + "accept": [ 14 + "image/*" 15 + ], 16 + "maxSize": 1000000 17 + }, 18 + "title": { 19 + "type": "string" 20 + }, 21 + "description": { 22 + "type": "string" 23 + }, 24 + "src": { 25 + "type": "string", 26 + "format": "uri" 27 + } 28 + } 29 + } 30 + } 31 + }
+83
lexicons/pub/leaflet/comment.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.comment", 4 + "revision": 1, 5 + "description": "A lexicon for comments on documents", 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "description": "Record containing a comment", 11 + "record": { 12 + "type": "object", 13 + "required": [ 14 + "subject", 15 + "plaintext", 16 + "createdAt" 17 + ], 18 + "properties": { 19 + "subject": { 20 + "type": "string", 21 + "format": "at-uri" 22 + }, 23 + "createdAt": { 24 + "type": "string", 25 + "format": "datetime" 26 + }, 27 + "reply": { 28 + "type": "ref", 29 + "ref": "#replyRef" 30 + }, 31 + "plaintext": { 32 + "type": "string" 33 + }, 34 + "facets": { 35 + "type": "array", 36 + "items": { 37 + "type": "ref", 38 + "ref": "pub.leaflet.richtext.facet" 39 + } 40 + }, 41 + "onPage": { 42 + "type": "string" 43 + }, 44 + "attachment": { 45 + "type": "union", 46 + "refs": [ 47 + "#linearDocumentQuote" 48 + ] 49 + } 50 + } 51 + } 52 + }, 53 + "linearDocumentQuote": { 54 + "type": "object", 55 + "required": [ 56 + "document", 57 + "quote" 58 + ], 59 + "properties": { 60 + "document": { 61 + "type": "string", 62 + "format": "at-uri" 63 + }, 64 + "quote": { 65 + "type": "ref", 66 + "ref": "pub.leaflet.pages.linearDocument#quote" 67 + } 68 + } 69 + }, 70 + "replyRef": { 71 + "type": "object", 72 + "required": [ 73 + "parent" 74 + ], 75 + "properties": { 76 + "parent": { 77 + "type": "string", 78 + "format": "at-uri" 79 + } 80 + } 81 + } 82 + } 83 + }
+79
lexicons/pub/leaflet/document.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.document", 4 + "revision": 1, 5 + "description": "A lexicon for long form rich media documents", 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "description": "Record containing a document", 11 + "record": { 12 + "type": "object", 13 + "required": [ 14 + "pages", 15 + "author", 16 + "title" 17 + ], 18 + "properties": { 19 + "title": { 20 + "type": "string", 21 + "maxLength": 1280, 22 + "maxGraphemes": 128 23 + }, 24 + "postRef": { 25 + "type": "ref", 26 + "ref": "com.atproto.repo.strongRef" 27 + }, 28 + "description": { 29 + "type": "string", 30 + "maxLength": 3000, 31 + "maxGraphemes": 300 32 + }, 33 + "publishedAt": { 34 + "type": "string", 35 + "format": "datetime" 36 + }, 37 + "publication": { 38 + "type": "string", 39 + "format": "at-uri" 40 + }, 41 + "author": { 42 + "type": "string", 43 + "format": "at-identifier" 44 + }, 45 + "theme": { 46 + "type": "ref", 47 + "ref": "pub.leaflet.publication#theme" 48 + }, 49 + "tags": { 50 + "type": "array", 51 + "items": { 52 + "type": "string", 53 + "maxLength": 50 54 + } 55 + }, 56 + "coverImage": { 57 + "type": "blob", 58 + "accept": [ 59 + "image/png", 60 + "image/jpeg", 61 + "image/webp" 62 + ], 63 + "maxSize": 1000000 64 + }, 65 + "pages": { 66 + "type": "array", 67 + "items": { 68 + "type": "union", 69 + "refs": [ 70 + "pub.leaflet.pages.linearDocument", 71 + "pub.leaflet.pages.canvas" 72 + ] 73 + } 74 + } 75 + } 76 + } 77 + } 78 + } 79 + }
+23
lexicons/pub/leaflet/graph/subscription.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.graph.subscription", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "Record declaring a subscription to a publication", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "publication" 13 + ], 14 + "properties": { 15 + "publication": { 16 + "type": "string", 17 + "format": "at-uri" 18 + } 19 + } 20 + } 21 + } 22 + } 23 + }
+114
lexicons/pub/leaflet/pages/canvas.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.pages.canvas", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "blocks" 9 + ], 10 + "properties": { 11 + "id": { 12 + "type": "string" 13 + }, 14 + "blocks": { 15 + "type": "array", 16 + "items": { 17 + "type": "ref", 18 + "ref": "#block" 19 + } 20 + } 21 + } 22 + }, 23 + "block": { 24 + "type": "object", 25 + "required": [ 26 + "block", 27 + "x", 28 + "y", 29 + "width" 30 + ], 31 + "properties": { 32 + "block": { 33 + "type": "union", 34 + "refs": [ 35 + "pub.leaflet.blocks.iframe", 36 + "pub.leaflet.blocks.text", 37 + "pub.leaflet.blocks.blockquote", 38 + "pub.leaflet.blocks.header", 39 + "pub.leaflet.blocks.image", 40 + "pub.leaflet.blocks.unorderedList", 41 + "pub.leaflet.blocks.website", 42 + "pub.leaflet.blocks.math", 43 + "pub.leaflet.blocks.code", 44 + "pub.leaflet.blocks.horizontalRule", 45 + "pub.leaflet.blocks.bskyPost", 46 + "pub.leaflet.blocks.page", 47 + "pub.leaflet.blocks.poll", 48 + "pub.leaflet.blocks.button" 49 + ] 50 + }, 51 + "x": { 52 + "type": "integer" 53 + }, 54 + "y": { 55 + "type": "integer" 56 + }, 57 + "width": { 58 + "type": "integer" 59 + }, 60 + "height": { 61 + "type": "integer" 62 + }, 63 + "rotation": { 64 + "type": "integer", 65 + "description": "The rotation of the block in degrees" 66 + } 67 + } 68 + }, 69 + "textAlignLeft": { 70 + "type": "token" 71 + }, 72 + "textAlignCenter": { 73 + "type": "token" 74 + }, 75 + "textAlignRight": { 76 + "type": "token" 77 + }, 78 + "quote": { 79 + "type": "object", 80 + "required": [ 81 + "start", 82 + "end" 83 + ], 84 + "properties": { 85 + "start": { 86 + "type": "ref", 87 + "ref": "#position" 88 + }, 89 + "end": { 90 + "type": "ref", 91 + "ref": "#position" 92 + } 93 + } 94 + }, 95 + "position": { 96 + "type": "object", 97 + "required": [ 98 + "block", 99 + "offset" 100 + ], 101 + "properties": { 102 + "block": { 103 + "type": "array", 104 + "items": { 105 + "type": "integer" 106 + } 107 + }, 108 + "offset": { 109 + "type": "integer" 110 + } 111 + } 112 + } 113 + } 114 + }
+107
lexicons/pub/leaflet/pages/linearDocument.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.pages.linearDocument", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "blocks" 9 + ], 10 + "properties": { 11 + "id": { 12 + "type": "string" 13 + }, 14 + "blocks": { 15 + "type": "array", 16 + "items": { 17 + "type": "ref", 18 + "ref": "#block" 19 + } 20 + } 21 + } 22 + }, 23 + "block": { 24 + "type": "object", 25 + "required": [ 26 + "block" 27 + ], 28 + "properties": { 29 + "block": { 30 + "type": "union", 31 + "refs": [ 32 + "pub.leaflet.blocks.iframe", 33 + "pub.leaflet.blocks.text", 34 + "pub.leaflet.blocks.blockquote", 35 + "pub.leaflet.blocks.header", 36 + "pub.leaflet.blocks.image", 37 + "pub.leaflet.blocks.unorderedList", 38 + "pub.leaflet.blocks.website", 39 + "pub.leaflet.blocks.math", 40 + "pub.leaflet.blocks.code", 41 + "pub.leaflet.blocks.horizontalRule", 42 + "pub.leaflet.blocks.bskyPost", 43 + "pub.leaflet.blocks.page", 44 + "pub.leaflet.blocks.poll", 45 + "pub.leaflet.blocks.button" 46 + ] 47 + }, 48 + "alignment": { 49 + "type": "string", 50 + "knownValues": [ 51 + "#textAlignLeft", 52 + "#textAlignCenter", 53 + "#textAlignRight", 54 + "#textAlignJustify" 55 + ] 56 + } 57 + } 58 + }, 59 + "textAlignLeft": { 60 + "type": "token" 61 + }, 62 + "textAlignCenter": { 63 + "type": "token" 64 + }, 65 + "textAlignRight": { 66 + "type": "token" 67 + }, 68 + "textAlignJustify": { 69 + "type": "token" 70 + }, 71 + "quote": { 72 + "type": "object", 73 + "required": [ 74 + "start", 75 + "end" 76 + ], 77 + "properties": { 78 + "start": { 79 + "type": "ref", 80 + "ref": "#position" 81 + }, 82 + "end": { 83 + "type": "ref", 84 + "ref": "#position" 85 + } 86 + } 87 + }, 88 + "position": { 89 + "type": "object", 90 + "required": [ 91 + "block", 92 + "offset" 93 + ], 94 + "properties": { 95 + "block": { 96 + "type": "array", 97 + "items": { 98 + "type": "integer" 99 + } 100 + }, 101 + "offset": { 102 + "type": "integer" 103 + } 104 + } 105 + } 106 + } 107 + }
+46
lexicons/pub/leaflet/poll/definition.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.poll.definition", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "Record declaring a poll", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "name", 13 + "options" 14 + ], 15 + "properties": { 16 + "name": { 17 + "type": "string", 18 + "maxLength": 500, 19 + "maxGraphemes": 100 20 + }, 21 + "options": { 22 + "type": "array", 23 + "items": { 24 + "type": "ref", 25 + "ref": "#option" 26 + } 27 + }, 28 + "endDate": { 29 + "type": "string", 30 + "format": "datetime" 31 + } 32 + } 33 + } 34 + }, 35 + "option": { 36 + "type": "object", 37 + "properties": { 38 + "text": { 39 + "type": "string", 40 + "maxLength": 500, 41 + "maxGraphemes": 50 42 + } 43 + } 44 + } 45 + } 46 + }
+30
lexicons/pub/leaflet/poll/vote.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.poll.vote", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "Record declaring a vote on a poll", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "poll", 13 + "option" 14 + ], 15 + "properties": { 16 + "poll": { 17 + "type": "ref", 18 + "ref": "com.atproto.repo.strongRef" 19 + }, 20 + "option": { 21 + "type": "array", 22 + "items": { 23 + "type": "string" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + } 30 + }
+106
lexicons/pub/leaflet/publication.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.publication", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "Record declaring a publication", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "name" 13 + ], 14 + "properties": { 15 + "name": { 16 + "type": "string", 17 + "maxLength": 2000 18 + }, 19 + "base_path": { 20 + "type": "string" 21 + }, 22 + "description": { 23 + "type": "string", 24 + "maxLength": 2000 25 + }, 26 + "icon": { 27 + "type": "blob", 28 + "accept": [ 29 + "image/*" 30 + ], 31 + "maxSize": 1000000 32 + }, 33 + "theme": { 34 + "type": "ref", 35 + "ref": "#theme" 36 + }, 37 + "preferences": { 38 + "type": "ref", 39 + "ref": "#preferences" 40 + } 41 + } 42 + } 43 + }, 44 + "preferences": { 45 + "type": "object", 46 + "properties": { 47 + "showInDiscover": { 48 + "type": "boolean", 49 + "default": true 50 + }, 51 + "showComments": { 52 + "type": "boolean", 53 + "default": true 54 + } 55 + } 56 + }, 57 + "theme": { 58 + "type": "object", 59 + "properties": { 60 + "backgroundColor": { 61 + "type": "union", 62 + "refs": [ 63 + "pub.leaflet.theme.color#rgba", 64 + "pub.leaflet.theme.color#rgb" 65 + ] 66 + }, 67 + "backgroundImage": { 68 + "type": "ref", 69 + "ref": "pub.leaflet.theme.backgroundImage" 70 + }, 71 + "primary": { 72 + "type": "union", 73 + "refs": [ 74 + "pub.leaflet.theme.color#rgba", 75 + "pub.leaflet.theme.color#rgb" 76 + ] 77 + }, 78 + "pageBackground": { 79 + "type": "union", 80 + "refs": [ 81 + "pub.leaflet.theme.color#rgba", 82 + "pub.leaflet.theme.color#rgb" 83 + ] 84 + }, 85 + "showPageBackground": { 86 + "type": "boolean", 87 + "default": false 88 + }, 89 + "accentBackground": { 90 + "type": "union", 91 + "refs": [ 92 + "pub.leaflet.theme.color#rgba", 93 + "pub.leaflet.theme.color#rgb" 94 + ] 95 + }, 96 + "accentText": { 97 + "type": "union", 98 + "refs": [ 99 + "pub.leaflet.theme.color#rgba", 100 + "pub.leaflet.theme.color#rgb" 101 + ] 102 + } 103 + } 104 + } 105 + } 106 + }
+140
lexicons/pub/leaflet/richtext/facet.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.richtext.facet", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "Annotation of a sub-string within rich text.", 8 + "required": [ 9 + "index", 10 + "features" 11 + ], 12 + "properties": { 13 + "index": { 14 + "type": "ref", 15 + "ref": "#byteSlice" 16 + }, 17 + "features": { 18 + "type": "array", 19 + "items": { 20 + "type": "union", 21 + "refs": [ 22 + "#link", 23 + "#didMention", 24 + "#atMention", 25 + "#code", 26 + "#highlight", 27 + "#underline", 28 + "#strikethrough", 29 + "#id", 30 + "#bold", 31 + "#italic" 32 + ] 33 + } 34 + } 35 + } 36 + }, 37 + "byteSlice": { 38 + "type": "object", 39 + "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.", 40 + "required": [ 41 + "byteStart", 42 + "byteEnd" 43 + ], 44 + "properties": { 45 + "byteStart": { 46 + "type": "integer", 47 + "minimum": 0 48 + }, 49 + "byteEnd": { 50 + "type": "integer", 51 + "minimum": 0 52 + } 53 + } 54 + }, 55 + "link": { 56 + "type": "object", 57 + "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", 58 + "required": [ 59 + "uri" 60 + ], 61 + "properties": { 62 + "uri": { 63 + "type": "string" 64 + } 65 + } 66 + }, 67 + "didMention": { 68 + "type": "object", 69 + "description": "Facet feature for mentioning a did.", 70 + "required": [ 71 + "did" 72 + ], 73 + "properties": { 74 + "did": { 75 + "type": "string", 76 + "format": "did" 77 + } 78 + } 79 + }, 80 + "atMention": { 81 + "type": "object", 82 + "description": "Facet feature for mentioning an AT URI.", 83 + "required": [ 84 + "atURI" 85 + ], 86 + "properties": { 87 + "atURI": { 88 + "type": "string", 89 + "format": "uri" 90 + } 91 + } 92 + }, 93 + "code": { 94 + "type": "object", 95 + "description": "Facet feature for inline code.", 96 + "required": [], 97 + "properties": {} 98 + }, 99 + "highlight": { 100 + "type": "object", 101 + "description": "Facet feature for highlighted text.", 102 + "required": [], 103 + "properties": {} 104 + }, 105 + "underline": { 106 + "type": "object", 107 + "description": "Facet feature for underline markup", 108 + "required": [], 109 + "properties": {} 110 + }, 111 + "strikethrough": { 112 + "type": "object", 113 + "description": "Facet feature for strikethrough markup", 114 + "required": [], 115 + "properties": {} 116 + }, 117 + "id": { 118 + "type": "object", 119 + "description": "Facet feature for an identifier. Used for linking to a segment", 120 + "required": [], 121 + "properties": { 122 + "id": { 123 + "type": "string" 124 + } 125 + } 126 + }, 127 + "bold": { 128 + "type": "object", 129 + "description": "Facet feature for bold text", 130 + "required": [], 131 + "properties": {} 132 + }, 133 + "italic": { 134 + "type": "object", 135 + "description": "Facet feature for italic text", 136 + "required": [], 137 + "properties": {} 138 + } 139 + } 140 + }
+27
lexicons/pub/leaflet/theme/backgroundImage.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.theme.backgroundImage", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "image" 9 + ], 10 + "properties": { 11 + "image": { 12 + "type": "blob", 13 + "accept": [ 14 + "image/*" 15 + ], 16 + "maxSize": 1000000 17 + }, 18 + "width": { 19 + "type": "integer" 20 + }, 21 + "repeat": { 22 + "type": "boolean" 23 + } 24 + } 25 + } 26 + } 27 + }
+62
lexicons/pub/leaflet/theme/color.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.theme.color", 4 + "defs": { 5 + "rgba": { 6 + "type": "object", 7 + "required": [ 8 + "r", 9 + "g", 10 + "b", 11 + "a" 12 + ], 13 + "properties": { 14 + "r": { 15 + "type": "integer", 16 + "maximum": 255, 17 + "minimum": 0 18 + }, 19 + "g": { 20 + "type": "integer", 21 + "maximum": 255, 22 + "minimum": 0 23 + }, 24 + "b": { 25 + "type": "integer", 26 + "maximum": 255, 27 + "minimum": 0 28 + }, 29 + "a": { 30 + "type": "integer", 31 + "maximum": 100, 32 + "minimum": 0 33 + } 34 + } 35 + }, 36 + "rgb": { 37 + "type": "object", 38 + "required": [ 39 + "r", 40 + "g", 41 + "b" 42 + ], 43 + "properties": { 44 + "r": { 45 + "type": "integer", 46 + "maximum": 255, 47 + "minimum": 0 48 + }, 49 + "g": { 50 + "type": "integer", 51 + "maximum": 255, 52 + "minimum": 0 53 + }, 54 + "b": { 55 + "type": "integer", 56 + "maximum": 255, 57 + "minimum": 0 58 + } 59 + } 60 + } 61 + } 62 + }
+15 -12
src/components/Porthole.svelte
··· 6 6 let { lexicon, author, content } = $props(); 7 7 </script> 8 8 9 - <div class="porthole relative my-5"> 10 - <h1 style="color: {lexicon.color}" class="inline text-lg font-bold">{lexicon.name}</h1> 11 - <img src={lexicon.logo} alt="{lexicon.name} Logo" class="logo" /> 12 - {#if lexicon.name == 'app.bsky.feed.post'} 13 - <BskyPost post={{ text: content.text, createdAt: content.createdAt }} /> 14 - {:else if lexicon.name == 'pub.leaflet.document'} 15 - <Leaflet {content} /> 16 - {/if} 9 + <div class="porthole parallax relative my-5"> 10 + <div class="porthole_content parallax__layer--back"> 11 + <h1 style="color: {lexicon.color}" class="inline text-lg font-bold">{lexicon.name}</h1> 12 + <img src={lexicon.logo} alt="{lexicon.name} Logo" class="logo" /> 13 + {#if lexicon.name == 'app.bsky.feed.post'} 14 + <BskyPost post={{ text: content.text, createdAt: content.createdAt }} /> 15 + {:else if lexicon.name == 'pub.leaflet.document'} 16 + <Leaflet {content} /> 17 + {/if} 17 18 18 - <p class="absolute right-4 bottom-4"> 19 - created by <a class="accentlink" href="/profile/{author}">{author}</a> 20 - </p> 19 + <p class="absolute right-4 bottom-4"> 20 + created by <a class="accentlink" href="/profile/{author}">{author}</a> 21 + </p> 22 + </div> 21 23 <EmojiReact 22 24 emotes={[ 23 25 { id: 1, name: '😤' }, ··· 35 37 36 38 .porthole { 37 39 color: var(--sunrise-navy); 38 - background: var(--sunrise-white); 40 + background: linear-gradient(to bottom, var(--sunrise-orange), var(--sunrise-white)); 39 41 40 42 border: 0.5rem solid var(--sunrise-purple); 41 43 max-width: 60vw; ··· 47 49 } 48 50 49 51 .logo { 52 + vertical-align: middle; 50 53 display: inline-block; 51 54 width: 1.125rem; 52 55 height: 1.125rem;
+87
src/routes/+page.svelte
··· 29 29 logo: 'https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg' 30 30 }} 31 31 author="goose.art" 32 + content={{ 33 + text: 'I am in the hole. AAAAA OH NO ITS THE HOLE EEE OH MY NO NONONOO WAAAKW WKWKWK ', 34 + createdAt: '2022-01-01T00:00:00Z' 35 + }} 36 + /> 37 + 38 + <Porthole 39 + lexicon={{ 40 + name: 'pub.leaflet.document', 41 + color: '#6E9340', 42 + logo: 'https://raw.githubusercontent.com/hyperlink-academy/leaflet/refs/heads/main/public/Logos/Logo%20Color%2064x64.svg' 43 + }} 44 + author="bees" 32 45 content={{ text: 'I am in the hole', createdAt: '2022-01-01T00:00:00Z' }} 46 + /><Porthole 47 + lexicon={{ 48 + name: 'app.bsky.feed.post', 49 + color: '#3471F6', 50 + logo: 'https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg' 51 + }} 52 + author="goose.art" 53 + content={{ 54 + text: 'I am in the hole. AAAAA OH NO ITS THE HOLE EEE OH MY NO NONONOO WAAAKW WKWKWK ', 55 + createdAt: '2022-01-01T00:00:00Z' 56 + }} 57 + /> 58 + 59 + <Porthole 60 + lexicon={{ 61 + name: 'pub.leaflet.document', 62 + color: '#6E9340', 63 + logo: 'https://raw.githubusercontent.com/hyperlink-academy/leaflet/refs/heads/main/public/Logos/Logo%20Color%2064x64.svg' 64 + }} 65 + author="bees" 66 + content={{ text: 'I am in the hole', createdAt: '2022-01-01T00:00:00Z' }} 67 + /><Porthole 68 + lexicon={{ 69 + name: 'app.bsky.feed.post', 70 + color: '#3471F6', 71 + logo: 'https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg' 72 + }} 73 + author="goose.art" 74 + content={{ 75 + text: 'I am in the hole. AAAAA OH NO ITS THE HOLE EEE OH MY NO NONONOO WAAAKW WKWKWK ', 76 + createdAt: '2022-01-01T00:00:00Z' 77 + }} 78 + /> 79 + 80 + <Porthole 81 + lexicon={{ 82 + name: 'pub.leaflet.document', 83 + color: '#6E9340', 84 + logo: 'https://raw.githubusercontent.com/hyperlink-academy/leaflet/refs/heads/main/public/Logos/Logo%20Color%2064x64.svg' 85 + }} 86 + author="bees" 87 + content={{ text: 'I am in the hole', createdAt: '2022-01-01T00:00:00Z' }} 88 + /><Porthole 89 + lexicon={{ 90 + name: 'app.bsky.feed.post', 91 + color: '#3471F6', 92 + logo: 'https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg' 93 + }} 94 + author="goose.art" 95 + content={{ 96 + text: 'I am in the hole. AAAAA OH NO ITS THE HOLE EEE OH MY NO NONONOO WAAAKW WKWKWK ', 97 + createdAt: '2022-01-01T00:00:00Z' 98 + }} 99 + /> 100 + 101 + <Porthole 102 + lexicon={{ 103 + name: 'pub.leaflet.document', 104 + color: '#6E9340', 105 + logo: 'https://raw.githubusercontent.com/hyperlink-academy/leaflet/refs/heads/main/public/Logos/Logo%20Color%2064x64.svg' 106 + }} 107 + author="bees" 108 + content={{ text: 'I am in the hole', createdAt: '2022-01-01T00:00:00Z' }} 109 + /><Porthole 110 + lexicon={{ 111 + name: 'app.bsky.feed.post', 112 + color: '#3471F6', 113 + logo: 'https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg' 114 + }} 115 + author="goose.art" 116 + content={{ 117 + text: 'I am in the hole. AAAAA OH NO ITS THE HOLE EEE OH MY NO NONONOO WAAAKW WKWKWK ', 118 + createdAt: '2022-01-01T00:00:00Z' 119 + }} 33 120 /> 34 121 35 122 <Porthole