Search interface for Tangled running on a Slice

add slices config, bring in lexicons, update @slices pkgs

Changed files
+1182 -366
lexicons
app
bsky
actor
com
atproto
sh
tangled
src
+2 -2
deno.json
··· 1 1 { 2 2 "imports": { 3 - "@slices/client": "jsr:@slices/client@~0.1.0-alpha.2", 4 - "@slices/oauth": "jsr:@slices/oauth@^0.4.1", 3 + "@slices/client": "jsr:@slices/client@~0.1.0-alpha.4", 4 + "@slices/oauth": "jsr:@slices/oauth@^0.6.0", 5 5 "github-colors": "npm:github-colors@^2.2.21", 6 6 "preact": "npm:preact@^10.27.1", 7 7 "preact-render-to-string": "npm:preact-render-to-string@^6.6.1",
+309 -13
deno.lock
··· 1 1 { 2 2 "version": "5", 3 3 "specifiers": { 4 - "jsr:@slices/client@~0.1.0-alpha.2": "0.1.0-alpha.2", 5 - "jsr:@slices/oauth@~0.3.2": "0.3.2", 6 - "jsr:@slices/oauth@~0.4.1": "0.4.1", 4 + "jsr:@shikijs/shiki@^3.7.0": "3.7.0", 7 5 "npm:@resvg/resvg-js@^2.6.2": "2.6.2", 8 6 "npm:@resvg/resvg-wasm@^2.6.2": "2.6.2", 7 + "npm:@shikijs/core@^3.7.0": "3.13.0", 8 + "npm:@shikijs/engine-oniguruma@^3.7.0": "3.13.0", 9 + "npm:@shikijs/types@^3.7.0": "3.13.0", 9 10 "npm:@takumi-rs/core@~0.29.8": "0.29.8", 10 11 "npm:@takumi-rs/helpers@~0.29.8": "0.29.8", 11 12 "npm:@types/node@*": "22.15.15", 12 13 "npm:@vercel/og@~0.6.2": "0.6.8", 13 14 "npm:@vercel/og@~0.8.5": "0.8.5", 15 + "npm:clsx@^2.1.1": "2.1.1", 14 16 "npm:github-colors@^2.2.21": "2.2.21", 17 + "npm:lucide-preact@0.544": "0.544.0_preact@10.27.1", 18 + "npm:marked-highlight@^2.2.2": "2.2.2_marked@16.3.0", 19 + "npm:marked@^16.3.0": "16.3.0", 20 + "npm:preact-render-to-string@^6.5.13": "6.6.1_preact@10.27.1", 15 21 "npm:preact-render-to-string@^6.6.1": "6.6.1_preact@10.27.1", 16 22 "npm:preact@^10.27.1": "10.27.1", 17 23 "npm:satori@~0.10.14": "0.10.14", 18 - "npm:satori@~0.18.2": "0.18.2" 24 + "npm:satori@~0.18.2": "0.18.2", 25 + "npm:shiki@^3.7.0": "3.13.0", 26 + "npm:tailwind-merge@^2.5.5": "2.6.0", 27 + "npm:typed-htmx@~0.3.1": "0.3.1" 19 28 }, 20 29 "jsr": { 21 - "@slices/client@0.1.0-alpha.2": { 22 - "integrity": "d3c591e89ab5b7ed7988faf9428bb7b3539484c6b90005a7c66f2188cc60fe19" 23 - }, 24 - "@slices/oauth@0.3.2": { 25 - "integrity": "51feaa6be538a61a3278ee7f1d264ed937187d09da2be1f0a2a837128df82526" 30 + "@shikijs/shiki@3.7.0": { 31 + "integrity": "6afb828d7d26efc521ef4ca16a7ef7245aca8e83dceaf58cc5cc64d3a4a4a895", 32 + "dependencies": [ 33 + "npm:@shikijs/core", 34 + "npm:@shikijs/engine-oniguruma", 35 + "npm:@shikijs/types", 36 + "npm:shiki" 37 + ] 26 38 }, 27 - "@slices/oauth@0.4.1": { 28 - "integrity": "15f20df2ba81e9d1764291c8b4f6e3eb38cfc953750eeb3815872b7e22475492" 39 + "@slices/client@0.1.0-alpha.4": { 40 + "integrity": "e45ca5d78318f11a861850f0a273b1608aa3aa97ccbd38706a8a000f3186ce43" 29 41 } 30 42 }, 31 43 "npm": { ··· 112 124 "@resvg/resvg-wasm@2.6.2": { 113 125 "integrity": "sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw==" 114 126 }, 127 + "@shikijs/core@3.13.0": { 128 + "integrity": "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==", 129 + "dependencies": [ 130 + "@shikijs/types", 131 + "@shikijs/vscode-textmate", 132 + "@types/hast", 133 + "hast-util-to-html" 134 + ] 135 + }, 136 + "@shikijs/engine-javascript@3.13.0": { 137 + "integrity": "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==", 138 + "dependencies": [ 139 + "@shikijs/types", 140 + "@shikijs/vscode-textmate", 141 + "oniguruma-to-es" 142 + ] 143 + }, 144 + "@shikijs/engine-oniguruma@3.13.0": { 145 + "integrity": "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==", 146 + "dependencies": [ 147 + "@shikijs/types", 148 + "@shikijs/vscode-textmate" 149 + ] 150 + }, 151 + "@shikijs/langs@3.13.0": { 152 + "integrity": "sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==", 153 + "dependencies": [ 154 + "@shikijs/types" 155 + ] 156 + }, 157 + "@shikijs/themes@3.13.0": { 158 + "integrity": "sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==", 159 + "dependencies": [ 160 + "@shikijs/types" 161 + ] 162 + }, 163 + "@shikijs/types@3.13.0": { 164 + "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", 165 + "dependencies": [ 166 + "@shikijs/vscode-textmate", 167 + "@types/hast" 168 + ] 169 + }, 170 + "@shikijs/vscode-textmate@10.0.2": { 171 + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" 172 + }, 115 173 "@shuding/opentype.js@1.4.0-beta.0": { 116 174 "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", 117 175 "dependencies": [ ··· 170 228 "@takumi-rs/helpers@0.29.8": { 171 229 "integrity": "sha512-a9jfiqcjaUVkTaMN9IKtCJtJzWZdv9LXSFWtaOM8EwTruyjk7sSJVjlYKM26a1XRPPZaWZGBN+4EQT4EgCAsUA==" 172 230 }, 231 + "@types/hast@3.0.4": { 232 + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 233 + "dependencies": [ 234 + "@types/unist" 235 + ] 236 + }, 237 + "@types/mdast@4.0.4": { 238 + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", 239 + "dependencies": [ 240 + "@types/unist" 241 + ] 242 + }, 173 243 "@types/node@22.15.15": { 174 244 "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", 175 245 "dependencies": [ 176 246 "undici-types" 177 247 ] 248 + }, 249 + "@types/unist@3.0.3": { 250 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" 251 + }, 252 + "@ungap/structured-clone@1.3.0": { 253 + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" 178 254 }, 179 255 "@vercel/og@0.6.8": { 180 256 "integrity": "sha512-e4kQK9mP8ntpo3dACWirGod/hHv4qO5JMj9a/0a2AZto7b4persj5YP7t1Er372gTtYFTYxNhMx34jRvHooglw==", ··· 241 317 "camelize@1.0.1": { 242 318 "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" 243 319 }, 320 + "ccount@2.0.1": { 321 + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" 322 + }, 323 + "character-entities-html4@2.1.0": { 324 + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" 325 + }, 326 + "character-entities-legacy@3.0.0": { 327 + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" 328 + }, 244 329 "class-methods@1.0.13": { 245 330 "integrity": "sha512-iaTvwkDnvbatOhvhCCPe6MKldhbjMPR2pmtet2HrNfYB/5tclL45bPSqEYV1itC7jIlpQsEAT0qK1x0Ym1Zc8Q==", 246 331 "dependencies": [ ··· 249 334 "ul" 250 335 ] 251 336 }, 337 + "clsx@2.1.1": { 338 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" 339 + }, 252 340 "color-convert@1.9.3": { 253 341 "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 254 342 "dependencies": [ ··· 260 348 }, 261 349 "color-name@1.1.4": { 262 350 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 351 + }, 352 + "comma-separated-tokens@2.0.3": { 353 + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" 263 354 }, 264 355 "couleurs@6.0.12": { 265 356 "integrity": "sha512-3SzCoWk+IWpReIhdrPnFCsjOQq1CyZ1OHWVTlFq/HR94tK6tEzNSbUycYCEhg+ywnznhFACad+YbGAHGmKzeOQ==", ··· 321 412 "typpy" 322 413 ] 323 414 }, 415 + "dequal@2.0.3": { 416 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" 417 + }, 418 + "devlop@1.1.0": { 419 + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", 420 + "dependencies": [ 421 + "dequal" 422 + ] 423 + }, 324 424 "diff-dates@1.0.15": { 325 425 "integrity": "sha512-tmM/uyu+nFMJbrh9E9HSzqwteVJmSYwXNkCKjavW24kXvbjVQGRpcQzp1EgkJzqUYragRUZsnAXaIVaX5zw7Yw==", 326 426 "dependencies": [ ··· 381 481 "has-flag@1.0.0": { 382 482 "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==" 383 483 }, 484 + "hast-util-to-html@9.0.5": { 485 + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", 486 + "dependencies": [ 487 + "@types/hast", 488 + "@types/unist", 489 + "ccount", 490 + "comma-separated-tokens", 491 + "hast-util-whitespace", 492 + "html-void-elements", 493 + "mdast-util-to-hast", 494 + "property-information", 495 + "space-separated-tokens", 496 + "stringify-entities", 497 + "zwitch" 498 + ] 499 + }, 500 + "hast-util-whitespace@3.0.0": { 501 + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", 502 + "dependencies": [ 503 + "@types/hast" 504 + ] 505 + }, 384 506 "hex-rgb@4.3.0": { 385 507 "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==" 508 + }, 509 + "html-void-elements@3.0.0": { 510 + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" 386 511 }, 387 512 "iterate-object@1.3.5": { 388 513 "integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A==" ··· 402 527 "unicode-trie" 403 528 ] 404 529 }, 530 + "lucide-preact@0.544.0_preact@10.27.1": { 531 + "integrity": "sha512-1OYqlRfxlQ6fQ8/e39kiY1btdKGCljwDmYKgF/GnB0ytVYV+PZE5EXmKdA3/Pknqs5A5QQKX+sK9TD7knUzwuw==", 532 + "dependencies": [ 533 + "preact" 534 + ] 535 + }, 536 + "marked-highlight@2.2.2_marked@16.3.0": { 537 + "integrity": "sha512-KlHOP31DatbtPPXPaI8nx1KTrG3EW0Z5zewCwpUj65swbtKOTStteK3sNAjBqV75Pgo3fNEVNHeptg18mDuWgw==", 538 + "dependencies": [ 539 + "marked" 540 + ] 541 + }, 542 + "marked@16.3.0": { 543 + "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", 544 + "bin": true 545 + }, 546 + "mdast-util-to-hast@13.2.0": { 547 + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", 548 + "dependencies": [ 549 + "@types/hast", 550 + "@types/mdast", 551 + "@ungap/structured-clone", 552 + "devlop", 553 + "micromark-util-sanitize-uri", 554 + "trim-lines", 555 + "unist-util-position", 556 + "unist-util-visit", 557 + "vfile" 558 + ] 559 + }, 560 + "micromark-util-character@2.1.1": { 561 + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", 562 + "dependencies": [ 563 + "micromark-util-symbol", 564 + "micromark-util-types" 565 + ] 566 + }, 567 + "micromark-util-encode@2.0.1": { 568 + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" 569 + }, 570 + "micromark-util-sanitize-uri@2.0.1": { 571 + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", 572 + "dependencies": [ 573 + "micromark-util-character", 574 + "micromark-util-encode", 575 + "micromark-util-symbol" 576 + ] 577 + }, 578 + "micromark-util-symbol@2.0.1": { 579 + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" 580 + }, 581 + "micromark-util-types@2.0.2": { 582 + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" 583 + }, 405 584 "minimist@1.2.8": { 406 585 "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 407 586 }, ··· 418 597 "noop6@1.0.10": { 419 598 "integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA==" 420 599 }, 600 + "oniguruma-parser@0.12.1": { 601 + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==" 602 + }, 603 + "oniguruma-to-es@4.3.3": { 604 + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", 605 + "dependencies": [ 606 + "oniguruma-parser", 607 + "regex", 608 + "regex-recursion" 609 + ] 610 + }, 421 611 "pako@0.2.9": { 422 612 "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" 423 613 }, ··· 446 636 "preact@10.27.1": { 447 637 "integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==" 448 638 }, 639 + "property-information@7.1.0": { 640 + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" 641 + }, 449 642 "regex-escape@3.4.11": { 450 643 "integrity": "sha512-051l4Hl/0HoJwTvNztrWVjoxLiseSfCrDgWqwR1cnGM/nyQSeIjmvti5zZ7HzOmsXDPaJ2k0iFxQ6/WNpJD5wQ==" 451 644 }, 645 + "regex-recursion@6.0.2": { 646 + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", 647 + "dependencies": [ 648 + "regex-utilities" 649 + ] 650 + }, 651 + "regex-utilities@2.3.0": { 652 + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" 653 + }, 654 + "regex@6.0.1": { 655 + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", 656 + "dependencies": [ 657 + "regex-utilities" 658 + ] 659 + }, 452 660 "satori@0.10.14": { 453 661 "integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==", 454 662 "dependencies": [ ··· 512 720 "yoga-layout" 513 721 ] 514 722 }, 723 + "shiki@3.13.0": { 724 + "integrity": "sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==", 725 + "dependencies": [ 726 + "@shikijs/core", 727 + "@shikijs/engine-javascript", 728 + "@shikijs/engine-oniguruma", 729 + "@shikijs/langs", 730 + "@shikijs/themes", 731 + "@shikijs/types", 732 + "@shikijs/vscode-textmate", 733 + "@types/hast" 734 + ] 735 + }, 515 736 "sliced@1.0.1": { 516 737 "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" 738 + }, 739 + "space-separated-tokens@2.0.2": { 740 + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" 517 741 }, 518 742 "sprintf-js@1.0.3": { 519 743 "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" ··· 531 755 "string.prototype.codepointat@0.2.1": { 532 756 "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" 533 757 }, 758 + "stringify-entities@4.0.4": { 759 + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", 760 + "dependencies": [ 761 + "character-entities-html4", 762 + "character-entities-legacy" 763 + ] 764 + }, 534 765 "supports-color@3.2.3": { 535 766 "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", 536 767 "dependencies": [ 537 768 "has-flag" 538 769 ] 770 + }, 771 + "tailwind-merge@2.6.0": { 772 + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==" 539 773 }, 540 774 "tiny-inflate@1.0.3": { 541 775 "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" ··· 549 783 "ul" 550 784 ] 551 785 }, 786 + "trim-lines@3.0.1": { 787 + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" 788 + }, 789 + "typed-html@3.0.1": { 790 + "integrity": "sha512-JKCM9zTfPDuPqQqdGZBWSEiItShliKkBFg5c6yOR8zth43v763XkAzTWaOlVqc0Y6p9ee8AaAbipGfUnCsYZUA==" 791 + }, 792 + "typed-htmx@0.3.1": { 793 + "integrity": "sha512-6WSPsukTIOEMsVbx5wzgVSvldLmgBUVcFIm2vJlBpRPtcbDOGC5y1IYrCWNX1yUlNsrv1Ngcw4gGM8jsPyNV7w==", 794 + "dependencies": [ 795 + "typed-html" 796 + ] 797 + }, 552 798 "typpy@2.4.0": { 553 799 "integrity": "sha512-a16Uv5doNtvHzaG4wZCHmXN+l9xxmTMpyODtPz7B3DSTsDVNXilTSJGuNw68sUh0Un4bf+ghRMbEcJCI6r06mQ==", 554 800 "dependencies": [ ··· 572 818 "tiny-inflate" 573 819 ] 574 820 }, 821 + "unist-util-is@6.0.0": { 822 + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", 823 + "dependencies": [ 824 + "@types/unist" 825 + ] 826 + }, 827 + "unist-util-position@5.0.0": { 828 + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", 829 + "dependencies": [ 830 + "@types/unist" 831 + ] 832 + }, 833 + "unist-util-stringify-position@4.0.0": { 834 + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", 835 + "dependencies": [ 836 + "@types/unist" 837 + ] 838 + }, 839 + "unist-util-visit-parents@6.0.1": { 840 + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", 841 + "dependencies": [ 842 + "@types/unist", 843 + "unist-util-is" 844 + ] 845 + }, 846 + "unist-util-visit@5.0.0": { 847 + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", 848 + "dependencies": [ 849 + "@types/unist", 850 + "unist-util-is", 851 + "unist-util-visit-parents" 852 + ] 853 + }, 854 + "vfile-message@4.0.3": { 855 + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", 856 + "dependencies": [ 857 + "@types/unist", 858 + "unist-util-stringify-position" 859 + ] 860 + }, 861 + "vfile@6.0.3": { 862 + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", 863 + "dependencies": [ 864 + "@types/unist", 865 + "vfile-message" 866 + ] 867 + }, 575 868 "yoga-layout@3.2.1": { 576 869 "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==" 577 870 }, 578 871 "yoga-wasm-web@0.3.3": { 579 872 "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==" 873 + }, 874 + "zwitch@2.0.4": { 875 + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" 580 876 } 581 877 }, 582 878 "redirects": { ··· 592 888 }, 593 889 "workspace": { 594 890 "dependencies": [ 595 - "jsr:@slices/client@~0.1.0-alpha.2", 596 - "jsr:@slices/oauth@~0.4.1", 891 + "jsr:@slices/client@~0.1.0-alpha.4", 892 + "jsr:@slices/oauth@0.6", 597 893 "npm:@takumi-rs/core@~0.29.8", 598 894 "npm:@takumi-rs/helpers@~0.29.8", 599 895 "npm:github-colors@^2.2.21",
+64
lexicons/app/bsky/actor/profile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.actor.profile", 4 + "defs": { 5 + "main": { 6 + "key": "literal:self", 7 + "type": "record", 8 + "record": { 9 + "type": "object", 10 + "properties": { 11 + "avatar": { 12 + "type": "blob", 13 + "accept": [ 14 + "image/png", 15 + "image/jpeg" 16 + ], 17 + "maxSize": 1000000, 18 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 19 + }, 20 + "banner": { 21 + "type": "blob", 22 + "accept": [ 23 + "image/png", 24 + "image/jpeg" 25 + ], 26 + "maxSize": 1000000, 27 + "description": "Larger horizontal image to display behind profile view." 28 + }, 29 + "labels": { 30 + "refs": [ 31 + "com.atproto.label.defs#selfLabels" 32 + ], 33 + "type": "union", 34 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 35 + }, 36 + "createdAt": { 37 + "type": "string", 38 + "format": "datetime" 39 + }, 40 + "pinnedPost": { 41 + "ref": "com.atproto.repo.strongRef", 42 + "type": "ref" 43 + }, 44 + "description": { 45 + "type": "string", 46 + "maxLength": 2560, 47 + "description": "Free-form profile description text.", 48 + "maxGraphemes": 256 49 + }, 50 + "displayName": { 51 + "type": "string", 52 + "maxLength": 640, 53 + "maxGraphemes": 64 54 + }, 55 + "joinedViaStarterPack": { 56 + "ref": "com.atproto.repo.strongRef", 57 + "type": "ref" 58 + } 59 + } 60 + }, 61 + "description": "A declaration of a Bluesky account profile." 62 + } 63 + } 64 + }
+192
lexicons/com/atproto/label/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.defs", 4 + "defs": { 5 + "label": { 6 + "type": "object", 7 + "required": [ 8 + "src", 9 + "uri", 10 + "val", 11 + "cts" 12 + ], 13 + "properties": { 14 + "cid": { 15 + "type": "string", 16 + "format": "cid", 17 + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 18 + }, 19 + "cts": { 20 + "type": "string", 21 + "format": "datetime", 22 + "description": "Timestamp when this label was created." 23 + }, 24 + "exp": { 25 + "type": "string", 26 + "format": "datetime", 27 + "description": "Timestamp at which this label expires (no longer applies)." 28 + }, 29 + "neg": { 30 + "type": "boolean", 31 + "description": "If true, this is a negation label, overwriting a previous label." 32 + }, 33 + "sig": { 34 + "type": "bytes", 35 + "description": "Signature of dag-cbor encoded label." 36 + }, 37 + "src": { 38 + "type": "string", 39 + "format": "did", 40 + "description": "DID of the actor who created this label." 41 + }, 42 + "uri": { 43 + "type": "string", 44 + "format": "uri", 45 + "description": "AT URI of the record, repository (account), or other resource that this label applies to." 46 + }, 47 + "val": { 48 + "type": "string", 49 + "maxLength": 128, 50 + "description": "The short string name of the value or type of this label." 51 + }, 52 + "ver": { 53 + "type": "integer", 54 + "description": "The AT Protocol version of the label object." 55 + } 56 + }, 57 + "description": "Metadata tag on an atproto resource (eg, repo or record)." 58 + }, 59 + "selfLabel": { 60 + "type": "object", 61 + "required": [ 62 + "val" 63 + ], 64 + "properties": { 65 + "val": { 66 + "type": "string", 67 + "maxLength": 128, 68 + "description": "The short string name of the value or type of this label." 69 + } 70 + }, 71 + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." 72 + }, 73 + "labelValue": { 74 + "type": "string", 75 + "knownValues": [ 76 + "!hide", 77 + "!no-promote", 78 + "!warn", 79 + "!no-unauthenticated", 80 + "dmca-violation", 81 + "doxxing", 82 + "porn", 83 + "sexual", 84 + "nudity", 85 + "nsfl", 86 + "gore" 87 + ] 88 + }, 89 + "selfLabels": { 90 + "type": "object", 91 + "required": [ 92 + "values" 93 + ], 94 + "properties": { 95 + "values": { 96 + "type": "array", 97 + "items": { 98 + "ref": "#selfLabel", 99 + "type": "ref" 100 + }, 101 + "maxLength": 10 102 + } 103 + }, 104 + "description": "Metadata tags on an atproto record, published by the author within the record." 105 + }, 106 + "labelValueDefinition": { 107 + "type": "object", 108 + "required": [ 109 + "identifier", 110 + "severity", 111 + "blurs", 112 + "locales" 113 + ], 114 + "properties": { 115 + "blurs": { 116 + "type": "string", 117 + "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.", 118 + "knownValues": [ 119 + "content", 120 + "media", 121 + "none" 122 + ] 123 + }, 124 + "locales": { 125 + "type": "array", 126 + "items": { 127 + "ref": "#labelValueDefinitionStrings", 128 + "type": "ref" 129 + } 130 + }, 131 + "severity": { 132 + "type": "string", 133 + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 134 + "knownValues": [ 135 + "inform", 136 + "alert", 137 + "none" 138 + ] 139 + }, 140 + "adultOnly": { 141 + "type": "boolean", 142 + "description": "Does the user need to have adult content enabled in order to configure this label?" 143 + }, 144 + "identifier": { 145 + "type": "string", 146 + "maxLength": 100, 147 + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 148 + "maxGraphemes": 100 149 + }, 150 + "defaultSetting": { 151 + "type": "string", 152 + "default": "warn", 153 + "description": "The default setting for this label.", 154 + "knownValues": [ 155 + "ignore", 156 + "warn", 157 + "hide" 158 + ] 159 + } 160 + }, 161 + "description": "Declares a label value and its expected interpretations and behaviors." 162 + }, 163 + "labelValueDefinitionStrings": { 164 + "type": "object", 165 + "required": [ 166 + "lang", 167 + "name", 168 + "description" 169 + ], 170 + "properties": { 171 + "lang": { 172 + "type": "string", 173 + "format": "language", 174 + "description": "The code of the language these strings are written in." 175 + }, 176 + "name": { 177 + "type": "string", 178 + "maxLength": 640, 179 + "description": "A short human-readable name for the label.", 180 + "maxGraphemes": 64 181 + }, 182 + "description": { 183 + "type": "string", 184 + "maxLength": 100000, 185 + "description": "A longer description of what the label means and why it might be applied.", 186 + "maxGraphemes": 10000 187 + } 188 + }, 189 + "description": "Strings which describe the label in the UI, localized into a specific language." 190 + } 191 + } 192 + }
+23
lexicons/com/atproto/repo/strongRef.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.strongRef", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "required": [ 8 + "uri", 9 + "cid" 10 + ], 11 + "properties": { 12 + "cid": { 13 + "type": "string", 14 + "format": "cid" 15 + }, 16 + "uri": { 17 + "type": "string", 18 + "format": "at-uri" 19 + } 20 + } 21 + } 22 + } 23 + }
+72
lexicons/sh/tangled/actor/profile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.actor.profile", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A declaration of a Tangled account profile.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "bluesky" 13 + ], 14 + "properties": { 15 + "description": { 16 + "type": "string", 17 + "description": "Free-form profile description text.", 18 + "maxGraphemes": 256, 19 + "maxLength": 2560 20 + }, 21 + "links": { 22 + "type": "array", 23 + "minLength": 0, 24 + "maxLength": 5, 25 + "items": { 26 + "type": "string", 27 + "description": "Any URI, intended for social profiles or websites, can be used to link DIDs/AT-URIs too.", 28 + "format": "uri" 29 + } 30 + }, 31 + "stats": { 32 + "type": "array", 33 + "minLength": 0, 34 + "maxLength": 2, 35 + "items": { 36 + "type": "string", 37 + "description": "Vanity stats.", 38 + "enum": [ 39 + "merged-pull-request-count", 40 + "closed-pull-request-count", 41 + "open-pull-request-count", 42 + "open-issue-count", 43 + "closed-issue-count", 44 + "repository-count" 45 + ] 46 + } 47 + }, 48 + "bluesky": { 49 + "type": "boolean", 50 + "description": "Include link to this account on Bluesky." 51 + }, 52 + "location": { 53 + "type": "string", 54 + "description": "Free-form location text.", 55 + "maxGraphemes": 40, 56 + "maxLength": 400 57 + }, 58 + "pinnedRepositories": { 59 + "type": "array", 60 + "description": "Any ATURI, it is up to appviews to validate these fields.", 61 + "minLength": 0, 62 + "maxLength": 6, 63 + "items": { 64 + "type": "string", 65 + "format": "at-uri" 66 + } 67 + } 68 + } 69 + } 70 + } 71 + } 72 + }
+27
lexicons/sh/tangled/feed/star.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.feed.star", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "record": { 9 + "type": "object", 10 + "required": [ 11 + "subject", 12 + "createdAt" 13 + ], 14 + "properties": { 15 + "subject": { 16 + "type": "string", 17 + "format": "at-uri" 18 + }, 19 + "createdAt": { 20 + "type": "string", 21 + "format": "datetime" 22 + } 23 + } 24 + } 25 + } 26 + } 27 + }
+54
lexicons/sh/tangled/repo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "record": { 9 + "type": "object", 10 + "required": [ 11 + "name", 12 + "knot", 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "name": { 17 + "type": "string", 18 + "description": "name of the repo" 19 + }, 20 + "knot": { 21 + "type": "string", 22 + "description": "knot where the repo was created" 23 + }, 24 + "spindle": { 25 + "type": "string", 26 + "description": "CI runner to send jobs to and receive results from" 27 + }, 28 + "description": { 29 + "type": "string", 30 + "minGraphemes": 1, 31 + "maxGraphemes": 140 32 + }, 33 + "source": { 34 + "type": "string", 35 + "format": "uri", 36 + "description": "source of the repo" 37 + }, 38 + "labels": { 39 + "type": "array", 40 + "description": "List of labels that this repo subscribes to", 41 + "items": { 42 + "type": "string", 43 + "format": "at-uri" 44 + } 45 + }, 46 + "createdAt": { 47 + "type": "string", 48 + "format": "datetime" 49 + } 50 + } 51 + } 52 + } 53 + } 54 + }
+34
lexicons/sh/tangled/repo/issue.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.repo.issue", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "record": { 9 + "type": "object", 10 + "required": [ 11 + "repo", 12 + "title", 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "repo": { 17 + "type": "string", 18 + "format": "at-uri" 19 + }, 20 + "title": { 21 + "type": "string" 22 + }, 23 + "body": { 24 + "type": "string" 25 + }, 26 + "createdAt": { 27 + "type": "string", 28 + "format": "datetime" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+5
slices.json
··· 1 + { 2 + "slice": "at://did:plc:bcgltzqazw5tb6k2g3ttenbj/network.slices.slice/3lymhhbxald2z", 3 + "lexiconPath": "./lexicons", 4 + "clientOutputPath": "./src/generated_client.ts" 5 + }
+400 -351
src/generated_client.ts
··· 1 1 // Generated TypeScript client for AT Protocol records 2 - // Generated at: 2025-09-14 18:49:29 UTC 2 + // Generated at: 2025-09-28 02:23:16 UTC 3 3 // Lexicons: 7 4 4 5 5 /** ··· 8 8 * import { AtProtoClient } from "./generated_client.ts"; 9 9 * 10 10 * const client = new AtProtoClient( 11 - * 'https://slices-api.fly.dev', 11 + * 'https://api.slices.network', 12 12 * 'at://did:plc:bcgltzqazw5tb6k2g3ttenbj/network.slices.slice/3lymhhbxald2z' 13 13 * ); 14 14 * 15 - * // Get records from the sh.tangled.feed.star collection 16 - * const records = await client.sh.tangled.feed.star.getRecords(); 15 + * // Get records from the app.bsky.actor.profile collection 16 + * const records = await client.app.bsky.actor.profile.getRecords(); 17 17 * 18 18 * // Get a specific record 19 - * const record = await client.sh.tangled.feed.star.getRecord({ 20 - * uri: 'at://did:plc:example/sh.tangled.feed.star/3abc123' 19 + * const record = await client.app.bsky.actor.profile.getRecord({ 20 + * uri: 'at://did:plc:example/app.bsky.actor.profile/3abc123' 21 21 * }); 22 22 * 23 23 * // Get records with filtering and search 24 - * const filteredRecords = await client.sh.tangled.feed.star.getRecords({ 24 + * const filteredRecords = await client.app.bsky.actor.profile.getRecords({ 25 25 * where: { 26 26 * text: { contains: "example search term" } 27 27 * } 28 28 * }); 29 29 * 30 30 * // Use slice-level methods for cross-collection queries with type safety 31 - * const sliceRecords = await client.network.slices.slice.getSliceRecords<ShTangledFeedStar>({ 31 + * const sliceRecords = await client.network.slices.slice.getSliceRecords<AppBskyActorProfile>({ 32 32 * where: { 33 - * collection: { eq: 'sh.tangled.feed.star' } 33 + * collection: { eq: 'app.bsky.actor.profile' } 34 34 * } 35 35 * }); 36 36 * 37 37 * // Search across multiple collections using union types 38 - * const multiCollectionRecords = await client.network.slices.slice.getSliceRecords<ShTangledFeedStar | AppBskyActorProfile>({ 38 + * const multiCollectionRecords = await client.network.slices.slice.getSliceRecords<AppBskyActorProfile | AppBskyActorProfile>({ 39 39 * where: { 40 - * collection: { in: ['sh.tangled.feed.star', 'app.bsky.actor.profile'] }, 40 + * collection: { in: ['app.bsky.actor.profile', 'app.bsky.actor.profile'] }, 41 41 * text: { contains: 'example search term' }, 42 42 * did: { in: ['did:plc:user1', 'did:plc:user2'] } 43 43 * }, ··· 50 50 */ 51 51 52 52 import { 53 + type AuthProvider, 53 54 type BlobRef, 54 55 type CountRecordsResponse, 55 56 type GetRecordParams, ··· 59 60 SlicesClient, 60 61 type SortField, 61 62 type WhereCondition, 62 - } from "jsr:@slices/client@^0.1.0-alpha.2"; 63 - import { OAuthClient } from "jsr:@slices/oauth@^0.4.1"; 63 + } from "@slices/client"; 64 + import type { OAuthClient } from "@slices/oauth"; 65 + 66 + export type ComAtprotoLabelDefsLabelValue = 67 + | "!hide" 68 + | "!no-promote" 69 + | "!warn" 70 + | "!no-unauthenticated" 71 + | "dmca-violation" 72 + | "doxxing" 73 + | "porn" 74 + | "sexual" 75 + | "nudity" 76 + | "nsfl" 77 + | "gore" 78 + | (string & Record<string, never>); 64 79 65 - export interface ShTangledFeedStar { 80 + export type ComAtprotoLabelDefsBlurs = 81 + | "content" 82 + | "media" 83 + | "none" 84 + | (string & Record<string, never>); 85 + 86 + export type ComAtprotoLabelDefsSeverity = 87 + | "inform" 88 + | "alert" 89 + | "none" 90 + | (string & Record<string, never>); 91 + 92 + export type ComAtprotoLabelDefsDefaultSetting = 93 + | "ignore" 94 + | "warn" 95 + | "hide" 96 + | (string & Record<string, never>); 97 + 98 + export interface AppBskyActorProfile { 99 + /** Small image to be displayed next to posts from account. AKA, 'profile picture' */ 100 + avatar?: BlobRef; 101 + /** Larger horizontal image to display behind profile view. */ 102 + banner?: BlobRef; 103 + /** Self-label values, specific to the Bluesky application, on the overall account. */ 104 + labels?: ComAtprotoLabelDefs["SelfLabels"] | { 105 + $type: string; 106 + [key: string]: unknown; 107 + }; 108 + createdAt?: string; 109 + pinnedPost?: ComAtprotoRepoStrongRef; 110 + /** Free-form profile description text. */ 111 + description?: string; 112 + displayName?: string; 113 + joinedViaStarterPack?: ComAtprotoRepoStrongRef; 114 + } 115 + 116 + export type AppBskyActorProfileSortFields = 117 + | "createdAt" 118 + | "description" 119 + | "displayName"; 120 + 121 + export interface ShTangledRepo { 122 + /** name of the repo */ 123 + name: string; 124 + /** knot where the repo was created */ 125 + knot: string; 126 + /** CI runner to send jobs to and receive results from */ 127 + spindle?: string; 128 + description?: string; 129 + /** source of the repo */ 130 + source?: string; 131 + /** List of labels that this repo subscribes to */ 132 + labels?: string[]; 66 133 createdAt: string; 134 + } 135 + 136 + export type ShTangledRepoSortFields = 137 + | "name" 138 + | "knot" 139 + | "spindle" 140 + | "description" 141 + | "source" 142 + | "createdAt"; 143 + 144 + export interface ShTangledFeedStar { 67 145 subject: string; 146 + createdAt: string; 68 147 } 69 148 70 - export type ShTangledFeedStarSortFields = "createdAt" | "subject"; 149 + export type ShTangledFeedStarSortFields = "subject" | "createdAt"; 150 + 151 + export interface ShTangledActorProfile { 152 + /** Free-form profile description text. */ 153 + description?: string; 154 + links?: string[]; 155 + stats?: string[]; 156 + /** Include link to this account on Bluesky. */ 157 + bluesky: boolean; 158 + /** Free-form location text. */ 159 + location?: string; 160 + /** Any ATURI, it is up to appviews to validate these fields. */ 161 + pinnedRepositories?: string[]; 162 + } 71 163 72 - export interface ComAtprotoRepoStrongRef { 73 - cid: string; 74 - uri: string; 164 + export type ShTangledActorProfileSortFields = "description" | "location"; 165 + 166 + export interface ShTangledRepoIssue { 167 + repo: string; 168 + title: string; 169 + body?: string; 170 + createdAt: string; 75 171 } 172 + 173 + export type ShTangledRepoIssueSortFields = 174 + | "repo" 175 + | "title" 176 + | "body" 177 + | "createdAt"; 76 178 77 179 export interface ComAtprotoLabelDefsLabel { 78 180 /** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */ ··· 95 197 ver?: number; 96 198 } 97 199 98 - export interface ComAtprotoLabelDefsLabelValueDefinition { 99 - /** Does the user need to have adult content enabled in order to configure this label? */ 100 - adultOnly?: boolean; 101 - /** 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. */ 102 - blurs: string; 103 - /** The default setting for this label. */ 104 - defaultSetting?: string; 105 - /** The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). */ 106 - identifier: string; 107 - locales: ComAtprotoLabelDefs["LabelValueDefinitionStrings"][]; 108 - /** How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. */ 109 - severity: string; 110 - } 111 - 112 - export interface ComAtprotoLabelDefsLabelValueDefinitionStrings { 113 - /** A longer description of what the label means and why it might be applied. */ 114 - description: string; 115 - /** The code of the language these strings are written in. */ 116 - lang: string; 117 - /** A short human-readable name for the label. */ 118 - name: string; 119 - } 120 - 121 200 export interface ComAtprotoLabelDefsSelfLabel { 122 201 /** The short string name of the value or type of this label. */ 123 202 val: string; ··· 127 206 values: ComAtprotoLabelDefs["SelfLabel"][]; 128 207 } 129 208 130 - export interface AppBskyActorProfile { 131 - /** Small image to be displayed next to posts from account. AKA, 'profile picture' */ 132 - avatar?: BlobRef; 133 - /** Larger horizontal image to display behind profile view. */ 134 - banner?: BlobRef; 135 - createdAt?: string; 136 - /** Free-form profile description text. */ 137 - description?: string; 138 - displayName?: string; 139 - joinedViaStarterPack?: ComAtprotoRepoStrongRef; 140 - /** Self-label values, specific to the Bluesky application, on the overall account. */ 141 - labels?: 142 - | ComAtprotoLabelDefs["SelfLabels"] 143 - | { 144 - $type: string; 145 - [key: string]: unknown; 146 - }; 147 - pinnedPost?: ComAtprotoRepoStrongRef; 148 - } 149 - 150 - export type AppBskyActorProfileSortFields = 151 - | "createdAt" 152 - | "description" 153 - | "displayName"; 154 - 155 - export interface ShTangledActorProfile { 156 - /** Include link to this account on Bluesky. */ 157 - bluesky: boolean; 158 - /** Free-form profile description text. */ 159 - description?: string; 160 - links?: string[]; 161 - /** Free-form location text. */ 162 - location?: string; 163 - /** Any ATURI, it is up to appviews to validate these fields. */ 164 - pinnedRepositories?: string[]; 165 - stats?: string[]; 209 + export interface ComAtprotoLabelDefsLabelValueDefinition { 210 + /** 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. */ 211 + blurs: ComAtprotoLabelDefsBlurs; 212 + locales: ComAtprotoLabelDefs["LabelValueDefinitionStrings"][]; 213 + /** How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. */ 214 + severity: ComAtprotoLabelDefsSeverity; 215 + /** Does the user need to have adult content enabled in order to configure this label? */ 216 + adultOnly?: boolean; 217 + /** The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). */ 218 + identifier: string; 219 + /** The default setting for this label. */ 220 + defaultSetting?: ComAtprotoLabelDefsDefaultSetting; 166 221 } 167 222 168 - export type ShTangledActorProfileSortFields = "description" | "location"; 169 - 170 - export interface ShTangledRepo { 171 - createdAt: string; 172 - description?: string; 173 - /** knot where the repo was created */ 174 - knot: string; 175 - /** name of the repo */ 223 + export interface ComAtprotoLabelDefsLabelValueDefinitionStrings { 224 + /** The code of the language these strings are written in. */ 225 + lang: string; 226 + /** A short human-readable name for the label. */ 176 227 name: string; 177 - owner: string; 178 - /** source of the repo */ 179 - source?: string; 180 - /** CI runner to send jobs to and receive results from */ 181 - spindle?: string; 228 + /** A longer description of what the label means and why it might be applied. */ 229 + description: string; 182 230 } 183 231 184 - export type ShTangledRepoSortFields = 185 - | "createdAt" 186 - | "description" 187 - | "knot" 188 - | "name" 189 - | "owner" 190 - | "source" 191 - | "spindle"; 192 - 193 - export interface ShTangledRepoIssue { 194 - body?: string; 195 - createdAt: string; 196 - repo: string; 197 - title: string; 232 + export interface ComAtprotoRepoStrongRef { 233 + cid: string; 234 + uri: string; 198 235 } 199 236 200 - export type ShTangledRepoIssueSortFields = 201 - | "body" 202 - | "createdAt" 203 - | "repo" 204 - | "title"; 205 - 206 237 export interface ComAtprotoLabelDefs { 207 238 readonly Label: ComAtprotoLabelDefsLabel; 208 - readonly LabelValueDefinition: ComAtprotoLabelDefsLabelValueDefinition; 209 - readonly LabelValueDefinitionStrings: ComAtprotoLabelDefsLabelValueDefinitionStrings; 210 239 readonly SelfLabel: ComAtprotoLabelDefsSelfLabel; 240 + readonly LabelValue: ComAtprotoLabelDefsLabelValue; 211 241 readonly SelfLabels: ComAtprotoLabelDefsSelfLabels; 242 + readonly LabelValueDefinition: ComAtprotoLabelDefsLabelValueDefinition; 243 + readonly LabelValueDefinitionStrings: 244 + ComAtprotoLabelDefsLabelValueDefinitionStrings; 212 245 } 213 246 214 - class StarFeedTangledShClient { 247 + class ProfileActorBskyAppClient { 215 248 private readonly client: SlicesClient; 216 249 217 250 constructor(client: SlicesClient) { 218 251 this.client = client; 219 252 } 220 253 221 - async getRecords(params?: { 222 - limit?: number; 223 - cursor?: string; 224 - where?: { 225 - [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: WhereCondition; 226 - }; 227 - orWhere?: { 228 - [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: WhereCondition; 229 - }; 230 - sortBy?: SortField<ShTangledFeedStarSortFields>[]; 231 - }): Promise<GetRecordsResponse<ShTangledFeedStar>> { 232 - return await this.client.getRecords("sh.tangled.feed.star", params); 254 + async getRecords( 255 + params?: { 256 + limit?: number; 257 + cursor?: string; 258 + where?: { 259 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 260 + WhereCondition; 261 + }; 262 + orWhere?: { 263 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 264 + WhereCondition; 265 + }; 266 + sortBy?: SortField<AppBskyActorProfileSortFields>[]; 267 + }, 268 + ): Promise<GetRecordsResponse<AppBskyActorProfile>> { 269 + return await this.client.getRecords("app.bsky.actor.profile", params); 233 270 } 234 271 235 272 async getRecord( 236 - params: GetRecordParams 237 - ): Promise<RecordResponse<ShTangledFeedStar>> { 238 - return await this.client.getRecord("sh.tangled.feed.star", params); 273 + params: GetRecordParams, 274 + ): Promise<RecordResponse<AppBskyActorProfile>> { 275 + return await this.client.getRecord("app.bsky.actor.profile", params); 239 276 } 240 277 241 - async countRecords(params?: { 242 - limit?: number; 243 - cursor?: string; 244 - where?: { 245 - [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: WhereCondition; 246 - }; 247 - orWhere?: { 248 - [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: WhereCondition; 249 - }; 250 - sortBy?: SortField<ShTangledFeedStarSortFields>[]; 251 - }): Promise<CountRecordsResponse> { 252 - return await this.client.countRecords("sh.tangled.feed.star", params); 278 + async countRecords( 279 + params?: { 280 + limit?: number; 281 + cursor?: string; 282 + where?: { 283 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 284 + WhereCondition; 285 + }; 286 + orWhere?: { 287 + [K in AppBskyActorProfileSortFields | IndexedRecordFields]?: 288 + WhereCondition; 289 + }; 290 + sortBy?: SortField<AppBskyActorProfileSortFields>[]; 291 + }, 292 + ): Promise<CountRecordsResponse> { 293 + return await this.client.countRecords("app.bsky.actor.profile", params); 253 294 } 254 295 255 296 async createRecord( 256 - record: ShTangledFeedStar, 257 - useSelfRkey?: boolean 297 + record: AppBskyActorProfile, 298 + useSelfRkey?: boolean, 258 299 ): Promise<{ uri: string; cid: string }> { 259 300 return await this.client.createRecord( 260 - "sh.tangled.feed.star", 301 + "app.bsky.actor.profile", 261 302 record, 262 - useSelfRkey 303 + useSelfRkey, 263 304 ); 264 305 } 265 306 266 307 async updateRecord( 267 308 rkey: string, 268 - record: ShTangledFeedStar 309 + record: AppBskyActorProfile, 269 310 ): Promise<{ uri: string; cid: string }> { 270 - return await this.client.updateRecord("sh.tangled.feed.star", rkey, record); 311 + return await this.client.updateRecord( 312 + "app.bsky.actor.profile", 313 + rkey, 314 + record, 315 + ); 271 316 } 272 317 273 318 async deleteRecord(rkey: string): Promise<void> { 274 - return await this.client.deleteRecord("sh.tangled.feed.star", rkey); 319 + return await this.client.deleteRecord("app.bsky.actor.profile", rkey); 275 320 } 276 321 } 277 322 278 - class FeedTangledShClient { 279 - readonly star: StarFeedTangledShClient; 323 + class ActorBskyAppClient { 324 + readonly profile: ProfileActorBskyAppClient; 280 325 private readonly client: SlicesClient; 281 326 282 327 constructor(client: SlicesClient) { 283 328 this.client = client; 284 - this.star = new StarFeedTangledShClient(client); 329 + this.profile = new ProfileActorBskyAppClient(client); 285 330 } 286 331 } 287 332 288 - class ProfileActorTangledShClient { 333 + class BskyAppClient { 334 + readonly actor: ActorBskyAppClient; 289 335 private readonly client: SlicesClient; 290 336 291 337 constructor(client: SlicesClient) { 292 338 this.client = client; 293 - } 294 - 295 - async getRecords(params?: { 296 - limit?: number; 297 - cursor?: string; 298 - where?: { 299 - [K in 300 - | ShTangledActorProfileSortFields 301 - | IndexedRecordFields]?: WhereCondition; 302 - }; 303 - orWhere?: { 304 - [K in 305 - | ShTangledActorProfileSortFields 306 - | IndexedRecordFields]?: WhereCondition; 307 - }; 308 - sortBy?: SortField<ShTangledActorProfileSortFields>[]; 309 - }): Promise<GetRecordsResponse<ShTangledActorProfile>> { 310 - return await this.client.getRecords("sh.tangled.actor.profile", params); 311 - } 312 - 313 - async getRecord( 314 - params: GetRecordParams 315 - ): Promise<RecordResponse<ShTangledActorProfile>> { 316 - return await this.client.getRecord("sh.tangled.actor.profile", params); 317 - } 318 - 319 - async countRecords(params?: { 320 - limit?: number; 321 - cursor?: string; 322 - where?: { 323 - [K in 324 - | ShTangledActorProfileSortFields 325 - | IndexedRecordFields]?: WhereCondition; 326 - }; 327 - orWhere?: { 328 - [K in 329 - | ShTangledActorProfileSortFields 330 - | IndexedRecordFields]?: WhereCondition; 331 - }; 332 - sortBy?: SortField<ShTangledActorProfileSortFields>[]; 333 - }): Promise<CountRecordsResponse> { 334 - return await this.client.countRecords("sh.tangled.actor.profile", params); 335 - } 336 - 337 - async createRecord( 338 - record: ShTangledActorProfile, 339 - useSelfRkey?: boolean 340 - ): Promise<{ uri: string; cid: string }> { 341 - return await this.client.createRecord( 342 - "sh.tangled.actor.profile", 343 - record, 344 - useSelfRkey 345 - ); 346 - } 347 - 348 - async updateRecord( 349 - rkey: string, 350 - record: ShTangledActorProfile 351 - ): Promise<{ uri: string; cid: string }> { 352 - return await this.client.updateRecord( 353 - "sh.tangled.actor.profile", 354 - rkey, 355 - record 356 - ); 357 - } 358 - 359 - async deleteRecord(rkey: string): Promise<void> { 360 - return await this.client.deleteRecord("sh.tangled.actor.profile", rkey); 339 + this.actor = new ActorBskyAppClient(client); 361 340 } 362 341 } 363 342 364 - class ActorTangledShClient { 365 - readonly profile: ProfileActorTangledShClient; 343 + class AppClient { 344 + readonly bsky: BskyAppClient; 366 345 private readonly client: SlicesClient; 367 346 368 347 constructor(client: SlicesClient) { 369 348 this.client = client; 370 - this.profile = new ProfileActorTangledShClient(client); 349 + this.bsky = new BskyAppClient(client); 371 350 } 372 351 } 373 352 ··· 378 357 this.client = client; 379 358 } 380 359 381 - async getRecords(params?: { 382 - limit?: number; 383 - cursor?: string; 384 - where?: { 385 - [K in 386 - | ShTangledRepoIssueSortFields 387 - | IndexedRecordFields]?: WhereCondition; 388 - }; 389 - orWhere?: { 390 - [K in 391 - | ShTangledRepoIssueSortFields 392 - | IndexedRecordFields]?: WhereCondition; 393 - }; 394 - sortBy?: SortField<ShTangledRepoIssueSortFields>[]; 395 - }): Promise<GetRecordsResponse<ShTangledRepoIssue>> { 360 + async getRecords( 361 + params?: { 362 + limit?: number; 363 + cursor?: string; 364 + where?: { 365 + [K in ShTangledRepoIssueSortFields | IndexedRecordFields]?: 366 + WhereCondition; 367 + }; 368 + orWhere?: { 369 + [K in ShTangledRepoIssueSortFields | IndexedRecordFields]?: 370 + WhereCondition; 371 + }; 372 + sortBy?: SortField<ShTangledRepoIssueSortFields>[]; 373 + }, 374 + ): Promise<GetRecordsResponse<ShTangledRepoIssue>> { 396 375 return await this.client.getRecords("sh.tangled.repo.issue", params); 397 376 } 398 377 399 378 async getRecord( 400 - params: GetRecordParams 379 + params: GetRecordParams, 401 380 ): Promise<RecordResponse<ShTangledRepoIssue>> { 402 381 return await this.client.getRecord("sh.tangled.repo.issue", params); 403 382 } 404 383 405 - async countRecords(params?: { 406 - limit?: number; 407 - cursor?: string; 408 - where?: { 409 - [K in 410 - | ShTangledRepoIssueSortFields 411 - | IndexedRecordFields]?: WhereCondition; 412 - }; 413 - orWhere?: { 414 - [K in 415 - | ShTangledRepoIssueSortFields 416 - | IndexedRecordFields]?: WhereCondition; 417 - }; 418 - sortBy?: SortField<ShTangledRepoIssueSortFields>[]; 419 - }): Promise<CountRecordsResponse> { 384 + async countRecords( 385 + params?: { 386 + limit?: number; 387 + cursor?: string; 388 + where?: { 389 + [K in ShTangledRepoIssueSortFields | IndexedRecordFields]?: 390 + WhereCondition; 391 + }; 392 + orWhere?: { 393 + [K in ShTangledRepoIssueSortFields | IndexedRecordFields]?: 394 + WhereCondition; 395 + }; 396 + sortBy?: SortField<ShTangledRepoIssueSortFields>[]; 397 + }, 398 + ): Promise<CountRecordsResponse> { 420 399 return await this.client.countRecords("sh.tangled.repo.issue", params); 421 400 } 422 401 423 402 async createRecord( 424 403 record: ShTangledRepoIssue, 425 - useSelfRkey?: boolean 404 + useSelfRkey?: boolean, 426 405 ): Promise<{ uri: string; cid: string }> { 427 406 return await this.client.createRecord( 428 407 "sh.tangled.repo.issue", 429 408 record, 430 - useSelfRkey 409 + useSelfRkey, 431 410 ); 432 411 } 433 412 434 413 async updateRecord( 435 414 rkey: string, 436 - record: ShTangledRepoIssue 415 + record: ShTangledRepoIssue, 437 416 ): Promise<{ uri: string; cid: string }> { 438 417 return await this.client.updateRecord( 439 418 "sh.tangled.repo.issue", 440 419 rkey, 441 - record 420 + record, 442 421 ); 443 422 } 444 423 ··· 456 435 this.issue = new IssueRepoTangledShClient(client); 457 436 } 458 437 459 - async getRecords(params?: { 460 - limit?: number; 461 - cursor?: string; 462 - where?: { 463 - [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 464 - }; 465 - orWhere?: { 466 - [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 467 - }; 468 - sortBy?: SortField<ShTangledRepoSortFields>[]; 469 - }): Promise<GetRecordsResponse<ShTangledRepo>> { 438 + async getRecords( 439 + params?: { 440 + limit?: number; 441 + cursor?: string; 442 + where?: { 443 + [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 444 + }; 445 + orWhere?: { 446 + [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 447 + }; 448 + sortBy?: SortField<ShTangledRepoSortFields>[]; 449 + }, 450 + ): Promise<GetRecordsResponse<ShTangledRepo>> { 470 451 return await this.client.getRecords("sh.tangled.repo", params); 471 452 } 472 453 473 454 async getRecord( 474 - params: GetRecordParams 455 + params: GetRecordParams, 475 456 ): Promise<RecordResponse<ShTangledRepo>> { 476 457 return await this.client.getRecord("sh.tangled.repo", params); 477 458 } 478 459 479 - async countRecords(params?: { 480 - limit?: number; 481 - cursor?: string; 482 - where?: { 483 - [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 484 - }; 485 - orWhere?: { 486 - [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 487 - }; 488 - sortBy?: SortField<ShTangledRepoSortFields>[]; 489 - }): Promise<CountRecordsResponse> { 460 + async countRecords( 461 + params?: { 462 + limit?: number; 463 + cursor?: string; 464 + where?: { 465 + [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 466 + }; 467 + orWhere?: { 468 + [K in ShTangledRepoSortFields | IndexedRecordFields]?: WhereCondition; 469 + }; 470 + sortBy?: SortField<ShTangledRepoSortFields>[]; 471 + }, 472 + ): Promise<CountRecordsResponse> { 490 473 return await this.client.countRecords("sh.tangled.repo", params); 491 474 } 492 475 493 476 async createRecord( 494 477 record: ShTangledRepo, 495 - useSelfRkey?: boolean 478 + useSelfRkey?: boolean, 496 479 ): Promise<{ uri: string; cid: string }> { 497 480 return await this.client.createRecord( 498 481 "sh.tangled.repo", 499 482 record, 500 - useSelfRkey 483 + useSelfRkey, 501 484 ); 502 485 } 503 486 504 487 async updateRecord( 505 488 rkey: string, 506 - record: ShTangledRepo 489 + record: ShTangledRepo, 507 490 ): Promise<{ uri: string; cid: string }> { 508 491 return await this.client.updateRecord("sh.tangled.repo", rkey, record); 509 492 } ··· 513 496 } 514 497 } 515 498 516 - class TangledShClient { 517 - readonly feed: FeedTangledShClient; 518 - readonly actor: ActorTangledShClient; 519 - readonly repo: RepoTangledShClient; 499 + class StarFeedTangledShClient { 520 500 private readonly client: SlicesClient; 521 501 522 502 constructor(client: SlicesClient) { 523 503 this.client = client; 524 - this.feed = new FeedTangledShClient(client); 525 - this.actor = new ActorTangledShClient(client); 526 - this.repo = new RepoTangledShClient(client); 504 + } 505 + 506 + async getRecords( 507 + params?: { 508 + limit?: number; 509 + cursor?: string; 510 + where?: { 511 + [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: 512 + WhereCondition; 513 + }; 514 + orWhere?: { 515 + [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: 516 + WhereCondition; 517 + }; 518 + sortBy?: SortField<ShTangledFeedStarSortFields>[]; 519 + }, 520 + ): Promise<GetRecordsResponse<ShTangledFeedStar>> { 521 + return await this.client.getRecords("sh.tangled.feed.star", params); 522 + } 523 + 524 + async getRecord( 525 + params: GetRecordParams, 526 + ): Promise<RecordResponse<ShTangledFeedStar>> { 527 + return await this.client.getRecord("sh.tangled.feed.star", params); 528 + } 529 + 530 + async countRecords( 531 + params?: { 532 + limit?: number; 533 + cursor?: string; 534 + where?: { 535 + [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: 536 + WhereCondition; 537 + }; 538 + orWhere?: { 539 + [K in ShTangledFeedStarSortFields | IndexedRecordFields]?: 540 + WhereCondition; 541 + }; 542 + sortBy?: SortField<ShTangledFeedStarSortFields>[]; 543 + }, 544 + ): Promise<CountRecordsResponse> { 545 + return await this.client.countRecords("sh.tangled.feed.star", params); 546 + } 547 + 548 + async createRecord( 549 + record: ShTangledFeedStar, 550 + useSelfRkey?: boolean, 551 + ): Promise<{ uri: string; cid: string }> { 552 + return await this.client.createRecord( 553 + "sh.tangled.feed.star", 554 + record, 555 + useSelfRkey, 556 + ); 557 + } 558 + 559 + async updateRecord( 560 + rkey: string, 561 + record: ShTangledFeedStar, 562 + ): Promise<{ uri: string; cid: string }> { 563 + return await this.client.updateRecord("sh.tangled.feed.star", rkey, record); 564 + } 565 + 566 + async deleteRecord(rkey: string): Promise<void> { 567 + return await this.client.deleteRecord("sh.tangled.feed.star", rkey); 527 568 } 528 569 } 529 570 530 - class ShClient { 531 - readonly tangled: TangledShClient; 571 + class FeedTangledShClient { 572 + readonly star: StarFeedTangledShClient; 532 573 private readonly client: SlicesClient; 533 574 534 575 constructor(client: SlicesClient) { 535 576 this.client = client; 536 - this.tangled = new TangledShClient(client); 577 + this.star = new StarFeedTangledShClient(client); 537 578 } 538 579 } 539 580 540 - class ProfileActorBskyAppClient { 581 + class ProfileActorTangledShClient { 541 582 private readonly client: SlicesClient; 542 583 543 584 constructor(client: SlicesClient) { 544 585 this.client = client; 545 586 } 546 587 547 - async getRecords(params?: { 548 - limit?: number; 549 - cursor?: string; 550 - where?: { 551 - [K in 552 - | AppBskyActorProfileSortFields 553 - | IndexedRecordFields]?: WhereCondition; 554 - }; 555 - orWhere?: { 556 - [K in 557 - | AppBskyActorProfileSortFields 558 - | IndexedRecordFields]?: WhereCondition; 559 - }; 560 - sortBy?: SortField<AppBskyActorProfileSortFields>[]; 561 - }): Promise<GetRecordsResponse<AppBskyActorProfile>> { 562 - return await this.client.getRecords("app.bsky.actor.profile", params); 588 + async getRecords( 589 + params?: { 590 + limit?: number; 591 + cursor?: string; 592 + where?: { 593 + [K in ShTangledActorProfileSortFields | IndexedRecordFields]?: 594 + WhereCondition; 595 + }; 596 + orWhere?: { 597 + [K in ShTangledActorProfileSortFields | IndexedRecordFields]?: 598 + WhereCondition; 599 + }; 600 + sortBy?: SortField<ShTangledActorProfileSortFields>[]; 601 + }, 602 + ): Promise<GetRecordsResponse<ShTangledActorProfile>> { 603 + return await this.client.getRecords("sh.tangled.actor.profile", params); 563 604 } 564 605 565 606 async getRecord( 566 - params: GetRecordParams 567 - ): Promise<RecordResponse<AppBskyActorProfile>> { 568 - return await this.client.getRecord("app.bsky.actor.profile", params); 607 + params: GetRecordParams, 608 + ): Promise<RecordResponse<ShTangledActorProfile>> { 609 + return await this.client.getRecord("sh.tangled.actor.profile", params); 569 610 } 570 611 571 - async countRecords(params?: { 572 - limit?: number; 573 - cursor?: string; 574 - where?: { 575 - [K in 576 - | AppBskyActorProfileSortFields 577 - | IndexedRecordFields]?: WhereCondition; 578 - }; 579 - orWhere?: { 580 - [K in 581 - | AppBskyActorProfileSortFields 582 - | IndexedRecordFields]?: WhereCondition; 583 - }; 584 - sortBy?: SortField<AppBskyActorProfileSortFields>[]; 585 - }): Promise<CountRecordsResponse> { 586 - return await this.client.countRecords("app.bsky.actor.profile", params); 612 + async countRecords( 613 + params?: { 614 + limit?: number; 615 + cursor?: string; 616 + where?: { 617 + [K in ShTangledActorProfileSortFields | IndexedRecordFields]?: 618 + WhereCondition; 619 + }; 620 + orWhere?: { 621 + [K in ShTangledActorProfileSortFields | IndexedRecordFields]?: 622 + WhereCondition; 623 + }; 624 + sortBy?: SortField<ShTangledActorProfileSortFields>[]; 625 + }, 626 + ): Promise<CountRecordsResponse> { 627 + return await this.client.countRecords("sh.tangled.actor.profile", params); 587 628 } 588 629 589 630 async createRecord( 590 - record: AppBskyActorProfile, 591 - useSelfRkey?: boolean 631 + record: ShTangledActorProfile, 632 + useSelfRkey?: boolean, 592 633 ): Promise<{ uri: string; cid: string }> { 593 634 return await this.client.createRecord( 594 - "app.bsky.actor.profile", 635 + "sh.tangled.actor.profile", 595 636 record, 596 - useSelfRkey 637 + useSelfRkey, 597 638 ); 598 639 } 599 640 600 641 async updateRecord( 601 642 rkey: string, 602 - record: AppBskyActorProfile 643 + record: ShTangledActorProfile, 603 644 ): Promise<{ uri: string; cid: string }> { 604 645 return await this.client.updateRecord( 605 - "app.bsky.actor.profile", 646 + "sh.tangled.actor.profile", 606 647 rkey, 607 - record 648 + record, 608 649 ); 609 650 } 610 651 611 652 async deleteRecord(rkey: string): Promise<void> { 612 - return await this.client.deleteRecord("app.bsky.actor.profile", rkey); 653 + return await this.client.deleteRecord("sh.tangled.actor.profile", rkey); 613 654 } 614 655 } 615 656 616 - class ActorBskyAppClient { 617 - readonly profile: ProfileActorBskyAppClient; 657 + class ActorTangledShClient { 658 + readonly profile: ProfileActorTangledShClient; 618 659 private readonly client: SlicesClient; 619 660 620 661 constructor(client: SlicesClient) { 621 662 this.client = client; 622 - this.profile = new ProfileActorBskyAppClient(client); 663 + this.profile = new ProfileActorTangledShClient(client); 623 664 } 624 665 } 625 666 626 - class BskyAppClient { 627 - readonly actor: ActorBskyAppClient; 667 + class TangledShClient { 668 + readonly repo: RepoTangledShClient; 669 + readonly feed: FeedTangledShClient; 670 + readonly actor: ActorTangledShClient; 628 671 private readonly client: SlicesClient; 629 672 630 673 constructor(client: SlicesClient) { 631 674 this.client = client; 632 - this.actor = new ActorBskyAppClient(client); 675 + this.repo = new RepoTangledShClient(client); 676 + this.feed = new FeedTangledShClient(client); 677 + this.actor = new ActorTangledShClient(client); 633 678 } 634 679 } 635 680 636 - class AppClient { 637 - readonly bsky: BskyAppClient; 681 + class ShClient { 682 + readonly tangled: TangledShClient; 638 683 private readonly client: SlicesClient; 639 684 640 685 constructor(client: SlicesClient) { 641 686 this.client = client; 642 - this.bsky = new BskyAppClient(client); 687 + this.tangled = new TangledShClient(client); 643 688 } 644 689 } 645 690 646 691 export class AtProtoClient extends SlicesClient { 692 + readonly app: AppClient; 647 693 readonly sh: ShClient; 648 - readonly app: AppClient; 649 - readonly oauth?: OAuthClient; 694 + readonly oauth?: OAuthClient | AuthProvider; 650 695 651 - constructor(baseUrl: string, sliceUri: string, oauthClient?: OAuthClient) { 696 + constructor( 697 + baseUrl: string, 698 + sliceUri: string, 699 + oauthClient?: OAuthClient | AuthProvider, 700 + ) { 652 701 super(baseUrl, sliceUri, oauthClient); 702 + this.app = new AppClient(this); 653 703 this.sh = new ShClient(this); 654 - this.app = new AppClient(this); 655 - this.oauth = this.oauthClient; 704 + this.oauth = oauthClient; 656 705 } 657 706 }