├── .nvmrc ├── src ├── entry.ts ├── constants.ts ├── octokit.ts ├── label-server.ts └── bot.ts ├── .gitignore ├── tsconfig.json ├── README.md ├── LICENSE ├── package.json └── pnpm-lock.yaml /.nvmrc: -------------------------------------------------------------------------------- 1 | 22.9.0 2 | -------------------------------------------------------------------------------- /src/entry.ts: -------------------------------------------------------------------------------- 1 | import "./label-server.js"; 2 | import "./bot.js"; 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | cursor.txt 4 | *.log 5 | labels.db* 6 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | 3 | export const HANDLE = "@github-labeler.bsky.social"; 4 | export const DID = (process.env.DID ?? "") as `did:${string}`; 5 | export const SIGNING_KEY = process.env.SIGNING_KEY ?? ""; 6 | export const PORT = Number(process.env.PORT ?? 4001); 7 | export const MAXLABELS = 4; 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "ESNext", 5 | "module": "nodenext", 6 | "moduleResolution": "nodenext", 7 | "allowSyntheticDefaultImports": true, 8 | "esModuleInterop": true, 9 | "noUncheckedIndexedAccess": true, 10 | "noUnusedLocals": true, 11 | "noUnusedParameters": true, 12 | "allowUnreachableCode": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitHub Labeler Bot 2 | 3 | ## Architecture 4 | 5 | - `src/label-server.ts`: Creates a server that bsky will make requests to for information about labeled content. 6 | - `src/bot.ts`: Creates a bot that will respond to messages from users. 7 | 8 | ## User Setup 9 | 10 | ``` 11 | Adds labels for repositories you contribute to (max 4) 12 | 13 | Setup Instructions: 14 | 15 | 1. Follow this labeler (hint: click the "..." menu > "Follow") 16 | 2. Subscribe to the labeler 17 | 3. Like the labeler 18 | 19 | All steps required. #3 sends a DM to continue setup 20 | ``` 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2024 Juliet Philippe 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any 4 | purpose with or without fee is hereby granted. 5 | 6 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 7 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 8 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 9 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 10 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 11 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 12 | PERFORMANCE OF THIS SOFTWARE. 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-labeler-bot", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "engines": { 6 | "node": ">=22.0.0" 7 | }, 8 | "scripts": { 9 | "start": "tsx src/entry.ts" 10 | }, 11 | "devDependencies": { 12 | "@types/node": "^22.7.5", 13 | "typescript": "^5.5.3" 14 | }, 15 | "dependencies": { 16 | "@octokit/plugin-retry": "^7.1.2", 17 | "@octokit/plugin-throttling": "^9.3.2", 18 | "@octokit/rest": "^21.0.2", 19 | "@skyware/bot": "^0.3.7", 20 | "@skyware/labeler": "^0.1.8", 21 | "await-to-js": "^3.0.0", 22 | "dedent": "^1.5.3", 23 | "dotenv": "^16.4.5", 24 | "tsx": "^4.19.2" 25 | }, 26 | "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee" 27 | } 28 | -------------------------------------------------------------------------------- /src/octokit.ts: -------------------------------------------------------------------------------- 1 | import { Octokit } from "@octokit/rest"; 2 | import { throttling } from "@octokit/plugin-throttling"; 3 | import { retry } from "@octokit/plugin-retry"; 4 | 5 | const MyOctokit = Octokit.plugin(throttling).plugin(retry); 6 | 7 | export const octokit = new MyOctokit({ 8 | auth: process.env.GITHUB_TOKEN!, 9 | throttle: { 10 | onRateLimit: (retryAfter, options, octokit, retryCount) => { 11 | octokit.log.warn( 12 | `Request quota exhausted for request ${options.method} ${options.url}` 13 | ); 14 | 15 | if (retryCount < 1) { 16 | // only retries once 17 | octokit.log.info(`Retrying after ${retryAfter} seconds!`); 18 | return true; 19 | } 20 | }, 21 | onSecondaryRateLimit: (retryAfter, options, octokit) => { 22 | // does not retry, only logs a warning 23 | octokit.log.warn( 24 | `SecondaryRateLimit detected for request ${options.method} ${options.url}` 25 | ); 26 | }, 27 | }, 28 | }); 29 | -------------------------------------------------------------------------------- /src/label-server.ts: -------------------------------------------------------------------------------- 1 | import { ComAtprotoLabelDefs } from "@atcute/client/lexicons"; 2 | import { 3 | getLabelerLabelDefinitions, 4 | setLabelerLabelDefinitions, 5 | } from "@skyware/labeler/scripts"; 6 | import { DID, PORT, MAXLABELS, SIGNING_KEY } from "./constants.js"; 7 | import { LabelerServer } from "@skyware/labeler"; 8 | 9 | const server = new LabelerServer({ 10 | did: DID, 11 | signingKey: SIGNING_KEY, 12 | dbPath: process.env.DB_PATH, 13 | }); 14 | 15 | server.app.listen({ port: PORT, host: "::" }, (error, address) => { 16 | if (error) console.error(error); 17 | else console.log(`Labeler server listening on ${address}`); 18 | }); 19 | 20 | const credentials = { 21 | identifier: DID, 22 | password: process.env.LABELER_PASSWORD!, 23 | }; 24 | 25 | interface Label { 26 | name: string; 27 | description: string; 28 | } 29 | 30 | const numbers = [ 31 | "zero", 32 | "one", 33 | "two", 34 | "three", 35 | "four", 36 | "five", 37 | "six", 38 | "seven", 39 | "eight", 40 | "nine", 41 | ]; 42 | 43 | function getIdentifier(name: string) { 44 | // GitHub allows [A-Za-z0-9_.-]+ but bsky only supports ^[a-z-]+$ 45 | let identifier = name 46 | // Replace the / in org/repo 47 | .replace("/", "-") 48 | // Replace _ and . with - 49 | .replaceAll("_", "-") 50 | .replaceAll(".", "-") 51 | // Convert to lowercase 52 | .toLowerCase(); 53 | 54 | // replace numbers with the corresponding string representation 55 | for (let i = 0; i < numbers.length; i++) { 56 | const number = numbers[i]; 57 | 58 | if (number && identifier.includes(`${i}`)) { 59 | identifier = identifier.replaceAll(`${i}`, number); 60 | } 61 | } 62 | 63 | return identifier; 64 | } 65 | 66 | async function createLabel({ name, description }: Label) { 67 | const identifier = getIdentifier(name); 68 | const currentLabels = (await getLabelerLabelDefinitions(credentials)) || []; 69 | 70 | if (currentLabels.find((label) => label.identifier === identifier)) { 71 | console.log(`Label ${identifier} already exists`); 72 | return; 73 | } 74 | 75 | await setLabelerLabelDefinitions(credentials, [ 76 | ...currentLabels, 77 | { 78 | identifier, 79 | severity: "inform", 80 | blurs: "none", 81 | defaultSetting: "warn", 82 | adultOnly: false, 83 | locales: [{ lang: "en", description, name }], 84 | }, 85 | ]); 86 | console.log(`Created label ${identifier}!`); 87 | } 88 | 89 | export const addUserLabel = async (did: string, label: Label) => { 90 | const identifier = getIdentifier(label.name); 91 | // Get the current labels for the did 92 | const query = server.db 93 | .prepare(`SELECT * FROM labels WHERE uri = ?`) 94 | .all(did) as ComAtprotoLabelDefs.Label[]; 95 | 96 | await createLabel(label); 97 | 98 | // make a set of the current labels 99 | const labels = query.reduce((set, label) => { 100 | if (!label.neg) set.add(label.val); 101 | else set.delete(label.val); 102 | return set; 103 | }, new Set()); 104 | 105 | try { 106 | if (labels.size < MAXLABELS) { 107 | server.createLabel({ uri: did, val: identifier }); 108 | console.log(`${new Date().toISOString()} Labeled ${did}: ${identifier}`); 109 | return true; 110 | } 111 | } catch (err) { 112 | console.error(err); 113 | } 114 | 115 | return false; 116 | }; 117 | 118 | export const clearUserLabels = async (did: string) => { 119 | // Get the current labels for the did 120 | const query = server.db 121 | .prepare(`SELECT * FROM labels WHERE uri = ?`) 122 | .all(did) as ComAtprotoLabelDefs.Label[]; 123 | 124 | // make a set of the current labels 125 | const labels = query.reduce((set, label) => { 126 | if (!label.neg) set.add(label.val); 127 | else set.delete(label.val); 128 | return set; 129 | }, new Set()); 130 | 131 | try { 132 | server.createLabels({ uri: did }, { negate: [...labels] }); 133 | console.log(`${new Date().toISOString()} Deleted labels: ${did}`); 134 | } catch (err) { 135 | console.error(err); 136 | } 137 | }; 138 | 139 | interface Session { 140 | accessJwt: string; 141 | refreshJwt: string; 142 | } 143 | 144 | export const getStoredSession = () => { 145 | // initialize session table if it doesn't exist 146 | server.db 147 | .prepare( 148 | `CREATE TABLE IF NOT EXISTS session (uri TEXT PRIMARY KEY, accessJwt TEXT, refreshJwt TEXT)` 149 | ) 150 | .run(); 151 | 152 | // TODO: https://github.com/skyware-js/bot/issues/16 153 | return null as Session | null; 154 | // return server.db 155 | // .prepare(`SELECT * FROM session WHERE uri = ?`) 156 | // .get(DID) as unknown as Session | null; 157 | }; 158 | 159 | export const setStoredSession = (session: Session) => { 160 | server.db 161 | .prepare( 162 | `INSERT OR REPLACE INTO session (uri, accessJwt, refreshJwt) VALUES (?, ?, ?)` 163 | ) 164 | .run(DID, session.accessJwt, session.refreshJwt); 165 | }; 166 | -------------------------------------------------------------------------------- /src/bot.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Bot, 3 | ChatMessage, 4 | Conversation, 5 | DeletedChatMessage, 6 | IncomingChatPreference, 7 | Labeler, 8 | } from "@skyware/bot"; 9 | import dedent from "dedent"; 10 | import { to } from "await-to-js"; 11 | import { octokit } from "./octokit.js"; 12 | import { 13 | addUserLabel, 14 | clearUserLabels, 15 | getStoredSession, 16 | setStoredSession, 17 | } from "./label-server.js"; 18 | import { DID, HANDLE } from "./constants.js"; 19 | 20 | const SUCCESS_MESSAGE = "Success! We've verified your GitHub account."; 21 | 22 | const bot = new Bot({ 23 | emitChatEvents: true, 24 | }); 25 | 26 | let session = getStoredSession(); 27 | 28 | if (session) { 29 | try { 30 | await bot.resumeSession({ 31 | accessJwt: session.accessJwt, 32 | refreshJwt: session.refreshJwt, 33 | active: true, 34 | did: DID, 35 | handle: HANDLE, 36 | }); 37 | console.log("Resumed session"); 38 | } catch (err) { 39 | console.error(err); 40 | session = null; 41 | } 42 | } 43 | 44 | if (!session) { 45 | const session = await bot.login({ 46 | identifier: process.env.DID!, 47 | password: process.env.LABELER_PASSWORD!, 48 | }); 49 | 50 | setStoredSession(session); 51 | console.log("Logged in"); 52 | } 53 | 54 | await bot.setChatPreference(IncomingChatPreference.All); 55 | 56 | bot.on("like", async ({ subject, user }) => { 57 | // We only care if the user liked the labeler 58 | if (subject instanceof Labeler !== true) { 59 | return; 60 | } 61 | 62 | const [err, conversation] = await to( 63 | bot.getConversationForMembers([user.did]) 64 | ); 65 | 66 | if (err) { 67 | console.error(err); 68 | return; 69 | } 70 | 71 | await conversation.sendMessage({ 72 | text: dedent` 73 | Hello! Let's onboard you to the GitHub labeler bot! 74 | 75 | This bot lets you add labels for repos you are a contributor to. You can add up to 4. 76 | 77 | First let's verify your GitHub account. For this to work you must list your Bluesky handle in your GitHub profile. 78 | 79 | Send your GitHub username in this format: 80 | 81 | github: your-username 82 | `, 83 | }); 84 | }); 85 | 86 | async function verifyUser(message: ChatMessage, conversation: Conversation) { 87 | const username = (message.text.split(":")[1] || "").trim(); 88 | 89 | if (!username) { 90 | await conversation.sendMessage({ 91 | text: dedent` 92 | You must provide a GitHub username. 93 | `, 94 | }); 95 | return; 96 | } 97 | 98 | const [socialErr, socials] = await to( 99 | octokit.users.listSocialAccountsForUser({ username }) 100 | ); 101 | 102 | if (socialErr) { 103 | await conversation.sendMessage({ 104 | text: dedent` 105 | Something went wrong getting your social accounts. Please try again. 106 | `, 107 | }); 108 | return; 109 | } 110 | 111 | const listedBlueskyHandle = socials.data.find( 112 | (account) => account.provider === "bluesky" 113 | ); 114 | 115 | if (!listedBlueskyHandle) { 116 | await conversation.sendMessage({ 117 | text: dedent` 118 | You must list your Bluesky handle in your GitHub profile. 119 | 120 | When you edit your profile, make sure to use the special Bluesky field! 121 | `, 122 | }); 123 | return; 124 | } 125 | 126 | const [profileErr, userForListedBlueskyHandle] = await to( 127 | bot.agent.get("app.bsky.actor.getProfile", { 128 | params: { 129 | actor: listedBlueskyHandle.url.replace("https://bsky.app/profile/", ""), 130 | }, 131 | }) 132 | ); 133 | 134 | if (profileErr) { 135 | await conversation.sendMessage({ 136 | text: dedent` 137 | Couldn't find your Bluesky profile. 138 | `, 139 | }); 140 | return; 141 | } 142 | 143 | if (userForListedBlueskyHandle.data.did !== message.senderDid) { 144 | await conversation.sendMessage({ 145 | text: dedent` 146 | The account your sending the message from is not the same as the account you listed in your GitHub profile. 147 | `, 148 | }); 149 | return; 150 | } 151 | 152 | await conversation.sendMessage({ 153 | text: dedent` 154 | ${SUCCESS_MESSAGE} 155 | 156 | To link github repo send a message like the following. We will confirm you are a collaborator on the repo. 157 | 158 | repo: your-username/your-repo 159 | 160 | > Note: Only public repos are supported for now. 161 | `, 162 | }); 163 | } 164 | 165 | async function findGithubUsername(conversation: Conversation) { 166 | let cursor: string | undefined | null = null; 167 | let messages: Array = []; 168 | let confirmMessageIndex = -1; 169 | 170 | while (confirmMessageIndex === -1 && cursor !== undefined) { 171 | ({ messages, cursor } = await conversation.getMessages( 172 | cursor || undefined 173 | )); 174 | 175 | confirmMessageIndex = messages.findIndex( 176 | (message) => 177 | message instanceof ChatMessage && 178 | message.text.startsWith(SUCCESS_MESSAGE) 179 | ); 180 | } 181 | 182 | if (confirmMessageIndex !== -1) { 183 | let previousMessage = messages[confirmMessageIndex + 1]; 184 | 185 | // If the success message is the last message, we need to fetch more 186 | if (!previousMessage) { 187 | ({ messages, cursor } = await conversation.getMessages( 188 | cursor || undefined 189 | )); 190 | previousMessage = messages[0]; 191 | } 192 | 193 | if (!previousMessage || !(previousMessage instanceof ChatMessage)) { 194 | await conversation.sendMessage({ 195 | text: dedent` 196 | Something went wrong. Please try again. 197 | `, 198 | }); 199 | return; 200 | } 201 | 202 | return (previousMessage.text.split(":")[1] || "").trim(); 203 | } 204 | } 205 | 206 | async function addRepoLabelForUser( 207 | message: ChatMessage, 208 | conversation: Conversation 209 | ) { 210 | const githubUsername = await findGithubUsername(conversation); 211 | console.log("Found github username", githubUsername); 212 | 213 | if (!githubUsername) { 214 | await conversation.sendMessage({ 215 | text: "Could not find your GitHub username. Please try again.", 216 | }); 217 | return; 218 | } 219 | 220 | const input = (message.text.split(":")[1] || "").trim(); 221 | const [org, repo] = input.split("/"); 222 | 223 | if (!org) { 224 | await conversation.sendMessage({ 225 | text: "Could not find the org name in the provided slug. Please try again.", 226 | }); 227 | return; 228 | } 229 | 230 | if (!repo) { 231 | await conversation.sendMessage({ 232 | text: "Could not find the repo name in the provided slug. Please try again.", 233 | }); 234 | return; 235 | } 236 | 237 | const [searchErr, mergedPrs] = await to( 238 | octokit.search.issuesAndPullRequests({ 239 | q: `repo:${input} author:${githubUsername} is:merged`, 240 | }) 241 | ); 242 | 243 | if (searchErr) { 244 | await conversation.sendMessage({ 245 | text: dedent` 246 | Something went wrong searching GitHub for merged PRs. Please try again. 247 | `, 248 | }); 249 | return; 250 | } 251 | 252 | if (mergedPrs.data.items.length === 0) { 253 | try { 254 | // As a last ditch effort, check if the user is a contributor to the repo via the public API 255 | // We don't use the public API otherwise because there is no filtering. 256 | const res = await fetch( 257 | `https://api.github.com/repos/${input}/contributors?per_page=100`, 258 | { 259 | headers: { 260 | Authorization: `token ${process.env.GITHUB_TOKEN}`, 261 | }, 262 | } 263 | ); 264 | const contributorList: { login: string }[] = await res.json(); 265 | const isTopContributor = contributorList.some( 266 | (c) => c.login === githubUsername 267 | ); 268 | 269 | if (!isTopContributor) { 270 | throw new Error("You aren't a contributor to the repo"); 271 | } 272 | } catch (err) { 273 | await conversation.sendMessage({ 274 | text: dedent` 275 | You have not merged any PRs to the repo so we cannot add the label. 276 | `, 277 | }); 278 | return; 279 | } 280 | } 281 | 282 | const [repoErr, targetRepo] = await to( 283 | octokit.repos.get({ 284 | owner: org, 285 | repo, 286 | }) 287 | ); 288 | 289 | if (repoErr) { 290 | await conversation.sendMessage({ 291 | text: dedent` 292 | Something went wrong. ${repoErr.message} 293 | `, 294 | }); 295 | return; 296 | } 297 | 298 | const didAdd = await addUserLabel(message.senderDid, { 299 | name: input, 300 | description: dedent` 301 | ${targetRepo?.data.description || ""} 302 | ${targetRepo.data.html_url} 303 | `, 304 | }); 305 | 306 | if (didAdd) { 307 | const ownership = org === githubUsername ? "You own" : "You contributed to"; 308 | await conversation.sendMessage({ 309 | text: dedent` 310 | Success! ${ownership} ${input}. And qualified for the label. 311 | 312 | > Note: It can take a few minutes for the label to be appear. 313 | `, 314 | }); 315 | } else { 316 | await conversation.sendMessage({ 317 | text: dedent` 318 | You're at the limit of 4 labels! Please /reset if you want to add more. 319 | 320 | > Note: Really only 2 labels looks aesthetically pleasing, don't flex too hard. 321 | `, 322 | }); 323 | } 324 | } 325 | 326 | bot.on("message", async (message: ChatMessage) => { 327 | console.log(`Received message: ${message.text}`); 328 | 329 | const [err, conversation] = await to( 330 | bot.getConversationForMembers([message.senderDid]) 331 | ); 332 | 333 | if (err) { 334 | console.error(err); 335 | return; 336 | } 337 | 338 | if (message.text.match(/^github:/i)) { 339 | await verifyUser(message, conversation); 340 | } else if (message.text.match(/^repo:/i)) { 341 | await addRepoLabelForUser(message, conversation); 342 | } else if (message.text.trim().match(/^\/reset$/i)) { 343 | await clearUserLabels(message.senderDid); 344 | await conversation.sendMessage({ 345 | text: "All labels have been cleared! It may take a few minutes for the changes to be reflected.", 346 | }); 347 | } else { 348 | await conversation.sendMessage({ 349 | text: dedent` 350 | These are the commands you can use: 351 | 352 | - "github: your-username" to verify your GitHub account 353 | - "repo: your-username/your-repo" to add a label to your repo 354 | - "/reset" to clear all labels 355 | - "/help" to see these commands 356 | 357 | If you want to see the source code or fix a bug check out the repo: https://github.com/hipstersmoothie/github-labeler-bot 358 | `, 359 | }); 360 | } 361 | }); 362 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@octokit/plugin-retry': 12 | specifier: ^7.1.2 13 | version: 7.1.2(@octokit/core@6.1.2) 14 | '@octokit/plugin-throttling': 15 | specifier: ^9.3.2 16 | version: 9.3.2(@octokit/core@6.1.2) 17 | '@octokit/rest': 18 | specifier: ^21.0.2 19 | version: 21.0.2 20 | '@skyware/bot': 21 | specifier: ^0.3.7 22 | version: 0.3.7 23 | '@skyware/labeler': 24 | specifier: ^0.1.8 25 | version: 0.1.13 26 | await-to-js: 27 | specifier: ^3.0.0 28 | version: 3.0.0 29 | dedent: 30 | specifier: ^1.5.3 31 | version: 1.5.3 32 | dotenv: 33 | specifier: ^16.4.5 34 | version: 16.4.5 35 | tsx: 36 | specifier: ^4.19.2 37 | version: 4.19.2 38 | devDependencies: 39 | '@types/node': 40 | specifier: ^22.7.5 41 | version: 22.9.0 42 | typescript: 43 | specifier: ^5.5.3 44 | version: 5.6.3 45 | 46 | packages: 47 | 48 | '@atcute/base32@1.0.1': 49 | resolution: {integrity: sha512-oHnrPXDlkLd4283rz5C4KLnL46/D9mjpFgK17iTPU7OooyNSz+elr8kXN9ReZgzgnjWZHIr8Dp2splEm9hjNhg==} 50 | 51 | '@atcute/bluesky-richtext-builder@1.0.2': 52 | resolution: {integrity: sha512-sa+9B5Ygb1GcWeMpav9RVBRdFLL5snZEoFFF2RkTaNr61m/cLd5lk97QJs+t9LXUEl5cfHS3jXujywFrGXZj9w==} 53 | peerDependencies: 54 | '@atcute/bluesky': ^1.0.0 55 | '@atcute/client': ^1.0.0 || ^2.0.0 56 | 57 | '@atcute/bluesky@1.0.8': 58 | resolution: {integrity: sha512-XqAZHYh65ZyBBT5rRkEhP656THYaY6CE+EY0AZXkIDaXJNdIl9KINZW5dnSrVWifspJbM+gUw1QFlCv8Yrx01g==} 59 | peerDependencies: 60 | '@atcute/client': ^1.0.0 || ^2.0.0 61 | 62 | '@atcute/car@1.1.1': 63 | resolution: {integrity: sha512-j6HY//ttIFCbOioDlEowKn2WOGeNavJenZkAP+wWIhsbRlK+V4+TpnJ38IX/VYfMpQHrKweh3W94wRCYp6L5Zg==} 64 | 65 | '@atcute/cbor@1.0.6': 66 | resolution: {integrity: sha512-ONqrK37COOTkp92gzmxI5a3per9DLPJf60SSlK3Z9vIps7sYEnTq+mL5PLYzbP8l+/V3GVdzpULLphj37eNuXg==} 67 | 68 | '@atcute/cid@1.0.2': 69 | resolution: {integrity: sha512-aRtt4/5pHCpKVvqtuvxWC8Koet9A7mT8t3fWspOJSj6lcP2QyKKpSUx3z0jSZ+M1Kf2UZ25eo6btcM5zmmhK3g==} 70 | 71 | '@atcute/client@2.0.4': 72 | resolution: {integrity: sha512-bKA6KEOmrdhU2CDRNp13M4WyKN0EdrVLKJffzPo62ANSTMacz5hRJhmvQYwuo7BZSGIoDql4sH+QR6Xbk3DERg==} 73 | 74 | '@atcute/ozone@1.0.6': 75 | resolution: {integrity: sha512-V5bGPGH1CZ3RqTIfX2msg5DgzijhIRCccgL93MAeoG7Qg0vaPS26eXAvqztVwWt/fB4w+Wvk1V6fMiintpHtQw==} 76 | peerDependencies: 77 | '@atcute/bluesky': ^1.0.0 78 | '@atcute/client': ^1.0.0 || ^2.0.0 79 | 80 | '@atcute/varint@1.0.1': 81 | resolution: {integrity: sha512-GXWu+CIfpQGSMSOSUskjwU/licxH8WcyX4t11mRKafQIE4Yi3v5GuchMYVOu89YX15tY93QzY/0zMQDCWoke8Q==} 82 | 83 | '@esbuild/aix-ppc64@0.23.1': 84 | resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} 85 | engines: {node: '>=18'} 86 | cpu: [ppc64] 87 | os: [aix] 88 | 89 | '@esbuild/android-arm64@0.23.1': 90 | resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} 91 | engines: {node: '>=18'} 92 | cpu: [arm64] 93 | os: [android] 94 | 95 | '@esbuild/android-arm@0.23.1': 96 | resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} 97 | engines: {node: '>=18'} 98 | cpu: [arm] 99 | os: [android] 100 | 101 | '@esbuild/android-x64@0.23.1': 102 | resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} 103 | engines: {node: '>=18'} 104 | cpu: [x64] 105 | os: [android] 106 | 107 | '@esbuild/darwin-arm64@0.23.1': 108 | resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} 109 | engines: {node: '>=18'} 110 | cpu: [arm64] 111 | os: [darwin] 112 | 113 | '@esbuild/darwin-x64@0.23.1': 114 | resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} 115 | engines: {node: '>=18'} 116 | cpu: [x64] 117 | os: [darwin] 118 | 119 | '@esbuild/freebsd-arm64@0.23.1': 120 | resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} 121 | engines: {node: '>=18'} 122 | cpu: [arm64] 123 | os: [freebsd] 124 | 125 | '@esbuild/freebsd-x64@0.23.1': 126 | resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} 127 | engines: {node: '>=18'} 128 | cpu: [x64] 129 | os: [freebsd] 130 | 131 | '@esbuild/linux-arm64@0.23.1': 132 | resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} 133 | engines: {node: '>=18'} 134 | cpu: [arm64] 135 | os: [linux] 136 | 137 | '@esbuild/linux-arm@0.23.1': 138 | resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} 139 | engines: {node: '>=18'} 140 | cpu: [arm] 141 | os: [linux] 142 | 143 | '@esbuild/linux-ia32@0.23.1': 144 | resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} 145 | engines: {node: '>=18'} 146 | cpu: [ia32] 147 | os: [linux] 148 | 149 | '@esbuild/linux-loong64@0.23.1': 150 | resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} 151 | engines: {node: '>=18'} 152 | cpu: [loong64] 153 | os: [linux] 154 | 155 | '@esbuild/linux-mips64el@0.23.1': 156 | resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} 157 | engines: {node: '>=18'} 158 | cpu: [mips64el] 159 | os: [linux] 160 | 161 | '@esbuild/linux-ppc64@0.23.1': 162 | resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} 163 | engines: {node: '>=18'} 164 | cpu: [ppc64] 165 | os: [linux] 166 | 167 | '@esbuild/linux-riscv64@0.23.1': 168 | resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} 169 | engines: {node: '>=18'} 170 | cpu: [riscv64] 171 | os: [linux] 172 | 173 | '@esbuild/linux-s390x@0.23.1': 174 | resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} 175 | engines: {node: '>=18'} 176 | cpu: [s390x] 177 | os: [linux] 178 | 179 | '@esbuild/linux-x64@0.23.1': 180 | resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} 181 | engines: {node: '>=18'} 182 | cpu: [x64] 183 | os: [linux] 184 | 185 | '@esbuild/netbsd-x64@0.23.1': 186 | resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} 187 | engines: {node: '>=18'} 188 | cpu: [x64] 189 | os: [netbsd] 190 | 191 | '@esbuild/openbsd-arm64@0.23.1': 192 | resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} 193 | engines: {node: '>=18'} 194 | cpu: [arm64] 195 | os: [openbsd] 196 | 197 | '@esbuild/openbsd-x64@0.23.1': 198 | resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} 199 | engines: {node: '>=18'} 200 | cpu: [x64] 201 | os: [openbsd] 202 | 203 | '@esbuild/sunos-x64@0.23.1': 204 | resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} 205 | engines: {node: '>=18'} 206 | cpu: [x64] 207 | os: [sunos] 208 | 209 | '@esbuild/win32-arm64@0.23.1': 210 | resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} 211 | engines: {node: '>=18'} 212 | cpu: [arm64] 213 | os: [win32] 214 | 215 | '@esbuild/win32-ia32@0.23.1': 216 | resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} 217 | engines: {node: '>=18'} 218 | cpu: [ia32] 219 | os: [win32] 220 | 221 | '@esbuild/win32-x64@0.23.1': 222 | resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} 223 | engines: {node: '>=18'} 224 | cpu: [x64] 225 | os: [win32] 226 | 227 | '@fastify/ajv-compiler@3.6.0': 228 | resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} 229 | 230 | '@fastify/error@3.4.1': 231 | resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} 232 | 233 | '@fastify/fast-json-stringify-compiler@4.3.0': 234 | resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} 235 | 236 | '@fastify/merge-json-schemas@0.1.1': 237 | resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} 238 | 239 | '@fastify/websocket@10.0.1': 240 | resolution: {integrity: sha512-8/pQIxTPRD8U94aILTeJ+2O3el/r19+Ej5z1O1mXlqplsUH7KzCjAI0sgd5DM/NoPjAi5qLFNIjgM5+9/rGSNw==} 241 | 242 | '@libsql/darwin-arm64@0.4.7': 243 | resolution: {integrity: sha512-yOL742IfWUlUevnI5PdnIT4fryY3LYTdLm56bnY0wXBw7dhFcnjuA7jrH3oSVz2mjZTHujxoITgAE7V6Z+eAbg==} 244 | cpu: [arm64] 245 | os: [darwin] 246 | 247 | '@libsql/darwin-x64@0.4.7': 248 | resolution: {integrity: sha512-ezc7V75+eoyyH07BO9tIyJdqXXcRfZMbKcLCeF8+qWK5nP8wWuMcfOVywecsXGRbT99zc5eNra4NEx6z5PkSsA==} 249 | cpu: [x64] 250 | os: [darwin] 251 | 252 | '@libsql/linux-arm64-gnu@0.4.7': 253 | resolution: {integrity: sha512-WlX2VYB5diM4kFfNaYcyhw5y+UJAI3xcMkEUJZPtRDEIu85SsSFrQ+gvoKfcVh76B//ztSeEX2wl9yrjF7BBCA==} 254 | cpu: [arm64] 255 | os: [linux] 256 | 257 | '@libsql/linux-arm64-musl@0.4.7': 258 | resolution: {integrity: sha512-6kK9xAArVRlTCpWeqnNMCoXW1pe7WITI378n4NpvU5EJ0Ok3aNTIC2nRPRjhro90QcnmLL1jPcrVwO4WD1U0xw==} 259 | cpu: [arm64] 260 | os: [linux] 261 | 262 | '@libsql/linux-x64-gnu@0.4.7': 263 | resolution: {integrity: sha512-CMnNRCmlWQqqzlTw6NeaZXzLWI8bydaXDke63JTUCvu8R+fj/ENsLrVBtPDlxQ0wGsYdXGlrUCH8Qi9gJep0yQ==} 264 | cpu: [x64] 265 | os: [linux] 266 | 267 | '@libsql/linux-x64-musl@0.4.7': 268 | resolution: {integrity: sha512-nI6tpS1t6WzGAt1Kx1n1HsvtBbZ+jHn0m7ogNNT6pQHZQj7AFFTIMeDQw/i/Nt5H38np1GVRNsFe99eSIMs9XA==} 269 | cpu: [x64] 270 | os: [linux] 271 | 272 | '@libsql/win32-x64-msvc@0.4.7': 273 | resolution: {integrity: sha512-7pJzOWzPm6oJUxml+PCDRzYQ4A1hTMHAciTAHfFK4fkbDZX33nWPVG7Y3vqdKtslcwAzwmrNDc6sXy2nwWnbiw==} 274 | cpu: [x64] 275 | os: [win32] 276 | 277 | '@neon-rs/load@0.0.4': 278 | resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 279 | 280 | '@noble/curves@1.6.0': 281 | resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} 282 | engines: {node: ^14.21.3 || >=16} 283 | 284 | '@noble/hashes@1.5.0': 285 | resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} 286 | engines: {node: ^14.21.3 || >=16} 287 | 288 | '@octokit/auth-token@5.1.1': 289 | resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} 290 | engines: {node: '>= 18'} 291 | 292 | '@octokit/core@6.1.2': 293 | resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} 294 | engines: {node: '>= 18'} 295 | 296 | '@octokit/endpoint@10.1.1': 297 | resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} 298 | engines: {node: '>= 18'} 299 | 300 | '@octokit/graphql@8.1.1': 301 | resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} 302 | engines: {node: '>= 18'} 303 | 304 | '@octokit/openapi-types@22.2.0': 305 | resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} 306 | 307 | '@octokit/plugin-paginate-rest@11.3.5': 308 | resolution: {integrity: sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==} 309 | engines: {node: '>= 18'} 310 | peerDependencies: 311 | '@octokit/core': '>=6' 312 | 313 | '@octokit/plugin-request-log@5.3.1': 314 | resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} 315 | engines: {node: '>= 18'} 316 | peerDependencies: 317 | '@octokit/core': '>=6' 318 | 319 | '@octokit/plugin-rest-endpoint-methods@13.2.6': 320 | resolution: {integrity: sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==} 321 | engines: {node: '>= 18'} 322 | peerDependencies: 323 | '@octokit/core': '>=6' 324 | 325 | '@octokit/plugin-retry@7.1.2': 326 | resolution: {integrity: sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==} 327 | engines: {node: '>= 18'} 328 | peerDependencies: 329 | '@octokit/core': '>=6' 330 | 331 | '@octokit/plugin-throttling@9.3.2': 332 | resolution: {integrity: sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==} 333 | engines: {node: '>= 18'} 334 | peerDependencies: 335 | '@octokit/core': ^6.0.0 336 | 337 | '@octokit/request-error@6.1.5': 338 | resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} 339 | engines: {node: '>= 18'} 340 | 341 | '@octokit/request@9.1.3': 342 | resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} 343 | engines: {node: '>= 18'} 344 | 345 | '@octokit/rest@21.0.2': 346 | resolution: {integrity: sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==} 347 | engines: {node: '>= 18'} 348 | 349 | '@octokit/types@13.6.1': 350 | resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} 351 | 352 | '@skyware/bot@0.3.7': 353 | resolution: {integrity: sha512-27k7r4/YA+h8FobXokMa3iv8fm/850a7NmajOHP3/CaMbCYicXXBDnAIY4kIPP58Zl/A/JvdcFLpQBpfFkiQHQ==} 354 | 355 | '@skyware/firehose@0.3.2': 356 | resolution: {integrity: sha512-CmRaw3lFPEd9euFGV+K/n/TF/o0Rre87oJP5pswC8IExj/qQnWVoncIulAJbL3keUCm5mlt49jCiiqfQXVjigg==} 357 | 358 | '@skyware/jetstream@0.1.9': 359 | resolution: {integrity: sha512-87NGqRSmEYmvEuVY0DKZ2ZRbL72tExtDuV+PDvywYqukSp3F/it+9wnU5Xb/Is/pf+KSbd6lWvrnE31HgxJpJg==} 360 | 361 | '@skyware/labeler@0.1.13': 362 | resolution: {integrity: sha512-VFnVpJ79oKUdP4ydPZLp6qqlXWJdxVlIEKp8JcYRfZybxt0gEGy+v3Rpzh5muf98FQNdi3eAjvt5d9YwM27Zvg==} 363 | hasBin: true 364 | 365 | '@types/node@22.9.0': 366 | resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} 367 | 368 | abstract-logging@2.0.1: 369 | resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} 370 | 371 | ajv-formats@2.1.1: 372 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 373 | peerDependencies: 374 | ajv: ^8.0.0 375 | peerDependenciesMeta: 376 | ajv: 377 | optional: true 378 | 379 | ajv-formats@3.0.1: 380 | resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} 381 | peerDependencies: 382 | ajv: ^8.0.0 383 | peerDependenciesMeta: 384 | ajv: 385 | optional: true 386 | 387 | ajv@8.17.1: 388 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 389 | 390 | atomic-sleep@1.0.0: 391 | resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 392 | engines: {node: '>=8.0.0'} 393 | 394 | avvio@8.4.0: 395 | resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} 396 | 397 | await-to-js@3.0.0: 398 | resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} 399 | engines: {node: '>=6.0.0'} 400 | 401 | before-after-hook@3.0.2: 402 | resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} 403 | 404 | bottleneck@2.19.5: 405 | resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} 406 | 407 | cookie@0.7.2: 408 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 409 | engines: {node: '>= 0.6'} 410 | 411 | dedent@1.5.3: 412 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 413 | peerDependencies: 414 | babel-plugin-macros: ^3.1.0 415 | peerDependenciesMeta: 416 | babel-plugin-macros: 417 | optional: true 418 | 419 | detect-libc@2.0.2: 420 | resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 421 | engines: {node: '>=8'} 422 | 423 | dotenv@16.4.5: 424 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 425 | engines: {node: '>=12'} 426 | 427 | duplexify@4.1.3: 428 | resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} 429 | 430 | end-of-stream@1.4.4: 431 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 432 | 433 | esbuild@0.23.1: 434 | resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} 435 | engines: {node: '>=18'} 436 | hasBin: true 437 | 438 | event-target-shim@6.0.2: 439 | resolution: {integrity: sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==} 440 | engines: {node: '>=10.13.0'} 441 | 442 | fast-content-type-parse@1.1.0: 443 | resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} 444 | 445 | fast-decode-uri-component@1.0.1: 446 | resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} 447 | 448 | fast-deep-equal@3.1.3: 449 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 450 | 451 | fast-json-stringify@5.16.1: 452 | resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} 453 | 454 | fast-querystring@1.1.2: 455 | resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} 456 | 457 | fast-redact@3.5.0: 458 | resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} 459 | engines: {node: '>=6'} 460 | 461 | fast-uri@2.4.0: 462 | resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} 463 | 464 | fast-uri@3.0.3: 465 | resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} 466 | 467 | fastify-plugin@4.5.1: 468 | resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} 469 | 470 | fastify@4.28.1: 471 | resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} 472 | 473 | fastq@1.17.1: 474 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 475 | 476 | find-my-way@8.2.2: 477 | resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} 478 | engines: {node: '>=14'} 479 | 480 | forwarded@0.2.0: 481 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 482 | engines: {node: '>= 0.6'} 483 | 484 | fsevents@2.3.3: 485 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 486 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 487 | os: [darwin] 488 | 489 | get-tsconfig@4.8.1: 490 | resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} 491 | 492 | inherits@2.0.4: 493 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 494 | 495 | ipaddr.js@1.9.1: 496 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 497 | engines: {node: '>= 0.10'} 498 | 499 | json-schema-ref-resolver@1.0.1: 500 | resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} 501 | 502 | json-schema-traverse@1.0.0: 503 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 504 | 505 | kleur@3.0.3: 506 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 507 | engines: {node: '>=6'} 508 | 509 | libsql@0.4.7: 510 | resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} 511 | os: [darwin, linux, win32] 512 | 513 | light-my-request@5.14.0: 514 | resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} 515 | 516 | multiformats@13.3.1: 517 | resolution: {integrity: sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g==} 518 | 519 | on-exit-leak-free@2.1.2: 520 | resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} 521 | engines: {node: '>=14.0.0'} 522 | 523 | once@1.4.0: 524 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 525 | 526 | partysocket@1.0.2: 527 | resolution: {integrity: sha512-rAFOUKImaq+VBk2B+2RTBsWEvlnarEP53nchoUHzpVs8V6fG2/estihOTslTQUWHVuHEKDL5k8htG8K3TngyFA==} 528 | 529 | pino-abstract-transport@2.0.0: 530 | resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} 531 | 532 | pino-std-serializers@7.0.0: 533 | resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} 534 | 535 | pino@9.5.0: 536 | resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} 537 | hasBin: true 538 | 539 | process-warning@3.0.0: 540 | resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} 541 | 542 | process-warning@4.0.0: 543 | resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} 544 | 545 | prompts@2.4.2: 546 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 547 | engines: {node: '>= 6'} 548 | 549 | proxy-addr@2.0.7: 550 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 551 | engines: {node: '>= 0.10'} 552 | 553 | quick-format-unescaped@4.0.4: 554 | resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 555 | 556 | quick-lru@7.0.0: 557 | resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} 558 | engines: {node: '>=18'} 559 | 560 | rate-limit-threshold@0.1.5: 561 | resolution: {integrity: sha512-75vpvXC/ZqQJrFDp0dVtfoXZi8kxQP2eBuxVYFvGDfnHhcgE+ZG870u4ItQhWQh54Y6nNwOaaq5g3AL9n27lTg==} 562 | engines: {node: ^14.13.1 || >=16.0.0} 563 | 564 | readable-stream@3.6.2: 565 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 566 | engines: {node: '>= 6'} 567 | 568 | real-require@0.2.0: 569 | resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 570 | engines: {node: '>= 12.13.0'} 571 | 572 | require-from-string@2.0.2: 573 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 574 | engines: {node: '>=0.10.0'} 575 | 576 | resolve-pkg-maps@1.0.0: 577 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 578 | 579 | ret@0.4.3: 580 | resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} 581 | engines: {node: '>=10'} 582 | 583 | reusify@1.0.4: 584 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 585 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 586 | 587 | rfdc@1.4.1: 588 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 589 | 590 | safe-buffer@5.2.1: 591 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 592 | 593 | safe-regex2@3.1.0: 594 | resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} 595 | 596 | safe-stable-stringify@2.5.0: 597 | resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 598 | engines: {node: '>=10'} 599 | 600 | secure-json-parse@2.7.0: 601 | resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} 602 | 603 | semver@7.6.3: 604 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 605 | engines: {node: '>=10'} 606 | hasBin: true 607 | 608 | set-cookie-parser@2.7.1: 609 | resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} 610 | 611 | sisteransi@1.0.5: 612 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 613 | 614 | sonic-boom@4.2.0: 615 | resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} 616 | 617 | split2@4.2.0: 618 | resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 619 | engines: {node: '>= 10.x'} 620 | 621 | stream-shift@1.0.3: 622 | resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} 623 | 624 | string_decoder@1.3.0: 625 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 626 | 627 | thread-stream@3.1.0: 628 | resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} 629 | 630 | toad-cache@3.7.0: 631 | resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} 632 | engines: {node: '>=12'} 633 | 634 | tsx@4.19.2: 635 | resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} 636 | engines: {node: '>=18.0.0'} 637 | hasBin: true 638 | 639 | typescript@5.6.3: 640 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 641 | engines: {node: '>=14.17'} 642 | hasBin: true 643 | 644 | uint8arrays@5.1.0: 645 | resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} 646 | 647 | undici-types@6.19.8: 648 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 649 | 650 | universal-user-agent@7.0.2: 651 | resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} 652 | 653 | util-deprecate@1.0.2: 654 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 655 | 656 | wrappy@1.0.2: 657 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 658 | 659 | ws@8.18.0: 660 | resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 661 | engines: {node: '>=10.0.0'} 662 | peerDependencies: 663 | bufferutil: ^4.0.1 664 | utf-8-validate: '>=5.0.2' 665 | peerDependenciesMeta: 666 | bufferutil: 667 | optional: true 668 | utf-8-validate: 669 | optional: true 670 | 671 | snapshots: 672 | 673 | '@atcute/base32@1.0.1': {} 674 | 675 | '@atcute/bluesky-richtext-builder@1.0.2(@atcute/bluesky@1.0.8(@atcute/client@2.0.4))(@atcute/client@2.0.4)': 676 | dependencies: 677 | '@atcute/bluesky': 1.0.8(@atcute/client@2.0.4) 678 | '@atcute/client': 2.0.4 679 | 680 | '@atcute/bluesky@1.0.8(@atcute/client@2.0.4)': 681 | dependencies: 682 | '@atcute/client': 2.0.4 683 | 684 | '@atcute/car@1.1.1': 685 | dependencies: 686 | '@atcute/cbor': 1.0.6 687 | '@atcute/cid': 1.0.2 688 | '@atcute/varint': 1.0.1 689 | optional: true 690 | 691 | '@atcute/cbor@1.0.6': 692 | dependencies: 693 | '@atcute/base32': 1.0.1 694 | '@atcute/cid': 1.0.2 695 | 696 | '@atcute/cid@1.0.2': 697 | dependencies: 698 | '@atcute/base32': 1.0.1 699 | '@atcute/varint': 1.0.1 700 | 701 | '@atcute/client@2.0.4': {} 702 | 703 | '@atcute/ozone@1.0.6(@atcute/bluesky@1.0.8(@atcute/client@2.0.4))(@atcute/client@2.0.4)': 704 | dependencies: 705 | '@atcute/bluesky': 1.0.8(@atcute/client@2.0.4) 706 | '@atcute/client': 2.0.4 707 | 708 | '@atcute/varint@1.0.1': {} 709 | 710 | '@esbuild/aix-ppc64@0.23.1': 711 | optional: true 712 | 713 | '@esbuild/android-arm64@0.23.1': 714 | optional: true 715 | 716 | '@esbuild/android-arm@0.23.1': 717 | optional: true 718 | 719 | '@esbuild/android-x64@0.23.1': 720 | optional: true 721 | 722 | '@esbuild/darwin-arm64@0.23.1': 723 | optional: true 724 | 725 | '@esbuild/darwin-x64@0.23.1': 726 | optional: true 727 | 728 | '@esbuild/freebsd-arm64@0.23.1': 729 | optional: true 730 | 731 | '@esbuild/freebsd-x64@0.23.1': 732 | optional: true 733 | 734 | '@esbuild/linux-arm64@0.23.1': 735 | optional: true 736 | 737 | '@esbuild/linux-arm@0.23.1': 738 | optional: true 739 | 740 | '@esbuild/linux-ia32@0.23.1': 741 | optional: true 742 | 743 | '@esbuild/linux-loong64@0.23.1': 744 | optional: true 745 | 746 | '@esbuild/linux-mips64el@0.23.1': 747 | optional: true 748 | 749 | '@esbuild/linux-ppc64@0.23.1': 750 | optional: true 751 | 752 | '@esbuild/linux-riscv64@0.23.1': 753 | optional: true 754 | 755 | '@esbuild/linux-s390x@0.23.1': 756 | optional: true 757 | 758 | '@esbuild/linux-x64@0.23.1': 759 | optional: true 760 | 761 | '@esbuild/netbsd-x64@0.23.1': 762 | optional: true 763 | 764 | '@esbuild/openbsd-arm64@0.23.1': 765 | optional: true 766 | 767 | '@esbuild/openbsd-x64@0.23.1': 768 | optional: true 769 | 770 | '@esbuild/sunos-x64@0.23.1': 771 | optional: true 772 | 773 | '@esbuild/win32-arm64@0.23.1': 774 | optional: true 775 | 776 | '@esbuild/win32-ia32@0.23.1': 777 | optional: true 778 | 779 | '@esbuild/win32-x64@0.23.1': 780 | optional: true 781 | 782 | '@fastify/ajv-compiler@3.6.0': 783 | dependencies: 784 | ajv: 8.17.1 785 | ajv-formats: 2.1.1(ajv@8.17.1) 786 | fast-uri: 2.4.0 787 | 788 | '@fastify/error@3.4.1': {} 789 | 790 | '@fastify/fast-json-stringify-compiler@4.3.0': 791 | dependencies: 792 | fast-json-stringify: 5.16.1 793 | 794 | '@fastify/merge-json-schemas@0.1.1': 795 | dependencies: 796 | fast-deep-equal: 3.1.3 797 | 798 | '@fastify/websocket@10.0.1': 799 | dependencies: 800 | duplexify: 4.1.3 801 | fastify-plugin: 4.5.1 802 | ws: 8.18.0 803 | transitivePeerDependencies: 804 | - bufferutil 805 | - utf-8-validate 806 | 807 | '@libsql/darwin-arm64@0.4.7': 808 | optional: true 809 | 810 | '@libsql/darwin-x64@0.4.7': 811 | optional: true 812 | 813 | '@libsql/linux-arm64-gnu@0.4.7': 814 | optional: true 815 | 816 | '@libsql/linux-arm64-musl@0.4.7': 817 | optional: true 818 | 819 | '@libsql/linux-x64-gnu@0.4.7': 820 | optional: true 821 | 822 | '@libsql/linux-x64-musl@0.4.7': 823 | optional: true 824 | 825 | '@libsql/win32-x64-msvc@0.4.7': 826 | optional: true 827 | 828 | '@neon-rs/load@0.0.4': {} 829 | 830 | '@noble/curves@1.6.0': 831 | dependencies: 832 | '@noble/hashes': 1.5.0 833 | 834 | '@noble/hashes@1.5.0': {} 835 | 836 | '@octokit/auth-token@5.1.1': {} 837 | 838 | '@octokit/core@6.1.2': 839 | dependencies: 840 | '@octokit/auth-token': 5.1.1 841 | '@octokit/graphql': 8.1.1 842 | '@octokit/request': 9.1.3 843 | '@octokit/request-error': 6.1.5 844 | '@octokit/types': 13.6.1 845 | before-after-hook: 3.0.2 846 | universal-user-agent: 7.0.2 847 | 848 | '@octokit/endpoint@10.1.1': 849 | dependencies: 850 | '@octokit/types': 13.6.1 851 | universal-user-agent: 7.0.2 852 | 853 | '@octokit/graphql@8.1.1': 854 | dependencies: 855 | '@octokit/request': 9.1.3 856 | '@octokit/types': 13.6.1 857 | universal-user-agent: 7.0.2 858 | 859 | '@octokit/openapi-types@22.2.0': {} 860 | 861 | '@octokit/plugin-paginate-rest@11.3.5(@octokit/core@6.1.2)': 862 | dependencies: 863 | '@octokit/core': 6.1.2 864 | '@octokit/types': 13.6.1 865 | 866 | '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.2)': 867 | dependencies: 868 | '@octokit/core': 6.1.2 869 | 870 | '@octokit/plugin-rest-endpoint-methods@13.2.6(@octokit/core@6.1.2)': 871 | dependencies: 872 | '@octokit/core': 6.1.2 873 | '@octokit/types': 13.6.1 874 | 875 | '@octokit/plugin-retry@7.1.2(@octokit/core@6.1.2)': 876 | dependencies: 877 | '@octokit/core': 6.1.2 878 | '@octokit/request-error': 6.1.5 879 | '@octokit/types': 13.6.1 880 | bottleneck: 2.19.5 881 | 882 | '@octokit/plugin-throttling@9.3.2(@octokit/core@6.1.2)': 883 | dependencies: 884 | '@octokit/core': 6.1.2 885 | '@octokit/types': 13.6.1 886 | bottleneck: 2.19.5 887 | 888 | '@octokit/request-error@6.1.5': 889 | dependencies: 890 | '@octokit/types': 13.6.1 891 | 892 | '@octokit/request@9.1.3': 893 | dependencies: 894 | '@octokit/endpoint': 10.1.1 895 | '@octokit/request-error': 6.1.5 896 | '@octokit/types': 13.6.1 897 | universal-user-agent: 7.0.2 898 | 899 | '@octokit/rest@21.0.2': 900 | dependencies: 901 | '@octokit/core': 6.1.2 902 | '@octokit/plugin-paginate-rest': 11.3.5(@octokit/core@6.1.2) 903 | '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.2) 904 | '@octokit/plugin-rest-endpoint-methods': 13.2.6(@octokit/core@6.1.2) 905 | 906 | '@octokit/types@13.6.1': 907 | dependencies: 908 | '@octokit/openapi-types': 22.2.0 909 | 910 | '@skyware/bot@0.3.7': 911 | dependencies: 912 | '@atcute/bluesky': 1.0.8(@atcute/client@2.0.4) 913 | '@atcute/bluesky-richtext-builder': 1.0.2(@atcute/bluesky@1.0.8(@atcute/client@2.0.4))(@atcute/client@2.0.4) 914 | '@atcute/client': 2.0.4 915 | '@atcute/ozone': 1.0.6(@atcute/bluesky@1.0.8(@atcute/client@2.0.4))(@atcute/client@2.0.4) 916 | quick-lru: 7.0.0 917 | rate-limit-threshold: 0.1.5 918 | optionalDependencies: 919 | '@skyware/firehose': 0.3.2 920 | '@skyware/jetstream': 0.1.9(@atcute/client@2.0.4) 921 | transitivePeerDependencies: 922 | - bufferutil 923 | - utf-8-validate 924 | 925 | '@skyware/firehose@0.3.2': 926 | dependencies: 927 | '@atcute/car': 1.1.1 928 | '@atcute/cbor': 1.0.6 929 | ws: 8.18.0 930 | transitivePeerDependencies: 931 | - bufferutil 932 | - utf-8-validate 933 | optional: true 934 | 935 | '@skyware/jetstream@0.1.9(@atcute/client@2.0.4)': 936 | dependencies: 937 | '@atcute/bluesky': 1.0.8(@atcute/client@2.0.4) 938 | partysocket: 1.0.2 939 | transitivePeerDependencies: 940 | - '@atcute/client' 941 | optional: true 942 | 943 | '@skyware/labeler@0.1.13': 944 | dependencies: 945 | '@atcute/bluesky': 1.0.8(@atcute/client@2.0.4) 946 | '@atcute/cbor': 1.0.6 947 | '@atcute/client': 2.0.4 948 | '@atcute/ozone': 1.0.6(@atcute/bluesky@1.0.8(@atcute/client@2.0.4))(@atcute/client@2.0.4) 949 | '@fastify/websocket': 10.0.1 950 | '@noble/curves': 1.6.0 951 | '@noble/hashes': 1.5.0 952 | fastify: 4.28.1 953 | libsql: 0.4.7 954 | prompts: 2.4.2 955 | uint8arrays: 5.1.0 956 | transitivePeerDependencies: 957 | - bufferutil 958 | - utf-8-validate 959 | 960 | '@types/node@22.9.0': 961 | dependencies: 962 | undici-types: 6.19.8 963 | 964 | abstract-logging@2.0.1: {} 965 | 966 | ajv-formats@2.1.1(ajv@8.17.1): 967 | optionalDependencies: 968 | ajv: 8.17.1 969 | 970 | ajv-formats@3.0.1(ajv@8.17.1): 971 | optionalDependencies: 972 | ajv: 8.17.1 973 | 974 | ajv@8.17.1: 975 | dependencies: 976 | fast-deep-equal: 3.1.3 977 | fast-uri: 3.0.3 978 | json-schema-traverse: 1.0.0 979 | require-from-string: 2.0.2 980 | 981 | atomic-sleep@1.0.0: {} 982 | 983 | avvio@8.4.0: 984 | dependencies: 985 | '@fastify/error': 3.4.1 986 | fastq: 1.17.1 987 | 988 | await-to-js@3.0.0: {} 989 | 990 | before-after-hook@3.0.2: {} 991 | 992 | bottleneck@2.19.5: {} 993 | 994 | cookie@0.7.2: {} 995 | 996 | dedent@1.5.3: {} 997 | 998 | detect-libc@2.0.2: {} 999 | 1000 | dotenv@16.4.5: {} 1001 | 1002 | duplexify@4.1.3: 1003 | dependencies: 1004 | end-of-stream: 1.4.4 1005 | inherits: 2.0.4 1006 | readable-stream: 3.6.2 1007 | stream-shift: 1.0.3 1008 | 1009 | end-of-stream@1.4.4: 1010 | dependencies: 1011 | once: 1.4.0 1012 | 1013 | esbuild@0.23.1: 1014 | optionalDependencies: 1015 | '@esbuild/aix-ppc64': 0.23.1 1016 | '@esbuild/android-arm': 0.23.1 1017 | '@esbuild/android-arm64': 0.23.1 1018 | '@esbuild/android-x64': 0.23.1 1019 | '@esbuild/darwin-arm64': 0.23.1 1020 | '@esbuild/darwin-x64': 0.23.1 1021 | '@esbuild/freebsd-arm64': 0.23.1 1022 | '@esbuild/freebsd-x64': 0.23.1 1023 | '@esbuild/linux-arm': 0.23.1 1024 | '@esbuild/linux-arm64': 0.23.1 1025 | '@esbuild/linux-ia32': 0.23.1 1026 | '@esbuild/linux-loong64': 0.23.1 1027 | '@esbuild/linux-mips64el': 0.23.1 1028 | '@esbuild/linux-ppc64': 0.23.1 1029 | '@esbuild/linux-riscv64': 0.23.1 1030 | '@esbuild/linux-s390x': 0.23.1 1031 | '@esbuild/linux-x64': 0.23.1 1032 | '@esbuild/netbsd-x64': 0.23.1 1033 | '@esbuild/openbsd-arm64': 0.23.1 1034 | '@esbuild/openbsd-x64': 0.23.1 1035 | '@esbuild/sunos-x64': 0.23.1 1036 | '@esbuild/win32-arm64': 0.23.1 1037 | '@esbuild/win32-ia32': 0.23.1 1038 | '@esbuild/win32-x64': 0.23.1 1039 | 1040 | event-target-shim@6.0.2: 1041 | optional: true 1042 | 1043 | fast-content-type-parse@1.1.0: {} 1044 | 1045 | fast-decode-uri-component@1.0.1: {} 1046 | 1047 | fast-deep-equal@3.1.3: {} 1048 | 1049 | fast-json-stringify@5.16.1: 1050 | dependencies: 1051 | '@fastify/merge-json-schemas': 0.1.1 1052 | ajv: 8.17.1 1053 | ajv-formats: 3.0.1(ajv@8.17.1) 1054 | fast-deep-equal: 3.1.3 1055 | fast-uri: 2.4.0 1056 | json-schema-ref-resolver: 1.0.1 1057 | rfdc: 1.4.1 1058 | 1059 | fast-querystring@1.1.2: 1060 | dependencies: 1061 | fast-decode-uri-component: 1.0.1 1062 | 1063 | fast-redact@3.5.0: {} 1064 | 1065 | fast-uri@2.4.0: {} 1066 | 1067 | fast-uri@3.0.3: {} 1068 | 1069 | fastify-plugin@4.5.1: {} 1070 | 1071 | fastify@4.28.1: 1072 | dependencies: 1073 | '@fastify/ajv-compiler': 3.6.0 1074 | '@fastify/error': 3.4.1 1075 | '@fastify/fast-json-stringify-compiler': 4.3.0 1076 | abstract-logging: 2.0.1 1077 | avvio: 8.4.0 1078 | fast-content-type-parse: 1.1.0 1079 | fast-json-stringify: 5.16.1 1080 | find-my-way: 8.2.2 1081 | light-my-request: 5.14.0 1082 | pino: 9.5.0 1083 | process-warning: 3.0.0 1084 | proxy-addr: 2.0.7 1085 | rfdc: 1.4.1 1086 | secure-json-parse: 2.7.0 1087 | semver: 7.6.3 1088 | toad-cache: 3.7.0 1089 | 1090 | fastq@1.17.1: 1091 | dependencies: 1092 | reusify: 1.0.4 1093 | 1094 | find-my-way@8.2.2: 1095 | dependencies: 1096 | fast-deep-equal: 3.1.3 1097 | fast-querystring: 1.1.2 1098 | safe-regex2: 3.1.0 1099 | 1100 | forwarded@0.2.0: {} 1101 | 1102 | fsevents@2.3.3: 1103 | optional: true 1104 | 1105 | get-tsconfig@4.8.1: 1106 | dependencies: 1107 | resolve-pkg-maps: 1.0.0 1108 | 1109 | inherits@2.0.4: {} 1110 | 1111 | ipaddr.js@1.9.1: {} 1112 | 1113 | json-schema-ref-resolver@1.0.1: 1114 | dependencies: 1115 | fast-deep-equal: 3.1.3 1116 | 1117 | json-schema-traverse@1.0.0: {} 1118 | 1119 | kleur@3.0.3: {} 1120 | 1121 | libsql@0.4.7: 1122 | dependencies: 1123 | '@neon-rs/load': 0.0.4 1124 | detect-libc: 2.0.2 1125 | optionalDependencies: 1126 | '@libsql/darwin-arm64': 0.4.7 1127 | '@libsql/darwin-x64': 0.4.7 1128 | '@libsql/linux-arm64-gnu': 0.4.7 1129 | '@libsql/linux-arm64-musl': 0.4.7 1130 | '@libsql/linux-x64-gnu': 0.4.7 1131 | '@libsql/linux-x64-musl': 0.4.7 1132 | '@libsql/win32-x64-msvc': 0.4.7 1133 | 1134 | light-my-request@5.14.0: 1135 | dependencies: 1136 | cookie: 0.7.2 1137 | process-warning: 3.0.0 1138 | set-cookie-parser: 2.7.1 1139 | 1140 | multiformats@13.3.1: {} 1141 | 1142 | on-exit-leak-free@2.1.2: {} 1143 | 1144 | once@1.4.0: 1145 | dependencies: 1146 | wrappy: 1.0.2 1147 | 1148 | partysocket@1.0.2: 1149 | dependencies: 1150 | event-target-shim: 6.0.2 1151 | optional: true 1152 | 1153 | pino-abstract-transport@2.0.0: 1154 | dependencies: 1155 | split2: 4.2.0 1156 | 1157 | pino-std-serializers@7.0.0: {} 1158 | 1159 | pino@9.5.0: 1160 | dependencies: 1161 | atomic-sleep: 1.0.0 1162 | fast-redact: 3.5.0 1163 | on-exit-leak-free: 2.1.2 1164 | pino-abstract-transport: 2.0.0 1165 | pino-std-serializers: 7.0.0 1166 | process-warning: 4.0.0 1167 | quick-format-unescaped: 4.0.4 1168 | real-require: 0.2.0 1169 | safe-stable-stringify: 2.5.0 1170 | sonic-boom: 4.2.0 1171 | thread-stream: 3.1.0 1172 | 1173 | process-warning@3.0.0: {} 1174 | 1175 | process-warning@4.0.0: {} 1176 | 1177 | prompts@2.4.2: 1178 | dependencies: 1179 | kleur: 3.0.3 1180 | sisteransi: 1.0.5 1181 | 1182 | proxy-addr@2.0.7: 1183 | dependencies: 1184 | forwarded: 0.2.0 1185 | ipaddr.js: 1.9.1 1186 | 1187 | quick-format-unescaped@4.0.4: {} 1188 | 1189 | quick-lru@7.0.0: {} 1190 | 1191 | rate-limit-threshold@0.1.5: {} 1192 | 1193 | readable-stream@3.6.2: 1194 | dependencies: 1195 | inherits: 2.0.4 1196 | string_decoder: 1.3.0 1197 | util-deprecate: 1.0.2 1198 | 1199 | real-require@0.2.0: {} 1200 | 1201 | require-from-string@2.0.2: {} 1202 | 1203 | resolve-pkg-maps@1.0.0: {} 1204 | 1205 | ret@0.4.3: {} 1206 | 1207 | reusify@1.0.4: {} 1208 | 1209 | rfdc@1.4.1: {} 1210 | 1211 | safe-buffer@5.2.1: {} 1212 | 1213 | safe-regex2@3.1.0: 1214 | dependencies: 1215 | ret: 0.4.3 1216 | 1217 | safe-stable-stringify@2.5.0: {} 1218 | 1219 | secure-json-parse@2.7.0: {} 1220 | 1221 | semver@7.6.3: {} 1222 | 1223 | set-cookie-parser@2.7.1: {} 1224 | 1225 | sisteransi@1.0.5: {} 1226 | 1227 | sonic-boom@4.2.0: 1228 | dependencies: 1229 | atomic-sleep: 1.0.0 1230 | 1231 | split2@4.2.0: {} 1232 | 1233 | stream-shift@1.0.3: {} 1234 | 1235 | string_decoder@1.3.0: 1236 | dependencies: 1237 | safe-buffer: 5.2.1 1238 | 1239 | thread-stream@3.1.0: 1240 | dependencies: 1241 | real-require: 0.2.0 1242 | 1243 | toad-cache@3.7.0: {} 1244 | 1245 | tsx@4.19.2: 1246 | dependencies: 1247 | esbuild: 0.23.1 1248 | get-tsconfig: 4.8.1 1249 | optionalDependencies: 1250 | fsevents: 2.3.3 1251 | 1252 | typescript@5.6.3: {} 1253 | 1254 | uint8arrays@5.1.0: 1255 | dependencies: 1256 | multiformats: 13.3.1 1257 | 1258 | undici-types@6.19.8: {} 1259 | 1260 | universal-user-agent@7.0.2: {} 1261 | 1262 | util-deprecate@1.0.2: {} 1263 | 1264 | wrappy@1.0.2: {} 1265 | 1266 | ws@8.18.0: {} 1267 | --------------------------------------------------------------------------------