A decentralized music tracking and discovery platform built on AT Protocol 🎵

Add Tap WebSocket server and Drizzle schema

+1821
+1
tap/.gitignore
··· 1 1 .env 2 2 data/ 3 + *.db
+25
tap/.zed/settings.json
··· 1 + { 2 + "lsp": { 3 + "deno": { 4 + "settings": { 5 + "deno": { 6 + "enable": true, 7 + "unstable": false, 8 + "lint": true, 9 + "cache": null 10 + } 11 + } 12 + } 13 + }, 14 + "languages": { 15 + "TypeScript": { 16 + "language_servers": ["deno", "!typescript-language-server"] 17 + }, 18 + "TSX": { 19 + "language_servers": ["deno", "!typescript-language-server"] 20 + }, 21 + "JavaScript": { 22 + "language_servers": ["deno", "!typescript-language-server"] 23 + } 24 + } 25 + }
+22
tap/deno.json
··· 1 + { 2 + "tasks": { 3 + "dev": "deno run --env-file=.env -A --watch src/main.ts" 4 + }, 5 + "imports": { 6 + "@atproto/tap": "npm:@atproto/tap@^0.1.3", 7 + "@es-toolkit/es-toolkit": "jsr:@es-toolkit/es-toolkit@^1.44.0", 8 + "@libsql/client": "npm:@libsql/client@^0.17.0", 9 + "@logtape/logtape": "npm:@logtape/logtape@^2.0.0", 10 + "@std/assert": "jsr:@std/assert@1", 11 + "chalk": "npm:chalk@^5.6.2", 12 + "drizzle-kit": "npm:drizzle-kit@^0.31.8", 13 + "drizzle-orm": "npm:drizzle-orm@^0.45.1", 14 + "ramda": "npm:ramda@^0.32.0" 15 + }, 16 + "nodeModulesDir": "auto", 17 + "allowScripts": [ 18 + "npm:core-js@3.47.0", 19 + "npm:esbuild@0.18.20", 20 + "npm:esbuild@0.25.12" 21 + ] 22 + }
+1123
tap/deno.lock
··· 1 + { 2 + "version": "5", 3 + "specifiers": { 4 + "jsr:@es-toolkit/es-toolkit@^1.44.0": "1.44.0", 5 + "jsr:@std/assert@1": "1.0.16", 6 + "jsr:@std/internal@^1.0.12": "1.0.12", 7 + "npm:@atproto/tap@~0.1.3": "0.1.3", 8 + "npm:@libsql/client@0.17": "0.17.0", 9 + "npm:@logtape/logtape@2": "2.0.0", 10 + "npm:chalk@^5.6.2": "5.6.2", 11 + "npm:drizzle-kit@~0.31.8": "0.31.8_esbuild@0.25.12", 12 + "npm:drizzle-orm@~0.45.1": "0.45.1_@libsql+client@0.17.0", 13 + "npm:ramda@0.32": "0.32.0" 14 + }, 15 + "jsr": { 16 + "@es-toolkit/es-toolkit@1.44.0": { 17 + "integrity": "647a7e777945a3ac81bd1783670f85429c2a661510d9af36becc6963ddfca00d" 18 + }, 19 + "@std/assert@1.0.16": { 20 + "integrity": "6a7272ed1eaa77defe76e5ff63ca705d9c495077e2d5fd0126d2b53fc5bd6532", 21 + "dependencies": [ 22 + "jsr:@std/internal" 23 + ] 24 + }, 25 + "@std/internal@1.0.12": { 26 + "integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027" 27 + } 28 + }, 29 + "npm": { 30 + "@atproto-labs/did-resolver@0.2.5": { 31 + "integrity": "sha512-he7EC6OMSifNs01a4RT9mta/yYitoKDzlK9ty2TFV5Uj/+HpB4vYMRdIDFrRW0Hcsehy90E2t/dw0t7361MEKQ==", 32 + "dependencies": [ 33 + "@atproto-labs/fetch", 34 + "@atproto-labs/pipe", 35 + "@atproto-labs/simple-store", 36 + "@atproto-labs/simple-store-memory", 37 + "@atproto/did", 38 + "zod" 39 + ] 40 + }, 41 + "@atproto-labs/fetch@0.2.3": { 42 + "integrity": "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==", 43 + "dependencies": [ 44 + "@atproto-labs/pipe" 45 + ] 46 + }, 47 + "@atproto-labs/pipe@0.1.1": { 48 + "integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==" 49 + }, 50 + "@atproto-labs/simple-store-memory@0.1.4": { 51 + "integrity": "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==", 52 + "dependencies": [ 53 + "@atproto-labs/simple-store", 54 + "lru-cache" 55 + ] 56 + }, 57 + "@atproto-labs/simple-store@0.3.0": { 58 + "integrity": "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==" 59 + }, 60 + "@atproto/common-web@0.4.12": { 61 + "integrity": "sha512-3aCJemqM/fkHQrVPbTCHCdiVstKFI+2LkFLvUhO6XZP0EqUZa/rg/CIZBKTFUWu9I5iYiaEiXL9VwcDRpEevSw==", 62 + "dependencies": [ 63 + "@atproto/lex-data", 64 + "@atproto/lex-json", 65 + "zod" 66 + ] 67 + }, 68 + "@atproto/common@0.5.8": { 69 + "integrity": "sha512-6BS6OJ/eiN/w8cu3xG1NA/waq9jBsYXZ6pfV85WUDegbfZaGS/IVtpJtjdE7LemE8cJys3AqGFDVJzeXDBQgbw==", 70 + "dependencies": [ 71 + "@atproto/common-web", 72 + "@atproto/lex-cbor", 73 + "@atproto/lex-data", 74 + "iso-datestring-validator", 75 + "multiformats", 76 + "pino" 77 + ] 78 + }, 79 + "@atproto/crypto@0.4.5": { 80 + "integrity": "sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==", 81 + "dependencies": [ 82 + "@noble/curves", 83 + "@noble/hashes", 84 + "uint8arrays" 85 + ] 86 + }, 87 + "@atproto/did@0.2.4": { 88 + "integrity": "sha512-nxNiCgXeo7pfjojq9fpfZxCO0X0xUipNVKW+AHNZwQKiUDt6zYL0VXEfm8HBUwQOCmKvj2pRRSM1Cur+tUWk3g==", 89 + "dependencies": [ 90 + "zod" 91 + ] 92 + }, 93 + "@atproto/lex-builder@0.0.11": { 94 + "integrity": "sha512-7FQ7iEB8CrZ2ie3NsweZpcleddf0Dd3Ck98iZbBmxmnWrHwseC86+NJ2q+THsbHyF/tdtHGhJPxmc7wWZ5WDKA==", 95 + "dependencies": [ 96 + "@atproto/lex-document", 97 + "@atproto/lex-schema", 98 + "prettier", 99 + "ts-morph", 100 + "tslib" 101 + ] 102 + }, 103 + "@atproto/lex-cbor@0.0.8": { 104 + "integrity": "sha512-WFUkNTLUMunPaA+NkD2INwfhrgo5fAMz7zSk2ncoqbK2AS78X2ith8TJSevY0ynPukbFmaJ9BdauzCpWQ4ZIqQ==", 105 + "dependencies": [ 106 + "@atproto/lex-data", 107 + "tslib" 108 + ] 109 + }, 110 + "@atproto/lex-client@0.0.9": { 111 + "integrity": "sha512-30WtEedG0s/JNkbHzxpObkUg0id4+/p1O7LcUVCQWrNhWRw/hCzhHySSgFKKIVeLKAYIrZmaWt1XlAdNhGO7DQ==", 112 + "dependencies": [ 113 + "@atproto/lex-data", 114 + "@atproto/lex-json", 115 + "@atproto/lex-schema", 116 + "tslib" 117 + ] 118 + }, 119 + "@atproto/lex-data@0.0.8": { 120 + "integrity": "sha512-1Y5tz7BkS7380QuLNXaE8GW8Xba+mRWugt8BKM4BUFYjjUZdmirU8lr72iM4XlEBrzRu8Cfvj+MbsbYaZv+IgA==", 121 + "dependencies": [ 122 + "@atproto/syntax", 123 + "multiformats", 124 + "tslib", 125 + "uint8arrays", 126 + "unicode-segmenter" 127 + ] 128 + }, 129 + "@atproto/lex-document@0.0.10": { 130 + "integrity": "sha512-GrvO36UyWhStSNN0CtVswMyzYK7eUA0zLjYJRqpghAyzYV9ZVXTUL1Vx79MUSg3tC1jDM1A0hmtsjE1Cyo2rHQ==", 131 + "dependencies": [ 132 + "@atproto/lex-schema", 133 + "core-js", 134 + "tslib" 135 + ] 136 + }, 137 + "@atproto/lex-installer@0.0.11": { 138 + "integrity": "sha512-uNjpmG7p91UBKd1RJh0AJbbi5jzpHuTCjx1Pr0ZBbBmssOnr9GvMhSpeFU8ZuJ2HJqMMCBxUCU7zlad/b0KafA==", 139 + "dependencies": [ 140 + "@atproto/lex-builder", 141 + "@atproto/lex-cbor", 142 + "@atproto/lex-data", 143 + "@atproto/lex-document", 144 + "@atproto/lex-resolver", 145 + "@atproto/lex-schema", 146 + "@atproto/syntax", 147 + "tslib" 148 + ] 149 + }, 150 + "@atproto/lex-json@0.0.8": { 151 + "integrity": "sha512-w1Qmkae1QhmNz+i1Zm3xr3jp0UPPRENmdlpU0qIrdxWDo9W4Mzkeyc3eSoa+Zs+zN8xkRSQw7RLZte/B7Ipdwg==", 152 + "dependencies": [ 153 + "@atproto/lex-data", 154 + "tslib" 155 + ] 156 + }, 157 + "@atproto/lex-resolver@0.0.10": { 158 + "integrity": "sha512-7cV/vjJGHMUbzv1y2kIOChC/B5ox1F5hKpG3fFZdkM8eZ5o9NuMiIojvTgCYdxyH+XA/X6qjblMrru73fFRtmA==", 159 + "dependencies": [ 160 + "@atproto-labs/did-resolver", 161 + "@atproto/crypto", 162 + "@atproto/lex-client", 163 + "@atproto/lex-data", 164 + "@atproto/lex-document", 165 + "@atproto/lex-schema", 166 + "@atproto/repo", 167 + "@atproto/syntax", 168 + "tslib" 169 + ] 170 + }, 171 + "@atproto/lex-schema@0.0.9": { 172 + "integrity": "sha512-nsXpG0BdWu5Qn8qgs/+tHKP2gdVoYNiYwIUl+lt6EFb5juuOScmPilhZOa9MPDpLLzVgl35x9whjh842CvpHJQ==", 173 + "dependencies": [ 174 + "@atproto/lex-data", 175 + "@atproto/syntax", 176 + "tslib" 177 + ] 178 + }, 179 + "@atproto/lex@0.0.11": { 180 + "integrity": "sha512-/AmuUrBidTMqwmPedjhGI3nqSZ7JqiowcCuFhfa1kvkJLPbv8S+PPALRrc+pvMM3IEgg9EctqmeauQM+as32ww==", 181 + "dependencies": [ 182 + "@atproto/lex-builder", 183 + "@atproto/lex-client", 184 + "@atproto/lex-data", 185 + "@atproto/lex-installer", 186 + "@atproto/lex-json", 187 + "@atproto/lex-schema", 188 + "tslib", 189 + "yargs" 190 + ], 191 + "bin": true 192 + }, 193 + "@atproto/lexicon@0.6.0": { 194 + "integrity": "sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ==", 195 + "dependencies": [ 196 + "@atproto/common-web", 197 + "@atproto/syntax", 198 + "iso-datestring-validator", 199 + "multiformats", 200 + "zod" 201 + ] 202 + }, 203 + "@atproto/repo@0.8.12": { 204 + "integrity": "sha512-QpVTVulgfz5PUiCTELlDBiRvnsnwrFWi+6CfY88VwXzrRHd9NE8GItK7sfxQ6U65vD/idH8ddCgFrlrsn1REPQ==", 205 + "dependencies": [ 206 + "@atproto/common", 207 + "@atproto/common-web", 208 + "@atproto/crypto", 209 + "@atproto/lexicon", 210 + "@ipld/dag-cbor", 211 + "multiformats", 212 + "uint8arrays", 213 + "varint", 214 + "zod" 215 + ] 216 + }, 217 + "@atproto/syntax@0.4.2": { 218 + "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==" 219 + }, 220 + "@atproto/tap@0.1.3": { 221 + "integrity": "sha512-vjc7RnBOBMHO01zTFvsFy2MvcdmRpoCOy/97xsnFSa0bR7C9OpnRJwMHodLqsbXrt0viLflD25BBXY+Q5VFspg==", 222 + "dependencies": [ 223 + "@atproto/common", 224 + "@atproto/lex", 225 + "@atproto/syntax", 226 + "@atproto/ws-client", 227 + "ws", 228 + "zod" 229 + ] 230 + }, 231 + "@atproto/ws-client@0.0.4": { 232 + "integrity": "sha512-dox1XIymuC7/ZRhUqKezIGgooZS45C6vHCfu0PnWjfvsLCK2kAlnvX4IBkA/WpcoijDhQ9ejChnFbo/sLmgvAg==", 233 + "dependencies": [ 234 + "@atproto/common", 235 + "ws" 236 + ] 237 + }, 238 + "@drizzle-team/brocli@0.10.2": { 239 + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==" 240 + }, 241 + "@esbuild-kit/core-utils@3.3.2": { 242 + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", 243 + "dependencies": [ 244 + "esbuild@0.18.20", 245 + "source-map-support" 246 + ], 247 + "deprecated": true 248 + }, 249 + "@esbuild-kit/esm-loader@2.6.5": { 250 + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", 251 + "dependencies": [ 252 + "@esbuild-kit/core-utils", 253 + "get-tsconfig" 254 + ], 255 + "deprecated": true 256 + }, 257 + "@esbuild/aix-ppc64@0.25.12": { 258 + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", 259 + "os": ["aix"], 260 + "cpu": ["ppc64"] 261 + }, 262 + "@esbuild/android-arm64@0.18.20": { 263 + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 264 + "os": ["android"], 265 + "cpu": ["arm64"] 266 + }, 267 + "@esbuild/android-arm64@0.25.12": { 268 + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", 269 + "os": ["android"], 270 + "cpu": ["arm64"] 271 + }, 272 + "@esbuild/android-arm@0.18.20": { 273 + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 274 + "os": ["android"], 275 + "cpu": ["arm"] 276 + }, 277 + "@esbuild/android-arm@0.25.12": { 278 + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", 279 + "os": ["android"], 280 + "cpu": ["arm"] 281 + }, 282 + "@esbuild/android-x64@0.18.20": { 283 + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 284 + "os": ["android"], 285 + "cpu": ["x64"] 286 + }, 287 + "@esbuild/android-x64@0.25.12": { 288 + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", 289 + "os": ["android"], 290 + "cpu": ["x64"] 291 + }, 292 + "@esbuild/darwin-arm64@0.18.20": { 293 + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 294 + "os": ["darwin"], 295 + "cpu": ["arm64"] 296 + }, 297 + "@esbuild/darwin-arm64@0.25.12": { 298 + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", 299 + "os": ["darwin"], 300 + "cpu": ["arm64"] 301 + }, 302 + "@esbuild/darwin-x64@0.18.20": { 303 + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 304 + "os": ["darwin"], 305 + "cpu": ["x64"] 306 + }, 307 + "@esbuild/darwin-x64@0.25.12": { 308 + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", 309 + "os": ["darwin"], 310 + "cpu": ["x64"] 311 + }, 312 + "@esbuild/freebsd-arm64@0.18.20": { 313 + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 314 + "os": ["freebsd"], 315 + "cpu": ["arm64"] 316 + }, 317 + "@esbuild/freebsd-arm64@0.25.12": { 318 + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", 319 + "os": ["freebsd"], 320 + "cpu": ["arm64"] 321 + }, 322 + "@esbuild/freebsd-x64@0.18.20": { 323 + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 324 + "os": ["freebsd"], 325 + "cpu": ["x64"] 326 + }, 327 + "@esbuild/freebsd-x64@0.25.12": { 328 + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", 329 + "os": ["freebsd"], 330 + "cpu": ["x64"] 331 + }, 332 + "@esbuild/linux-arm64@0.18.20": { 333 + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 334 + "os": ["linux"], 335 + "cpu": ["arm64"] 336 + }, 337 + "@esbuild/linux-arm64@0.25.12": { 338 + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", 339 + "os": ["linux"], 340 + "cpu": ["arm64"] 341 + }, 342 + "@esbuild/linux-arm@0.18.20": { 343 + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 344 + "os": ["linux"], 345 + "cpu": ["arm"] 346 + }, 347 + "@esbuild/linux-arm@0.25.12": { 348 + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", 349 + "os": ["linux"], 350 + "cpu": ["arm"] 351 + }, 352 + "@esbuild/linux-ia32@0.18.20": { 353 + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 354 + "os": ["linux"], 355 + "cpu": ["ia32"] 356 + }, 357 + "@esbuild/linux-ia32@0.25.12": { 358 + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", 359 + "os": ["linux"], 360 + "cpu": ["ia32"] 361 + }, 362 + "@esbuild/linux-loong64@0.18.20": { 363 + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 364 + "os": ["linux"], 365 + "cpu": ["loong64"] 366 + }, 367 + "@esbuild/linux-loong64@0.25.12": { 368 + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", 369 + "os": ["linux"], 370 + "cpu": ["loong64"] 371 + }, 372 + "@esbuild/linux-mips64el@0.18.20": { 373 + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 374 + "os": ["linux"], 375 + "cpu": ["mips64el"] 376 + }, 377 + "@esbuild/linux-mips64el@0.25.12": { 378 + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", 379 + "os": ["linux"], 380 + "cpu": ["mips64el"] 381 + }, 382 + "@esbuild/linux-ppc64@0.18.20": { 383 + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 384 + "os": ["linux"], 385 + "cpu": ["ppc64"] 386 + }, 387 + "@esbuild/linux-ppc64@0.25.12": { 388 + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", 389 + "os": ["linux"], 390 + "cpu": ["ppc64"] 391 + }, 392 + "@esbuild/linux-riscv64@0.18.20": { 393 + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 394 + "os": ["linux"], 395 + "cpu": ["riscv64"] 396 + }, 397 + "@esbuild/linux-riscv64@0.25.12": { 398 + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", 399 + "os": ["linux"], 400 + "cpu": ["riscv64"] 401 + }, 402 + "@esbuild/linux-s390x@0.18.20": { 403 + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 404 + "os": ["linux"], 405 + "cpu": ["s390x"] 406 + }, 407 + "@esbuild/linux-s390x@0.25.12": { 408 + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", 409 + "os": ["linux"], 410 + "cpu": ["s390x"] 411 + }, 412 + "@esbuild/linux-x64@0.18.20": { 413 + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 414 + "os": ["linux"], 415 + "cpu": ["x64"] 416 + }, 417 + "@esbuild/linux-x64@0.25.12": { 418 + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", 419 + "os": ["linux"], 420 + "cpu": ["x64"] 421 + }, 422 + "@esbuild/netbsd-arm64@0.25.12": { 423 + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", 424 + "os": ["netbsd"], 425 + "cpu": ["arm64"] 426 + }, 427 + "@esbuild/netbsd-x64@0.18.20": { 428 + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 429 + "os": ["netbsd"], 430 + "cpu": ["x64"] 431 + }, 432 + "@esbuild/netbsd-x64@0.25.12": { 433 + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", 434 + "os": ["netbsd"], 435 + "cpu": ["x64"] 436 + }, 437 + "@esbuild/openbsd-arm64@0.25.12": { 438 + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", 439 + "os": ["openbsd"], 440 + "cpu": ["arm64"] 441 + }, 442 + "@esbuild/openbsd-x64@0.18.20": { 443 + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 444 + "os": ["openbsd"], 445 + "cpu": ["x64"] 446 + }, 447 + "@esbuild/openbsd-x64@0.25.12": { 448 + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", 449 + "os": ["openbsd"], 450 + "cpu": ["x64"] 451 + }, 452 + "@esbuild/openharmony-arm64@0.25.12": { 453 + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", 454 + "os": ["openharmony"], 455 + "cpu": ["arm64"] 456 + }, 457 + "@esbuild/sunos-x64@0.18.20": { 458 + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 459 + "os": ["sunos"], 460 + "cpu": ["x64"] 461 + }, 462 + "@esbuild/sunos-x64@0.25.12": { 463 + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", 464 + "os": ["sunos"], 465 + "cpu": ["x64"] 466 + }, 467 + "@esbuild/win32-arm64@0.18.20": { 468 + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 469 + "os": ["win32"], 470 + "cpu": ["arm64"] 471 + }, 472 + "@esbuild/win32-arm64@0.25.12": { 473 + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", 474 + "os": ["win32"], 475 + "cpu": ["arm64"] 476 + }, 477 + "@esbuild/win32-ia32@0.18.20": { 478 + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 479 + "os": ["win32"], 480 + "cpu": ["ia32"] 481 + }, 482 + "@esbuild/win32-ia32@0.25.12": { 483 + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", 484 + "os": ["win32"], 485 + "cpu": ["ia32"] 486 + }, 487 + "@esbuild/win32-x64@0.18.20": { 488 + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 489 + "os": ["win32"], 490 + "cpu": ["x64"] 491 + }, 492 + "@esbuild/win32-x64@0.25.12": { 493 + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", 494 + "os": ["win32"], 495 + "cpu": ["x64"] 496 + }, 497 + "@ipld/dag-cbor@7.0.3": { 498 + "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 499 + "dependencies": [ 500 + "cborg", 501 + "multiformats" 502 + ] 503 + }, 504 + "@isaacs/balanced-match@4.0.1": { 505 + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==" 506 + }, 507 + "@isaacs/brace-expansion@5.0.0": { 508 + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", 509 + "dependencies": [ 510 + "@isaacs/balanced-match" 511 + ] 512 + }, 513 + "@libsql/client@0.17.0": { 514 + "integrity": "sha512-TLjSU9Otdpq0SpKHl1tD1Nc9MKhrsZbCFGot3EbCxRa8m1E5R1mMwoOjKMMM31IyF7fr+hPNHLpYfwbMKNusmg==", 515 + "dependencies": [ 516 + "@libsql/core", 517 + "@libsql/hrana-client", 518 + "js-base64", 519 + "libsql", 520 + "promise-limit" 521 + ] 522 + }, 523 + "@libsql/core@0.17.0": { 524 + "integrity": "sha512-hnZRnJHiS+nrhHKLGYPoJbc78FE903MSDrFJTbftxo+e52X+E0Y0fHOCVYsKWcg6XgB7BbJYUrz/xEkVTSaipw==", 525 + "dependencies": [ 526 + "js-base64" 527 + ] 528 + }, 529 + "@libsql/darwin-arm64@0.5.22": { 530 + "integrity": "sha512-4B8ZlX3nIDPndfct7GNe0nI3Yw6ibocEicWdC4fvQbSs/jdq/RC2oCsoJxJ4NzXkvktX70C1J4FcmmoBy069UA==", 531 + "os": ["darwin"], 532 + "cpu": ["arm64"] 533 + }, 534 + "@libsql/darwin-x64@0.5.22": { 535 + "integrity": "sha512-ny2HYWt6lFSIdNFzUFIJ04uiW6finXfMNJ7wypkAD8Pqdm6nAByO+Fdqu8t7sD0sqJGeUCiOg480icjyQ2/8VA==", 536 + "os": ["darwin"], 537 + "cpu": ["x64"] 538 + }, 539 + "@libsql/hrana-client@0.9.0": { 540 + "integrity": "sha512-pxQ1986AuWfPX4oXzBvLwBnfgKDE5OMhAdR/5cZmRaB4Ygz5MecQybvwZupnRz341r2CtFmbk/BhSu7k2Lm+Jw==", 541 + "dependencies": [ 542 + "@libsql/isomorphic-ws", 543 + "cross-fetch", 544 + "js-base64", 545 + "node-fetch@3.3.2" 546 + ] 547 + }, 548 + "@libsql/isomorphic-ws@0.1.5": { 549 + "integrity": "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==", 550 + "dependencies": [ 551 + "@types/ws", 552 + "ws" 553 + ] 554 + }, 555 + "@libsql/linux-arm-gnueabihf@0.5.22": { 556 + "integrity": "sha512-3Uo3SoDPJe/zBnyZKosziRGtszXaEtv57raWrZIahtQDsjxBVjuzYQinCm9LRCJCUT5t2r5Z5nLDPJi2CwZVoA==", 557 + "os": ["linux"], 558 + "cpu": ["arm"] 559 + }, 560 + "@libsql/linux-arm-musleabihf@0.5.22": { 561 + "integrity": "sha512-LCsXh07jvSojTNJptT9CowOzwITznD+YFGGW+1XxUr7fS+7/ydUrpDfsMX7UqTqjm7xG17eq86VkWJgHJfvpNg==", 562 + "os": ["linux"], 563 + "cpu": ["arm"] 564 + }, 565 + "@libsql/linux-arm64-gnu@0.5.22": { 566 + "integrity": "sha512-KSdnOMy88c9mpOFKUEzPskSaF3VLflfSUCBwas/pn1/sV3pEhtMF6H8VUCd2rsedwoukeeCSEONqX7LLnQwRMA==", 567 + "os": ["linux"], 568 + "cpu": ["arm64"] 569 + }, 570 + "@libsql/linux-arm64-musl@0.5.22": { 571 + "integrity": "sha512-mCHSMAsDTLK5YH//lcV3eFEgiR23Ym0U9oEvgZA0667gqRZg/2px+7LshDvErEKv2XZ8ixzw3p1IrBzLQHGSsw==", 572 + "os": ["linux"], 573 + "cpu": ["arm64"] 574 + }, 575 + "@libsql/linux-x64-gnu@0.5.22": { 576 + "integrity": "sha512-kNBHaIkSg78Y4BqAdgjcR2mBilZXs4HYkAmi58J+4GRwDQZh5fIUWbnQvB9f95DkWUIGVeenqLRFY2pcTmlsew==", 577 + "os": ["linux"], 578 + "cpu": ["x64"] 579 + }, 580 + "@libsql/linux-x64-musl@0.5.22": { 581 + "integrity": "sha512-UZ4Xdxm4pu3pQXjvfJiyCzZop/9j/eA2JjmhMaAhe3EVLH2g11Fy4fwyUp9sT1QJYR1kpc2JLuybPM0kuXv/Tg==", 582 + "os": ["linux"], 583 + "cpu": ["x64"] 584 + }, 585 + "@libsql/win32-x64-msvc@0.5.22": { 586 + "integrity": "sha512-Fj0j8RnBpo43tVZUVoNK6BV/9AtDUM5S7DF3LB4qTYg1LMSZqi3yeCneUTLJD6XomQJlZzbI4mst89yspVSAnA==", 587 + "os": ["win32"], 588 + "cpu": ["x64"] 589 + }, 590 + "@logtape/logtape@2.0.0": { 591 + "integrity": "sha512-z9Hp44mIRXAzgxSyQfFQiRuJ78EMnZa6g43UCxyGOO3RgHjn/7q+5OhdbhypkeHjiJRPxv6RmRsyF0S+OOYWnA==" 592 + }, 593 + "@neon-rs/load@0.0.4": { 594 + "integrity": "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==" 595 + }, 596 + "@noble/curves@1.9.7": { 597 + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", 598 + "dependencies": [ 599 + "@noble/hashes" 600 + ] 601 + }, 602 + "@noble/hashes@1.8.0": { 603 + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" 604 + }, 605 + "@ts-morph/common@0.28.1": { 606 + "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==", 607 + "dependencies": [ 608 + "minimatch", 609 + "path-browserify", 610 + "tinyglobby" 611 + ] 612 + }, 613 + "@types/node@25.0.9": { 614 + "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", 615 + "dependencies": [ 616 + "undici-types" 617 + ] 618 + }, 619 + "@types/ws@8.18.1": { 620 + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", 621 + "dependencies": [ 622 + "@types/node" 623 + ] 624 + }, 625 + "abort-controller@3.0.0": { 626 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 627 + "dependencies": [ 628 + "event-target-shim" 629 + ] 630 + }, 631 + "ansi-regex@5.0.1": { 632 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 633 + }, 634 + "ansi-styles@4.3.0": { 635 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 636 + "dependencies": [ 637 + "color-convert" 638 + ] 639 + }, 640 + "atomic-sleep@1.0.0": { 641 + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" 642 + }, 643 + "base64-js@1.5.1": { 644 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 645 + }, 646 + "buffer-from@1.1.2": { 647 + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 648 + }, 649 + "buffer@6.0.3": { 650 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 651 + "dependencies": [ 652 + "base64-js", 653 + "ieee754" 654 + ] 655 + }, 656 + "cborg@1.10.2": { 657 + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", 658 + "bin": true 659 + }, 660 + "chalk@5.6.2": { 661 + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" 662 + }, 663 + "cliui@8.0.1": { 664 + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 665 + "dependencies": [ 666 + "string-width", 667 + "strip-ansi", 668 + "wrap-ansi" 669 + ] 670 + }, 671 + "code-block-writer@13.0.3": { 672 + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" 673 + }, 674 + "color-convert@2.0.1": { 675 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 676 + "dependencies": [ 677 + "color-name" 678 + ] 679 + }, 680 + "color-name@1.1.4": { 681 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 682 + }, 683 + "core-js@3.47.0": { 684 + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", 685 + "scripts": true 686 + }, 687 + "cross-fetch@4.1.0": { 688 + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", 689 + "dependencies": [ 690 + "node-fetch@2.7.0" 691 + ] 692 + }, 693 + "data-uri-to-buffer@4.0.1": { 694 + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" 695 + }, 696 + "debug@4.4.3": { 697 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 698 + "dependencies": [ 699 + "ms" 700 + ] 701 + }, 702 + "detect-libc@2.0.2": { 703 + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" 704 + }, 705 + "drizzle-kit@0.31.8_esbuild@0.25.12": { 706 + "integrity": "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==", 707 + "dependencies": [ 708 + "@drizzle-team/brocli", 709 + "@esbuild-kit/esm-loader", 710 + "esbuild@0.25.12", 711 + "esbuild-register" 712 + ], 713 + "bin": true 714 + }, 715 + "drizzle-orm@0.45.1_@libsql+client@0.17.0": { 716 + "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", 717 + "dependencies": [ 718 + "@libsql/client" 719 + ], 720 + "optionalPeers": [ 721 + "@libsql/client" 722 + ] 723 + }, 724 + "emoji-regex@8.0.0": { 725 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 726 + }, 727 + "esbuild-register@3.6.0_esbuild@0.25.12": { 728 + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", 729 + "dependencies": [ 730 + "debug", 731 + "esbuild@0.25.12" 732 + ] 733 + }, 734 + "esbuild@0.18.20": { 735 + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 736 + "optionalDependencies": [ 737 + "@esbuild/android-arm@0.18.20", 738 + "@esbuild/android-arm64@0.18.20", 739 + "@esbuild/android-x64@0.18.20", 740 + "@esbuild/darwin-arm64@0.18.20", 741 + "@esbuild/darwin-x64@0.18.20", 742 + "@esbuild/freebsd-arm64@0.18.20", 743 + "@esbuild/freebsd-x64@0.18.20", 744 + "@esbuild/linux-arm@0.18.20", 745 + "@esbuild/linux-arm64@0.18.20", 746 + "@esbuild/linux-ia32@0.18.20", 747 + "@esbuild/linux-loong64@0.18.20", 748 + "@esbuild/linux-mips64el@0.18.20", 749 + "@esbuild/linux-ppc64@0.18.20", 750 + "@esbuild/linux-riscv64@0.18.20", 751 + "@esbuild/linux-s390x@0.18.20", 752 + "@esbuild/linux-x64@0.18.20", 753 + "@esbuild/netbsd-x64@0.18.20", 754 + "@esbuild/openbsd-x64@0.18.20", 755 + "@esbuild/sunos-x64@0.18.20", 756 + "@esbuild/win32-arm64@0.18.20", 757 + "@esbuild/win32-ia32@0.18.20", 758 + "@esbuild/win32-x64@0.18.20" 759 + ], 760 + "scripts": true, 761 + "bin": true 762 + }, 763 + "esbuild@0.25.12": { 764 + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", 765 + "optionalDependencies": [ 766 + "@esbuild/aix-ppc64", 767 + "@esbuild/android-arm@0.25.12", 768 + "@esbuild/android-arm64@0.25.12", 769 + "@esbuild/android-x64@0.25.12", 770 + "@esbuild/darwin-arm64@0.25.12", 771 + "@esbuild/darwin-x64@0.25.12", 772 + "@esbuild/freebsd-arm64@0.25.12", 773 + "@esbuild/freebsd-x64@0.25.12", 774 + "@esbuild/linux-arm@0.25.12", 775 + "@esbuild/linux-arm64@0.25.12", 776 + "@esbuild/linux-ia32@0.25.12", 777 + "@esbuild/linux-loong64@0.25.12", 778 + "@esbuild/linux-mips64el@0.25.12", 779 + "@esbuild/linux-ppc64@0.25.12", 780 + "@esbuild/linux-riscv64@0.25.12", 781 + "@esbuild/linux-s390x@0.25.12", 782 + "@esbuild/linux-x64@0.25.12", 783 + "@esbuild/netbsd-arm64", 784 + "@esbuild/netbsd-x64@0.25.12", 785 + "@esbuild/openbsd-arm64", 786 + "@esbuild/openbsd-x64@0.25.12", 787 + "@esbuild/openharmony-arm64", 788 + "@esbuild/sunos-x64@0.25.12", 789 + "@esbuild/win32-arm64@0.25.12", 790 + "@esbuild/win32-ia32@0.25.12", 791 + "@esbuild/win32-x64@0.25.12" 792 + ], 793 + "scripts": true, 794 + "bin": true 795 + }, 796 + "escalade@3.2.0": { 797 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" 798 + }, 799 + "event-target-shim@5.0.1": { 800 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 801 + }, 802 + "events@3.3.0": { 803 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 804 + }, 805 + "fast-redact@3.5.0": { 806 + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==" 807 + }, 808 + "fdir@6.5.0_picomatch@4.0.3": { 809 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 810 + "dependencies": [ 811 + "picomatch" 812 + ], 813 + "optionalPeers": [ 814 + "picomatch" 815 + ] 816 + }, 817 + "fetch-blob@3.2.0": { 818 + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 819 + "dependencies": [ 820 + "node-domexception", 821 + "web-streams-polyfill" 822 + ] 823 + }, 824 + "formdata-polyfill@4.0.10": { 825 + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 826 + "dependencies": [ 827 + "fetch-blob" 828 + ] 829 + }, 830 + "get-caller-file@2.0.5": { 831 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 832 + }, 833 + "get-tsconfig@4.13.0": { 834 + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", 835 + "dependencies": [ 836 + "resolve-pkg-maps" 837 + ] 838 + }, 839 + "ieee754@1.2.1": { 840 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 841 + }, 842 + "is-fullwidth-code-point@3.0.0": { 843 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 844 + }, 845 + "iso-datestring-validator@2.2.2": { 846 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 847 + }, 848 + "js-base64@3.7.8": { 849 + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==" 850 + }, 851 + "libsql@0.5.22": { 852 + "integrity": "sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA==", 853 + "dependencies": [ 854 + "@neon-rs/load", 855 + "detect-libc" 856 + ], 857 + "optionalDependencies": [ 858 + "@libsql/darwin-arm64", 859 + "@libsql/darwin-x64", 860 + "@libsql/linux-arm-gnueabihf", 861 + "@libsql/linux-arm-musleabihf", 862 + "@libsql/linux-arm64-gnu", 863 + "@libsql/linux-arm64-musl", 864 + "@libsql/linux-x64-gnu", 865 + "@libsql/linux-x64-musl", 866 + "@libsql/win32-x64-msvc" 867 + ], 868 + "os": ["darwin", "linux", "win32"], 869 + "cpu": ["x64", "arm64", "wasm32", "arm"] 870 + }, 871 + "lru-cache@10.4.3": { 872 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" 873 + }, 874 + "minimatch@10.1.1": { 875 + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", 876 + "dependencies": [ 877 + "@isaacs/brace-expansion" 878 + ] 879 + }, 880 + "ms@2.1.3": { 881 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 882 + }, 883 + "multiformats@9.9.0": { 884 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 885 + }, 886 + "node-domexception@1.0.0": { 887 + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 888 + "deprecated": true 889 + }, 890 + "node-fetch@2.7.0": { 891 + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 892 + "dependencies": [ 893 + "whatwg-url" 894 + ] 895 + }, 896 + "node-fetch@3.3.2": { 897 + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 898 + "dependencies": [ 899 + "data-uri-to-buffer", 900 + "fetch-blob", 901 + "formdata-polyfill" 902 + ] 903 + }, 904 + "on-exit-leak-free@2.1.2": { 905 + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" 906 + }, 907 + "path-browserify@1.0.1": { 908 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 909 + }, 910 + "picomatch@4.0.3": { 911 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" 912 + }, 913 + "pino-abstract-transport@1.2.0": { 914 + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", 915 + "dependencies": [ 916 + "readable-stream", 917 + "split2" 918 + ] 919 + }, 920 + "pino-std-serializers@6.2.2": { 921 + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" 922 + }, 923 + "pino@8.21.0": { 924 + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", 925 + "dependencies": [ 926 + "atomic-sleep", 927 + "fast-redact", 928 + "on-exit-leak-free", 929 + "pino-abstract-transport", 930 + "pino-std-serializers", 931 + "process-warning", 932 + "quick-format-unescaped", 933 + "real-require", 934 + "safe-stable-stringify", 935 + "sonic-boom", 936 + "thread-stream" 937 + ], 938 + "bin": true 939 + }, 940 + "prettier@3.7.4": { 941 + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", 942 + "bin": true 943 + }, 944 + "process-warning@3.0.0": { 945 + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" 946 + }, 947 + "process@0.11.10": { 948 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" 949 + }, 950 + "promise-limit@2.7.0": { 951 + "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==" 952 + }, 953 + "quick-format-unescaped@4.0.4": { 954 + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" 955 + }, 956 + "ramda@0.32.0": { 957 + "integrity": "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ==" 958 + }, 959 + "readable-stream@4.7.0": { 960 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 961 + "dependencies": [ 962 + "abort-controller", 963 + "buffer", 964 + "events", 965 + "process", 966 + "string_decoder" 967 + ] 968 + }, 969 + "real-require@0.2.0": { 970 + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" 971 + }, 972 + "require-directory@2.1.1": { 973 + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 974 + }, 975 + "resolve-pkg-maps@1.0.0": { 976 + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" 977 + }, 978 + "safe-buffer@5.2.1": { 979 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 980 + }, 981 + "safe-stable-stringify@2.5.0": { 982 + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==" 983 + }, 984 + "sonic-boom@3.8.1": { 985 + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 986 + "dependencies": [ 987 + "atomic-sleep" 988 + ] 989 + }, 990 + "source-map-support@0.5.21": { 991 + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 992 + "dependencies": [ 993 + "buffer-from", 994 + "source-map" 995 + ] 996 + }, 997 + "source-map@0.6.1": { 998 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 999 + }, 1000 + "split2@4.2.0": { 1001 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" 1002 + }, 1003 + "string-width@4.2.3": { 1004 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1005 + "dependencies": [ 1006 + "emoji-regex", 1007 + "is-fullwidth-code-point", 1008 + "strip-ansi" 1009 + ] 1010 + }, 1011 + "string_decoder@1.3.0": { 1012 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1013 + "dependencies": [ 1014 + "safe-buffer" 1015 + ] 1016 + }, 1017 + "strip-ansi@6.0.1": { 1018 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1019 + "dependencies": [ 1020 + "ansi-regex" 1021 + ] 1022 + }, 1023 + "thread-stream@2.7.0": { 1024 + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", 1025 + "dependencies": [ 1026 + "real-require" 1027 + ] 1028 + }, 1029 + "tinyglobby@0.2.15_picomatch@4.0.3": { 1030 + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 1031 + "dependencies": [ 1032 + "fdir", 1033 + "picomatch" 1034 + ] 1035 + }, 1036 + "tr46@0.0.3": { 1037 + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1038 + }, 1039 + "ts-morph@27.0.2": { 1040 + "integrity": "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==", 1041 + "dependencies": [ 1042 + "@ts-morph/common", 1043 + "code-block-writer" 1044 + ] 1045 + }, 1046 + "tslib@2.8.1": { 1047 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1048 + }, 1049 + "uint8arrays@3.0.0": { 1050 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 1051 + "dependencies": [ 1052 + "multiformats" 1053 + ] 1054 + }, 1055 + "undici-types@7.16.0": { 1056 + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" 1057 + }, 1058 + "unicode-segmenter@0.14.5": { 1059 + "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==" 1060 + }, 1061 + "varint@6.0.0": { 1062 + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" 1063 + }, 1064 + "web-streams-polyfill@3.3.3": { 1065 + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" 1066 + }, 1067 + "webidl-conversions@3.0.1": { 1068 + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1069 + }, 1070 + "whatwg-url@5.0.0": { 1071 + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1072 + "dependencies": [ 1073 + "tr46", 1074 + "webidl-conversions" 1075 + ] 1076 + }, 1077 + "wrap-ansi@7.0.0": { 1078 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1079 + "dependencies": [ 1080 + "ansi-styles", 1081 + "string-width", 1082 + "strip-ansi" 1083 + ] 1084 + }, 1085 + "ws@8.19.0": { 1086 + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==" 1087 + }, 1088 + "y18n@5.0.8": { 1089 + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1090 + }, 1091 + "yargs-parser@21.1.1": { 1092 + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" 1093 + }, 1094 + "yargs@17.7.2": { 1095 + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 1096 + "dependencies": [ 1097 + "cliui", 1098 + "escalade", 1099 + "get-caller-file", 1100 + "require-directory", 1101 + "string-width", 1102 + "y18n", 1103 + "yargs-parser" 1104 + ] 1105 + }, 1106 + "zod@3.25.76": { 1107 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" 1108 + } 1109 + }, 1110 + "workspace": { 1111 + "dependencies": [ 1112 + "jsr:@es-toolkit/es-toolkit@^1.44.0", 1113 + "jsr:@std/assert@1", 1114 + "npm:@atproto/tap@~0.1.3", 1115 + "npm:@libsql/client@0.17", 1116 + "npm:@logtape/logtape@2", 1117 + "npm:chalk@^5.6.2", 1118 + "npm:drizzle-kit@~0.31.8", 1119 + "npm:drizzle-orm@~0.45.1", 1120 + "npm:ramda@0.32" 1121 + ] 1122 + } 1123 + }
+9
tap/drizzle.config.ts
··· 1 + import { defineConfig } from "drizzle-kit"; 2 + 3 + export default defineConfig({ 4 + dialect: "sqlite", 5 + schema: "./src/schema", 6 + dbCredentials: { 7 + url: Deno.env.get("TAP_CACHE_DATABASE_URL") || "tap-cache.db", 8 + }, 9 + });
+21
tap/drizzle/0000_spotty_sphinx.sql
··· 1 + CREATE TABLE `events` ( 2 + `id` integer PRIMARY KEY NOT NULL, 3 + `type` text NOT NULL, 4 + `did` text NOT NULL, 5 + `status` text, 6 + `handle` text, 7 + `is_active` integer, 8 + `collection` text, 9 + `rev` text, 10 + `rkey` text, 11 + `record` text, 12 + `live` integer, 13 + `cid` text, 14 + `created_at` integer DEFAULT (unixepoch()) NOT NULL 15 + ); 16 + --> statement-breakpoint 17 + CREATE UNIQUE INDEX `events_cid_unique` ON `events` (`cid`);--> statement-breakpoint 18 + CREATE INDEX `did_idx` ON `events` (`did`);--> statement-breakpoint 19 + CREATE INDEX `type_idx` ON `events` (`type`);--> statement-breakpoint 20 + CREATE INDEX `collection_idx` ON `events` (`collection`);--> statement-breakpoint 21 + CREATE INDEX `did_collection_rkey_idx` ON `events` (`did`,`collection`,`rkey`);
+1
tap/drizzle/0001_funny_wrecker.sql
··· 1 + ALTER TABLE `events` ADD `action` text;
+158
tap/drizzle/meta/0000_snapshot.json
··· 1 + { 2 + "version": "6", 3 + "dialect": "sqlite", 4 + "id": "2eb6ec4a-e6e2-416f-9657-7072f2db7558", 5 + "prevId": "00000000-0000-0000-0000-000000000000", 6 + "tables": { 7 + "events": { 8 + "name": "events", 9 + "columns": { 10 + "id": { 11 + "name": "id", 12 + "type": "integer", 13 + "primaryKey": true, 14 + "notNull": true, 15 + "autoincrement": false 16 + }, 17 + "type": { 18 + "name": "type", 19 + "type": "text", 20 + "primaryKey": false, 21 + "notNull": true, 22 + "autoincrement": false 23 + }, 24 + "did": { 25 + "name": "did", 26 + "type": "text", 27 + "primaryKey": false, 28 + "notNull": true, 29 + "autoincrement": false 30 + }, 31 + "status": { 32 + "name": "status", 33 + "type": "text", 34 + "primaryKey": false, 35 + "notNull": false, 36 + "autoincrement": false 37 + }, 38 + "handle": { 39 + "name": "handle", 40 + "type": "text", 41 + "primaryKey": false, 42 + "notNull": false, 43 + "autoincrement": false 44 + }, 45 + "is_active": { 46 + "name": "is_active", 47 + "type": "integer", 48 + "primaryKey": false, 49 + "notNull": false, 50 + "autoincrement": false 51 + }, 52 + "collection": { 53 + "name": "collection", 54 + "type": "text", 55 + "primaryKey": false, 56 + "notNull": false, 57 + "autoincrement": false 58 + }, 59 + "rev": { 60 + "name": "rev", 61 + "type": "text", 62 + "primaryKey": false, 63 + "notNull": false, 64 + "autoincrement": false 65 + }, 66 + "rkey": { 67 + "name": "rkey", 68 + "type": "text", 69 + "primaryKey": false, 70 + "notNull": false, 71 + "autoincrement": false 72 + }, 73 + "record": { 74 + "name": "record", 75 + "type": "text", 76 + "primaryKey": false, 77 + "notNull": false, 78 + "autoincrement": false 79 + }, 80 + "live": { 81 + "name": "live", 82 + "type": "integer", 83 + "primaryKey": false, 84 + "notNull": false, 85 + "autoincrement": false 86 + }, 87 + "cid": { 88 + "name": "cid", 89 + "type": "text", 90 + "primaryKey": false, 91 + "notNull": false, 92 + "autoincrement": false 93 + }, 94 + "created_at": { 95 + "name": "created_at", 96 + "type": "integer", 97 + "primaryKey": false, 98 + "notNull": true, 99 + "autoincrement": false, 100 + "default": "(unixepoch())" 101 + } 102 + }, 103 + "indexes": { 104 + "events_cid_unique": { 105 + "name": "events_cid_unique", 106 + "columns": [ 107 + "cid" 108 + ], 109 + "isUnique": true 110 + }, 111 + "did_idx": { 112 + "name": "did_idx", 113 + "columns": [ 114 + "did" 115 + ], 116 + "isUnique": false 117 + }, 118 + "type_idx": { 119 + "name": "type_idx", 120 + "columns": [ 121 + "type" 122 + ], 123 + "isUnique": false 124 + }, 125 + "collection_idx": { 126 + "name": "collection_idx", 127 + "columns": [ 128 + "collection" 129 + ], 130 + "isUnique": false 131 + }, 132 + "did_collection_rkey_idx": { 133 + "name": "did_collection_rkey_idx", 134 + "columns": [ 135 + "did", 136 + "collection", 137 + "rkey" 138 + ], 139 + "isUnique": false 140 + } 141 + }, 142 + "foreignKeys": {}, 143 + "compositePrimaryKeys": {}, 144 + "uniqueConstraints": {}, 145 + "checkConstraints": {} 146 + } 147 + }, 148 + "views": {}, 149 + "enums": {}, 150 + "_meta": { 151 + "schemas": {}, 152 + "tables": {}, 153 + "columns": {} 154 + }, 155 + "internal": { 156 + "indexes": {} 157 + } 158 + }
+165
tap/drizzle/meta/0001_snapshot.json
··· 1 + { 2 + "version": "6", 3 + "dialect": "sqlite", 4 + "id": "e965a6b3-42e8-41a5-8919-11fb478cfa1a", 5 + "prevId": "2eb6ec4a-e6e2-416f-9657-7072f2db7558", 6 + "tables": { 7 + "events": { 8 + "name": "events", 9 + "columns": { 10 + "id": { 11 + "name": "id", 12 + "type": "integer", 13 + "primaryKey": true, 14 + "notNull": true, 15 + "autoincrement": false 16 + }, 17 + "type": { 18 + "name": "type", 19 + "type": "text", 20 + "primaryKey": false, 21 + "notNull": true, 22 + "autoincrement": false 23 + }, 24 + "action": { 25 + "name": "action", 26 + "type": "text", 27 + "primaryKey": false, 28 + "notNull": false, 29 + "autoincrement": false 30 + }, 31 + "did": { 32 + "name": "did", 33 + "type": "text", 34 + "primaryKey": false, 35 + "notNull": true, 36 + "autoincrement": false 37 + }, 38 + "status": { 39 + "name": "status", 40 + "type": "text", 41 + "primaryKey": false, 42 + "notNull": false, 43 + "autoincrement": false 44 + }, 45 + "handle": { 46 + "name": "handle", 47 + "type": "text", 48 + "primaryKey": false, 49 + "notNull": false, 50 + "autoincrement": false 51 + }, 52 + "is_active": { 53 + "name": "is_active", 54 + "type": "integer", 55 + "primaryKey": false, 56 + "notNull": false, 57 + "autoincrement": false 58 + }, 59 + "collection": { 60 + "name": "collection", 61 + "type": "text", 62 + "primaryKey": false, 63 + "notNull": false, 64 + "autoincrement": false 65 + }, 66 + "rev": { 67 + "name": "rev", 68 + "type": "text", 69 + "primaryKey": false, 70 + "notNull": false, 71 + "autoincrement": false 72 + }, 73 + "rkey": { 74 + "name": "rkey", 75 + "type": "text", 76 + "primaryKey": false, 77 + "notNull": false, 78 + "autoincrement": false 79 + }, 80 + "record": { 81 + "name": "record", 82 + "type": "text", 83 + "primaryKey": false, 84 + "notNull": false, 85 + "autoincrement": false 86 + }, 87 + "live": { 88 + "name": "live", 89 + "type": "integer", 90 + "primaryKey": false, 91 + "notNull": false, 92 + "autoincrement": false 93 + }, 94 + "cid": { 95 + "name": "cid", 96 + "type": "text", 97 + "primaryKey": false, 98 + "notNull": false, 99 + "autoincrement": false 100 + }, 101 + "created_at": { 102 + "name": "created_at", 103 + "type": "integer", 104 + "primaryKey": false, 105 + "notNull": true, 106 + "autoincrement": false, 107 + "default": "(unixepoch())" 108 + } 109 + }, 110 + "indexes": { 111 + "events_cid_unique": { 112 + "name": "events_cid_unique", 113 + "columns": [ 114 + "cid" 115 + ], 116 + "isUnique": true 117 + }, 118 + "did_idx": { 119 + "name": "did_idx", 120 + "columns": [ 121 + "did" 122 + ], 123 + "isUnique": false 124 + }, 125 + "type_idx": { 126 + "name": "type_idx", 127 + "columns": [ 128 + "type" 129 + ], 130 + "isUnique": false 131 + }, 132 + "collection_idx": { 133 + "name": "collection_idx", 134 + "columns": [ 135 + "collection" 136 + ], 137 + "isUnique": false 138 + }, 139 + "did_collection_rkey_idx": { 140 + "name": "did_collection_rkey_idx", 141 + "columns": [ 142 + "did", 143 + "collection", 144 + "rkey" 145 + ], 146 + "isUnique": false 147 + } 148 + }, 149 + "foreignKeys": {}, 150 + "compositePrimaryKeys": {}, 151 + "uniqueConstraints": {}, 152 + "checkConstraints": {} 153 + } 154 + }, 155 + "views": {}, 156 + "enums": {}, 157 + "_meta": { 158 + "schemas": {}, 159 + "tables": {}, 160 + "columns": {} 161 + }, 162 + "internal": { 163 + "indexes": {} 164 + } 165 + }
+20
tap/drizzle/meta/_journal.json
··· 1 + { 2 + "version": "7", 3 + "dialect": "sqlite", 4 + "entries": [ 5 + { 6 + "idx": 0, 7 + "version": "6", 8 + "when": 1768620339760, 9 + "tag": "0000_spotty_sphinx", 10 + "breakpoints": true 11 + }, 12 + { 13 + "idx": 1, 14 + "version": "6", 15 + "when": 1768622485450, 16 + "tag": "0001_funny_wrecker", 17 + "breakpoints": true 18 + } 19 + ] 20 + }
+7
tap/src/context.ts
··· 1 + import drizzle from "./drizzle.ts"; 2 + 3 + export const ctx = { 4 + db: drizzle.db, 5 + }; 6 + 7 + export type Context = typeof ctx;
+9
tap/src/drizzle.ts
··· 1 + import { drizzle } from "drizzle-orm/libsql"; 2 + 3 + const db = drizzle({ 4 + connection: { 5 + url: Deno.env.get("TAP_CACHE_DATABASE_URL") || "file:tap-cache.db", 6 + }, 7 + }); 8 + 9 + export default { db };
+17
tap/src/logger.ts
··· 1 + import { configure, getConsoleSink, getLogger } from "@logtape/logtape"; 2 + 3 + await configure({ 4 + sinks: { console: getConsoleSink() }, 5 + loggers: [ 6 + { 7 + category: ["logtape", "meta"], 8 + lowestLevel: "warning", 9 + sinks: ["console"], 10 + }, 11 + { category: "tap", lowestLevel: "debug", sinks: ["console"] }, 12 + ], 13 + }); 14 + 15 + const logger = getLogger("tap"); 16 + 17 + export default logger;
+132
tap/src/main.ts
··· 1 + import { ctx } from "./context.ts"; 2 + import logger from "./logger.ts"; 3 + import connectToTap from "./tap.ts"; 4 + import schema from "./schema/mod.ts"; 5 + import { asc } from "drizzle-orm"; 6 + import { omit } from "@es-toolkit/es-toolkit/compat"; 7 + import type { SelectEvent } from "./schema/event.ts"; 8 + 9 + const PAGE_SIZE = 500; 10 + 11 + interface ClientState { 12 + socket: WebSocket; 13 + isPaginating: boolean; 14 + queue: SelectEvent[]; 15 + } 16 + 17 + const connectedClients = new Map<WebSocket, ClientState>(); 18 + 19 + export function broadcastEvent(evt: SelectEvent) { 20 + const message = JSON.stringify({ 21 + ...omit(evt, "createdAt", "record"), 22 + ...(evt.record && { 23 + record: JSON.parse(evt.record), 24 + }), 25 + }); 26 + 27 + for (const [socket, state] of connectedClients.entries()) { 28 + if (socket.readyState === WebSocket.OPEN) { 29 + if (state.isPaginating) { 30 + state.queue.push(evt); 31 + } else { 32 + socket.send(message); 33 + } 34 + } 35 + } 36 + } 37 + 38 + connectToTap(); 39 + 40 + Deno.serve({ port: parseInt(Deno.env.get("WS_PORT") || "2481") }, (req) => { 41 + if (req.headers.get("upgrade") != "websocket") { 42 + return new Response(null, { status: 426 }); 43 + } 44 + 45 + const { socket, response } = Deno.upgradeWebSocket(req); 46 + 47 + socket.addEventListener("open", async () => { 48 + logger.info`✅ Connected to Tap!`; 49 + 50 + connectedClients.set(socket, { 51 + socket, 52 + isPaginating: true, 53 + queue: [], 54 + }); 55 + 56 + let page = 0; 57 + let hasMore = true; 58 + 59 + while (hasMore) { 60 + const events = await ctx.db 61 + .select() 62 + .from(schema.events) 63 + .orderBy(asc(schema.events.createdAt)) 64 + .offset(page * PAGE_SIZE) 65 + .limit(PAGE_SIZE) 66 + .execute(); 67 + 68 + for (const evt of events) { 69 + socket.send( 70 + JSON.stringify({ 71 + ...omit(evt, "createdAt", "record"), 72 + ...(evt.record && { 73 + record: JSON.parse(evt.record), 74 + }), 75 + }), 76 + ); 77 + } 78 + 79 + hasMore = events.length === PAGE_SIZE; 80 + page++; 81 + } 82 + 83 + logger.info`📤 Sent all historical events (${page} pages)`; 84 + 85 + const clientState = connectedClients.get(socket); 86 + if (clientState) { 87 + const queuedCount = clientState.queue.length; 88 + 89 + if (queuedCount > 0) { 90 + logger.info`📦 Sending ${queuedCount} queued events...`; 91 + 92 + for (const evt of clientState.queue) { 93 + socket.send( 94 + JSON.stringify({ 95 + ...omit(evt, "createdAt", "record"), 96 + ...(evt.record && { 97 + record: JSON.parse(evt.record), 98 + }), 99 + }), 100 + ); 101 + } 102 + 103 + clientState.queue = []; 104 + } 105 + 106 + clientState.isPaginating = false; 107 + } 108 + 109 + logger.info`🔄 Now streaming real-time events...`; 110 + }); 111 + 112 + socket.addEventListener("message", (event) => { 113 + if (event.data === "ping") { 114 + socket.send("pong"); 115 + } 116 + }); 117 + 118 + socket.addEventListener("close", () => { 119 + connectedClients.delete(socket); 120 + logger.info`❌ Client disconnected. Active clients: ${connectedClients.size}`; 121 + }); 122 + 123 + socket.addEventListener("error", (error) => { 124 + logger.error`WebSocket error: ${error}`; 125 + connectedClients.delete(socket); 126 + }); 127 + 128 + return response; 129 + }); 130 + 131 + const url = `ws://localhost:${Deno.env.get("WS_PORT") || 2481}`; 132 + logger.info`🚀 Tap WebSocket server is running! ${url}`;
+37
tap/src/schema/event.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { sqliteTable, text, integer, index } from "drizzle-orm/sqlite-core"; 3 + 4 + const events = sqliteTable( 5 + "events", 6 + { 7 + id: integer("id").primaryKey(), 8 + type: text("type").notNull(), 9 + action: text("action"), 10 + did: text("did").notNull(), 11 + // identity 12 + status: text("status"), 13 + handle: text("handle"), 14 + isActive: integer("is_active", { mode: "boolean" }), 15 + // record 16 + collection: text("collection"), 17 + rev: text("rev"), 18 + rkey: text("rkey"), 19 + record: text("record"), 20 + live: integer("live", { mode: "boolean" }), 21 + cid: text("cid").unique(), 22 + createdAt: integer("created_at", { mode: "timestamp" }) 23 + .notNull() 24 + .default(sql`(unixepoch())`), 25 + }, 26 + (t) => [ 27 + index("did_idx").on(t.did), 28 + index("type_idx").on(t.type), 29 + index("collection_idx").on(t.collection), 30 + index("did_collection_rkey_idx").on(t.did, t.collection, t.rkey), 31 + ], 32 + ); 33 + 34 + export type SelectEvent = InferSelectModel<typeof events>; 35 + export type InsertEvent = InferInsertModel<typeof events>; 36 + 37 + export default events;
+5
tap/src/schema/mod.ts
··· 1 + import events from "./event.ts"; 2 + 3 + export default { 4 + events, 5 + };
+69
tap/src/tap.ts
··· 1 + import { Tap, SimpleIndexer } from "@atproto/tap"; 2 + import logger from "./logger.ts"; 3 + import { ctx } from "./context.ts"; 4 + import schema from "./schema/mod.ts"; 5 + import _ from "@es-toolkit/es-toolkit/compat"; 6 + import { broadcastEvent } from "./main.ts"; 7 + 8 + export const TAP_WS_URL = Deno.env.get("TAP_URL") || "http://localhost:2480"; 9 + 10 + export default function connectToTap() { 11 + const tap = new Tap(TAP_WS_URL); 12 + 13 + const indexer = new SimpleIndexer(); 14 + 15 + indexer.identity(async (evt) => { 16 + const result = await ctx.db 17 + .insert(schema.events) 18 + .values({ 19 + id: evt.id, 20 + type: evt.type, 21 + did: evt.did, 22 + handle: evt.handle, 23 + status: evt.status, 24 + isActive: evt.isActive, 25 + }) 26 + .onConflictDoNothing() 27 + .returning() 28 + .execute(); 29 + 30 + if (result.length > 0) { 31 + broadcastEvent(result[0]); 32 + } 33 + 34 + logger.info`${evt.did} updated identity: ${evt.handle} (${evt.status})`; 35 + }); 36 + 37 + indexer.record(async (evt) => { 38 + logger.info`${evt}`; 39 + const result = await ctx.db 40 + .insert(schema.events) 41 + .values({ 42 + id: evt.id, 43 + type: evt.type, 44 + action: evt.action, 45 + did: evt.did, 46 + rev: evt.rev, 47 + collection: evt.collection, 48 + rkey: evt.rkey, 49 + record: JSON.stringify(evt.record), 50 + cid: evt.cid, 51 + live: evt.live, 52 + }) 53 + .onConflictDoNothing() 54 + .returning() 55 + .execute(); 56 + 57 + if (result.length > 0) { 58 + broadcastEvent(result[0]); 59 + } 60 + 61 + const uri = `at://${_.get(result, "[0].did")}/${_.get(result, "[0].collection")}/${_.get(result, "[0].rkey")}`; 62 + logger.info`New record inserted: ${result.length} ${uri}`; 63 + }); 64 + 65 + indexer.error((err) => logger.error`${err}`); 66 + 67 + const channel = tap.channel(indexer); 68 + channel.start(); 69 + }