+2
-2
deno.json
+2
-2
deno.json
+309
-13
deno.lock
+309
-13
deno.lock
···
1
{
2
"version": "5",
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",
7
"npm:@resvg/resvg-js@^2.6.2": "2.6.2",
8
"npm:@resvg/resvg-wasm@^2.6.2": "2.6.2",
9
"npm:@takumi-rs/core@~0.29.8": "0.29.8",
10
"npm:@takumi-rs/helpers@~0.29.8": "0.29.8",
11
"npm:@types/node@*": "22.15.15",
12
"npm:@vercel/og@~0.6.2": "0.6.8",
13
"npm:@vercel/og@~0.8.5": "0.8.5",
14
"npm:github-colors@^2.2.21": "2.2.21",
15
"npm:preact-render-to-string@^6.6.1": "6.6.1_preact@10.27.1",
16
"npm:preact@^10.27.1": "10.27.1",
17
"npm:satori@~0.10.14": "0.10.14",
18
-
"npm:satori@~0.18.2": "0.18.2"
19
},
20
"jsr": {
21
-
"@slices/client@0.1.0-alpha.2": {
22
-
"integrity": "d3c591e89ab5b7ed7988faf9428bb7b3539484c6b90005a7c66f2188cc60fe19"
23
-
},
24
-
"@slices/oauth@0.3.2": {
25
-
"integrity": "51feaa6be538a61a3278ee7f1d264ed937187d09da2be1f0a2a837128df82526"
26
},
27
-
"@slices/oauth@0.4.1": {
28
-
"integrity": "15f20df2ba81e9d1764291c8b4f6e3eb38cfc953750eeb3815872b7e22475492"
29
}
30
},
31
"npm": {
···
112
"@resvg/resvg-wasm@2.6.2": {
113
"integrity": "sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw=="
114
},
115
"@shuding/opentype.js@1.4.0-beta.0": {
116
"integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==",
117
"dependencies": [
···
170
"@takumi-rs/helpers@0.29.8": {
171
"integrity": "sha512-a9jfiqcjaUVkTaMN9IKtCJtJzWZdv9LXSFWtaOM8EwTruyjk7sSJVjlYKM26a1XRPPZaWZGBN+4EQT4EgCAsUA=="
172
},
173
"@types/node@22.15.15": {
174
"integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==",
175
"dependencies": [
176
"undici-types"
177
]
178
},
179
"@vercel/og@0.6.8": {
180
"integrity": "sha512-e4kQK9mP8ntpo3dACWirGod/hHv4qO5JMj9a/0a2AZto7b4persj5YP7t1Er372gTtYFTYxNhMx34jRvHooglw==",
···
241
"camelize@1.0.1": {
242
"integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="
243
},
244
"class-methods@1.0.13": {
245
"integrity": "sha512-iaTvwkDnvbatOhvhCCPe6MKldhbjMPR2pmtet2HrNfYB/5tclL45bPSqEYV1itC7jIlpQsEAT0qK1x0Ym1Zc8Q==",
246
"dependencies": [
···
249
"ul"
250
]
251
},
252
"color-convert@1.9.3": {
253
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
254
"dependencies": [
···
260
},
261
"color-name@1.1.4": {
262
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
263
},
264
"couleurs@6.0.12": {
265
"integrity": "sha512-3SzCoWk+IWpReIhdrPnFCsjOQq1CyZ1OHWVTlFq/HR94tK6tEzNSbUycYCEhg+ywnznhFACad+YbGAHGmKzeOQ==",
···
321
"typpy"
322
]
323
},
324
"diff-dates@1.0.15": {
325
"integrity": "sha512-tmM/uyu+nFMJbrh9E9HSzqwteVJmSYwXNkCKjavW24kXvbjVQGRpcQzp1EgkJzqUYragRUZsnAXaIVaX5zw7Yw==",
326
"dependencies": [
···
381
"has-flag@1.0.0": {
382
"integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA=="
383
},
384
"hex-rgb@4.3.0": {
385
"integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw=="
386
},
387
"iterate-object@1.3.5": {
388
"integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A=="
···
402
"unicode-trie"
403
]
404
},
405
"minimist@1.2.8": {
406
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
407
},
···
418
"noop6@1.0.10": {
419
"integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA=="
420
},
421
"pako@0.2.9": {
422
"integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
423
},
···
446
"preact@10.27.1": {
447
"integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ=="
448
},
449
"regex-escape@3.4.11": {
450
"integrity": "sha512-051l4Hl/0HoJwTvNztrWVjoxLiseSfCrDgWqwR1cnGM/nyQSeIjmvti5zZ7HzOmsXDPaJ2k0iFxQ6/WNpJD5wQ=="
451
},
452
"satori@0.10.14": {
453
"integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==",
454
"dependencies": [
···
512
"yoga-layout"
513
]
514
},
515
"sliced@1.0.1": {
516
"integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="
517
},
518
"sprintf-js@1.0.3": {
519
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
···
531
"string.prototype.codepointat@0.2.1": {
532
"integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
533
},
534
"supports-color@3.2.3": {
535
"integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
536
"dependencies": [
537
"has-flag"
538
]
539
},
540
"tiny-inflate@1.0.3": {
541
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
···
549
"ul"
550
]
551
},
552
"typpy@2.4.0": {
553
"integrity": "sha512-a16Uv5doNtvHzaG4wZCHmXN+l9xxmTMpyODtPz7B3DSTsDVNXilTSJGuNw68sUh0Un4bf+ghRMbEcJCI6r06mQ==",
554
"dependencies": [
···
572
"tiny-inflate"
573
]
574
},
575
"yoga-layout@3.2.1": {
576
"integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="
577
},
578
"yoga-wasm-web@0.3.3": {
579
"integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA=="
580
}
581
},
582
"redirects": {
···
592
},
593
"workspace": {
594
"dependencies": [
595
-
"jsr:@slices/client@~0.1.0-alpha.2",
596
-
"jsr:@slices/oauth@~0.4.1",
597
"npm:@takumi-rs/core@~0.29.8",
598
"npm:@takumi-rs/helpers@~0.29.8",
599
"npm:github-colors@^2.2.21",
···
1
{
2
"version": "5",
3
"specifiers": {
4
+
"jsr:@shikijs/shiki@^3.7.0": "3.7.0",
5
"npm:@resvg/resvg-js@^2.6.2": "2.6.2",
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",
10
"npm:@takumi-rs/core@~0.29.8": "0.29.8",
11
"npm:@takumi-rs/helpers@~0.29.8": "0.29.8",
12
"npm:@types/node@*": "22.15.15",
13
"npm:@vercel/og@~0.6.2": "0.6.8",
14
"npm:@vercel/og@~0.8.5": "0.8.5",
15
+
"npm:clsx@^2.1.1": "2.1.1",
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",
21
"npm:preact-render-to-string@^6.6.1": "6.6.1_preact@10.27.1",
22
"npm:preact@^10.27.1": "10.27.1",
23
"npm:satori@~0.10.14": "0.10.14",
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"
28
},
29
"jsr": {
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
+
]
38
},
39
+
"@slices/client@0.1.0-alpha.4": {
40
+
"integrity": "e45ca5d78318f11a861850f0a273b1608aa3aa97ccbd38706a8a000f3186ce43"
41
}
42
},
43
"npm": {
···
124
"@resvg/resvg-wasm@2.6.2": {
125
"integrity": "sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw=="
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
+
},
173
"@shuding/opentype.js@1.4.0-beta.0": {
174
"integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==",
175
"dependencies": [
···
228
"@takumi-rs/helpers@0.29.8": {
229
"integrity": "sha512-a9jfiqcjaUVkTaMN9IKtCJtJzWZdv9LXSFWtaOM8EwTruyjk7sSJVjlYKM26a1XRPPZaWZGBN+4EQT4EgCAsUA=="
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
+
},
243
"@types/node@22.15.15": {
244
"integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==",
245
"dependencies": [
246
"undici-types"
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=="
254
},
255
"@vercel/og@0.6.8": {
256
"integrity": "sha512-e4kQK9mP8ntpo3dACWirGod/hHv4qO5JMj9a/0a2AZto7b4persj5YP7t1Er372gTtYFTYxNhMx34jRvHooglw==",
···
317
"camelize@1.0.1": {
318
"integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="
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
+
},
329
"class-methods@1.0.13": {
330
"integrity": "sha512-iaTvwkDnvbatOhvhCCPe6MKldhbjMPR2pmtet2HrNfYB/5tclL45bPSqEYV1itC7jIlpQsEAT0qK1x0Ym1Zc8Q==",
331
"dependencies": [
···
334
"ul"
335
]
336
},
337
+
"clsx@2.1.1": {
338
+
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="
339
+
},
340
"color-convert@1.9.3": {
341
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
342
"dependencies": [
···
348
},
349
"color-name@1.1.4": {
350
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
351
+
},
352
+
"comma-separated-tokens@2.0.3": {
353
+
"integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="
354
},
355
"couleurs@6.0.12": {
356
"integrity": "sha512-3SzCoWk+IWpReIhdrPnFCsjOQq1CyZ1OHWVTlFq/HR94tK6tEzNSbUycYCEhg+ywnznhFACad+YbGAHGmKzeOQ==",
···
412
"typpy"
413
]
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
+
},
424
"diff-dates@1.0.15": {
425
"integrity": "sha512-tmM/uyu+nFMJbrh9E9HSzqwteVJmSYwXNkCKjavW24kXvbjVQGRpcQzp1EgkJzqUYragRUZsnAXaIVaX5zw7Yw==",
426
"dependencies": [
···
481
"has-flag@1.0.0": {
482
"integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA=="
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
+
},
506
"hex-rgb@4.3.0": {
507
"integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw=="
508
+
},
509
+
"html-void-elements@3.0.0": {
510
+
"integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="
511
},
512
"iterate-object@1.3.5": {
513
"integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A=="
···
527
"unicode-trie"
528
]
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
+
},
584
"minimist@1.2.8": {
585
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
586
},
···
597
"noop6@1.0.10": {
598
"integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA=="
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
+
},
611
"pako@0.2.9": {
612
"integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
613
},
···
636
"preact@10.27.1": {
637
"integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ=="
638
},
639
+
"property-information@7.1.0": {
640
+
"integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="
641
+
},
642
"regex-escape@3.4.11": {
643
"integrity": "sha512-051l4Hl/0HoJwTvNztrWVjoxLiseSfCrDgWqwR1cnGM/nyQSeIjmvti5zZ7HzOmsXDPaJ2k0iFxQ6/WNpJD5wQ=="
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
+
},
660
"satori@0.10.14": {
661
"integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==",
662
"dependencies": [
···
720
"yoga-layout"
721
]
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
+
},
736
"sliced@1.0.1": {
737
"integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="
738
+
},
739
+
"space-separated-tokens@2.0.2": {
740
+
"integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="
741
},
742
"sprintf-js@1.0.3": {
743
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
···
755
"string.prototype.codepointat@0.2.1": {
756
"integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
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
+
},
765
"supports-color@3.2.3": {
766
"integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
767
"dependencies": [
768
"has-flag"
769
]
770
+
},
771
+
"tailwind-merge@2.6.0": {
772
+
"integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="
773
},
774
"tiny-inflate@1.0.3": {
775
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
···
783
"ul"
784
]
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
+
},
798
"typpy@2.4.0": {
799
"integrity": "sha512-a16Uv5doNtvHzaG4wZCHmXN+l9xxmTMpyODtPz7B3DSTsDVNXilTSJGuNw68sUh0Un4bf+ghRMbEcJCI6r06mQ==",
800
"dependencies": [
···
818
"tiny-inflate"
819
]
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
+
},
868
"yoga-layout@3.2.1": {
869
"integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="
870
},
871
"yoga-wasm-web@0.3.3": {
872
"integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA=="
873
+
},
874
+
"zwitch@2.0.4": {
875
+
"integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="
876
}
877
},
878
"redirects": {
···
888
},
889
"workspace": {
890
"dependencies": [
891
+
"jsr:@slices/client@~0.1.0-alpha.4",
892
+
"jsr:@slices/oauth@0.6",
893
"npm:@takumi-rs/core@~0.29.8",
894
"npm:@takumi-rs/helpers@~0.29.8",
895
"npm:github-colors@^2.2.21",
+64
lexicons/app/bsky/actor/profile.json
+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
+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
+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
+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
+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
+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
+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
+5
slices.json
+400
-351
src/generated_client.ts
+400
-351
src/generated_client.ts
···
1
// Generated TypeScript client for AT Protocol records
2
-
// Generated at: 2025-09-14 18:49:29 UTC
3
// Lexicons: 7
4
5
/**
···
8
* import { AtProtoClient } from "./generated_client.ts";
9
*
10
* const client = new AtProtoClient(
11
-
* 'https://slices-api.fly.dev',
12
* 'at://did:plc:bcgltzqazw5tb6k2g3ttenbj/network.slices.slice/3lymhhbxald2z'
13
* );
14
*
15
-
* // Get records from the sh.tangled.feed.star collection
16
-
* const records = await client.sh.tangled.feed.star.getRecords();
17
*
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'
21
* });
22
*
23
* // Get records with filtering and search
24
-
* const filteredRecords = await client.sh.tangled.feed.star.getRecords({
25
* where: {
26
* text: { contains: "example search term" }
27
* }
28
* });
29
*
30
* // Use slice-level methods for cross-collection queries with type safety
31
-
* const sliceRecords = await client.network.slices.slice.getSliceRecords<ShTangledFeedStar>({
32
* where: {
33
-
* collection: { eq: 'sh.tangled.feed.star' }
34
* }
35
* });
36
*
37
* // Search across multiple collections using union types
38
-
* const multiCollectionRecords = await client.network.slices.slice.getSliceRecords<ShTangledFeedStar | AppBskyActorProfile>({
39
* where: {
40
-
* collection: { in: ['sh.tangled.feed.star', 'app.bsky.actor.profile'] },
41
* text: { contains: 'example search term' },
42
* did: { in: ['did:plc:user1', 'did:plc:user2'] }
43
* },
···
50
*/
51
52
import {
53
type BlobRef,
54
type CountRecordsResponse,
55
type GetRecordParams,
···
59
SlicesClient,
60
type SortField,
61
type WhereCondition,
62
-
} from "jsr:@slices/client@^0.1.0-alpha.2";
63
-
import { OAuthClient } from "jsr:@slices/oauth@^0.4.1";
64
65
-
export interface ShTangledFeedStar {
66
createdAt: string;
67
subject: string;
68
}
69
70
-
export type ShTangledFeedStarSortFields = "createdAt" | "subject";
71
72
-
export interface ComAtprotoRepoStrongRef {
73
-
cid: string;
74
-
uri: string;
75
}
76
77
export interface ComAtprotoLabelDefsLabel {
78
/** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */
···
95
ver?: number;
96
}
97
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
export interface ComAtprotoLabelDefsSelfLabel {
122
/** The short string name of the value or type of this label. */
123
val: string;
···
127
values: ComAtprotoLabelDefs["SelfLabel"][];
128
}
129
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[];
166
}
167
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 */
176
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;
182
}
183
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;
198
}
199
200
-
export type ShTangledRepoIssueSortFields =
201
-
| "body"
202
-
| "createdAt"
203
-
| "repo"
204
-
| "title";
205
-
206
export interface ComAtprotoLabelDefs {
207
readonly Label: ComAtprotoLabelDefsLabel;
208
-
readonly LabelValueDefinition: ComAtprotoLabelDefsLabelValueDefinition;
209
-
readonly LabelValueDefinitionStrings: ComAtprotoLabelDefsLabelValueDefinitionStrings;
210
readonly SelfLabel: ComAtprotoLabelDefsSelfLabel;
211
readonly SelfLabels: ComAtprotoLabelDefsSelfLabels;
212
}
213
214
-
class StarFeedTangledShClient {
215
private readonly client: SlicesClient;
216
217
constructor(client: SlicesClient) {
218
this.client = client;
219
}
220
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);
233
}
234
235
async getRecord(
236
-
params: GetRecordParams
237
-
): Promise<RecordResponse<ShTangledFeedStar>> {
238
-
return await this.client.getRecord("sh.tangled.feed.star", params);
239
}
240
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);
253
}
254
255
async createRecord(
256
-
record: ShTangledFeedStar,
257
-
useSelfRkey?: boolean
258
): Promise<{ uri: string; cid: string }> {
259
return await this.client.createRecord(
260
-
"sh.tangled.feed.star",
261
record,
262
-
useSelfRkey
263
);
264
}
265
266
async updateRecord(
267
rkey: string,
268
-
record: ShTangledFeedStar
269
): Promise<{ uri: string; cid: string }> {
270
-
return await this.client.updateRecord("sh.tangled.feed.star", rkey, record);
271
}
272
273
async deleteRecord(rkey: string): Promise<void> {
274
-
return await this.client.deleteRecord("sh.tangled.feed.star", rkey);
275
}
276
}
277
278
-
class FeedTangledShClient {
279
-
readonly star: StarFeedTangledShClient;
280
private readonly client: SlicesClient;
281
282
constructor(client: SlicesClient) {
283
this.client = client;
284
-
this.star = new StarFeedTangledShClient(client);
285
}
286
}
287
288
-
class ProfileActorTangledShClient {
289
private readonly client: SlicesClient;
290
291
constructor(client: SlicesClient) {
292
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);
361
}
362
}
363
364
-
class ActorTangledShClient {
365
-
readonly profile: ProfileActorTangledShClient;
366
private readonly client: SlicesClient;
367
368
constructor(client: SlicesClient) {
369
this.client = client;
370
-
this.profile = new ProfileActorTangledShClient(client);
371
}
372
}
373
···
378
this.client = client;
379
}
380
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>> {
396
return await this.client.getRecords("sh.tangled.repo.issue", params);
397
}
398
399
async getRecord(
400
-
params: GetRecordParams
401
): Promise<RecordResponse<ShTangledRepoIssue>> {
402
return await this.client.getRecord("sh.tangled.repo.issue", params);
403
}
404
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> {
420
return await this.client.countRecords("sh.tangled.repo.issue", params);
421
}
422
423
async createRecord(
424
record: ShTangledRepoIssue,
425
-
useSelfRkey?: boolean
426
): Promise<{ uri: string; cid: string }> {
427
return await this.client.createRecord(
428
"sh.tangled.repo.issue",
429
record,
430
-
useSelfRkey
431
);
432
}
433
434
async updateRecord(
435
rkey: string,
436
-
record: ShTangledRepoIssue
437
): Promise<{ uri: string; cid: string }> {
438
return await this.client.updateRecord(
439
"sh.tangled.repo.issue",
440
rkey,
441
-
record
442
);
443
}
444
···
456
this.issue = new IssueRepoTangledShClient(client);
457
}
458
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>> {
470
return await this.client.getRecords("sh.tangled.repo", params);
471
}
472
473
async getRecord(
474
-
params: GetRecordParams
475
): Promise<RecordResponse<ShTangledRepo>> {
476
return await this.client.getRecord("sh.tangled.repo", params);
477
}
478
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> {
490
return await this.client.countRecords("sh.tangled.repo", params);
491
}
492
493
async createRecord(
494
record: ShTangledRepo,
495
-
useSelfRkey?: boolean
496
): Promise<{ uri: string; cid: string }> {
497
return await this.client.createRecord(
498
"sh.tangled.repo",
499
record,
500
-
useSelfRkey
501
);
502
}
503
504
async updateRecord(
505
rkey: string,
506
-
record: ShTangledRepo
507
): Promise<{ uri: string; cid: string }> {
508
return await this.client.updateRecord("sh.tangled.repo", rkey, record);
509
}
···
513
}
514
}
515
516
-
class TangledShClient {
517
-
readonly feed: FeedTangledShClient;
518
-
readonly actor: ActorTangledShClient;
519
-
readonly repo: RepoTangledShClient;
520
private readonly client: SlicesClient;
521
522
constructor(client: SlicesClient) {
523
this.client = client;
524
-
this.feed = new FeedTangledShClient(client);
525
-
this.actor = new ActorTangledShClient(client);
526
-
this.repo = new RepoTangledShClient(client);
527
}
528
}
529
530
-
class ShClient {
531
-
readonly tangled: TangledShClient;
532
private readonly client: SlicesClient;
533
534
constructor(client: SlicesClient) {
535
this.client = client;
536
-
this.tangled = new TangledShClient(client);
537
}
538
}
539
540
-
class ProfileActorBskyAppClient {
541
private readonly client: SlicesClient;
542
543
constructor(client: SlicesClient) {
544
this.client = client;
545
}
546
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);
563
}
564
565
async getRecord(
566
-
params: GetRecordParams
567
-
): Promise<RecordResponse<AppBskyActorProfile>> {
568
-
return await this.client.getRecord("app.bsky.actor.profile", params);
569
}
570
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);
587
}
588
589
async createRecord(
590
-
record: AppBskyActorProfile,
591
-
useSelfRkey?: boolean
592
): Promise<{ uri: string; cid: string }> {
593
return await this.client.createRecord(
594
-
"app.bsky.actor.profile",
595
record,
596
-
useSelfRkey
597
);
598
}
599
600
async updateRecord(
601
rkey: string,
602
-
record: AppBskyActorProfile
603
): Promise<{ uri: string; cid: string }> {
604
return await this.client.updateRecord(
605
-
"app.bsky.actor.profile",
606
rkey,
607
-
record
608
);
609
}
610
611
async deleteRecord(rkey: string): Promise<void> {
612
-
return await this.client.deleteRecord("app.bsky.actor.profile", rkey);
613
}
614
}
615
616
-
class ActorBskyAppClient {
617
-
readonly profile: ProfileActorBskyAppClient;
618
private readonly client: SlicesClient;
619
620
constructor(client: SlicesClient) {
621
this.client = client;
622
-
this.profile = new ProfileActorBskyAppClient(client);
623
}
624
}
625
626
-
class BskyAppClient {
627
-
readonly actor: ActorBskyAppClient;
628
private readonly client: SlicesClient;
629
630
constructor(client: SlicesClient) {
631
this.client = client;
632
-
this.actor = new ActorBskyAppClient(client);
633
}
634
}
635
636
-
class AppClient {
637
-
readonly bsky: BskyAppClient;
638
private readonly client: SlicesClient;
639
640
constructor(client: SlicesClient) {
641
this.client = client;
642
-
this.bsky = new BskyAppClient(client);
643
}
644
}
645
646
export class AtProtoClient extends SlicesClient {
647
readonly sh: ShClient;
648
-
readonly app: AppClient;
649
-
readonly oauth?: OAuthClient;
650
651
-
constructor(baseUrl: string, sliceUri: string, oauthClient?: OAuthClient) {
652
super(baseUrl, sliceUri, oauthClient);
653
this.sh = new ShClient(this);
654
-
this.app = new AppClient(this);
655
-
this.oauth = this.oauthClient;
656
}
657
}
···
1
// Generated TypeScript client for AT Protocol records
2
+
// Generated at: 2025-09-28 02:23:16 UTC
3
// Lexicons: 7
4
5
/**
···
8
* import { AtProtoClient } from "./generated_client.ts";
9
*
10
* const client = new AtProtoClient(
11
+
* 'https://api.slices.network',
12
* 'at://did:plc:bcgltzqazw5tb6k2g3ttenbj/network.slices.slice/3lymhhbxald2z'
13
* );
14
*
15
+
* // Get records from the app.bsky.actor.profile collection
16
+
* const records = await client.app.bsky.actor.profile.getRecords();
17
*
18
* // Get a specific record
19
+
* const record = await client.app.bsky.actor.profile.getRecord({
20
+
* uri: 'at://did:plc:example/app.bsky.actor.profile/3abc123'
21
* });
22
*
23
* // Get records with filtering and search
24
+
* const filteredRecords = await client.app.bsky.actor.profile.getRecords({
25
* where: {
26
* text: { contains: "example search term" }
27
* }
28
* });
29
*
30
* // Use slice-level methods for cross-collection queries with type safety
31
+
* const sliceRecords = await client.network.slices.slice.getSliceRecords<AppBskyActorProfile>({
32
* where: {
33
+
* collection: { eq: 'app.bsky.actor.profile' }
34
* }
35
* });
36
*
37
* // Search across multiple collections using union types
38
+
* const multiCollectionRecords = await client.network.slices.slice.getSliceRecords<AppBskyActorProfile | AppBskyActorProfile>({
39
* where: {
40
+
* collection: { in: ['app.bsky.actor.profile', 'app.bsky.actor.profile'] },
41
* text: { contains: 'example search term' },
42
* did: { in: ['did:plc:user1', 'did:plc:user2'] }
43
* },
···
50
*/
51
52
import {
53
+
type AuthProvider,
54
type BlobRef,
55
type CountRecordsResponse,
56
type GetRecordParams,
···
60
SlicesClient,
61
type SortField,
62
type WhereCondition,
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>);
79
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[];
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 {
145
subject: string;
146
+
createdAt: string;
147
}
148
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
+
}
163
164
+
export type ShTangledActorProfileSortFields = "description" | "location";
165
+
166
+
export interface ShTangledRepoIssue {
167
+
repo: string;
168
+
title: string;
169
+
body?: string;
170
+
createdAt: string;
171
}
172
+
173
+
export type ShTangledRepoIssueSortFields =
174
+
| "repo"
175
+
| "title"
176
+
| "body"
177
+
| "createdAt";
178
179
export interface ComAtprotoLabelDefsLabel {
180
/** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */
···
197
ver?: number;
198
}
199
200
export interface ComAtprotoLabelDefsSelfLabel {
201
/** The short string name of the value or type of this label. */
202
val: string;
···
206
values: ComAtprotoLabelDefs["SelfLabel"][];
207
}
208
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;
221
}
222
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. */
227
name: string;
228
+
/** A longer description of what the label means and why it might be applied. */
229
+
description: string;
230
}
231
232
+
export interface ComAtprotoRepoStrongRef {
233
+
cid: string;
234
+
uri: string;
235
}
236
237
export interface ComAtprotoLabelDefs {
238
readonly Label: ComAtprotoLabelDefsLabel;
239
readonly SelfLabel: ComAtprotoLabelDefsSelfLabel;
240
+
readonly LabelValue: ComAtprotoLabelDefsLabelValue;
241
readonly SelfLabels: ComAtprotoLabelDefsSelfLabels;
242
+
readonly LabelValueDefinition: ComAtprotoLabelDefsLabelValueDefinition;
243
+
readonly LabelValueDefinitionStrings:
244
+
ComAtprotoLabelDefsLabelValueDefinitionStrings;
245
}
246
247
+
class ProfileActorBskyAppClient {
248
private readonly client: SlicesClient;
249
250
constructor(client: SlicesClient) {
251
this.client = client;
252
}
253
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);
270
}
271
272
async getRecord(
273
+
params: GetRecordParams,
274
+
): Promise<RecordResponse<AppBskyActorProfile>> {
275
+
return await this.client.getRecord("app.bsky.actor.profile", params);
276
}
277
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);
294
}
295
296
async createRecord(
297
+
record: AppBskyActorProfile,
298
+
useSelfRkey?: boolean,
299
): Promise<{ uri: string; cid: string }> {
300
return await this.client.createRecord(
301
+
"app.bsky.actor.profile",
302
record,
303
+
useSelfRkey,
304
);
305
}
306
307
async updateRecord(
308
rkey: string,
309
+
record: AppBskyActorProfile,
310
): Promise<{ uri: string; cid: string }> {
311
+
return await this.client.updateRecord(
312
+
"app.bsky.actor.profile",
313
+
rkey,
314
+
record,
315
+
);
316
}
317
318
async deleteRecord(rkey: string): Promise<void> {
319
+
return await this.client.deleteRecord("app.bsky.actor.profile", rkey);
320
}
321
}
322
323
+
class ActorBskyAppClient {
324
+
readonly profile: ProfileActorBskyAppClient;
325
private readonly client: SlicesClient;
326
327
constructor(client: SlicesClient) {
328
this.client = client;
329
+
this.profile = new ProfileActorBskyAppClient(client);
330
}
331
}
332
333
+
class BskyAppClient {
334
+
readonly actor: ActorBskyAppClient;
335
private readonly client: SlicesClient;
336
337
constructor(client: SlicesClient) {
338
this.client = client;
339
+
this.actor = new ActorBskyAppClient(client);
340
}
341
}
342
343
+
class AppClient {
344
+
readonly bsky: BskyAppClient;
345
private readonly client: SlicesClient;
346
347
constructor(client: SlicesClient) {
348
this.client = client;
349
+
this.bsky = new BskyAppClient(client);
350
}
351
}
352
···
357
this.client = client;
358
}
359
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>> {
375
return await this.client.getRecords("sh.tangled.repo.issue", params);
376
}
377
378
async getRecord(
379
+
params: GetRecordParams,
380
): Promise<RecordResponse<ShTangledRepoIssue>> {
381
return await this.client.getRecord("sh.tangled.repo.issue", params);
382
}
383
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> {
399
return await this.client.countRecords("sh.tangled.repo.issue", params);
400
}
401
402
async createRecord(
403
record: ShTangledRepoIssue,
404
+
useSelfRkey?: boolean,
405
): Promise<{ uri: string; cid: string }> {
406
return await this.client.createRecord(
407
"sh.tangled.repo.issue",
408
record,
409
+
useSelfRkey,
410
);
411
}
412
413
async updateRecord(
414
rkey: string,
415
+
record: ShTangledRepoIssue,
416
): Promise<{ uri: string; cid: string }> {
417
return await this.client.updateRecord(
418
"sh.tangled.repo.issue",
419
rkey,
420
+
record,
421
);
422
}
423
···
435
this.issue = new IssueRepoTangledShClient(client);
436
}
437
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>> {
451
return await this.client.getRecords("sh.tangled.repo", params);
452
}
453
454
async getRecord(
455
+
params: GetRecordParams,
456
): Promise<RecordResponse<ShTangledRepo>> {
457
return await this.client.getRecord("sh.tangled.repo", params);
458
}
459
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> {
473
return await this.client.countRecords("sh.tangled.repo", params);
474
}
475
476
async createRecord(
477
record: ShTangledRepo,
478
+
useSelfRkey?: boolean,
479
): Promise<{ uri: string; cid: string }> {
480
return await this.client.createRecord(
481
"sh.tangled.repo",
482
record,
483
+
useSelfRkey,
484
);
485
}
486
487
async updateRecord(
488
rkey: string,
489
+
record: ShTangledRepo,
490
): Promise<{ uri: string; cid: string }> {
491
return await this.client.updateRecord("sh.tangled.repo", rkey, record);
492
}
···
496
}
497
}
498
499
+
class StarFeedTangledShClient {
500
private readonly client: SlicesClient;
501
502
constructor(client: SlicesClient) {
503
this.client = 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);
568
}
569
}
570
571
+
class FeedTangledShClient {
572
+
readonly star: StarFeedTangledShClient;
573
private readonly client: SlicesClient;
574
575
constructor(client: SlicesClient) {
576
this.client = client;
577
+
this.star = new StarFeedTangledShClient(client);
578
}
579
}
580
581
+
class ProfileActorTangledShClient {
582
private readonly client: SlicesClient;
583
584
constructor(client: SlicesClient) {
585
this.client = client;
586
}
587
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);
604
}
605
606
async getRecord(
607
+
params: GetRecordParams,
608
+
): Promise<RecordResponse<ShTangledActorProfile>> {
609
+
return await this.client.getRecord("sh.tangled.actor.profile", params);
610
}
611
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);
628
}
629
630
async createRecord(
631
+
record: ShTangledActorProfile,
632
+
useSelfRkey?: boolean,
633
): Promise<{ uri: string; cid: string }> {
634
return await this.client.createRecord(
635
+
"sh.tangled.actor.profile",
636
record,
637
+
useSelfRkey,
638
);
639
}
640
641
async updateRecord(
642
rkey: string,
643
+
record: ShTangledActorProfile,
644
): Promise<{ uri: string; cid: string }> {
645
return await this.client.updateRecord(
646
+
"sh.tangled.actor.profile",
647
rkey,
648
+
record,
649
);
650
}
651
652
async deleteRecord(rkey: string): Promise<void> {
653
+
return await this.client.deleteRecord("sh.tangled.actor.profile", rkey);
654
}
655
}
656
657
+
class ActorTangledShClient {
658
+
readonly profile: ProfileActorTangledShClient;
659
private readonly client: SlicesClient;
660
661
constructor(client: SlicesClient) {
662
this.client = client;
663
+
this.profile = new ProfileActorTangledShClient(client);
664
}
665
}
666
667
+
class TangledShClient {
668
+
readonly repo: RepoTangledShClient;
669
+
readonly feed: FeedTangledShClient;
670
+
readonly actor: ActorTangledShClient;
671
private readonly client: SlicesClient;
672
673
constructor(client: SlicesClient) {
674
this.client = client;
675
+
this.repo = new RepoTangledShClient(client);
676
+
this.feed = new FeedTangledShClient(client);
677
+
this.actor = new ActorTangledShClient(client);
678
}
679
}
680
681
+
class ShClient {
682
+
readonly tangled: TangledShClient;
683
private readonly client: SlicesClient;
684
685
constructor(client: SlicesClient) {
686
this.client = client;
687
+
this.tangled = new TangledShClient(client);
688
}
689
}
690
691
export class AtProtoClient extends SlicesClient {
692
+
readonly app: AppClient;
693
readonly sh: ShClient;
694
+
readonly oauth?: OAuthClient | AuthProvider;
695
696
+
constructor(
697
+
baseUrl: string,
698
+
sliceUri: string,
699
+
oauthClient?: OAuthClient | AuthProvider,
700
+
) {
701
super(baseUrl, sliceUri, oauthClient);
702
+
this.app = new AppClient(this);
703
this.sh = new ShClient(this);
704
+
this.oauth = oauthClient;
705
}
706
}