{"_id":"@reddb-io/red-router","_rev":"116-afe5c1f4d1bb3929a2264902f02d4c80","name":"@reddb-io/red-router","dist-tags":{"latest":"0.58.3"},"versions":{"0.1.0":{"name":"@reddb-io/red-router","version":"0.1.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.1.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"39d547d426a6bf2ceaa3c6e1b39e7f2b510afe20","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.1.0.tgz","fileCount":5338,"integrity":"sha512-DtpSnREZubDK09VNvGnKbNZzgA73zmk5HKCllamy/PHCBvkBqhipPFQYpb8KacoT5KSNgiElUjfOV2fQIpya+w==","signatures":[{"sig":"MEQCIBZta9eLGkyMGyVU5qJtx+yXrwKc/yXKAK6tAUjT/uPkAiBXcTMg0PMTqSMe4NruI1OPVuNbbkS6zntdaz6v16rKCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83058967},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.1.0_1789678175422_0.8679352506818683","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@reddb-io/red-router","version":"0.2.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.2.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"94b6d9a9d64e38c45f92302122211efa626024e8","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.2.0.tgz","fileCount":5338,"integrity":"sha512-ho0HBdsQP5TzzooIOW58yiPyh1QCxXUKCVquAHxy1YFvLQ9n+96RgATC7EI/ZoCBaDKw5F+i5i4feRq6xXqonA==","signatures":[{"sig":"MEUCIDuDd9BzqYDV8dlIYtK4aN/c4f+83GByix/pj26hm1mMAiEAz4s7k+WvsbItgHvAbJ3RyvRIa/MIJIzSRxjAvlCIMNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEyWwQQfE0lK85isiMjHvwv5Bo1bm96QMV5yJWQl8UF4AiBK+6vimdwlEKHIFc0OG219FyrCzHs2fWsbvVE9vxgu+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82999460},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.2.0_1789691197286_0.46677289378893505","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@reddb-io/red-router","version":"0.3.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.3.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"561ef2e315beb1f44960c67b7749ed48f2fce3cd","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.3.0.tgz","fileCount":5338,"integrity":"sha512-O2NeLuBR1qacXE3nLSS47lgWYbu98HDxHoFcPV2jpIiLZkBJNTsrMH+vz7YAMb1JWDj4j6PQsvPJ42x8R5uB1A==","signatures":[{"sig":"MEYCIQD290w3QM791mVV2bXBQ0iSvHgPA/5jR/h5JnCLfxqAEAIhANlP/B9WwkcQIaB3n/TRlOjnpP2Kyrx4V+IiTu79uMRV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDpZJoZYcaNBvUlfvcXJkNLVEYeommglrtyYZ53vKKMdgIhAMbvDOo5S/XbO7uJ2zusHR+xfhy74vouH6R1Sml0B3wV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82999474},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.3.0_1789692492103_0.5559265978457475","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@reddb-io/red-router","version":"0.4.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.4.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"9847e9ba7a763f276c1988291547a1e8eeff3243","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.4.0.tgz","fileCount":5345,"integrity":"sha512-5mkZetw3MRYt8SrSVomNyToFYkZKdNu3f9HPHH2/MIQm6PNRyvGZ91ip7D/SPeByKR3MEM/Zt5f1GZ/g90F4Ig==","signatures":[{"sig":"MEYCIQChq2pfVXwH4/7xt91ivCLK+VZr4zfZKBcnfoXPYzSoBAIhANpM8qE3za8+M3cfDYtuegWNmbrRLh2TXKzxZEAhpeZt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBXxzXJm+MO1sq3xLCZAcPSNVWsYLFjKXhVNicEUxmOoAiAN/UMNxF2JKrbIz1h9iIkcgPJ1nlIAJ41OwQvExHncbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103057819},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.4.0_1789700338695_0.9181598119534413","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@reddb-io/red-router","version":"0.5.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.5.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"6540647a9a507ed1199de91c8ec80a757dde98ce","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.5.0.tgz","fileCount":5345,"integrity":"sha512-kw3Vp5HvEVPo2ATjndMhZV4P+ceAIpykos8JsklZL+Gcs3zgIrsR7HteTDs/MdGLNTWEIt2VaDPEcr2LsoMiKA==","signatures":[{"sig":"MEYCIQCmvrlnHO6IOxm1BUsVdwEOnQMGmNXGxcXQGvS669hU9QIhAISyItaQ5Fed0j344a9yNfnQ4wDDKSh0C6cEw5iWn9hp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGr7Uz2eZds8ayz2YKCPitvzFEjgUaXGM684Mw1me15BAiAMLIRg+yzF6FpFlgjaOjC3cKgpgCvk3zbxponFD4+ziA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103070624},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.5.0_1789703136706_0.8058134973592408","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@reddb-io/red-router","version":"0.5.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.5.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"c5a54f47a7bc99e4333578c72ef28f425fd62a5a","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.5.1.tgz","fileCount":5787,"integrity":"sha512-hzOY6ggqmZuxqq4pQ9uRDhLcLFwQiVHzbMRMjlxXLXS2ngbajfY2wqouiYVsUuGUkULLOki/ZOgovi/sI8P6Og==","signatures":[{"sig":"MEUCICg553j3K88aQpOhci2IUrPOZgZkmriroY6lSpO1lkGSAiEA0GBLG3HklksnHD+AeN8Ujg0EKhCsWJ07926SvKEgxJI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCHMiKpKvbIhbUxgCoIbbEMbC87b98hCj63L5nFb/VSCQIhANfZ52+D05YsSR9MsVlDySF09nNu26Mc3i8QZwDs4JZm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103364824},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.5.1_1789730604995_0.2853041213807268","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@reddb-io/red-router","version":"0.5.3","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.5.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"521d2f6a78977a1686fc72f4b37bdc0da9584588","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.5.3.tgz","fileCount":5857,"integrity":"sha512-KqtvvDCnCm1Ksl7WIynPPVe+1Jaraslj/dp9HLah6Bp8l6YTxYFfuxzPaRJrrE8mhomvm6hOXMdF9Bhg8ufafg==","signatures":[{"sig":"MEUCIQDBM76G/PqZA/BX7oKMx+gFz5WDjf0p+tPWTinvRhAkMwIgUGiGspsyXM6oA5ly4i6E4l21O0IE5CdsErg2pDXU7q8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE3DHPHw5eZVzwqoYckszrtqDsScDWdtLHqz90/l887ZAiA0YB3BFP83FSMR0BMuVcM5+7qkWQfrFNrwSX6KnUgE1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110855781},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.5.3_1789731989354_0.545736910098102","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@reddb-io/red-router","version":"0.6.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.6.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"23d7f9b9e4fdc8966615444a140f42bcb7033f21","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.6.0.tgz","fileCount":5858,"integrity":"sha512-6/hC24eq1r3wCnHEk6FrPDwLf1Vv61qMvjAmJ4dNss6FRrznLjpsImeNxQslaNCwntfHRgHaUnfwCM/RSEDnEA==","signatures":[{"sig":"MEUCIQD02lWcyfudRlfSX37dbMi1XzBm08SJiueThDyMYnDR3AIgUUtFQSt66x2PgUGbQK1u6feB7+v8svzD9qWQWis7pyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDIukXWjP3+rJFOdizbq4PHywlGPoMvk+jz/lRbHbGkSAiAKGmSpguvEqx7QOCUa4qNDGb1zTsJ3qULDVvBOPYYXlA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110864563},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.6.0_1789735877266_0.22463876409837935","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@reddb-io/red-router","version":"0.7.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.7.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"a43f36e294bdda89948f71247f449e1ce048dd31","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.7.0.tgz","fileCount":5858,"integrity":"sha512-co3sjJCIqm007jzbNanvtpp//Q6ab0DmDd/FSjWH5Gz/TERBFwlt6y1OZU0iHzGuxmiC7NAIvlNry49ALGE1qw==","signatures":[{"sig":"MEQCIEriAOqifLqWknRUDErgSg5MaEJ5bqGRJMzt+pSBqOZnAiAoLPO2xX4eqaws/7Hl4rfp7K6rmoE4Yd9HDjqGaFIQfQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDHWuKFHind8jSlwB8Hic3SDUi0u8yKmCF/eazTdHDVbgIgQ53knqsrnfWmlZSlad9RGhcj2f+L/JBjHdoBdAYR5q4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110848665},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.7.0_1789736676594_0.9035418002357836","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@reddb-io/red-router","version":"0.7.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.7.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"2ab68c9565e340a623a4b310fac204119bd4366a","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.7.1.tgz","fileCount":5858,"integrity":"sha512-1XDxmlTt3YJV60JyW8U7RUhidR8EH+yXShaonmKp0BhSH4E2KWi+RS0603RKV4GwMmhiU6cGwBzhz6tWYK56Pw==","signatures":[{"sig":"MEQCIHL48/CCPpF/EL8YrTIBBZN1KOQ/FDi6kcmWP4PHs/kvAiA5keatn+SoFylBrpDRxX+1E0z09/rrsMZo4um62uZO+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDAUqHHYH8BE3ErNk+nIvqmR4yFEXI+UNXZZ8EqxMecewIgJdMPTd93yW3X0X7EVw+M9FXETJD8sUmHRTRukxnIWPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110823751},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.7.1_1789737524603_0.3975667825981215","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@reddb-io/red-router","version":"0.7.2","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.7.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"b18b954017316626e1c6ee6bb6aee7eb7d29e5e8","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.7.2.tgz","fileCount":5858,"integrity":"sha512-J3JvNfBjglnxP1RhpGe+LgMUmesWZv/krnyD3laY+MNLERjdEq6LcIviLtP+kzLT5QyM+B6hZxaLHwXG/OSLlg==","signatures":[{"sig":"MEYCIQCatzjLforZ5QmWapdP7EiPZ2wrdq45GWFRsyC0e6AqMgIhAJQGPQX+CXJ8YGoySVTmYqsP+8YYUam6RQZd9t61yUEP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCMOLhyoZZtqbjTk6iP0YjhWSE7L/pXMN5AbjwFKTcC6wIgNJKAxbT475kp03XcXDG1SoBSnjnyg/9uLNwNCLA+RU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110833215},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.7.2_1789748312114_0.619555651765068","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@reddb-io/red-router","version":"0.8.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.8.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"486ab75844b3c806f18bde57f1db268706688d2a","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.8.0.tgz","fileCount":6022,"integrity":"sha512-9Ies5IimbyiiC+czb/ba3mtt6qFa5A6F/6de+FoR1+2EVbfsq8ALwPQrl8wnQUjbtQX1Evwlq9xQpBUjLWNCHQ==","signatures":[{"sig":"MEYCIQCcyxDviBwB1ORWdn2Pr7P+2DYgG7GDVCyBeZ67GAb/YQIhAOl4diYvyeOnTBj3FRC6qW0GLZexaP5yXk0/NePJLUKw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQClejzNa5Cbc6N6Yy7NbbfudjTydpHtLgNBhSwI6hFe0wIhAM9t+ar/GdvDDuxJ+F90KiPvYRLa/uv0FdOPEeH/pSAD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114161108},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.8.0_1789767759127_0.5297386675367652","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@reddb-io/red-router","version":"0.8.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.8.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"2226daf652b23662b85fa0eccb1f89a21002ceb0","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.8.1.tgz","fileCount":6026,"integrity":"sha512-tC/IXx1q0EQxyDCFFgIbEI10+zrurbqlecVQ0UUe4/I/Z8UIjQRpIvm+HogjAD0bg++2Fram7tXoh6V2wlT9+w==","signatures":[{"sig":"MEQCIFM35EaOMSNTaMNWZkTKtDUL13cnImUdGtJri9XfvwsmAiAh5IXCk+OwhILnfIPGTSwGQCQZDqt7qYZI6EMuNeEM7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFDahQuTIbR3dRcyqjRXIHsyEvi4kDFa31Sa+lrERhu9AiASBuuQ6ek3rrpOwZyV26gAQ7CGIHLglYLGWob4Mk40xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114215728},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.8.1_1789882838870_0.28120904384070844","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@reddb-io/red-router","version":"0.9.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.9.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"6b5cf0443c86b09bdbc2e708a906c71277e462c0","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.9.0.tgz","fileCount":6030,"integrity":"sha512-/T634aQ8s5eiffWYskJ0kbMOg835jmwSpYpG3JH5Ma8yYITYcZRD9gSwG8hJv+ayObPECkevnQRhuaP1tz1VrQ==","signatures":[{"sig":"MEUCIB/sRxAD8ohnSwMxOXm69xDJas8NNYNRWhuQycUr2PEzAiEAo2crPeIP82hPtjbG5kEms8wiOizjJeiJIj9zUboMDU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE0EcAheYZLrGl8i+8IKBEnNUqQEu5hhmBLTFySIkXwdAiBCpz0GHoglmg1A9nNtaYDDdTyFwfhzCpBOF6Hp5YKrPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114305803},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.9.0_1789938724098_0.5601837222199504","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@reddb-io/red-router","version":"0.9.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.9.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"92dbc27d906aadf1cea962ad43250ff86a77b83e","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.9.1.tgz","fileCount":6030,"integrity":"sha512-yjv9s3cBSyVddmKa/F2IMt5XAIYc5SO0IBSIleM+mY5sKTlGh4o4KpheuKQXl8FYV9kqntYvq04mOJueRAwvwA==","signatures":[{"sig":"MEUCIE4wiEK9OWrDihgKs87e8MEpOxhPyXykazrFExGFlspcAiEA0fa4V6pVODA+t5m1YMqZRyuv2YIiB6DXoldw6ofk7gQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCLuNqRlWZzVWtSrRfyAo+6Omvn8WymOHjgGfImTjonkgIgWHP5iWuK7V+3Krdmuj7jyPb4b+HON42wju0SthUXR+U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114307692},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.9.1_1789941789035_0.02134325196950182","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@reddb-io/red-router","version":"0.10.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.10.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"0e99f5696897171f3b31650c438d975385ecce80","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.10.0.tgz","fileCount":6030,"integrity":"sha512-O2iR+OMfCec+q1KmnzUIsD0ko+OpMj3o7FzwQsvw6IWI7xs38X3N2GIC3D7VEOqk95wWr6rf9RH2TSKkr8UE0w==","signatures":[{"sig":"MEUCIQCDIIC995+zwlMGNlYr80k/3zO1ZZt+2Tbxgm/V48xgQgIgTk/IkjJWTxxCghqUGF7vYJpolwuJ991i8vQYBTSD5Og=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID6R/TueBwd5c0vKzX8Yi7gtOf6qD4GT4u8CYl50+hooAiAfaYjZzyo3NmjDXmclDEfWNKyGa16NQSZPSUBF4/JtYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114356823},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.10.0_1790018775297_0.2971619417886735","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@reddb-io/red-router","version":"0.11.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"766f09a395d2cbad742373705fb16eab6ead4d52","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.0.tgz","fileCount":6030,"integrity":"sha512-0ZORogRe7Bho3Xf4ibO6/avcUyP9pye0+4yqqHSPeroc/6lTgOoVR8o6vXQBaMcHUoblMDXTKiM9K+EsCdA80g==","signatures":[{"sig":"MEUCIQDX/wWCYPG2rVo/zdsWq4IWTFtD2tw8Kt+dbmAqOOjalgIgOIDhDDHqEtsRZTweBlgZU/llUjA/877wEXCAkwKEcYM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEfhlCkqno7BLXZL8V4CB2anKb4i0g197J4W2a8roOm8AiEAzoP8OxB3UHj2MBRRzp2pT3P9NY4cxvfutzD3rzV6HmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114364743},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.0_1790022560922_0.820394119428794","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@reddb-io/red-router","version":"0.11.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"d5a21379c3dcf3078428213c59b02c8c0a4f5d12","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.1.tgz","fileCount":6030,"integrity":"sha512-uCB/gUCXuXU6Xv/SgXXUAg8KHex6/Qy4pfX09CO/63LnUQMaBOlzmx/Yfesy9G6j8gEczpiECM8x1a05Oejelw==","signatures":[{"sig":"MEUCIQCWJkXECmglW7tAYqG4T20tsxexU0+Q2Eta8WH+jGc+AAIgMjNBVyVoZQYRN+b7kOZx9mUyrsgSfWj9VPebtR0R9eE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDV1uJkTwCPc6AF83T9n9oScmG3mj2+GrHmuSQiZwvssAiEA5HEelHwibZ9+pjc0z5aWHt+eF58tDkc0gl8eBGh3xzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114322855},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.1_1790025855446_0.8050278310124508","host":"s3://npm-registry-packages-npm-production"}},"0.11.2":{"name":"@reddb-io/red-router","version":"0.11.2","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"b7ca6b2b6bcacbadfe91566cb6ba37276c564ba2","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.2.tgz","fileCount":6030,"integrity":"sha512-ElAGI8vfHaBKZ91iJoO4mAWJKRbKkplvjkSYxRK3UXqeQQFWelYuXAfUOsFIXoCBSIsFwjp8lGaUGuUBgAH1oA==","signatures":[{"sig":"MEQCIC/We6R4csId3XdADqpA5X6KXEVyPlHUS/eCIQZeZKBAAiBzYqy3b1XkYLZMA/NHa9zuff4Sp8uG4QsQce1n+n9vzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDsgIRWHhWc2NCpiiJUOY9TJbbPjjCeAFz0a6EbC6xH5gIgUIpKDjm4cFAQPSK1jnEAbNEutgKKdSPDtDR688F4pao=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114314100},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.2_1790039966617_0.415865337860827","host":"s3://npm-registry-packages-npm-production"}},"0.11.3":{"name":"@reddb-io/red-router","version":"0.11.3","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"94f30821aec7ba0c57cc5a74afcde77e6379393d","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.3.tgz","fileCount":6031,"integrity":"sha512-NqZgg6AwbJQQqjilwpa8dpvK8NImqsgjAv5dhjQkChKMm//rFK68BOxXaOZgxYMiKEJFJqkXUeQ06wf8YL4XZQ==","signatures":[{"sig":"MEUCIAWmo9+kBWfGaN15iJNsusd0VIDjpv0JN8fkfnQY56qNAiEAoQS1W6W315Je0wmnmzxhwRfLkbqyP3DBAB7XtD2fnRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGCVfuRm63seQbqrQ3SOyn7TnwetgM741FH4aDTl2Bw2AiBmuq/BAYDHCGvEq34Ax8WPVF/PCybu4Y8Ea7Rbh7jaHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114316076},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.3_1790040119425_0.14007995556147756","host":"s3://npm-registry-packages-npm-production"}},"0.11.4":{"name":"@reddb-io/red-router","version":"0.11.4","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.4","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"581ad1643962109ea0094fffe04dd248591b8e4b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.4.tgz","fileCount":6031,"integrity":"sha512-TuLOYMa2u+hlgsyqMhh7kL2zEJrZzJpUlCec3qK+pBmaDGrWUDDa7MPczxnRzplWVACPCx38K4Uqrdgs+O0q8Q==","signatures":[{"sig":"MEQCIExwBYwyyCg5PKhpqy/6/bcprF03Ip0K94GPkYEdhXqmAiAWEq8whRz3nF4ZlFIJif63a5Ky8hkg25ptqJl25zFL1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBnz+VSFYJuIA46bTIgYHBENNHjXxeAewkN+qq+apn51AiEA80GzgW8Z0TjhfwDDVJ8fcciqtP/VQtq7PK6kWtZF8ZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114315972},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.4_1790040811830_0.6299974927902259","host":"s3://npm-registry-packages-npm-production"}},"0.11.5":{"name":"@reddb-io/red-router","version":"0.11.5","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.5","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"982b4821a27f68af105726ab675fe394f6895ac9","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.5.tgz","fileCount":6031,"integrity":"sha512-7FR7s/KcH6VlGgAcW+gDtgg3AMlMMxBs+XRVQqCWx+FFVkuk4JKPwW2xifkyZqhiIyYu0oit7P0zIjEgG4VuYg==","signatures":[{"sig":"MEUCIA67PZyT2KxCXe2Ev4GcEO7T4Sg8iIknHhMVBQCJJfNMAiEA67fMrPJvrqU09yGrA5OuHl2Tx7zndi/aQn2MMcQycrs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAQQRiwhi9ZjUV20iairCcorthouLmKVTpumpOoJKddJAiA31Q4DD3EgZs68lFTxraTjGwikos9H0qPAy+tVFz1cAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114320124},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.5_1790043548321_0.5458299709423966","host":"s3://npm-registry-packages-npm-production"}},"0.11.6":{"name":"@reddb-io/red-router","version":"0.11.6","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.6","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"098fe2eb60db58f670fca9a37e2bd30bd9910d50","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.6.tgz","fileCount":6031,"integrity":"sha512-rbTct6sV+zEfb7MDezlfWf4jSaT+U+Q4/+6HbS95jnM2MMh1QgmqOxIEheyrzMggjIzIw3GcCH8UGY9OMG/AHA==","signatures":[{"sig":"MEQCICClIipbqmLKTQ8FbZYOM8mpCSEuLIj/9dWVYY6++4DdAiA9Q9cQkxde0yIEl28z87/ByLGkhqsG/cnT796Lm7fq3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFyRCirfJNRYDuiBwT0zuPs2uEax/2nBjuNYtfIQQzeZAiEAw/Hx6xTJcq9WHPT9IWNR2XwGTdcSl9C/8UchtkP6t9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114324793},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.6_1790045841775_0.07698696074540257","host":"s3://npm-registry-packages-npm-production"}},"0.11.7":{"name":"@reddb-io/red-router","version":"0.11.7","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.7","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"376a374cb5ef19fcd09458e29d63c1a54e67d69a","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.7.tgz","fileCount":6031,"integrity":"sha512-1VdbK5ZvaJesRX982X8iygg9oLI1GqBlsGb7r75PR+eVoP5/ptnqWOsp46ywu5GxN3Hidn5CW2DdoWeP0x5dLQ==","signatures":[{"sig":"MEYCIQCPaFoPeUHBzqNrgjdlUhxd4WwPtHToZFY0CnzP6x1YKQIhANf1Ri99B8Z62u30p0qAIRmKesTZiqSXtcRp3ViI2ZBe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDZTfh7W6Sv5kZ4nEXwz1J/Rz2SU370g4lBURJqTFUaDAiEAr3zl9hL711c678KcIax7v+cYjRQzDTx44drFz6c+Lx0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114324881},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.7_1790053952339_0.9495531288178187","host":"s3://npm-registry-packages-npm-production"}},"0.11.8":{"name":"@reddb-io/red-router","version":"0.11.8","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.8","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"f0557e1d32b0dcdebf8f2204e1ebf7fd9ab63081","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.8.tgz","fileCount":6032,"integrity":"sha512-M+SG4IWN9LnAtlQCF1VVV1AZohN4D57AE499Q3+WWh7G30tcHDTdLkX7zeYZ7rAXy8PDFqcvqoKNJEyKyTjirA==","signatures":[{"sig":"MEUCIQCNJdQoR0wXmPzhOitTAkU6rL7X1P+L2F2Pkn+UVphazgIgJtKvsEgal0gsiZVx6ueo2WW+1U0pTFTBhoQQnIP/ozU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAL1W4KD31gPikr4YyhYJZC6OX9VkZR0CWTImB8gt+OVAiAepConIbpsAyolnbIZ8D47ok60SvDgfZoCghAMp3q/Xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114354654},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.8_1790083981997_0.4612208646001563","host":"s3://npm-registry-packages-npm-production"}},"0.11.9":{"name":"@reddb-io/red-router","version":"0.11.9","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.9","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"640e913326d1b2a457a6cc12e64a3cc26170b251","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.9.tgz","fileCount":6032,"integrity":"sha512-UqNHlMG3Gjl1aa/dJCwboC7u1E3dXpeye76MuJu2K6PbGZd+VtlEBvDFJsSyuqxDAastWJu34jNAPTPRSaYpeQ==","signatures":[{"sig":"MEUCIBpWsqNwKI6DXFOinaIS7U9VfIWdyUbdN26bU4SI2kysAiEAvU56+Bm7or26zk9NCrdO3e+CxJnlcOIvazRhQhGWUV8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHo0PP7ywgOf/dXYQvE6/J+8i/JsrihEudysKPn5wkXxAiAgGMoE8jIdtMBElTh6wHXx962+pt4Wfdf46qvI/CwOoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114355049},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.9_1790084492786_0.13687666272036125","host":"s3://npm-registry-packages-npm-production"}},"0.11.10":{"name":"@reddb-io/red-router","version":"0.11.10","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.11.10","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"eb4dc44c306d3abd50f0bd33adb5f0bea93cc0c4","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.11.10.tgz","fileCount":6033,"integrity":"sha512-e7TvlvKKUnwNDFKQPDpcDPsmV9mLibqIs85WlLpV6FqMU4Q6PFq4KtqiMVKpk0/iMOHOdCZtYxvGOu/jBsvXSw==","signatures":[{"sig":"MEUCIESrw5vjPjUQcL4eCA9jHLi2Y2SX2vtokee5DkxFrD+OAiEA99ZmqZievnReek1wl6EvvSYyS/DdYqSTsW3dlTyxwdk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCWGT9N9n10OQOTUwqQh/d0C2AJmlqeQHFEf34v3GnhagIhAOZszzk5y4+Pd9Wz0rHt5nQv+1EvOHcLtIZVzknoJXKl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114374202},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.11.10_1790086015094_0.8721911351989851","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@reddb-io/red-router","version":"0.12.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.12.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"da1b9bc2852c1ba798fb4171c927171e4da3c457","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.12.0.tgz","fileCount":6046,"integrity":"sha512-IbtMilzuiBA5cJAvkLSZvxpwF/43vooCDN+OQcXy630fecxAQG7Du7U1bjIcQDlB1Tx8GjANWQhMfxlwPmamGQ==","signatures":[{"sig":"MEQCIA/9VGVDVsgangIZ0VEVDB5xN4BJZ4cl4tHObOBCSb8yAiBOYGMyq7+kThQppyJ2NlveIbkxLpidsH/3QHYybv53Zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICfO2OM9+9N0tuVMOtWo9c6i1W2eeQD+nL9Zp3Atl2WPAiEAypjFvl/WFPE35fksQNE5Ut3Y8MW1TGoCkqzNsk6yl1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114813445},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"deprecated":"Contains build-time runtime artifacts; upgrade to 0.12.1 or newer.","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.12.0_1790089669442_0.5063114165962104","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@reddb-io/red-router","version":"0.12.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.12.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"8953cef1a989462c512815ccf1538b8ead9e942c","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.12.1.tgz","fileCount":6043,"integrity":"sha512-4VI3oqyHsH09vtSyWlC8Wte56s2Mpj1voFoChOHnatOHwP9TFM8NbA8SE7ZbFr26I0oVMXCoIOsFhb4EwSa1Xg==","signatures":[{"sig":"MEQCIQDBpE0ZJtNjeeuqX9TxmHyR3hBvjst61DCTHiXCU4acNwIfBVk7s8rUB2EdW/4wy8Dpc4e6icpAYmVnwxPjWZpw7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICJNZTaUUlQ6npGwAYIBmgqgTSGhULBm7acTC+nWHXxMAiEA+qNGPLkgB52G2PRvrLf3XvenS724ILvDipEZMBEwFGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114611093},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.12.1_1790092577959_0.8142930884842423","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@reddb-io/red-router","version":"0.13.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.13.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"6c90b59bf17d24342601599034868708053cc784","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.13.0.tgz","fileCount":6072,"integrity":"sha512-/T9itfVIc5KFsPmNmpG7Jq8AupEZS/w7+ocWmm6l4oqGQC+ZmTmbFaNKJxQGMlySJiwKzO3dw+YjxxjWvTav1A==","signatures":[{"sig":"MEUCIQCjX/25ev8ebz4dN3usmWXh+OiuOvxScWsxsALsh1Li6gIgHFx1KWBhkIrWCXmjGsHPhOqUs/5XAg/9d22h0rf9epA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCkCXZwyo+4ICZwOaAYK8c1NnZlfYf+sNjjVJCBgB/0uAIgNCLTmsQDpxiD1M3la79vfO3+gtNVt7kaMSjEja9HnKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115973141},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.13.0_1790101315897_0.6915048263098467","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@reddb-io/red-router","version":"0.14.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.14.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"f65a163729569f4d154733c526297b5277a1a918","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.14.0.tgz","fileCount":6072,"integrity":"sha512-NBxEAfKqgrlHQE7ql3uHCbSLsO8ddV0LWkvwAf9vw0se02VenQanxPROytIpzW8SqjFH1e6fOSJkgdECKqyhng==","signatures":[{"sig":"MEUCIEXSDouSFZ/JKu8F2fB4KG0iw3Ri82IIfuNJvF6PtGPqAiEAkSI0gOCRUUSLJXWUNiLZ2NaWY1tqyChHZZMjB6ldVro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC+Ou442Ex36O8UVAEycbBqtV/SoDiaLskkHYUvRjxqZgIhAPVj9iGhCdG+mKXENWNG8SYtC3g+LaRFtxwG9jzdraR0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116013564},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.14.0_1790128540970_0.1587462105985844","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@reddb-io/red-router","version":"0.15.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.15.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"288211085040d4974ab11d8e7acc6c2107d4d635","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.15.0.tgz","fileCount":6072,"integrity":"sha512-ZGa3z7YINCoi1+llO1MqRKgmNNFaObR1bDvj455/aC7WybqTfWFlEHWQu5ALbykdgSCYGEDZkGQtVdY8BrgTsA==","signatures":[{"sig":"MEQCIGqpwHE0do9InTcw40qvJIBFvTKUKhgMk0yDUzjwxvKMAiBf50v7pbOnr/3A/2d9zz9cxQENv2LBOJj6L2+L1qsRdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEJhrPksSioMzWJQ61C8msP83oFISVqVaZiPGIgeRZxVAiEA+4ZYlp9aQcJVK2K2RhzpdqIVUHG8EUK24x3O1QmIsQs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116025250},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.15.0_1790134591547_0.05142143537131427","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@reddb-io/red-router","version":"0.16.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.16.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"bin":{"red-router":"./cli.js"},"dist":{"shasum":"7122c96a76c88580ffd91cecceea582737c1af89","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.16.0.tgz","fileCount":6072,"integrity":"sha512-kRDqsd/AirMXG4NL9N7uYHkMNXC15409CbbmeyqrZ7R5bKq22s8lPi8wl4m9Hr3TTOcmBbAYBuPLWzBHEVlRgw==","signatures":[{"sig":"MEUCIQD0k1Ejtw4MzroGBLLTPG37nD56YdueGdMU6jczHirMngIgcjAD09UfCJupqfpTjeue59sUU6dzkZoXBZVXdI8BgWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDXsCT6kSSy7BWIuBnImsWhVooSO5qZwr5qhou+O8WI4wIgWVpJ42HHle5glgLd2ND5jkxWivWPgw0G7dMI1eBN6zk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116039973},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.16.0_1790142593250_0.8926431340378114","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"name":"@reddb-io/red-router","version":"0.16.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.16.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"aa6b9d729969a6b4347fa9c3d25674e3bafbafe1","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.16.1.tgz","fileCount":6072,"integrity":"sha512-YHQLFpLhgY8bwNFYZvYqaeAidDQGz1XUaXOOE9NfjcUFyfaF55WhsRjs53YH4t75La/sL9oXWvvzWNwcAPOo2g==","signatures":[{"sig":"MEYCIQDW9vIS+XXkvU99o9vevrHX9T68j45sxJ9QZqNpWVuSHQIhANFPzLTyume6evscPQaX2Xe0sBBepypkIBpR5N73nNj+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCI2OJsVgPjPTBy0u+FgDL6Y+oFtYEHBxTBRwTiFCCi3wIhANGPLqE4V6IuhOz1YinkJCcCKRCmRdiD/Ta0AkVRXe/u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.16.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116040319},"_from":"file:release-artifacts/reddb-io-red-router-0.16.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.16.1.tgz","_integrity":"sha512-YHQLFpLhgY8bwNFYZvYqaeAidDQGz1XUaXOOE9NfjcUFyfaF55WhsRjs53YH4t75La/sL9oXWvvzWNwcAPOo2g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.16.1_1790145885577_0.26067434585330784","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@reddb-io/red-router","version":"0.17.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.17.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"e619d61142986ee1a73e93f62d918db46358ebab","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.17.0.tgz","fileCount":6084,"integrity":"sha512-a3wZNwzRWD/eVZK482dCVgFQG3XbotLvZrNPfdkU81L+ZlEKIS8Zqnr1uLsnGUgWU8p9SI2pzwja99a1UFhPPg==","signatures":[{"sig":"MEYCIQC1JEAoGL9vuQiJP14bEhvlifi8BRzUZYfFq/Ae7md1/wIhAMJtIIZI4+8KckraPOhHPFHWE6dRnh//RdpBdkAyIv2Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDDzqA8z9p8LDqWY5m2ayPDSTIXpGGNW3koTClaG5kISQIhAPOlpCYNyGiehfLAkDx7UQB4EvgLRwU4X+FxIKcVrKp1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116274176},"_from":"file:release-artifacts/reddb-io-red-router-0.17.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.17.0.tgz","_integrity":"sha512-a3wZNwzRWD/eVZK482dCVgFQG3XbotLvZrNPfdkU81L+ZlEKIS8Zqnr1uLsnGUgWU8p9SI2pzwja99a1UFhPPg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.17.0_1790174831106_0.3491546026025041","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@reddb-io/red-router","version":"0.18.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.18.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"2b7523a8902a8554b886a1c7ac8c01021867f521","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.18.0.tgz","fileCount":6084,"integrity":"sha512-mg/2O39LQcnGeLevq8AZfXi40EHAP1NgJii2xa7osIZ2FFoID//eUm/NKn3hGOl7DKziJ0UV49agP+iDJ+KRIA==","signatures":[{"sig":"MEUCIFARB6PQOpwWOp7wuXY0Lz26n1bUDMJkRF3F5ZoxOhMnAiEA6RVOhxXvOgstafpvrkzLnE1E9m+SgEli2C+mWQtGzz4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAeGskXUzE/zC8lsTbb+NVeGk4/7e+UrFlwWqPjG3aH/AiBCC1q41zkLX7xox0Bbx92JV6qtCZ/j6rSv7+8KPwrv9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116289242},"_from":"file:release-artifacts/reddb-io-red-router-0.18.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.18.0.tgz","_integrity":"sha512-mg/2O39LQcnGeLevq8AZfXi40EHAP1NgJii2xa7osIZ2FFoID//eUm/NKn3hGOl7DKziJ0UV49agP+iDJ+KRIA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.18.0_1790182552953_0.3257990861202802","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@reddb-io/red-router","version":"0.19.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.19.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"082574b54fbc7c4aa947e76f19f822f6f53e8b74","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.19.0.tgz","fileCount":6096,"integrity":"sha512-8soNZ0J9TPZBTi+UW2mceZk/6U6BUTog9kvKUlHicXIsqSq8/SRY3RWMSkS58zrQ4zNW9VWQBw99SaJ4HBlKeQ==","signatures":[{"sig":"MEYCIQDCDwWSzXAPbqT8Mo/nBlnraU5abV5/iUyFAfW92clyxwIhAKbvbldIpD9eHQQlI1xOoDvZxRB2K9YpsxvEat/mRqu2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDemfGEMxXEfQTGIvONU6Oj8ALZwA5247BqmytpjXWkqAiAJo/p2URdPYADo8Sas2ZITtr9MZ8KXFQFUFZJgGzKr+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116497614},"_from":"file:release-artifacts/reddb-io-red-router-0.19.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.19.0.tgz","_integrity":"sha512-8soNZ0J9TPZBTi+UW2mceZk/6U6BUTog9kvKUlHicXIsqSq8/SRY3RWMSkS58zrQ4zNW9VWQBw99SaJ4HBlKeQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.19.0_1790184627368_0.9671983842934859","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@reddb-io/red-router","version":"0.20.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.20.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"de4217b7800dd5a1c6088e8eca4cebfc5922d12d","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.20.0.tgz","fileCount":6167,"integrity":"sha512-HnOLRNufBUloq4hl5hnwM8cZ6dd7q/5Q6EegfH7LWLYqVMAVT4wZhEgbGXqgZqqxKUIFnO2hlDgHo+rBR/mpeA==","signatures":[{"sig":"MEQCIDtrjt808g+1IrzrkuCYm0TyaTZvX94dhjr3zskX/CPMAiBAvFBvmc6jHF9pN6f5/i82cKn99PThNw5FLXf+ydcmXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICZxxQ/XTvyZ6WjKA//dEup25uPMHYyOJwoN4+JyqiIDAiAmtOAWvbxgitpriejk62b/HvnaJXbtdCdtPd4DuIj7+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116645218},"_from":"file:release-artifacts/reddb-io-red-router-0.20.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.20.0.tgz","_integrity":"sha512-HnOLRNufBUloq4hl5hnwM8cZ6dd7q/5Q6EegfH7LWLYqVMAVT4wZhEgbGXqgZqqxKUIFnO2hlDgHo+rBR/mpeA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.20.0_1790186282614_0.7743710086542399","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@reddb-io/red-router","version":"0.21.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.21.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"fa36aae38e29706cb70592b965ceb3e594d9b6bb","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.21.0.tgz","fileCount":6167,"integrity":"sha512-gdGPII6QyU1inOoxHPencp7a1/45GBq4N7PhDXBzP3VKn0tg3ZZOKviYP/3LS76+3S2Dr+7NP1tWG4qlqGuLJA==","signatures":[{"sig":"MEUCIDbUKDDYV4ZtkRXu2flJ8A917J2FTd+sL+r35VNLFI/NAiEAqthq22nySYXImKXLbYFjJHNeIqzo09nY9cxLff/48Y4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICiIfNnHKZsgZzWa4r/nZ9LF5qh+3HsH3Tmz83Xa71swAiEAjrge9H+uForG4eUM34/591Dmw1Fdzmc4RSBLwyLjdVU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116648600},"_from":"file:release-artifacts/reddb-io-red-router-0.21.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.21.0.tgz","_integrity":"sha512-gdGPII6QyU1inOoxHPencp7a1/45GBq4N7PhDXBzP3VKn0tg3ZZOKviYP/3LS76+3S2Dr+7NP1tWG4qlqGuLJA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.21.0_1790192928492_0.7775991420728927","host":"s3://npm-registry-packages-npm-production"}},"0.21.1":{"name":"@reddb-io/red-router","version":"0.21.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.21.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"d9c6336d382c8c7942e761a1a8418b34584ae064","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.21.1.tgz","fileCount":6172,"integrity":"sha512-8gGkjlCUVaomcKuUJDcu0LANF2Kunf9Z+IW0yXVe+cfjWYGGz0echQi5jkwZS73Tf+t8jt6PMvj8pJTjgyIgvA==","signatures":[{"sig":"MEUCIFAM8yfw293BHpPAkW4dXReqTIB6782l/bOALgQyU+UWAiEAgb/76J269ATZ9Kqfl5kKzeiqLTVAnKA+T0Wjgt9M98k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGzouV1lOqx/KKXlV3X8HymjWpPCkLCcsSgLMyat69TJAiBeBpebwAaGoPf3n6kOrTrPgKpVdw0A1ITbtxJcoebyRg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.21.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116721864},"_from":"file:release-artifacts/reddb-io-red-router-0.21.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.21.1.tgz","_integrity":"sha512-8gGkjlCUVaomcKuUJDcu0LANF2Kunf9Z+IW0yXVe+cfjWYGGz0echQi5jkwZS73Tf+t8jt6PMvj8pJTjgyIgvA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.21.1_1790195907304_0.7262892524954627","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@reddb-io/red-router","version":"0.22.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.22.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"d1c3ca93ebae2a732c65be2d66adfa3c904bdfad","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.22.0.tgz","fileCount":6184,"integrity":"sha512-zat/xgSUVCV09CFBpe+iv6gdnZ01qNHxdQffHlUoDqFrBqJoUCXvlQtLCgqtIzTP52UBw2Q/zws1UEVg3lT1rQ==","signatures":[{"sig":"MEQCIHdY02b5Ij+bbLVQNn/867cKGTu+BBej3InyGXr2lQGmAiABuPEHXy6GI+T2wvrs/0ndQ6eFdQHrl+N0rhMzF0P7Vw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHAoJ3sxZG38fXkFm6E94R64v3jmzoMXTbmwSPjmdw5yAiAWVGK66qhhgUeCVTw8HdN3GZrN3HRMLh+OC+Ne6trvXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117118991},"_from":"file:release-artifacts/reddb-io-red-router-0.22.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.22.0.tgz","_integrity":"sha512-zat/xgSUVCV09CFBpe+iv6gdnZ01qNHxdQffHlUoDqFrBqJoUCXvlQtLCgqtIzTP52UBw2Q/zws1UEVg3lT1rQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.22.0_1790197903842_0.70360648685427","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@reddb-io/red-router","version":"0.23.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.23.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"eb7b6255c2edd8ea420f93a7fd130fb6a43353e6","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.23.0.tgz","fileCount":6184,"integrity":"sha512-zqk7jOqPoSq6lC9vfgoKyySo03fWnY7TnAut+vz7Sm7S5eyoe5tDU7VZwnPGDM64C62ITyT9lVN+KJcZGYOIJg==","signatures":[{"sig":"MEUCIQCPgg6aO99Y2wqANU1EigMkB3/bo0kv+9D/zAbWrBpFxwIgQDKBk0xB4CFumR1P+8g2F6nt2lHlVNGbji5W6dH2OUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDtI6cBIbD/Mr/WCyoB4aiKFkd7Bbd5butEVYCiuNS4bAiACU/hTd0ZTN8DVLw3W4xu2pfxdz1APS78sGLc+RsDP7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117118997},"_from":"file:release-artifacts/reddb-io-red-router-0.23.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.23.0.tgz","_integrity":"sha512-zqk7jOqPoSq6lC9vfgoKyySo03fWnY7TnAut+vz7Sm7S5eyoe5tDU7VZwnPGDM64C62ITyT9lVN+KJcZGYOIJg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.23.0_1790198930509_0.8989943446821633","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@reddb-io/red-router","version":"0.24.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"c83dc4f06edf9197ce44703108d3cf6e036f656d","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.0.tgz","fileCount":6189,"integrity":"sha512-Z2U1TkRTifCqOmySgWWJEKhOhnUv0vXDlsbgwl/ZM+bf0nWhrPKp2f9qzbllSa8qOAa9mLfRlDlXalY1eUqguQ==","signatures":[{"sig":"MEQCIGHNttsKSaBdqUv6JFz76E8gpvW3UTggux2e6glNiCHXAiAZRUygJzLa8OO8rgya2bkaRmGA0JYQrqTj9uPT+rGiHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDV+1EPpHWjpxnOZGUnbp3AgqIOLjYzZ2N8LYBOhd96rQIgFTZUPWFLriOzlByyR4g64l2r8uEuZD1zYUhdNEUXThg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117192748},"_from":"file:release-artifacts/reddb-io-red-router-0.24.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.0.tgz","_integrity":"sha512-Z2U1TkRTifCqOmySgWWJEKhOhnUv0vXDlsbgwl/ZM+bf0nWhrPKp2f9qzbllSa8qOAa9mLfRlDlXalY1eUqguQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.0_1790216716875_0.1080589901803446","host":"s3://npm-registry-packages-npm-production"}},"0.24.1":{"name":"@reddb-io/red-router","version":"0.24.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"e10d7512da554cb6823805b7965897b0831b000e","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.1.tgz","fileCount":6189,"integrity":"sha512-piVGNZ9sK5dfbG1/K0tyCrc6gfxMwAdqbH13nrf16qhx3/3DIyt1OVlPgwG0P41quqfiEuUSGFrqUW3V/RqXkA==","signatures":[{"sig":"MEUCIQDTekeYO/xnZWOQNvHpC50e/iMouGsjmkCJ3r3JGKPGpQIgEhXq7Pro05N4pLw43LEPrXmZyqcA6ZXs92z3S043018=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDYmZqyNrU5hGlD+snQrbFxbZqwZmgOqu4dnoShSw2eyAIhAL64A69By1Cq6ARcThl63HngyW9XeizAMBmxNTQVj8kf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117195027},"_from":"file:release-artifacts/reddb-io-red-router-0.24.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.1.tgz","_integrity":"sha512-piVGNZ9sK5dfbG1/K0tyCrc6gfxMwAdqbH13nrf16qhx3/3DIyt1OVlPgwG0P41quqfiEuUSGFrqUW3V/RqXkA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.1_1790247213841_0.23251201485079198","host":"s3://npm-registry-packages-npm-production"}},"0.24.2":{"name":"@reddb-io/red-router","version":"0.24.2","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"79b2f09b39d77294880ffc6bde320dd8a2552996","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.2.tgz","fileCount":6189,"integrity":"sha512-DVW72opy8LeSmNBlh/zQ0FHac51m6HKDUmbN8Svq7jhQaPagpAcbbq/9CIP+6JqvNRafHotPRkNgh5cg9YwU+g==","signatures":[{"sig":"MEUCIQD/6MlogzXgi4JnlcgduSWSU+izKa7sx8ryVTnCWeR9tgIgGUGIh+Hjr0Cx5zyzhplswDRhxGasN+6a5ZSSxFw88ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCvhpSw4TWCPYKdTSJNDf9uh7yIkCCDb9gOfvkU25nvdAIhAOmx6OqGCQBMByYqEOMboiaODPZychPeTmMRD/efwDQo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117195919},"_from":"file:release-artifacts/reddb-io-red-router-0.24.2.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.2.tgz","_integrity":"sha512-DVW72opy8LeSmNBlh/zQ0FHac51m6HKDUmbN8Svq7jhQaPagpAcbbq/9CIP+6JqvNRafHotPRkNgh5cg9YwU+g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.2_1790272987508_0.20725752307422063","host":"s3://npm-registry-packages-npm-production"}},"0.24.3":{"name":"@reddb-io/red-router","version":"0.24.3","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"873ae2218f1846eecf12610ce7a819a7f3aeec7b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.3.tgz","fileCount":6191,"integrity":"sha512-URWE25aQlBJTP8176vzvOAmQbv+5hHmksF57vuYtafIRvIR8tGvVh3apPFm0/PI/O9qrKSs8RdSKyIyEyrdaBg==","signatures":[{"sig":"MEQCIFIuxNACca5yHt//R7T7R+k4cljC4N/n+im0tXlxpqBHAiB/0Tl5t3hI5Jzr+cDG4D17xPShVSCwZGD5dYiu9Bw79w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFd3+5dUWLktTWJ8LvXYIdTL7KinVbmhgwKVd8DmWCInAiAAlIi8ovOMR2hhThouhHWZHg8OD0KkV61TdoLz1tv8Tg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117428432},"_from":"file:release-artifacts/reddb-io-red-router-0.24.3.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.3.tgz","_integrity":"sha512-URWE25aQlBJTP8176vzvOAmQbv+5hHmksF57vuYtafIRvIR8tGvVh3apPFm0/PI/O9qrKSs8RdSKyIyEyrdaBg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.3_1790280916848_0.40889447534299483","host":"s3://npm-registry-packages-npm-production"}},"0.24.4":{"name":"@reddb-io/red-router","version":"0.24.4","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.4","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"fc7bfa3816cdbfc27b8ed21c3f9acce2c0f28d19","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.4.tgz","fileCount":6191,"integrity":"sha512-gcEF1wGL7Ci7WUuS7anQpIF3rbQBk6pktqNCAID2wVmddiWY/vThzU9hY2pb7tu4KX+v+LTMOy+Vru5xOapkfw==","signatures":[{"sig":"MEYCIQCaYkoIEIknaH5jkrbd8Cg05krkhwBdqXawusTO/eBLRQIhAJtJeHoXrW/C7TBBnvViu0G4KeVzX3jhbHOpanDAoSiZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHKwe3gvBmdlXnkr/KGUVEJ5NWC4v2pkY7ry14UdVtpmAiAjkA8gkhFUz+OuSwHK7WiPI7R0/yTqn6TDvwwmG0hoow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117446184},"_from":"file:release-artifacts/reddb-io-red-router-0.24.4.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.4.tgz","_integrity":"sha512-gcEF1wGL7Ci7WUuS7anQpIF3rbQBk6pktqNCAID2wVmddiWY/vThzU9hY2pb7tu4KX+v+LTMOy+Vru5xOapkfw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.4_1790285424090_0.3105074903647964","host":"s3://npm-registry-packages-npm-production"}},"0.24.5":{"name":"@reddb-io/red-router","version":"0.24.5","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.5","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"d6245be55f696074709b699436f836f92150da14","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.5.tgz","fileCount":6191,"integrity":"sha512-49Xi8uOCeZ4VcfJw5eQsDfSORrwNfZngnn+j9nh7X8yNg/RebsG5ZpJ9wIcRZMCSlvjZk63/+MjBfmRh2YK3KA==","signatures":[{"sig":"MEYCIQCkNlsQaHk3QKnXrMZPPqQgF5z1ufYrcyqv/yp9KnGanQIhANfdjzAlNOjWpvdkIAWem4q967gwY0u1F56GgeZRh4LL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCHG+837QMABcFdUigBR2HmWz3A3b5axEDuC0PDLDXhWAIhAPeuh5emLWFPXjgc2xyOTjcjVw9aX1IslZV5ycDl2keo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117449107},"_from":"file:release-artifacts/reddb-io-red-router-0.24.5.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.5.tgz","_integrity":"sha512-49Xi8uOCeZ4VcfJw5eQsDfSORrwNfZngnn+j9nh7X8yNg/RebsG5ZpJ9wIcRZMCSlvjZk63/+MjBfmRh2YK3KA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.5_1790286899728_0.8482641482358106","host":"s3://npm-registry-packages-npm-production"}},"0.24.6":{"name":"@reddb-io/red-router","version":"0.24.6","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.6","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"d64ebbbeb8aa6d48078e4b816f7474dc6470804c","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.6.tgz","fileCount":6191,"integrity":"sha512-nq/DCPy197baUjo06ts8Sb45MuVxT27aHDlCpnFMGsbAQayIWhKogLzV+u0GAk316VwJAwb3ISrkwbZEgJKz6w==","signatures":[{"sig":"MEYCIQCt8Q1YpTbogOYx/vDfoh4PULwJG+fOc0pASzXFlkr88gIhAJZGzz4fxEqEopIx1/OcI/VE8ZsbioO+vsl9LZsDp1Sd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDBXQQpXlKRBGJIyO4Du0AU/PbvoN9nspFOWwpa17Pf2wIhAMyZUysd5izeD+dz1/0UPdn3imChGFXrrK2FnLM7ZHVg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117456040},"_from":"file:release-artifacts/reddb-io-red-router-0.24.6.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.6.tgz","_integrity":"sha512-nq/DCPy197baUjo06ts8Sb45MuVxT27aHDlCpnFMGsbAQayIWhKogLzV+u0GAk316VwJAwb3ISrkwbZEgJKz6w==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.6_1790287348353_0.2611579512408735","host":"s3://npm-registry-packages-npm-production"}},"0.24.7":{"name":"@reddb-io/red-router","version":"0.24.7","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.24.7","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"7b4686bbc7e116b56ec1acd7a641ea145a5029ff","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.24.7.tgz","fileCount":6191,"integrity":"sha512-1VZN61Vr5Yz8LFIH+121LzETPjqCne8gxvCOiJAZDlvywCX0RKIzKKInEZ3MywTqiyLBajzWRF169NxOdcXP9g==","signatures":[{"sig":"MEUCIQD7UoMFk87e36Hn0owVvlA4P85AKkNHYWYOU8hI688CqAIgTrNzKeIpa+Obfr9efh1xirTGV5X41/wtb5HG/2tBglY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD92UFKQWphSf3p0it0soRT5Z9WPQAyMPUqzmdeohJBMQIhAKaa6Zb3bVH09qlTJygp7ULy2CHGdia4Rcj/3JwlyjPy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.24.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117454815},"_from":"file:release-artifacts/reddb-io-red-router-0.24.7.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.24.7.tgz","_integrity":"sha512-1VZN61Vr5Yz8LFIH+121LzETPjqCne8gxvCOiJAZDlvywCX0RKIzKKInEZ3MywTqiyLBajzWRF169NxOdcXP9g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.24.7_1790331145703_0.7301106566195437","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@reddb-io/red-router","version":"0.25.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.25.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"bbe67f1806d7a093feca7034bc48a3a52a9f147a","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.25.0.tgz","fileCount":6233,"integrity":"sha512-pmWNSOiWZ2hvfA2n5sDB7t13ghtRp7yzHp4Hs13LgHlfLfPN0KGaOstee0y0AN2CiZdbJqYSOx8NZwCE1zn9mQ==","signatures":[{"sig":"MEUCIQDT7QorVQmS78lEtwa5nl9wgI/gF4e1+7yqzHjlguHjhwIgHKA2Ri92YL+K7Ocpb8CIOe2vX1dMLGVJ7xs6sFfvETw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAyxlsOUYU8oFo1BBAAd/TiJcnwBO/7YjByd0vDSsM/vAiEAwvKML8j/5/JPJ6l0dSI4LrTw+bBlQiOTqMHb9Sopthc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121011948},"_from":"file:release-artifacts/reddb-io-red-router-0.25.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.25.0.tgz","_integrity":"sha512-pmWNSOiWZ2hvfA2n5sDB7t13ghtRp7yzHp4Hs13LgHlfLfPN0KGaOstee0y0AN2CiZdbJqYSOx8NZwCE1zn9mQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.25.0_1790332766709_0.31329255915323606","host":"s3://npm-registry-packages-npm-production"}},"0.25.1":{"name":"@reddb-io/red-router","version":"0.25.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.25.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"aca4a6ab26b8047af97bb8a23599298f65376fee","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.25.1.tgz","fileCount":6232,"integrity":"sha512-xhWP6PebMZxU54xWyMQMJYwZSefRbiHujjc7NXQ1N6HYW4k0lCPed5EpzXkJrSsHgq9/Cbd6q6vjrKm8qnii2Q==","signatures":[{"sig":"MEUCIHvjs5ExyTUu9uyhWv/Yhf9mDRTYTsckicTztt05E7wGAiEAgY4e00T93Tn4w8/g1DxmpmPfRYfnpzco14xb4Yjw8Ss=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC+wZdDcC2UcVyn9pXgkbDyscI2szHzvym2BSuIuEqleAiEA0setIj9BCBpJXh5wWdPj0sxW6cLQzuLfEevJDvFpfAc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.25.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121082084},"_from":"file:release-artifacts/reddb-io-red-router-0.25.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.25.1.tgz","_integrity":"sha512-xhWP6PebMZxU54xWyMQMJYwZSefRbiHujjc7NXQ1N6HYW4k0lCPed5EpzXkJrSsHgq9/Cbd6q6vjrKm8qnii2Q==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.25.1_1790333559673_0.9878459272171585","host":"s3://npm-registry-packages-npm-production"}},"0.25.2":{"name":"@reddb-io/red-router","version":"0.25.2","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.25.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"21e0c46c7693f7e9eac3993d01610a42085e30dc","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.25.2.tgz","fileCount":6232,"integrity":"sha512-6zfMhC4v/Nk+EBT8egK7BiUsl1sK0NdqYolUQr2XH3v8NuvNPKRYzYx7PypTrUL3XARaCAfZtGEpKTBwbXUvgg==","signatures":[{"sig":"MEQCIBmCrNIPIc3K/XCNED/x4SNDF6GETcX9a4ItSXQ32Do3AiBxyfAzlLsMOAgH/mJurdtdzTH/Aiu+pK5kAIzR8eyEKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCq1JOW5eZZ47kko/UD0CozAZt/wqLaEj8FPJKPC/knZQIgb7yEvyX7ysIyv5jW/pMWCpuf58D1/QvQeEivvL78w7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.25.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121051564},"_from":"file:release-artifacts/reddb-io-red-router-0.25.2.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.25.2.tgz","_integrity":"sha512-6zfMhC4v/Nk+EBT8egK7BiUsl1sK0NdqYolUQr2XH3v8NuvNPKRYzYx7PypTrUL3XARaCAfZtGEpKTBwbXUvgg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.25.2_1790336971585_0.24538403627462846","host":"s3://npm-registry-packages-npm-production"}},"0.25.3":{"name":"@reddb-io/red-router","version":"0.25.3","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.25.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"7e24f6de17ebb359cfcda16d23d93b151ad908fe","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.25.3.tgz","fileCount":6232,"integrity":"sha512-UD0ktLjPdZuDYJ2rBMMHkZkwXlPxPKVfbgZYmFy+p4JbTkGD7u1r7xygsYvCQk9kfO2Emkfm32XsjU3YELJ0WQ==","signatures":[{"sig":"MEUCIQClR6kGQjj9Ma/UznrEptM2009D7KoFQvRramhOElM2OgIgBByoOmvgRDNWTCfVpILtZ30qKf92Ybxv6MPRmnU5ziA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIA9dYA5FCLTso+ctP4FoF3XfJw9yIG7YyDu1nrydvwOsAiEA//Ny6Xa/gIOEQTR+NUlxf2xJPpfMouIayN7+DtGsiWg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.25.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121062780},"_from":"file:release-artifacts/reddb-io-red-router-0.25.3.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.25.3.tgz","_integrity":"sha512-UD0ktLjPdZuDYJ2rBMMHkZkwXlPxPKVfbgZYmFy+p4JbTkGD7u1r7xygsYvCQk9kfO2Emkfm32XsjU3YELJ0WQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.25.3_1790338787647_0.14316566675995568","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"@reddb-io/red-router","version":"0.26.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.26.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"a7f3856ad9d959ddd03d927cd60e2a4a71a24329","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.26.0.tgz","fileCount":6234,"integrity":"sha512-Imc/KU6b+Q2xjL6GbPBGt/Tgfm9KhqkEt170mx06WN/vFcKvkq0b0uhYZk+o/56GjrU9VWHDx5n9VS9+0J7F/g==","signatures":[{"sig":"MEQCIF3JGqu0cBCGd0yPRqlPlC9U7CyMbvR+VTQG0xPVjysdAiBz6lAaY7aLq5xsj/AYHa8DWKhfTS0t2iyGKQ9nhoKULA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEnw+pBmkx3BnGoatu2k47giCz0AMkEbgW34V3nk5kw9AiA9FVv1kFBeRPk7ngtxwSJtFidu5xj5uql1dbiQVS0WFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.26.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121722697},"_from":"file:release-artifacts/reddb-io-red-router-0.26.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.26.0.tgz","_integrity":"sha512-Imc/KU6b+Q2xjL6GbPBGt/Tgfm9KhqkEt170mx06WN/vFcKvkq0b0uhYZk+o/56GjrU9VWHDx5n9VS9+0J7F/g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.26.0_1790343400040_0.9662187582665296","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"@reddb-io/red-router","version":"0.27.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.27.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"4b4146d364fba72f4683b79d55154a3dd6c4696f","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.27.0.tgz","fileCount":6327,"integrity":"sha512-XqRaEQxE8wrgDZrH/pdHg1gedbZj8fJhPtHQQ1o8FxnT1ZF3T/uAMSiTbXrYS57bXiusN+ypjgniX2kES1JR9A==","signatures":[{"sig":"MEUCICYo96HV8lFvdNV9Ya2Lc9U8xbQR2Li460rhUCzUWalYAiEAp8aEsJc2Xl+JMGPp6NFLsBaWy+p5vNXvQviScyG3fWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCng3nCbPdVWppZqiqU2cXvobNWdFI0Km8QkPCL+w+7tAIhANEYxGkXY+pml5z1UKnpcSNgJ60QS6flnnsYi9t20vmj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.27.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119036572},"_from":"file:release-artifacts/reddb-io-red-router-0.27.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.27.0.tgz","_integrity":"sha512-XqRaEQxE8wrgDZrH/pdHg1gedbZj8fJhPtHQQ1o8FxnT1ZF3T/uAMSiTbXrYS57bXiusN+ypjgniX2kES1JR9A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.27.0_1790346884857_0.5033367485479507","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"@reddb-io/red-router","version":"0.28.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.28.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"eb0ddfb3d91100839ffe7d43a0454e96656310b7","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.28.0.tgz","fileCount":6333,"integrity":"sha512-AgVQ0/8V1HmclHp9XKS/sVFwykqtrbz9sJe5aOPIcXr0zhkeE/PrlHgtCaNlW9JeSHobugqcdXdK3coHgA2//A==","signatures":[{"sig":"MEUCIQD6ODwrEXnqbFP8VUVN/uyan8wSDNYPh9qI8Y7ibEhhSAIgHCmcJi4bsLMQIRxYYIbZMi0K+CgX4zULrHhCbOiIgJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCrfvNope2F0ZLYEphbcGk2iKf6UWtAoAsr8SHa2FRkSQIhAN7kXth8eZBFYT0ZjfoLUPSBFjuP0Vf7M7OdLUBh4B8f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.28.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119172202},"_from":"file:release-artifacts/reddb-io-red-router-0.28.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.28.0.tgz","_integrity":"sha512-AgVQ0/8V1HmclHp9XKS/sVFwykqtrbz9sJe5aOPIcXr0zhkeE/PrlHgtCaNlW9JeSHobugqcdXdK3coHgA2//A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.28.0_1790348058039_0.9876335526027624","host":"s3://npm-registry-packages-npm-production"}},"0.29.0":{"name":"@reddb-io/red-router","version":"0.29.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.29.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"315ee2cd0dbe6a2e6f7e1f6f27cf8760c01f22b1","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.29.0.tgz","fileCount":6340,"integrity":"sha512-KYOLKhClk0tnQSt9X7sKKwRTo69AkF+0cufn6t22zfucqszM6XkCrGXNyMzooka7TaEFLF6BDC9TTMRRADPXiQ==","signatures":[{"sig":"MEUCIQDfjOKsFzFc1xQ4/0hUvhailU090GVT/rnliRXkIRdU1QIgQYiTe+Q0rq9wUo0TUokxwerNAL69C8hmvTHVW5nTqXw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIALGZeHVk9H1aeFkUgBqfRBPj5+CArTD6f6VwiwdG4wOAiEAtLHbyJh7JcQPI/DEdT2U58WNZkL0f6dDFxSBhT4S4fY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.29.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119305161},"_from":"file:release-artifacts/reddb-io-red-router-0.29.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.29.0.tgz","_integrity":"sha512-KYOLKhClk0tnQSt9X7sKKwRTo69AkF+0cufn6t22zfucqszM6XkCrGXNyMzooka7TaEFLF6BDC9TTMRRADPXiQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.29.0_1790348970333_0.655683948831127","host":"s3://npm-registry-packages-npm-production"}},"0.29.1":{"name":"@reddb-io/red-router","version":"0.29.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.29.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"52d6e9ba75c1d010dfcf8cfb437df7e6d2c9e39b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.29.1.tgz","fileCount":6340,"integrity":"sha512-8vAszKnbhA1ERJL7zdRkke40RKxw2gqeHChcFL32uWhsaceK5mGUtv7qeU5hfTmjFo6iCzCbL5HSLenWwAcUAg==","signatures":[{"sig":"MEUCIFQcJ5czOMsjUZQdzLDrtbU3eis/pC+whvHVbHgduftTAiEAluImtM3uKwsao7jS9UszkerzQhAPjQ/Md1CNE/zfses=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG8WFYsFOQfDOnm8TdsNLmD2uw8OB9j9uYxY+f6jFJYQAiEA2cTldE5wwkuuqDYF+tTLUTwTciXGIdBmdi/mTV1X1uk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.29.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119305705},"_from":"file:release-artifacts/reddb-io-red-router-0.29.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.29.1.tgz","_integrity":"sha512-8vAszKnbhA1ERJL7zdRkke40RKxw2gqeHChcFL32uWhsaceK5mGUtv7qeU5hfTmjFo6iCzCbL5HSLenWwAcUAg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.29.1_1790354492223_0.8536273885074446","host":"s3://npm-registry-packages-npm-production"}},"0.30.0":{"name":"@reddb-io/red-router","version":"0.30.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.30.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"40af317c051f1c5277d37d53b5ff629c86b73882","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.30.0.tgz","fileCount":6335,"integrity":"sha512-jgGgz5+8AvDz7fKEO3e1OEsS/4UKJkY/4gEy51ZwtLnwv1w0C/DokSHWGiZmH7a+Nwzp+mrcujSuxxAXHj2mMQ==","signatures":[{"sig":"MEUCIBgoWX4HFtXZA4s47rLvgfH4qiNzEzvMI5vXaGheTlfbAiEAlN96mF3tWLfSlLWxnoIU9leQj+HvUebz6ah7OQUMF+E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC6i7XI0EUbg7uceHTjJr4JxFNBhLEAD014Rf6oEZtC4AiEAnRT0CVpo64p13GYfsy9x0PH2B7dxcPqiu7EzQsghClE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.30.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119299970},"_from":"file:release-artifacts/reddb-io-red-router-0.30.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.30.0.tgz","_integrity":"sha512-jgGgz5+8AvDz7fKEO3e1OEsS/4UKJkY/4gEy51ZwtLnwv1w0C/DokSHWGiZmH7a+Nwzp+mrcujSuxxAXHj2mMQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.30.0_1790356258999_0.9454110954186203","host":"s3://npm-registry-packages-npm-production"}},"0.31.0":{"name":"@reddb-io/red-router","version":"0.31.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.31.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"1d3fc45f802f37cf7b5ce02649dbc7beb3619f08","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.31.0.tgz","fileCount":6345,"integrity":"sha512-bVQ97B6EEvqu0ZJnEklkC1UYdBM/GZ9mGeVujMGrUNMj0ZkvtCCjUKodCrY9orpMdLMK6s0rVku4GfnUDaGjYw==","signatures":[{"sig":"MEQCIDrURhNcg6p6pgqJ+4/+AD1xR90LHufKTLNuqsSmNYMPAiAYSiL1EXGhXFQUCu9DXy/HBRyh4zzIEg2+KavzMjaixg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGy0dzRXlPuDI7o78E4sOwHWtoCeFb10dlKI0ewOfObSAiBguQIrO/yXAKfmEoberR8/G6KDkktzF8kFecVc8ED0fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.31.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119532939},"_from":"file:release-artifacts/reddb-io-red-router-0.31.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.31.0.tgz","_integrity":"sha512-bVQ97B6EEvqu0ZJnEklkC1UYdBM/GZ9mGeVujMGrUNMj0ZkvtCCjUKodCrY9orpMdLMK6s0rVku4GfnUDaGjYw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.31.0_1790357495828_0.9188068201447548","host":"s3://npm-registry-packages-npm-production"}},"0.32.0":{"name":"@reddb-io/red-router","version":"0.32.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.32.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"2b24131334141717cda7964550d9c4053cef4250","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.32.0.tgz","fileCount":6194,"integrity":"sha512-YY04rAylAAnrwXwi77U6UXqFk9HQAhcDw4jVw3w70xCLA2OoSlEvFjA4bkPhJNVJeMMO5SUcdv+Ohi0weRbG4g==","signatures":[{"sig":"MEYCIQD4iO9Jk1sOw5+SjBLnDb9YJvr/0u4zu4XIKyjYRpNHqgIhAPd8XESxP8lWiRYAjHWEgAa8QmAX8awX+SySa4HkYPKY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDQ5vChwbsXGetLr6d9ZWPFZ61ppdj/dG1h1kGgmKHVgAiAjvMPX3w7CIF6+SAYMaWePFiPnw0DEd+kIvQQRTzfOvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.32.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117781057},"_from":"file:release-artifacts/reddb-io-red-router-0.32.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.32.0.tgz","_integrity":"sha512-YY04rAylAAnrwXwi77U6UXqFk9HQAhcDw4jVw3w70xCLA2OoSlEvFjA4bkPhJNVJeMMO5SUcdv+Ohi0weRbG4g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.32.0_1790358832973_0.5373234925748271","host":"s3://npm-registry-packages-npm-production"}},"0.32.1":{"name":"@reddb-io/red-router","version":"0.32.1","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.32.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"d6b1025017921ee07567c6dec0ec42270f31ce2f","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.32.1.tgz","fileCount":6194,"integrity":"sha512-lkODTWy1Qt0iwHYMjUS9hpuEaUYT3IZAzgiDHfjEfPO4JiWAcEqIPrQZB/SlmBSLhF6FUCPO+GebkQ0dfeLwKA==","signatures":[{"sig":"MEQCIFxXFL36wkJ5ZOOqCmm3DCVKx/+3CN76h7h7WAOPIssZAiBQu+R8qsnDq1pLezrw8YUgU0H2ac2hR2ntR6kbA9GFfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCIVZXw6aqQsYFF1XUw6oBQkDvsV4ZT2klos8IuYkgNuQIhAJvjoxv4cvhWG2nEfVW9X78EDN/QcVyreW8LGHG2invK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.32.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117782467},"_from":"file:release-artifacts/reddb-io-red-router-0.32.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.32.1.tgz","_integrity":"sha512-lkODTWy1Qt0iwHYMjUS9hpuEaUYT3IZAzgiDHfjEfPO4JiWAcEqIPrQZB/SlmBSLhF6FUCPO+GebkQ0dfeLwKA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.32.1_1790360166041_0.4775171380850518","host":"s3://npm-registry-packages-npm-production"}},"0.33.0":{"name":"@reddb-io/red-router","version":"0.33.0","keywords":["red-router","cli","proxy","ai","api"],"license":"MIT","_id":"@reddb-io/red-router@0.33.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router#readme","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"cli.js"},"dist":{"shasum":"04734096734528ab0affde705b53e319d8f7523c","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.33.0.tgz","fileCount":6194,"integrity":"sha512-kp8317jMYiJNJYxqiAK9hIyyFHz0Ixl1xz/YJy+57a8ugjfuD4H2tnDkCOMZI9ldHRHdB7MPC53O1ZqYhFdyDw==","signatures":[{"sig":"MEYCIQDko7zXNqmXS5+G3J90WwbRdNtrAS76sJFw7Avxg1SzXgIhAIzs1LBs7+/Xao0+DNhtWQKJJCvwSdKGuULwyd2NBkuQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID5vrx2mwZrg9HEUe4eGKYRxBp1W9BpDPo3aULcSt+BKAiAYxXMsBmweRt6czp6NtF9i4DE2g1FWuu0DGn4kJYTI3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.33.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117793275},"_from":"file:release-artifacts/reddb-io-red-router-0.33.0.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon -I --watch cli.js --watch src --watch hooks --ext js,json cli.js","build":"node scripts/build-cli.js","pack:cli":"npm run build && npm pack --pack-destination ..","postinstall":"node hooks/postinstall.js","publish:cli":"npm run build && npm publish"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.33.0.tgz","_integrity":"sha512-kp8317jMYiJNJYxqiAK9hIyyFHz0Ixl1xz/YJy+57a8ugjfuD4H2tnDkCOMZI9ldHRHdB7MPC53O1ZqYhFdyDw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git","directory":"cli"},"_npmVersion":"11.19.1","description":"RedRouter CLI - Start and manage the RedRouter (RedRouter) server","directories":{},"_nodeVersion":"22.23.2","dependencies":{"react":"19.2.1","enquirer":"^2.4.1","react-dom":"19.2.1","node-forge":"^1.3.3","node-machine-id":"^1.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"comment_sqlite":"sql.js + better-sqlite3 are NOT bundled here. They are installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js (and re-checked at runtime by cli.js). This avoids Windows EBUSY errors when updating the global CLI, since native .node files no longer live under the locked install dir.","comment_systray":"systray2 is NOT bundled here. It is lazy-installed into ~/.red-router/runtime/node_modules by hooks/postinstall.js on macOS/Linux only. Windows uses PowerShell NotifyIcon (zero binary). This avoids shipping unsigned Go binaries that trigger antivirus false positives (Kaspersky). We use the systray2 fork because the legacy systray@1.0.5 ships a 2017 x86_64 binary that fails on modern macOS dyld.","devDependencies":{"esbuild":"^0.25.12","nodemon":"^3.1.14"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.33.0_1790360860710_0.5521219931627217","host":"s3://npm-registry-packages-npm-production"}},"0.34.0":{"name":"@reddb-io/red-router","version":"0.34.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.34.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"11feb49e9abbbc8de843f1c2f2109db3829dc83f","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.34.0.tgz","fileCount":9027,"integrity":"sha512-EPizEnAdNPrHu4apILE07h0pJjB0j9OxKt6eYJQt+KY0Fi1bUNWRkQjaW+gjRszoZbDgZWFBJhkG5dCrQD5tFQ==","signatures":[{"sig":"MEYCIQCRmiVuQNrkAzIlLd/Z6VM8JC+NKfP+LDgFTyIgrCuDGQIhAIyXgXdeW9AX/gIhDjVQtvweZLvQKygLYCe9XmaJw7p2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDK8Jb8A7JH85hRXNHfciCH9SlUgkPNOFDXTdLwfQCs0AIgcQqgJRTrPWmZUf7C85XfcgLlanRssR8J9fK8UewEZQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.34.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":550453954},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:release-artifacts/reddb-io-red-router-0.34.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json","test":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:vitest:ui && npm run test:ecosystem && npm run test:e2e","test:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","build:cli":"node --import tsx scripts/build/prepublish.ts","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"vitest run --config vitest.mcp.config.ts","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-20128} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","test:unit:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"vitest run --config vitest.config.ts","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-EPizEnAdNPrHu4apILE07h0pJjB0j9OxKt6eYJQt+KY0Fi1bUNWRkQjaW+gjRszoZbDgZWFBJhkG5dCrQD5tFQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern --no-warn-ignored --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions"],"*.{json,md,yml,yaml,css}":["prettier --write"]},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","@lobehub/icons":"^5.16.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","lint-staged":"^17.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.34.0_1790572500976_0.8969361193228598","host":"s3://npm-registry-packages-npm-production"}},"0.34.1":{"name":"@reddb-io/red-router","version":"0.34.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.34.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"559697960d3b3c7dd4abecc97d51794a170dbc5b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.34.1.tgz","fileCount":9087,"integrity":"sha512-DOSalrEIYXJtPjXXcfJhFz36QRfy94tGE/2KasIrtku7jIYCX4e/gnSLYEs+R0h8MwMtSANpIcPxfvb9seVmoQ==","signatures":[{"sig":"MEUCIE0q6KLkcXeiwoNU7/xKxfCMoqBKaFcANA16EOJ2fskwAiEA1AZc0rW2Noz5Bkz1yFk5+lwOZ9z2Yl4/xpNBRjFer1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDZrRP+lNsBoMZ6ueStxeWDVJ8o+ahYzK/9dxJaUdat7QIgTya7BNQaNvBilGhODteQNuQtJo8FeJhD9ksuruJICA8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.34.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":552255030},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:release-artifacts/reddb-io-red-router-0.34.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-20128} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-DOSalrEIYXJtPjXXcfJhFz36QRfy94tGE/2KasIrtku7jIYCX4e/gnSLYEs+R0h8MwMtSANpIcPxfvb9seVmoQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.34.1_1790612336400_0.746253570360772","host":"s3://npm-registry-packages-npm-production"}},"0.34.2":{"name":"@reddb-io/red-router","version":"0.34.2","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.34.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"691f32257588cbb5d9ec22574da6ce235555f6ed","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.34.2.tgz","fileCount":9089,"integrity":"sha512-0vQJShdN6AnE9S3WC8UEuZJqwi2E+JeYi0k/076CvpY73JXN2I700xXAsp5lAlIcCrMwngNrfZKn5OsEuRjUXQ==","signatures":[{"sig":"MEYCIQDV7FwulXwSBetUT9XWAkdL00FDWPLcmiwhjTcrfUdBAQIhANxviWH+7blemDktTyKbmzZnNwfIFtBrBrtTGZOSs/h3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEMCH1B85Si0PkoejpiI9ZXrC7w8vKOkYmUBqZm+VfSFT0MCID02iXYCvYrqYjD6fBXoA29I8sl8hh89skaxrLfj0yWM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.34.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":552265269},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.2.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.2.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-0vQJShdN6AnE9S3WC8UEuZJqwi2E+JeYi0k/076CvpY73JXN2I700xXAsp5lAlIcCrMwngNrfZKn5OsEuRjUXQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.34.2_1790627507135_0.2660623895687806","host":"s3://npm-registry-packages-npm-production"}},"0.34.3":{"name":"@reddb-io/red-router","version":"0.34.3","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.34.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"ba13f785eef941741c6418282246d58e45bc84df","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.34.3.tgz","fileCount":8292,"integrity":"sha512-jIfsnjJf/CWwX8fx6VkJFBCeYj0nhdkSUO20ODgtVp6s4ZfG7/LZd8n7+PgyrK9hFh2CmilwUBzDShTlxCCq4A==","signatures":[{"sig":"MEYCIQCFaTkX4cQMXo7R7wmPJDaycO8yT5wg6mSAH13F3fuoRAIhAL7WRXB8SKr0eQg7eP6HgzbGdD3wN94ZGUvOWeR8ISDW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCcsi5XaQv1q3pDb6aAIBChZPSyTiHQ28+E/tBl0iBsMQIhAJIm3Cu7j3rVPFzYDz4BzIyd/U7Wa+fbsI8FzMABshbV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.34.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":242902815},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.3.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.3.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-jIfsnjJf/CWwX8fx6VkJFBCeYj0nhdkSUO20ODgtVp6s4ZfG7/LZd8n7+PgyrK9hFh2CmilwUBzDShTlxCCq4A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.34.3_1790630186794_0.036966008311560605","host":"s3://npm-registry-packages-npm-production"}},"0.34.4":{"name":"@reddb-io/red-router","version":"0.34.4","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.34.4","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"4c89ef24817dfa3d1a036c6108cfb2830c27511c","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.34.4.tgz","fileCount":8309,"integrity":"sha512-R09/FJAkvV4/mPRFrBWewM2ivUljf25126AJOmDcKUivPxtqUSNU++JpLHf7Hu8czsEptML7V7ELbEaQrzxFqA==","signatures":[{"sig":"MEYCIQDGfk9KkmrAp21+kACxlHUg79O9bvVU1h4ElYVCDeThGwIhAPa5vOrPM4CppDq31j5XzgX9JWgRWxylBIlUkqjQWNrv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCVu+2VkPmJyYhITeQ5DUBUplr5VAYaVgmsUonMc0hk6AIhAJiG4ehoCT5YS0Tnqe0q26TRRX2ZUkBKDsARXG7M0kQq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.34.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243050784},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.4.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.34.4.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-R09/FJAkvV4/mPRFrBWewM2ivUljf25126AJOmDcKUivPxtqUSNU++JpLHf7Hu8czsEptML7V7ELbEaQrzxFqA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.34.4_1790652496952_0.3980332349943634","host":"s3://npm-registry-packages-npm-production"}},"0.35.0":{"name":"@reddb-io/red-router","version":"0.35.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.35.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"1cf1b1c3265efec84fc7afcb07759030de433b83","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.35.0.tgz","fileCount":8309,"integrity":"sha512-xB1DDDdgz/0cHgq/3qBLBcwN03GWDzcZcHMPEQ9ezzPN2suspwnLoFhk+SsyySg7Rw9nupNr/dsKyYxKHi//5A==","signatures":[{"sig":"MEUCIA9nXAJdxpoINdwyGoMWjlGAglt7OYAlmle8poAxoe7JAiEAuBF37J9T7UhTR3M7ThaXLVyadymhPmuQnZxhgoPjnzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCQ5T7y329FMHUDIxxogBmfp9uPgwGBtotq8sXOx6EuRQIgJzDy8CF4xgHpH7OO27EQwYRhQXVXSyqH9z8O2gyT5Cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.35.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243050782},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.35.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.35.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-xB1DDDdgz/0cHgq/3qBLBcwN03GWDzcZcHMPEQ9ezzPN2suspwnLoFhk+SsyySg7Rw9nupNr/dsKyYxKHi//5A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.35.0_1790656561268_0.7860194389656927","host":"s3://npm-registry-packages-npm-production"}},"0.35.1":{"name":"@reddb-io/red-router","version":"0.35.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.35.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6ffad16717e7fffa68257c4a50f92d6c58b5bc49","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.35.1.tgz","fileCount":8309,"integrity":"sha512-BKeQgjsMrNDpX3Pu5q2f9WXqC7N05Cgwbwi9pJ5h1ANdlzi0X7VMbw27M6AZF2e+JM5nEkemZ0kbMnhWGCX42A==","signatures":[{"sig":"MEQCIAyvXlBxvXZTlqEZ1bmK6aMCXiNAYa4KxNAooo2hK0IrAiBJiozJ+pBovPTRokcZUodeIWi+t1SbeWeKkaNw2npN7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDVI2LTh0V/OFVrglQmzUBGswPrec7ZBmH7eY9h1rt2CAiEAqPZxHEuKlNHYyDm8ELJCcjv1O6lKWDy8PS7C7bBXnUM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.35.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243054781},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.35.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.35.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-BKeQgjsMrNDpX3Pu5q2f9WXqC7N05Cgwbwi9pJ5h1ANdlzi0X7VMbw27M6AZF2e+JM5nEkemZ0kbMnhWGCX42A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.35.1_1790684765560_0.5063665076703086","host":"s3://npm-registry-packages-npm-production"}},"0.37.0":{"name":"@reddb-io/red-router","version":"0.37.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.37.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"d86c8c07b19d775f383878d3bf5139b2652ccdb0","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.37.0.tgz","fileCount":8326,"integrity":"sha512-ktYko+PUSIQNkunZ5g7nHUTx9kJgbVGElSAkTNO6yLEC/kYr+rK01KyAoeLW1f7wJnqckDMVUl1R+99kfb7TpA==","signatures":[{"sig":"MEUCIQCIXB7yb5pg0R+m5nw+CI0QKW1PaED8aeI8rAMNSxY9OgIgCTW2xgv4P55it/zQfb+zWxxzu5nzZhcdbZPatqOvhjQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCVIJxsbokRDFD8Va3eTJU1UyADVpssO1oh7eizMhfUmQIhAOKiDNnUY+h9ITmQyfUQCYvG/EGutkkxkDuo94c17MP0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.37.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":244177780},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.37.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.37.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.3.1","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-ktYko+PUSIQNkunZ5g7nHUTx9kJgbVGElSAkTNO6yLEC/kYr+rK01KyAoeLW1f7wJnqckDMVUl1R+99kfb7TpA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.10.0","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.37.0_1790692728342_0.1005874496460255","host":"s3://npm-registry-packages-npm-production"}},"0.38.0":{"name":"@reddb-io/red-router","version":"0.38.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.38.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"4afc72e00af6aab54ddbbe6d23477115d53698d9","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.38.0.tgz","fileCount":8485,"integrity":"sha512-gAEjDYJd+3c5ojkJ+2W/5c7n1Dqd4IjnS0kdTarhauDL+S1Go+eUzUT4b4EfnGsgd215fakNgoXK7ifoFHjf9g==","signatures":[{"sig":"MEYCIQC4t/2VsV9+uhcwfzxdsnq6AF2cbOrtmFhK0MOfQr274QIhAI4rnN5BLKP4XLC1QxqCxuk5upckcvYCU4PVgHHG7Rdm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDkRvyVIsGuChGBbaI3QDqzItOhuWX+Pgwz9ICXqn3J7gIhANgu2A3UbcAInTx5Gl0+1sAL1hXulb+NbPuuotEWVNgI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.38.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251015919},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.38.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.38.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-gAEjDYJd+3c5ojkJ+2W/5c7n1Dqd4IjnS0kdTarhauDL+S1Go+eUzUT4b4EfnGsgd215fakNgoXK7ifoFHjf9g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.38.0_1790698094073_0.5302227931197081","host":"s3://npm-registry-packages-npm-production"}},"0.39.0":{"name":"@reddb-io/red-router","version":"0.39.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.39.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"32c5bd3207e87c476a654b89ef1a4c3b96d05c32","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.39.0.tgz","fileCount":8495,"integrity":"sha512-72MV1Q6adFICwbE12SttcCY19/2bHds5FymCx9eqXd2jW7lRSbtVBXzodBpCZGQDHnlaIiNfj2E4rNI68Gt9Hg==","signatures":[{"sig":"MEUCIQCobzRmSaquHPEKgFAS3n9RZYFvz3awO6xXQLhstFcwTQIgLkddnEaXhdPEosdRcOtCVbOloN7PfHMDF2dnCmW2dXk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCamePEPVkr0H7E1ztoAv7QU1sCqIFmBQKVEyFVSEdKGQIhAKYzrYhrbyB94KvQnWtNIapFyFKfNdK5CUlZKRa3Dn8D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.39.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251234529},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-72MV1Q6adFICwbE12SttcCY19/2bHds5FymCx9eqXd2jW7lRSbtVBXzodBpCZGQDHnlaIiNfj2E4rNI68Gt9Hg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.39.0_1790701457232_0.5610486148704257","host":"s3://npm-registry-packages-npm-production"}},"0.39.1":{"name":"@reddb-io/red-router","version":"0.39.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.39.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0aab8a5ba0480742d8b1fb231de05e285f3351c5","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.39.1.tgz","fileCount":8496,"integrity":"sha512-nwYxaQwpeJtlGgGc/g/PwV1a3vuJVMtwvMFyY+1gmIa9d8pI7Y4FbDqQ76ferdP/Vbk89K5ayz6jlYceKTAwUg==","signatures":[{"sig":"MEUCIEEo9XJvZKuJ/bcR3VAWyowoWR1mQEmbLnAILE6owfkeAiEAqWUHiimbmhwHbpOxgXghxibBMC5TpI+JsPzdgdUmBjQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGXfnCwvUCzx+mW+P3lI3lvYKyH9HvuBjQn2ByidkBUnAiBqErtk1ce/t50e9DBVXj6+se7MaBgpXwTsCzY9Fdu9rQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.39.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251246399},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-nwYxaQwpeJtlGgGc/g/PwV1a3vuJVMtwvMFyY+1gmIa9d8pI7Y4FbDqQ76ferdP/Vbk89K5ayz6jlYceKTAwUg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.39.1_1790702436602_0.6436983732230721","host":"s3://npm-registry-packages-npm-production"}},"0.39.2":{"name":"@reddb-io/red-router","version":"0.39.2","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.39.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"549fa3c96e7cd0b56837e9d495fd50d8e35efb4d","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.39.2.tgz","fileCount":8496,"integrity":"sha512-cIQ3EPmk+8vTwaZW2MRxM7V9H7xPlfhoAvUDd7IgUPoGYMG4qQ0bJ526xw669Bp/aYnvKTM7RnNdP01BXcqHtA==","signatures":[{"sig":"MEUCIQDihj9OqxSZjaDTC5EWXGrauE9iChror+tikWjcGQJtfQIgDybZfzsJh0UhfBsjajhdcSJVgFp/2mfUYm2h5beT+3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDxIT7NChMEX4rDt3A/ptfvtirRTNeeDxtARTp4+pipSgIhAM2e2xtXOhuOXsl86T2fPgludY0YUQvRY0oSMn0p8zTK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.39.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251248984},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.2.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.2.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-cIQ3EPmk+8vTwaZW2MRxM7V9H7xPlfhoAvUDd7IgUPoGYMG4qQ0bJ526xw669Bp/aYnvKTM7RnNdP01BXcqHtA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.39.2_1790704255924_0.20788673027218274","host":"s3://npm-registry-packages-npm-production"}},"0.39.3":{"name":"@reddb-io/red-router","version":"0.39.3","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.39.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"87b0582b0e336f34750e739ebb88047c49eb706e","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.39.3.tgz","fileCount":8499,"integrity":"sha512-Z+g/mW/AxndnWWx3xAwq6oWAaIONpA5JevVFgaF4Z4hrGqQsFxORmyp2Ue1lpx+Uec6A0aN5YDqXNIZsO/oFew==","signatures":[{"sig":"MEQCIGhEeUhct9klA0tPCBM26dIHkHZnZ1+QLyqyb80l2t4CAiAYQ/xZ19rxzTlAOzIAy5qiSwUAgQ4vEKOBvPLcB86eVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDyJivzWIdh5kS+lNu6X0gGSuzGT8Z8FUjjsJHDH9fmzAiEA5+PO1pDLkmcvg9A/ScQHlxVnJ75vbaI08bm7hiw6RmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.39.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251271428},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.3.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.39.3.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-Z+g/mW/AxndnWWx3xAwq6oWAaIONpA5JevVFgaF4Z4hrGqQsFxORmyp2Ue1lpx+Uec6A0aN5YDqXNIZsO/oFew==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.39.3_1790704822825_0.8886559175527906","host":"s3://npm-registry-packages-npm-production"}},"0.40.0":{"name":"@reddb-io/red-router","version":"0.40.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.40.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"4ff350555a3bdb820d66f3825a7a668969bd0a52","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.40.0.tgz","fileCount":8508,"integrity":"sha512-Ksw6sp5GFqFnzNHqGEsgj2GlKwaORZUIe8hzXcFtwz4KDpGUfW5OFI76w2wWjWDuwPh9Ej6ZoVYmVQuqvSoiwA==","signatures":[{"sig":"MEUCICElz+xHmKxssNhHPQovR/OD0/+a9a8qIm97qsRiNk//AiEA1LD+aNCHZLDnWl/SPPlh6A3OEBRu5ynOb1QnhbQQZ20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDTIXLmoDovL19U+VLGZ6kJwtgnoHqtZTa5hbDD2m2fSgIhANEMjHsWwmGBZn1DY/M9WBPisA3hC+nsfzRdNrXuXO7m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.40.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251628518},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.40.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.40.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-Ksw6sp5GFqFnzNHqGEsgj2GlKwaORZUIe8hzXcFtwz4KDpGUfW5OFI76w2wWjWDuwPh9Ej6ZoVYmVQuqvSoiwA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.40.0_1790704847083_0.7221770725425811","host":"s3://npm-registry-packages-npm-production"}},"0.40.1":{"name":"@reddb-io/red-router","version":"0.40.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.40.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a82205674e9a38c9e88b0ef770432113a28e427f","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.40.1.tgz","fileCount":8508,"integrity":"sha512-8ixpBKd7uGT5HOiJmuNuwBshGvD8iMd4O5UMqZPtchywnoStr4fXdWA023LmoW6reU70IYhR/jVxDon0UyAEiQ==","signatures":[{"sig":"MEYCIQCYHhvTjJmk6OjZinuEY7+6892CUB715LtR+Ih9rGYkQwIhALrDzJMPBD22xFG47U1MJa+qqOWau59SMq3Cr9Yp+d8J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAbRPaaZhJzAU3rAsFHQTpjIlYOF6tyRprP26cwV8uPjAiA7JSnh9AjsPM8UnQkzDnMnhZJbxwk0kwK1WA6OBPqkBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.40.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251465945},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.40.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.40.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-8ixpBKd7uGT5HOiJmuNuwBshGvD8iMd4O5UMqZPtchywnoStr4fXdWA023LmoW6reU70IYhR/jVxDon0UyAEiQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.40.1_1790705748565_0.26739541526202437","host":"s3://npm-registry-packages-npm-production"}},"0.41.0":{"name":"@reddb-io/red-router","version":"0.41.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.41.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a5b3a04c1010be57e98a92dd956f1734f76055e7","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.41.0.tgz","fileCount":8522,"integrity":"sha512-INU8kCzWJhNdX88p+AIu7rFJkWw5/6mgF/qpupU93QW7oheWzKf0iwlm1yOK6Q09cCi6Or9MIkDfAXMVm0CaPA==","signatures":[{"sig":"MEYCIQDFDqeDeRS3/IZ+TeYDUd6WYjHDAh9s1xQY1GdN6UwQQgIhAOo32Y/f5IzGseE3aB/bO1iHX79WTS9/l2McfOw1MdVV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCYu8cAZd2Pl6g/T2fOHooK6WXtGzgFKT2eUeL4wW8IcgIhAJvpF6lS0AFTIjWiFHIC7ujuSrJDbAgUiX2A7kNRxY/q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.41.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":252191057},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-INU8kCzWJhNdX88p+AIu7rFJkWw5/6mgF/qpupU93QW7oheWzKf0iwlm1yOK6Q09cCi6Or9MIkDfAXMVm0CaPA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.41.0_1790706695938_0.4751352237882205","host":"s3://npm-registry-packages-npm-production"}},"0.41.1":{"name":"@reddb-io/red-router","version":"0.41.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.41.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"5358367b9ffb6a348c8ebef6bc048f508fafbc74","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.41.1.tgz","fileCount":8521,"integrity":"sha512-rC1+ZmuwJUlZcJV84iFxT1rmdMbyaYkNrszUvP4TbtZrUKqkAXGHCr2CcGmiNPz5i7w5QMmJd4SOJHGGE5ft8Q==","signatures":[{"sig":"MEUCIQCC6kVbS6QTkUVcMR1EQDkiy01r9BFlyEmBxniCp8vZgwIgObVw+mFuA3lsusWK/q5o1XovK/TrgFcRyLgaGtrhQCM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDx0jOF6imicNzVAcmRdXseKYJr4OE9MQBJXJFVVsQZ6gIhAJws2fR6P3lMq049R76TqUF33GjkdAY7YVcrz7mFFEqx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.41.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":252179143},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-rC1+ZmuwJUlZcJV84iFxT1rmdMbyaYkNrszUvP4TbtZrUKqkAXGHCr2CcGmiNPz5i7w5QMmJd4SOJHGGE5ft8Q==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.41.1_1790706821403_0.5333814078901886","host":"s3://npm-registry-packages-npm-production"}},"0.41.2":{"name":"@reddb-io/red-router","version":"0.41.2","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.41.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"9f5d5682284f9e534d0d73767300e79b05df58cb","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.41.2.tgz","fileCount":8521,"integrity":"sha512-uEOmLrAMEwRZTqPXhKzVJNV5IaecN1wJu60P04MWl0bzqCV86NFXkVyDwuzW430uvO6q1951kbYIcexkAU3cow==","signatures":[{"sig":"MEUCIHCt+68rqhWkbdCSGJArBok5PfFaw69eLsgOtSvghAUqAiEAg98RI0VyIm3YKneNc3kwK1GsLXxzuG80b/aUAgmZuRs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEMJGs04P7eY6nH2w650RYnfb7EgtFA+qHJ+b7my4/2xAiBNbhfloZ14oOziibAxHzpv57xhuaGK+brDkR3LbDa5Mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.41.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":252141863},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.2.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.2.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-uEOmLrAMEwRZTqPXhKzVJNV5IaecN1wJu60P04MWl0bzqCV86NFXkVyDwuzW430uvO6q1951kbYIcexkAU3cow==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.41.2_1790707155320_0.046742795165227724","host":"s3://npm-registry-packages-npm-production"}},"0.41.3":{"name":"@reddb-io/red-router","version":"0.41.3","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.41.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"1eaf3cd2f715f6de40f62b7698b4ed1496b363d4","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.41.3.tgz","fileCount":8518,"integrity":"sha512-rEQye5d8Upo2aoY9iuXI1U2zP1xSK8nKY/3DGXwsMmN9D8/SxM15uykNl1fM8nZdFr1zmYQ/2qjg/7xep8tT0A==","signatures":[{"sig":"MEQCIAQ3K01uwTfTbpv0Nto1VPWvS7ZxktbticyRJOM4fLGcAiBXr6ZksefFueHSLOmGWh2sC1eQ3mbfpkD9yRTomr4gTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCNx/DLleVnPC4jjqIEgzNfe9hq98MsqmjJjiUDZOX/4QIgJ9GNKyyOGTTxoHSsWZza/G1XMD1NhgBBY9YHXc5vhOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.41.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251966144},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.3.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.3.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-rEQye5d8Upo2aoY9iuXI1U2zP1xSK8nKY/3DGXwsMmN9D8/SxM15uykNl1fM8nZdFr1zmYQ/2qjg/7xep8tT0A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.41.3_1790709489702_0.1774407759330512","host":"s3://npm-registry-packages-npm-production"}},"0.41.4":{"name":"@reddb-io/red-router","version":"0.41.4","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.41.4","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"e26e9a6127b5f2c8f3b752b5c1afcf738be1dd1a","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.41.4.tgz","fileCount":8518,"integrity":"sha512-n69ucAwDsB0qm18Wxz7dynX14fhJr1SF75WfHZiBL5SQquCOCnrxPiiR58ZfjMg4yoMz9cibkyqNpan0wJ9stA==","signatures":[{"sig":"MEUCIB7ETnmtbJnKulJo/Xs/UFoXpB5O11cVInK54u6Ji1jlAiEAzsF0dQ4WwF4LgELMJwNzOIpkczJfKjsf1QYAVjNfCdY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDmtHChAhnThiCquuwwdSeDOTXJB1hKUzg+s3DvxEUhPgIgJ4M76KQHbdVhhWQVvbzt2IQWEwpnd+dRudOuJTWSifY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.41.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251966138},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.4.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.4.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-n69ucAwDsB0qm18Wxz7dynX14fhJr1SF75WfHZiBL5SQquCOCnrxPiiR58ZfjMg4yoMz9cibkyqNpan0wJ9stA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.41.4_1790710189070_0.6440303865890842","host":"s3://npm-registry-packages-npm-production"}},"0.41.5":{"name":"@reddb-io/red-router","version":"0.41.5","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.41.5","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"7d918dd42a3f58b82c221c449c9051087e6228d0","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.41.5.tgz","fileCount":8518,"integrity":"sha512-nUHSS6dOmIp+LwC8XWB7N17UR3aOZoY8TrKHY0Ua+oofOsK+JQZsnElMnubBPTdSgGy8CAZt1hQd/yiar09tVw==","signatures":[{"sig":"MEUCID7flFRUUfFwuvMIGGIINZDyRFSqxW/kI/w0YPS6ajy5AiEAkzHnXUYsatAmcq2RQ7DHe5OhwV33+atQHYWuchswGJE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIE197dABLY8sN8DbjKeTCBW1hY1HFQn+gj+WMAaSas7uAiEA4krQGflSAAkpZddfRffc5P5eIivi9yaZpKaUO6XT0Fw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.41.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251966233},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.5.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.41.5.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-nUHSS6dOmIp+LwC8XWB7N17UR3aOZoY8TrKHY0Ua+oofOsK+JQZsnElMnubBPTdSgGy8CAZt1hQd/yiar09tVw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.41.5_1790710340906_0.21585795940882835","host":"s3://npm-registry-packages-npm-production"}},"0.42.1":{"name":"@reddb-io/red-router","version":"0.42.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.42.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"735abd729de65e4961e3c33835e8256e64b9f935","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.42.1.tgz","fileCount":8441,"integrity":"sha512-H3sBZI/iPtHLc1LgCTfj4qS4tbmS0g90c0itzbjv8p0uZiPGNetzuf1zY02ZY+GSuvzHtI0NMOTHtY3D7uy4iA==","signatures":[{"sig":"MEQCIGg//Kc3mYq0R0caZgBDs2M1Ql1lWwLO8aIUAjoCKlnFAiAysF+NijSdok/3gzyh5ZIVrE5ff6eBtLQDfatcaumjPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEBAMpxTvMUswtdEKdGG7JhZt+SPN/kGre/NLBgzHpmSAiA93Fp0PXFYKmlO3FW8/kNyQUoDQhEgLxWzDnLLXmc3FQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.42.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":250575301},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.42.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.42.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-H3sBZI/iPtHLc1LgCTfj4qS4tbmS0g90c0itzbjv8p0uZiPGNetzuf1zY02ZY+GSuvzHtI0NMOTHtY3D7uy4iA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.42.1_1790714733084_0.5454336709414436","host":"s3://npm-registry-packages-npm-production"}},"0.43.0":{"name":"@reddb-io/red-router","version":"0.43.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.43.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"6e77af78a85b06b1601997d4756515755fdfc410","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.43.0.tgz","fileCount":8441,"integrity":"sha512-J1RgUBC1Ta02yZMmUYw7TbqqCTF1rAGJfze+VMgNM/rlX/8M6GmPc8DSAI2aJBPMnowRf82x/vxMCSpnh91W8w==","signatures":[{"sig":"MEUCICyyfabfiQRSD3xbOKzbCXNMVQLw37JbYNAxHI7ZR+UvAiEAgatdU2L+pW4POYiQ2WDg/99oJlE2H1C9th8vwnVmFF0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDHoEeuYd9UjTs6pOf6ZbXMMCCHAWsV8EZyj9tTIKZWIwIgUMoK1+dM7L4fF8XgOU92g9Nki7tJiFWj/8iA7+ZX0pk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.43.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":250615365},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.43.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.43.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-J1RgUBC1Ta02yZMmUYw7TbqqCTF1rAGJfze+VMgNM/rlX/8M6GmPc8DSAI2aJBPMnowRf82x/vxMCSpnh91W8w==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.43.0_1790715685525_0.7667504947917023","host":"s3://npm-registry-packages-npm-production"}},"0.44.0":{"name":"@reddb-io/red-router","version":"0.44.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.44.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"d6ec3fe22ea31ec7c232e406b58cd18e61ced810","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.44.0.tgz","fileCount":8477,"integrity":"sha512-7mreZqhzqPwJcOAq/lhMZQc4JgQC6ycFsV76eXWlJ3y2uI9cJmes3T27aU9uaYBLlnP7sesOcHH6Pz1bKQPTWw==","signatures":[{"sig":"MEUCIQCdqbSm4/tP1EiU9/G3WQp3HHBpZM7EfqaSbAfp1VndDQIgGexu/pIwNu9h5GRsY7Ec2nTboDUMGCy5Ew87QXuYT2I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCHgig/2zmSvyBJA1FSSUiDF3f8VIsquXbM0jkt243qggIgeT3sbeRyKjoC9/i2oFWOx+KEX5PswAIPg4NJShCK+Yo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.44.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251191562},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.44.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.44.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-7mreZqhzqPwJcOAq/lhMZQc4JgQC6ycFsV76eXWlJ3y2uI9cJmes3T27aU9uaYBLlnP7sesOcHH6Pz1bKQPTWw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.44.0_1790717791347_0.5697574847230846","host":"s3://npm-registry-packages-npm-production"}},"0.46.0":{"name":"@reddb-io/red-router","version":"0.46.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.46.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"2f69cb1adc13dbc7ae0ca1f35ef6d1db9190ccda","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.46.0.tgz","fileCount":8513,"integrity":"sha512-5Li51iIQX3WMPyyYVLxbp9zGcNqZBcRWMFwtgRAz39Bf7V+uKq6QkUMBS5dvDMnSKkBmmNNQ9nSFMTk4sL6O9g==","signatures":[{"sig":"MEYCIQD6smfHG091FIxbJSkBW0TUiIqoHc72SFBu3zlZL1ReegIhAM8xdg/o+8/7ZZLOnR+zpgJQHhGz6CWY/j2+30un4oxM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDpsUFl0YR6gaQ0M2MXQqhYSOPNso++zGfEVVPAqHRpIQIhAJTX6vavVVCTE4yd+QGvS8R9Aj2BmGi6FaydWTMy0+hk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.46.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251953682},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.46.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.46.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-5Li51iIQX3WMPyyYVLxbp9zGcNqZBcRWMFwtgRAz39Bf7V+uKq6QkUMBS5dvDMnSKkBmmNNQ9nSFMTk4sL6O9g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.46.0_1790721171326_0.31426378760927887","host":"s3://npm-registry-packages-npm-production"}},"0.47.0":{"name":"@reddb-io/red-router","version":"0.47.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.47.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"e1465b40420e0abf272e06afbac93f7f575a0a79","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.47.0.tgz","fileCount":8538,"integrity":"sha512-CGdLtOpGlyM1p5c6REDMjTvCgNuw0B6KMp7W7aSlbOXLfqNOy1p+WvmiSrh69unQJC4yBbjTl9QEMxUHgdhBnA==","signatures":[{"sig":"MEQCIAVvwyoFa8H9GulWSkH4K8cV6dFYb52glUmj9os3lVXvAiATShi7JTb+KJNWtZ+dDV2fv0R0F1sm3Al2yOtj23M1ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAac5TLgUwL+Mzmqdrz1w0Jn1Qach3LMM3nw+0vV4a/fAiAWLkAwp/CnWD1L+BVtFEmYatZ7lMe8SFQ0jT/BZiGajQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.47.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":252804659},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.47.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.47.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-CGdLtOpGlyM1p5c6REDMjTvCgNuw0B6KMp7W7aSlbOXLfqNOy1p+WvmiSrh69unQJC4yBbjTl9QEMxUHgdhBnA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.47.0_1790730067529_0.3935866431046109","host":"s3://npm-registry-packages-npm-production"}},"0.48.0":{"name":"@reddb-io/red-router","version":"0.48.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.48.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0cf8d1f9b02f820bf4b816a2d240a80d903b813b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.48.0.tgz","fileCount":8565,"integrity":"sha512-zlmMbDOBqcEpm6flw/0bw29ODE+LV8zvkW3uHfoeULxo8Ceku0tOuyjVDS2fc5j+OLss/jRkJ4CQZAEicGaliw==","signatures":[{"sig":"MEQCIH7KaiaPL8Bp8+pJLpFaCycnzV3ODulkr71gBNGa4VvrAiBzCsm7NuR6RUis2pv/5NUSwhfICPdZiwp3G3/njBVFnA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDmf1f9k3DKuWcY78DIuPkxJ71nWEPhV2qtiLXXnGbBYQIhAJiwPM0gRajaCjUkqVBL+kMGN7kLiZzfq9eNkM54FzWa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.48.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":253348545},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.48.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.48.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-zlmMbDOBqcEpm6flw/0bw29ODE+LV8zvkW3uHfoeULxo8Ceku0tOuyjVDS2fc5j+OLss/jRkJ4CQZAEicGaliw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.48.0_1790731840020_0.7163436811308692","host":"s3://npm-registry-packages-npm-production"}},"0.49.1":{"name":"@reddb-io/red-router","version":"0.49.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.49.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"a7acc3b29b3da4e0da4db4105dd0be06966a7ed6","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.49.1.tgz","fileCount":8621,"integrity":"sha512-FIOxgXsvN0s+Fxs3ThN+9UUISqPLCshAFcuAetiu/Y+a2gsn1ZihPnLtIQKKnpVeIBCIs2ktinKLy2XoNANbHw==","signatures":[{"sig":"MEUCIQDSvQsyQkboi5a2j/pvdTAHO4pr4Ex0Pbo0L+rQriiy7wIgF13sdwpDRX1CIMAfytHRnCGEluzPwTGdTLXfA6k8QQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCO7FHbn+NQ4ClNGVqD6roamxXF7viUrraqUrzA1+8LUgIgULvtuZuqRIU+CcTZLTi5xCb01wm9yDfMY0VCPnpzODo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.49.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":254048140},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.49.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.49.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-FIOxgXsvN0s+Fxs3ThN+9UUISqPLCshAFcuAetiu/Y+a2gsn1ZihPnLtIQKKnpVeIBCIs2ktinKLy2XoNANbHw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.49.1_1790738451442_0.944747083272502","host":"s3://npm-registry-packages-npm-production"}},"0.50.0":{"name":"@reddb-io/red-router","version":"0.50.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.50.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"45d9f2f037de3af91f4b7889936e5b11e62f25c8","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.50.0.tgz","fileCount":8640,"integrity":"sha512-zDE42KCnjS8IiKB2KqlksE05ba+/Zw882gWygF3GbWJnQbvJEyq5gHt1AbyP9FdOGtf1QaRDa5KZ97CZUvocKQ==","signatures":[{"sig":"MEUCIQC3oVXbJA8HIZUjFkfRcXuMLrDt0L4qG0i8bgZHj0OJ7gIgMz/6l8wlXF7omqjV1d5kpOewDymnD7S0wuLRLALkAbA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDT1/tqcI0MeSiwzmsnD/U95ICqZpxFmHpURW+pG2NnoAIhANQJDPp4rqgdtcp7tigBFTPCBalVoMN98QC3YlPB4dSj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.50.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":254235179},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.50.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.50.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-zDE42KCnjS8IiKB2KqlksE05ba+/Zw882gWygF3GbWJnQbvJEyq5gHt1AbyP9FdOGtf1QaRDa5KZ97CZUvocKQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.50.0_1790741453585_0.24059606326674565","host":"s3://npm-registry-packages-npm-production"}},"0.50.1":{"name":"@reddb-io/red-router","version":"0.50.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.50.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0fa5e0e7b89031714a9b9a4884ab167000ef3f6f","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.50.1.tgz","fileCount":8640,"integrity":"sha512-tlnu5C6z8MVTvdHjuoJf68aLzzHqMQmcbl7QlILwsdWjcPn8he4zd8vMImOpqVzlHrE7uBMzEnNECoSYr+ASjw==","signatures":[{"sig":"MEYCIQCI8ufbWtEPVNsGB9Jq/EKJG7yesPM6vBenSJ48j9jAVgIhAJRJLG6D++UM51+NcgKr8/Ql7/klu4zq294U83xua2I0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDyxoajReLgD6FZi/EnhZ3/w3Zuu9UvG73S1BXI6tNgUwIhALMmky8UcnCPNpwzrq3UhEL8g7ahHRrQykJBtov6Sp4t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.50.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":254236963},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.50.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.50.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-tlnu5C6z8MVTvdHjuoJf68aLzzHqMQmcbl7QlILwsdWjcPn8he4zd8vMImOpqVzlHrE7uBMzEnNECoSYr+ASjw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.50.1_1790747749548_0.3722511276334557","host":"s3://npm-registry-packages-npm-production"}},"0.51.1":{"name":"@reddb-io/red-router","version":"0.51.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.51.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"4b153176b1b6566b4a56737cc7b2eac079a93959","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.51.1.tgz","fileCount":8672,"integrity":"sha512-PPMXnFop95NFwuyt0IrjT6+nyu2ZZ3BtSDAf6BQzfOpG1lBNLipVai0FpXPRa9rR+MQTLsvtxCE4aygea4x+SQ==","signatures":[{"sig":"MEUCICSGcv89TF3C4DVo0HeDJkh/X0Rjo5+lXsIyv3UVI+8kAiEA96k1RaGCG9RW/sE7AhdddZgSE9Rm8P8GGbekNSOMv44=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIF/bf96Ix8QVXV+L6nZ3sp++DCantZHlMJoUeg7GDwIkAiEA/xlXnRoLWCl2hu1gIANlJgRxmypI7bG2u1EYRW5UDWM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.51.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":254959662},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.51.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"rm -rf .build dist && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.51.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-PPMXnFop95NFwuyt0IrjT6+nyu2ZZ3BtSDAf6BQzfOpG1lBNLipVai0FpXPRa9rR+MQTLsvtxCE4aygea4x+SQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.51.1_1790767473071_0.13663146770357648","host":"s3://npm-registry-packages-npm-production"}},"0.52.0":{"name":"@reddb-io/red-router","version":"0.52.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.52.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"cdd1079900e53339a782860fc7c255b129a9a134","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.52.0.tgz","fileCount":8702,"integrity":"sha512-2lzicP1lyUEW2sGbuFQPnCtrGanCC1pf6j5gR3dFbhZ0m7mixEVywpA3IWsiUmnQVkcmTK/NXsTPwDc0uesrEQ==","signatures":[{"sig":"MEQCIFpayMjWeobgPOtjqFmMsIO5Ix+/EanJAk0XuQyMG1cnAiBKW5E6SFyfSmzRu6YyTNmluCmwlELe3Ab5x5kw7sOCMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE1Q4YZZookNq0SKNEj0i44gUvsSheIdF2eA5GFnAoC+AiBMaqiKlqMNlS1Z9rz/wzOZkvOLK/rqaiz5BhQvVzNQqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.52.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":255281757},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.52.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.52.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-2lzicP1lyUEW2sGbuFQPnCtrGanCC1pf6j5gR3dFbhZ0m7mixEVywpA3IWsiUmnQVkcmTK/NXsTPwDc0uesrEQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.52.0_1790776708019_0.2796282645152337","host":"s3://npm-registry-packages-npm-production"}},"0.54.0":{"name":"@reddb-io/red-router","version":"0.54.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.54.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"52998f56c29f8c52e6da945c908414e7f68a8c97","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.54.0.tgz","fileCount":8744,"integrity":"sha512-Gw/j6pDlcPLkW9v2OIc5Dr8N3oYWFjl+lwmy3FykigEf+3T8dGizvkegYYlusP8HtiJHUBoO48l/UBCnSA7BgA==","signatures":[{"sig":"MEQCIC5AF9QvfbKuPvTLezLdwqZYftxVkQRPLmwbPECuxikPAiA48mPksQgYf78iEVgtP3elJwusu/UGnThKdpuigkOKWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDn79IWxNAUBOWtMSkZSKI60ZJwVzaUeH0lZiBJilgU9AIhAO9i+mMxonF38xL8U2d/zuldeccC7CMPJXKYSnsBN1KN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.54.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":255973034},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.54.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.54.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-Gw/j6pDlcPLkW9v2OIc5Dr8N3oYWFjl+lwmy3FykigEf+3T8dGizvkegYYlusP8HtiJHUBoO48l/UBCnSA7BgA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.54.0_1790779758852_0.49490304012593134","host":"s3://npm-registry-packages-npm-production"}},"0.55.0":{"name":"@reddb-io/red-router","version":"0.55.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.55.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"940a482fb3ab2cd2b75133c2d9b7b02a241803c7","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.55.0.tgz","fileCount":8757,"integrity":"sha512-x9rmAQk6PJS3sTT4D9qmJyIm5fO4zMGZkT5NdJU+nzDVKanmvAqllPomhUf7m1e3cakMWxUxYPq58hOZYo9AZg==","signatures":[{"sig":"MEQCID37KvJZyT/Z+DQ+oiZryeM5P2JbkDV1aPwrtXvoN4vvAiBVvBelARDppYj87Bm7R9WV3yPrjBQRgOgxwa54Fvzxjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEpd/bdX72o/uAGeYxIR+BDU0nAh3SUvTKdB6GIxVK+hAiEA4G1bW2YbDhm3S7ws9ngnDRXmBHuD6Fmr3ePMFjp0bHw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.55.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":257554944},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.55.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.55.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-x9rmAQk6PJS3sTT4D9qmJyIm5fO4zMGZkT5NdJU+nzDVKanmvAqllPomhUf7m1e3cakMWxUxYPq58hOZYo9AZg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.5","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.5","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.55.0_1790785767389_0.12884671450430352","host":"s3://npm-registry-packages-npm-production"}},"0.55.3":{"name":"@reddb-io/red-router","version":"0.55.3","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.55.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"ce3bbe1e7b55494eb8c48a21583b1b287ef8c1d4","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.55.3.tgz","fileCount":8759,"integrity":"sha512-UBjjvip7FL6JYrGzA4sqJtFB9FMJgcr5C9Vcb0cRN6I7MGX5QrDGqWZnyePVXuebWt2O+O/x/BXRVQtRgnZkwQ==","signatures":[{"sig":"MEUCIQCrYtxXUzOba5Yp7apt4Go2pu72VUMVgL+teX9gGP7//wIgJVLEPYuUwgTHgscnkJs1DQq1nxObLpyjqCGkUSkEha0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF43BZ5rwE8RdcvZTP9QTpkOBLE1QJXNrqQD/K0VYrleAiBNx+FamPSj8tllYv/m+5/rKfVTNBF1jsCUNLhLsF7VDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.55.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":257664509},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.55.3.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.55.3.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-UBjjvip7FL6JYrGzA4sqJtFB9FMJgcr5C9Vcb0cRN6I7MGX5QrDGqWZnyePVXuebWt2O+O/x/BXRVQtRgnZkwQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.55.3_1790792872948_0.051147762919056206","host":"s3://npm-registry-packages-npm-production"}},"0.55.5":{"name":"@reddb-io/red-router","version":"0.55.5","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.55.5","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"62d22ae2591ceb585ce36d674d2bc6a1800a8b4b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.55.5.tgz","fileCount":8759,"integrity":"sha512-XJDtnwipBTst+yI+YSTaqO8jyWYHP0FwksetuQu5GO48Q6lcP7ytRBwG6He1y1S63CS25YjUL2wvLP1LfRfHMQ==","signatures":[{"sig":"MEYCIQDvb9YOmqQrJBQnARuBZ9XlGH1upWHdJ8FdX1gS0O14AwIhALs3p2n4JaenICKMCN5pTI8ljbeONXcGjVT7+FV889Un","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGLaX/Aio3LwrcSnmWzAEwpGf22SG5DkdBpEIzxSuMKxAiEA8s8JbGtM3QLYwoOKO8udYfd1F8YtIPJep4BykJLII6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.55.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":257669406},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.55.5.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.55.5.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-XJDtnwipBTst+yI+YSTaqO8jyWYHP0FwksetuQu5GO48Q6lcP7ytRBwG6He1y1S63CS25YjUL2wvLP1LfRfHMQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.55.5_1790794651226_0.90985559526665","host":"s3://npm-registry-packages-npm-production"}},"0.56.0":{"name":"@reddb-io/red-router","version":"0.56.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.56.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"f932158a49a2213ffa86145f2b469acb49a35b75","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.56.0.tgz","fileCount":8780,"integrity":"sha512-xRBbC9jCZGcF8UDSR4tsKcFvBaWqhA2Fl0ga0xM60NKD857eZWc00O6/GL5nXCTZvbCqw5jq55TzpneU56lXsA==","signatures":[{"sig":"MEYCIQCCNLoEYgZFScCLXEMyZm+CCUgBoH1EvPAj07FnipKZ9gIhAP+fm6Y4mutuMPggslHoSnLj0FEeL1brMFU/mszqIat7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIB4yRT2AJLXwEFzM46pPRwP4ngUyVEHQCotsrPRLvbghAiEAxSFalwCbH//Y/LIN9wpDJahkQCRVuQ5B61nTyqq3ecE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.56.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":258279512},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-xRBbC9jCZGcF8UDSR4tsKcFvBaWqhA2Fl0ga0xM60NKD857eZWc00O6/GL5nXCTZvbCqw5jq55TzpneU56lXsA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.56.0_1790800835038_0.09349139056327549","host":"s3://npm-registry-packages-npm-production"}},"0.56.1":{"name":"@reddb-io/red-router","version":"0.56.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.56.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"dabfaeae11ced64195cd5a6b690b615173c43335","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.56.1.tgz","fileCount":8780,"integrity":"sha512-f4oLenun4u9QIJ3utjMdbgCVlpWo0Lw+4+2QON1/QeMIX4qj7Qo+frQU16LfzYecjuKpNJxNdToseSw7yoCyCQ==","signatures":[{"sig":"MEUCIGfB5S/La+uOUqDazljcHU3a0RpJLskVRLel5Cz98uwXAiEAoApNAgopDYKubAexCyrPxYpRLNwj6Sd91Bs4QsRzprs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCajCljmFiCDr5a/fSVV1eGLlltz//TbEGo1bx/nbU4ngIgDLrzqGqnRY36J86ohvMmbOU3eV4l4X0hEfK+GsEzXh0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.56.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":258279654},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-f4oLenun4u9QIJ3utjMdbgCVlpWo0Lw+4+2QON1/QeMIX4qj7Qo+frQU16LfzYecjuKpNJxNdToseSw7yoCyCQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.56.1_1790801937475_0.7394804564587749","host":"s3://npm-registry-packages-npm-production"}},"0.56.2":{"name":"@reddb-io/red-router","version":"0.56.2","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.56.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"06505a79c1a1ac5cbc4951934f921f752fa6849c","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.56.2.tgz","fileCount":8780,"integrity":"sha512-4SNDB9BYgwMxjT7Yf6FvsBRvmq8QgEKpU5xPG/X1NJUiGDaQB5lxlkGU0RX4+3fBwg6wC1I/5a+4lAhFJFgz7A==","signatures":[{"sig":"MEUCIDhOwuG5l+/3llr9RiaHWdcROUJa1GMFwXf0ct6r/thkAiEApB9oJQRJ9W2cKFfNWj25pax0Hh1KnbEMQtqA7J8KImE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBtnx+sE+WpDQ82PqmXrsJGJeoFnKuvtTa5GojBPf0R0AiByT7gxN9LJ4Vky3CV6ktUuM3JajfPr+r0IifES1i4OIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.56.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":258286046},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.2.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.2.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-4SNDB9BYgwMxjT7Yf6FvsBRvmq8QgEKpU5xPG/X1NJUiGDaQB5lxlkGU0RX4+3fBwg6wC1I/5a+4lAhFJFgz7A==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.56.2_1790803002453_0.10235362292327643","host":"s3://npm-registry-packages-npm-production"}},"0.56.3":{"name":"@reddb-io/red-router","version":"0.56.3","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.56.3","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"42050fa4b29f57b0dc87e0b606a26d07790b4d55","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.56.3.tgz","fileCount":8794,"integrity":"sha512-ukIJh+uZS17WJHQrVtevAaDHonZX1YaShxK5L13NCHs0vcP+5Awle7XySKR/Q3vW1AtUXMxhEsBomzvuJplV+g==","signatures":[{"sig":"MEUCIHh7QeVnv0Iyn9o25hYz6hQsjhDySZYrrZ6Y7YW5dx31AiEAnUY7GvD7t893ttxfI0nIxsKmOzD2KrDE5LjBF2wi8n8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDDuhMrkYdyjVf387xT+7H1LpDXMqjBYb5RF7tf6ElDQgIhAOHNcP7fkEZj/V7NY8dpo5KKhjB8Py77QFCxCtxWfFS6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.56.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":258637134},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.3.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.56.3.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-ukIJh+uZS17WJHQrVtevAaDHonZX1YaShxK5L13NCHs0vcP+5Awle7XySKR/Q3vW1AtUXMxhEsBomzvuJplV+g==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.56.3_1790831063796_0.571101314276462","host":"s3://npm-registry-packages-npm-production"}},"0.57.0":{"name":"@reddb-io/red-router","version":"0.57.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"3a5338050115da0e26867af9ba2eaf187c9fb2a9","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.0.tgz","fileCount":8810,"integrity":"sha512-8WCRTIrI7x/Z8OfTWI6Fvjgm5vGh5DijE46r5W7BT6NOop6b/Rw1xR4YOpaMtYnGfeXzI1cDJLyScf0jGn09gw==","signatures":[{"sig":"MEUCIQD0aN2GNtT1q0NsWrFQEhp+VXUGJCO5NYkPnUZ3Jc9LKwIgHtY/prfgj5pJ1pcyH3mx+Y/f7PfS6Swy2bnBw+HuzH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDY95C9NLMCduOZhEuswJuxVDnDP6IjcRFxi2EwwYXF4gIhAJzv3Dw/FG1o/zmfDFNLLgeIfL7IqAwHoVVWs/w/wMm2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":259539478},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-8WCRTIrI7x/Z8OfTWI6Fvjgm5vGh5DijE46r5W7BT6NOop6b/Rw1xR4YOpaMtYnGfeXzI1cDJLyScf0jGn09gw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","mermaid":"^11.17.2","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.0_1790866287845_0.7232245871953114","host":"s3://npm-registry-packages-npm-production"}},"0.57.1":{"name":"@reddb-io/red-router","version":"0.57.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"94ce214445bd41de243ecf59206144c7b81d7122","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.1.tgz","fileCount":8812,"integrity":"sha512-w0Q1bHXuPmVeN59OHpRkMX0OBg9puBHouKH/AqBZjotssXexeYqRHRw2+vb4K3DN1QmyiS+M/y8q129JsjR8zw==","signatures":[{"sig":"MEYCIQDkABUlYN5fFLEfqhEIrPLWJjIUvOI8TEze1YIlQvjbSwIhAJM3X1saoCshUa/H0hOeRY1GA8IcpO6CsN7flhqwk6LF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDmXv4Hcw9eyns2+HZjMvdVRKizI1ZW9cfe3ZBb3hQiZgIhAMLRM3km8VMp+2/S1uPzYk3mtmTRUMLElXcYBS1DeC4L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":259675181},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-w0Q1bHXuPmVeN59OHpRkMX0OBg9puBHouKH/AqBZjotssXexeYqRHRw2+vb4K3DN1QmyiS+M/y8q129JsjR8zw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.1_1790882298375_0.5512266353681168","host":"s3://npm-registry-packages-npm-production"}},"0.57.2":{"name":"@reddb-io/red-router","version":"0.57.2","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"d358ee7de487d273c8096c63ffe532cce7086bb0","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.2.tgz","fileCount":8816,"integrity":"sha512-MNiXMJNJURbNxBVx/lks55QxEEwL96mSfK1C2L21/XSMYISVrYn2dzTa8M2z1lqbjtLzVboAJr3Xb+ydai4ppQ==","signatures":[{"sig":"MEUCIQCeVaHUdGk7QxspgSqJOE/O1uVH/Oi+p+NiJu5ozA+AnQIgEB2PqxgAKpwgBdk0PE70EzM7HBxwF6kknsd3yarcQ0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFnzmqnJ3BzAl2kAJcJCtgoXWqTGH4XpFJFS+4RfiVdNAiEA+3RE6RW75fGHDJ0r07T2yxLOvT9ctcK07frqz3qTQrk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":259727216},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.2.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.2.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-MNiXMJNJURbNxBVx/lks55QxEEwL96mSfK1C2L21/XSMYISVrYn2dzTa8M2z1lqbjtLzVboAJr3Xb+ydai4ppQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.2_1790885300119_0.900405069067209","host":"s3://npm-registry-packages-npm-production"}},"0.57.4":{"name":"@reddb-io/red-router","version":"0.57.4","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.4","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"51300e6a9f155d6e5ea640b2979c58d08e4bd85b","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.4.tgz","fileCount":8823,"integrity":"sha512-nRdl3xlZTOYnX67J/ptq5DLSruCI+nbeZDahmYhtl/oQzWWQOLmIPwEpriARkts9fTJHwjBCaqtXx+LfSiFYqQ==","signatures":[{"sig":"MEUCIQC269Lu6AmKdgvNN1O8P5cXM9HpdNGb+mDbhgC4ncExsgIgAu5A8VD8xg/CUxbuPsQYbAdSQKYUnUgRenmTW2XwFMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAlENrvz9omF6tWVKbsHl+qcUZ1R8IdcmKrpVB7E5YavAiEArP6DcWc6rqPE/xs6AZuc+806DeSzFdpCi3Gi8svAVdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260512956},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.4.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.4.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-nRdl3xlZTOYnX67J/ptq5DLSruCI+nbeZDahmYhtl/oQzWWQOLmIPwEpriARkts9fTJHwjBCaqtXx+LfSiFYqQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.4_1790906914486_0.7991943460332269","host":"s3://npm-registry-packages-npm-production"}},"0.57.7":{"name":"@reddb-io/red-router","version":"0.57.7","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.7","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"cdf733201fbbdf74e69f9d13e02f7653ee0882bc","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.7.tgz","fileCount":8826,"integrity":"sha512-7ffplaLIRiQ87ETSbUh94MaOEVRanCWP0GS5mHMqenXLxEn+DKTZaZQFmIBOBs3L4ZfbvlIyrPQD8QzCtaMaGQ==","signatures":[{"sig":"MEQCIBrba5c1ICLmJ8gvD/RFCp7z9fCQsmA8DUt5tuSWQG9UAiAxLSwSJjSwxim4sIpgK8a+d7S4u3z5FbaC5OjTy7/Z7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD0H7lUzK7FmIE20g4r3wCKVZwzH/cCBIlCzygDsDwNOQIgM6yIEctWPKUuYj9Nhosf/euSKp4baxn9C+YuW8BmwWU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260563440},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.7.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.7.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-7ffplaLIRiQ87ETSbUh94MaOEVRanCWP0GS5mHMqenXLxEn+DKTZaZQFmIBOBs3L4ZfbvlIyrPQD8QzCtaMaGQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.7_1790909832667_0.7446924171711637","host":"s3://npm-registry-packages-npm-production"}},"0.57.8":{"name":"@reddb-io/red-router","version":"0.57.8","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.8","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"ed5422498ab1fd51cc15019327d53a1688de02dc","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.8.tgz","fileCount":8838,"integrity":"sha512-FbVFBjN+BGU7WsczKUQhnCMYPPi91uE5wT1S7O0bVghQqW3B/ai2cukzNx5vdArJPEvK3VqJ40nBdP9I6+sKEQ==","signatures":[{"sig":"MEQCIBHLYGeC9rryAEk9aduV/7dq38TCB0zgpm3497ZpcmQJAiAl9RPXHcoN5IT3ZU5yFmtv5zKvNgKGmbod5gUk8P/rtg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCxieH9sY8KN4f8XJxJWecXWnyYkYReW92cdAnlcyJuFgIhAOI7a6trhkSOuPupBuaapcDVRXkXh1WVLFXUfEAxpf2Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":287239646},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.8.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","catalog:seed":"node scripts/research/update-models-dev-seed.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.8.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-FbVFBjN+BGU7WsczKUQhnCMYPPi91uE5wT1S7O0bVghQqW3B/ai2cukzNx5vdArJPEvK3VqJ40nBdP9I6+sKEQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.8_1790942144442_0.45986703933334017","host":"s3://npm-registry-packages-npm-production"}},"0.57.9":{"name":"@reddb-io/red-router","version":"0.57.9","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.57.9","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"868e976e2abed93817e5f4ece48de2f652da1d70","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.57.9.tgz","fileCount":8838,"integrity":"sha512-EkxBGaAkIJGIul3a+lzBiygYmWYvVHG0aHy7z+WyhqjRwpIqaaQnq/B63aG+S05WzoQiKgGcC+sOtZWStUtQ2w==","signatures":[{"sig":"MEQCICzeLrKt9vKN32JtFF106PBqiqPh4QTMRx8SMyf8a6ACAiBc5W2e/UdUl6Gq0yujKzuYErf9xqHAeEzoWSkwA+ghvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCTcf7C6dsUyi7vQ5cGPoXgvfM5yIpsOtD501Gf4siN4QIgFjlcWJ0qlUPLpymcPlxpKIhs3mLlEU/WCd7lLwTsAS0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.57.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":287184705},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.9.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","catalog:seed":"node scripts/research/update-models-dev-seed.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.57.9.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-EkxBGaAkIJGIul3a+lzBiygYmWYvVHG0aHy7z+WyhqjRwpIqaaQnq/B63aG+S05WzoQiKgGcC+sOtZWStUtQ2w==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.57.9_1790945758997_0.9064112440420133","host":"s3://npm-registry-packages-npm-production"}},"0.58.0":{"name":"@reddb-io/red-router","version":"0.58.0","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.58.0","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"c039fc77b6d2b31f6c14bd085a95135ee170f546","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.58.0.tgz","fileCount":8853,"integrity":"sha512-5Xu0DhIM5TC3XO0TEFLvL3K3hCCnx3R8LXYThcIfWTZLbN7ducNc3C7pHejCnH2sh9gqntzdhaCJDmBM1LxyyQ==","signatures":[{"sig":"MEYCIQDswZRoGzmXCCbWXlh3iN+wy9rdthwggDllDJSN1+bQMQIhANWU+aAFq5ffwIQfnBH7FutoIy2rYnyb1enYBLyWi9PS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFp8UPEtuP36M3LMLa9v4iHD8MQG9edSoVERjrdlrOxDAiBgZs/35nmxZhWqEJkT61ttHUuuKwISwdeaLqzJaQ8oNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.58.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":286991237},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.0.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","catalog:seed":"node scripts/research/update-models-dev-seed.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.0.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-5Xu0DhIM5TC3XO0TEFLvL3K3hCCnx3R8LXYThcIfWTZLbN7ducNc3C7pHejCnH2sh9gqntzdhaCJDmBM1LxyyQ==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.58.0_1790965641279_0.9785712441931773","host":"s3://npm-registry-packages-npm-production"}},"0.58.1":{"name":"@reddb-io/red-router","version":"0.58.1","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.58.1","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"0cfdb0b484881ac5fc2ab6c16e58ea2f8e881f69","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.58.1.tgz","fileCount":8849,"integrity":"sha512-PEZstwAllxD+bCNkcFBDhfqNCv8nCHkJgYUqo/m9zjiAHSVnX8iF4Wg7SrBhwDttXLJKdHVaXn2bWeWv9YwkiA==","signatures":[{"sig":"MEUCIBSkhinGCFqvH84Eq8J55gts8sulbU42glJsmQzqOcu0AiEAt4NsQLvuzcGBYmaFNUg6/FGNy22DtdQn9344937Be3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDn35BHYvsk5uRRDROmmKfnm80omo5ywUdpcsWBOhHNIwIhAMcXNx7ZJfjo3gB4hzc7hR9wKXk+g5Y1QqveydhTvk1c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.58.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":286854829},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.1.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","catalog:seed":"node scripts/research/update-models-dev-seed.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.1.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-PEZstwAllxD+bCNkcFBDhfqNCv8nCHkJgYUqo/m9zjiAHSVnX8iF4Wg7SrBhwDttXLJKdHVaXn2bWeWv9YwkiA==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.58.1_1790968689760_0.32459107135045207","host":"s3://npm-registry-packages-npm-production"}},"0.58.2":{"name":"@reddb-io/red-router","version":"0.58.2","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","_id":"@reddb-io/red-router@0.58.2","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"homepage":"https://github.com/reddb-io/red-router","bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"dist":{"shasum":"ca40af77d018e34a3beebd92bf2475a66f7426d0","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.58.2.tgz","fileCount":8850,"integrity":"sha512-hyNoB8lcN06+bjVkeJlE+wF3hr3SkC/HFKYhYHnp8B6V+eEchOqR3kkxu+stFTns0cJNZxqO1TII0iwBPsIdLg==","signatures":[{"sig":"MEYCIQDHhjJ9qeQkk0aqeD4cAutD41ddjFPNa9ShHFiv97FtqgIhAIKThWjO3Z1REjMroHtx2U+57OgXYOUoA2+4gRfLV3XQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIClHSfCOo3NxAr+GFNcuv/NXrxTl4dr0Ek0wAYIexn+zAiEA49Yxz2N7CC8quzEiIEUwNAbJv0Wi3CK/2l0OAQWrsIs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.58.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":286898021},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.2.tgz","engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","catalog:seed":"node scripts/research/update-models-dev-seed.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.2.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-hyNoB8lcN06+bjVkeJlE+wF3hr3SkC/HFKYhYHnp8B6V+eEchOqR3kkxu+stFTns0cJNZxqO1TII0iwBPsIdLg==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/red-router_0.58.2_1790975841947_0.1825796920470073","host":"s3://npm-registry-packages-npm-production"}},"0.58.3":{"_id":"@reddb-io/red-router@0.58.3","bin":{"red-router":"bin/omniroute.mjs","red-router-reset-password":"bin/reset-password.mjs"},"bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"dist":{"shasum":"a80c58d8808d1c39ea6e1b51dc8a7595bb351fa9","tarball":"https://registry.npmjs.org/@reddb-io/red-router/-/red-router-0.58.3.tgz","fileCount":8860,"integrity":"sha512-hrqWu2AEJWF3JeI+Vq82A0H5rM9nZYkZtasuVli710NHZ9CYBgwqN/ry5XcmGdagASqTmdVI+eWEZ4sKH4aKRw==","signatures":[{"sig":"MEUCIQDda8tBU8HtvlXU5n1r50hAh8VgZ86EUE30xH3HTTRbDwIgS+lAcS22LSOwBVdGHm2WbrZLzskJGSLyNj22V3i1iP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB9l7SLbhWbS3dlpU0ytLXFbn+SgfvNeTZMobMEBkIQUAiEAvg05ZD+aoNVXZgX/1AquaMyONaAXNdKYRR3Lyuprmz0="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@reddb-io%2fred-router@0.58.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":287435254},"name":"@reddb-io/red-router","pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},"type":"module","_from":"file:/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.3.tgz","author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"engines":{"node":">=22.22.2 <23 || >=24.0.0 <27"},"license":"MIT","scripts":{"dev":"node --max-old-space-size=8192 scripts/dev/run-next.mjs dev","lint":"eslint . --cache --cache-location .eslintcache --suppressions-location config/quality/eslint-suppressions.json --pass-on-unpruned-suppressions","test":"node scripts/test/run-redrouter.mjs native","build":"node scripts/build/build-next-isolated.mjs","check":"npm run lint && npm run test","start":"node scripts/dev/run-next.mjs start","homolog":"node scripts/homolog/run.mjs","lint:md":"npx --yes markdownlint-cli2 \"docs/**/*.md\" \"*.md\" \"!docs/i18n\" \"!docs/research\"","prepare":"node -e \"try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})\"","env:sync":"node scripts/dev/sync-env.mjs","prebuild":"npm run check:native-deps","test:all":"npm run test:unit && npm run test:vitest && npm run test:e2e","test:e2e":"node scripts/test/run-redrouter.mjs e2e","build:cli":"node --import tsx scripts/build/prepublish.ts","changeset":"node scripts/release/changesets.mjs add","lint:json":"node scripts/quality/run-eslint-json.mjs","postbuild":"node scripts/build/colocate-standalone.mjs","test:heap":"node --expose-gc --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit tests/integration/heap-growth.test.ts","test:unit":"node scripts/test/run-redrouter.mjs native","uninstall":"node scripts/build/uninstall.mjs","audit:deps":"npm audit --audit-level=critical && (npm audit --audit-level=high || echo '::warning::high-severity advisories present (non-blocking)') && npm run audit:electron","build:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/build/build-next-isolated.mjs","check:deps":"node scripts/check/check-deps.mjs","lint:prose":"vale docs","start:fast":"cross-env OMNIROUTE_SKIP_STANDALONE=1 node scripts/dev/run-next.mjs start","test:chaos":"cross-env RUN_CHAOS_INT=1 node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/resilience-chaos.test.ts","test:fixes":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/fixes-p1.test.ts","test:plan3":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/plan3-p0.test.ts","eval:router":"node --import tsx scripts/router-eval/index.ts","postinstall":"node scripts/build/postinstall.mjs","system-info":"node scripts/dev/system-info.mjs","test:bun:db":"bun test tests/unit/db-adapters/bunSqliteAdapter.test.ts tests/unit/db-adapters/driverFactory.test.ts tests/unit/db-adapters/cliSqlite.test.mjs","test:scoped":"bash scripts/quality/test-scoped.sh","test:system":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/e2e/system-failover.test.ts","test:vitest":"node scripts/test/run-redrouter.mjs ui","build:secure":"OMNIROUTE_BUILD_PROFILE=minimal node scripts/build/build-next-isolated.mjs","catalog:seed":"node scripts/research/update-models-dev-seed.mjs","check:cycles":"node scripts/check/check-cycles.mjs","electron:dev":"concurrently \"npm run dev\" \"wait-on http://localhost:${PORT:-25050} && cd electron && npm run dev\"","quality:gate":"npm run quality:collect && npm run quality:ratchet -- --allow-missing","quality:scan":"node scripts/quality/run-all-gates.mjs","release:pack":"node scripts/release/artifact.mjs pack","test:unit:ci":"node scripts/test/run-redrouter.mjs native","build:backend":"cross-env OMNIROUTE_BUILD_BACKEND_ONLY=1 node scripts/build/build-next-isolated.mjs","build:cli-api":"node --import tsx/esm scripts/cli/generate-api-commands.mjs","build:release":"node scripts/build/clean-build-output.mjs && OMNIROUTE_BUILD_SHA=$(git rev-parse --short HEAD) npm run build && npm run build:cli && node scripts/build/write-build-sha.mjs","check:secrets":"node scripts/check/check-secrets.mjs","prebuild:docs":"node scripts/docs/gen-openapi-module.mjs","prebuild:fast":"npm run check:native-deps","test:coverage":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 npm run test:coverage:runner","test:mutation":"stryker run","test:property":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --test --test-force-exit tests/unit/correctness/*.property.test.ts","test:security":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test tests/unit/security-fase01.test.ts","audit:electron":"npm --prefix electron audit --audit-level=critical && (npm --prefix electron audit --audit-level=high || echo '::warning::electron high-severity advisories present (non-blocking)')","check:db-rules":"node scripts/check/check-db-rules.mjs","check:docs-all":"npm run check:docs-sync && npm run check:docs-frontmatter && npm run check:docs-counts && npm run check:env-doc-sync && npm run check:deprecated-versions && npm run check:doc-links && npm run check:fabricated-docs","check:licenses":"node scripts/check/check-licenses.mjs","check:lockfile":"node scripts/check/check-lockfile.mjs","electron:build":"npm run build && cd electron && npm run build","prepublishOnly":"npm run build:cli-api && npm run build:cli && npm run check:pack-artifact","release:status":"node scripts/release/changesets.mjs status","test:ecosystem":"node scripts/dev/run-ecosystem-tests.mjs","test:unit:fast":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-isolation=none \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:vitest:ui":"node scripts/test/run-redrouter.mjs ui","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","uninstall:full":"node scripts/build/uninstall.mjs --full","bench:heap-body":"node --expose-gc --import tsx/esm scripts/perf/request-body-heap.ts","check:dead-code":"node scripts/check/check-dead-code.mjs","check:doc-links":"node scripts/check/check-doc-links.mjs","check:docs-sync":"node scripts/check/check-docs-sync.mjs","check:file-size":"node scripts/check/check-file-size.mjs","check:pack-boot":"node scripts/check/check-pack-boot.mjs","check:workflows":"node scripts/check/check-workflows.mjs","coverage:report":"cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 report --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","quality:collect":"node scripts/quality/collect-metrics.mjs","quality:ratchet":"node scripts/quality/check-quality-ratchet.mjs","release:version":"node scripts/release/changesets.mjs version","test:combo:live":"cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"","test:unit:shard":"concurrently --kill-others-on-fail -n s1,s2 \"npm:test:unit:shard:1\" \"npm:test:unit:shard:2\"","check:complexity":"node scripts/check/check-complexity.mjs","coverage:summary":"node scripts/check/test-report-summary.mjs --input coverage/coverage-summary.json --output coverage/coverage-report.md","eval:compression":"node --import tsx scripts/compression-eval/index.ts","omniroute:verify":"node scripts/check/omniroute-verify.mjs","pretest:coverage":"rm -rf coverage","quality:headroom":"node scripts/quality/baseline-headroom.mjs","test:integration":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","test:scoped:full":"bash scripts/quality/test-scoped.sh --full","test:unit:serial":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/unit/serial/**/*.test.ts\"","test:upstream:ui":"vitest run --config vitest.config.ts","bench:compression":"bun scripts/compression/benchmark.ts","build:contributor":"cross-env OMNIROUTE_BUILD_PROFILE=contributor OMNIROUTE_USE_TURBOPACK=0 node scripts/build/build-next-isolated.mjs","check:build-scope":"node scripts/check/check-build-scope.mjs","check:bundle-size":"node scripts/check/check-bundle-size.mjs","check:docs-counts":"node scripts/check/check-docs-counts-sync.mjs","check:duplication":"node scripts/check/check-duplication.mjs","check:native-deps":"node scripts/check/check-native-deps.mjs","check:pack-policy":"node --import tsx scripts/build/validate-pack-artifact.ts --policy-only","check:pr-evidence":"node scripts/check/check-pr-evidence.mjs","check:router-eval":"node --import tsx scripts/check/check-router-eval-regression.ts","check:rtl-ratchet":"node scripts/check/check-rtl-ratchet.mjs","quality:scan:fast":"node scripts/quality/run-all-gates.mjs --fast","release:reconcile":"node scripts/release/reconcile-changelog.mjs","release:uncovered":"node scripts/release/list-uncovered-commits.mjs","test:combo:matrix":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"","test:unit:shard:1":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=1/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=1/2 \"tests/unit/serial/**/*.test.ts\"","test:unit:shard:2":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=10 --test-shard=2/2 \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=2/2 \"tests/unit/serial/**/*.test.ts\"","test:upstream:e2e":"node scripts/dev/run-playwright-tests.mjs test tests/e2e/*.spec.ts","check:docs-symbols":"node scripts/check/check-docs-symbols.mjs","check:env-doc-sync":"node scripts/check/check-env-doc-sync.mjs","check:error-helper":"node scripts/check/check-error-helper.mjs","check:node-runtime":"node --import tsx scripts/check/check-supported-node-runtime.ts","check:public-creds":"node scripts/check/check-public-creds.mjs","check:ratchet-bank":"node scripts/quality/verify-ratchet-bank.mjs","check:test-masking":"node scripts/check/check-test-masking.mjs","check:vuln-ratchet":"node scripts/check/check-vuln-ratchet.mjs","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:win":"npm run build && cd electron && npm run build:win","eval:router:search":"node --import tsx scripts/router-eval/search.ts","eval:router:trends":"node --import tsx scripts/router-eval/trends.ts","test:boundary:live":"cross-env RUN_BOUNDARY_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/boundary/*.live.test.ts\"","test:protocols:e2e":"node scripts/dev/run-protocol-clients-tests.mjs","test:scoped:staged":"bash scripts/quality/test-scoped.sh --staged","test:unit:ci:shard":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=$TEST_SHARD \"tests/unit/dashboard/**/*.test.ts\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD \"tests/unit/serial/**/*.test.ts\"","test:upstream:unit":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","bench:highwatermark":"node --import tsx/esm scripts/perf/benchmark-highwatermark.ts","build:native:tproxy":"cd src/mitm/tproxy/native && npx --yes node-gyp rebuild","changelog:aggregate":"node scripts/release/aggregate-changelog.mjs","check:api-docs-refs":"node scripts/check/check-api-docs-refs.mjs","check:circular-deps":"node scripts/check/check-circular-deps.mjs","check:fetch-targets":"node scripts/check/check-fetch-targets.mjs","check:known-symbols":"bun scripts/check/check-known-symbols.ts","check:pack-artifact":"node --import tsx scripts/build/validate-pack-artifact.ts","check:release-green":"node scripts/quality/validate-release-green.mjs","check:type-coverage":"node scripts/check/check-type-coverage.mjs","eval:router:compare":"node --import tsx scripts/router-eval/compare.ts","test:combo:live:vps":"node scripts/test/combo-live-vps.mjs","test:integration:ci":"cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"","backfill-aggregation":"node --import tsx src/scripts/backfillAggregation.ts","bench:routing-events":"node --import tsx/esm scripts/perf/routing-events-bench.ts","check:ai-attribution":"node scripts/check/check-ai-attribution.mjs","check:any-budget:t11":"node scripts/check/check-t11-any-budget.mjs","check:codeql-ratchet":"node scripts/check/check-codeql-ratchet.mjs","check:openapi-routes":"node scripts/check/check-openapi-routes.mjs","check:pr-test-policy":"node scripts/check/check-pr-test-policy.mjs","check:test-discovery":"node scripts/check/check-test-discovery.mjs","docs:render-diagrams":"node scripts/docs/render-diagrams.mjs","electron:build:linux":"npm run build && cd electron && npm run build:linux","release:contributors":"node scripts/release/gen-contributors.mjs","test:coverage:legacy":"c8 --output-dir coverage --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.ts","test:coverage:runner":"node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,translator,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial","test:upstream:vitest":"vitest run --config vitest.mcp.config.ts","check:fabricated-docs":"node scripts/check/check-fabricated-docs.mjs --strict","check:install-upgrade":"node scripts/check/check-install-upgrade.mjs","check:model-lifecycle":"node --import tsx/esm scripts/check/check-model-lifecycle.mjs","check:provider-assets":"node scripts/check/check-provider-assets.mjs","check:radar-sentinels":"node scripts/check/check-radar-sentinels.mjs","check:test-runner-api":"node scripts/check/check-test-runner-api.mjs","sweep:stale-fragments":"node scripts/release/sweep-stale-fragments.mjs","update:cli-identities":"node scripts/release/refresh-cli-identities.mjs","alibaba:sync-allowlist":"node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs","check:docs-frontmatter":"node scripts/check/check-docs-frontmatter.mjs","check:mutation-ratchet":"node scripts/check/check-mutation-ratchet.mjs","check:openapi-breaking":"node scripts/check/check-openapi-breaking.mjs","check:openapi-coverage":"node scripts/check/check-openapi-coverage.mjs","coverage:report:legacy":"c8 report --output-dir coverage --exclude=open-sse --reporter=text --reporter=text-summary","gen:provider-reference":"bun scripts/docs/gen-provider-reference.ts","check:agent-skills-sync":"node --import tsx/esm scripts/skills/generate-agent-skills.mjs","check:pricing-freshness":"node scripts/check/check-pricing-freshness.mjs","check:tracked-artifacts":"node scripts/check/check-tracked-artifacts.mjs","check:vitest-exclusions":"node scripts/check/check-vitest-exclusions.mjs","electron:smoke:packaged":"node scripts/dev/smoke-electron-packaged.mjs","quality:relax-baselines":"node scripts/quality/relax-baselines.mjs","check:compression-budget":"bun scripts/check/check-compression-budget.ts","check:open-sse-typecheck":"node scripts/check/check-open-sse-typecheck.mjs","check:changelog-integrity":"node scripts/check/check-changelog-integrity.mjs","check:complexity-ratchets":"node scripts/check/check-complexity-ratchets.mjs","check:dashboard-typecheck":"node scripts/check/check-dashboard-typecheck.mjs","check:deprecated-versions":"node scripts/check/check-deprecated-versions.mjs","check:migration-numbering":"node scripts/check/check-migration-numbering.mjs","check:provider-order-sync":"node scripts/check/check-provider-order-sync.mjs","check:routing-error-guard":"node scripts/check/check-routing-error-guard.mjs","eval:router:patch-compare":"node --import tsx scripts/router-eval/patch-compare.ts","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","check:cognitive-complexity":"node scripts/check/check-cognitive-complexity.mjs","check:nvidia-catalog-drift":"node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts","check:provider-consistency":"bun scripts/check/check-provider-consistency.ts","check:route-validation:t06":"node scripts/check/check-route-validation.mjs","check:cli-fingerprint-drift":"node --import tsx/esm scripts/check/check-cli-fingerprint-drift.ts","check:mutation-test-coverage":"node scripts/check/check-mutation-test-coverage.mjs --strict","check:openapi-security-tiers":"node scripts/check/check-openapi-security-tiers.mjs","check:route-guard-membership":"node --import tsx scripts/check/check-route-guard-membership.ts","test:combo:live:vps:failover":"node scripts/test/combo-live-vps.mjs --failover","check:forgotten-sibling-tests":"node scripts/check/check-forgotten-sibling-tests.mjs","check:ts7-diagnostics-ratchet":"node scripts/check/check-ts7-diagnostics-ratchet.mjs","check:provider-asset-provenance":"node scripts/check/check-provider-asset-provenance.mjs","quality:refresh-model-lifecycle":"node scripts/quality/refresh-model-lifecycle.mjs"},"version":"0.58.3","_npmUser":{"name":"fforattini","email":"filipeforattini1@gmail.com"},"homepage":"https://github.com/reddb-io/red-router","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"_resolved":"/home/runner/work/red-router/red-router/release-artifacts/reddb-io-red-router-0.58.3.tgz","overrides":{"qs":"^6.16.0","joi":"^18.2.8","tar":"^7.5.21","hono":"^4.13.7","uuid":"^14.0.2","vite":"^8.0.16","jsdom":{"undici":"^7.29.0"},"sharp":"^0.35.4","nanoid":"^3.3.17","rimraf":{"minimatch":{"brace-expansion":"^2.1.4"}},"adm-zip":"^0.6.1","postcss":"^8.5.18","fast-uri":"^3.1.7","node-gyp":{"undici":"^6.28.0"},"csv-parse":"^7.0.2","form-data":"^4.0.6","libxmljs2":{"minimatch":{"brace-expansion":"^2.1.4"}},"promptfoo":{"undici":"^7.29.0","js-yaml":"^5.2.2"},"ip-address":"^10.7.2","protobufjs":"^7.6.5","@babel/core":"^7.29.6","body-parser":"^2.3.0","xmlbuilder2":{"js-yaml":"^4.3.1"},"browserslist":"^4.28.8","concurrently":{"shell-quote":"^1.9.0"},"lockfile-lint":{"js-yaml":"^4.3.1"},"monaco-editor":{"dompurify":"^3.4.14"},"fast-xml-parser":"^5.10.1","@eslint/eslintrc":{"js-yaml":"^4.3.1"},"@yarnpkg/parsers":{"js-yaml":"^4.3.2"},"onnxruntime-node":"1.30.0","socket.io-parser":"^4.2.7","@hono/node-server":"^2.0.5","@openai/codex-security":{"smol-toml":"^1.8.0"},"eslint-plugin-react-hooks":"7.1.1","@apidevtools/json-schema-ref-parser":{"js-yaml":"^4.3.1"}},"_integrity":"sha512-hrqWu2AEJWF3JeI+Vq82A0H5rM9nZYkZtasuVli710NHZ9CYBgwqN/ry5XcmGdagASqTmdVI+eWEZ4sKH4aKRw==","repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"workspaces":["open-sse","packages/browser-pool"],"_npmVersion":"11.19.1","description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","directories":{},"maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"_nodeVersion":"24.21.0","allowScripts":{"keytar":true,"esbuild":true,"@swc/core":true,"protobufjs":true,"unrs-resolver":true,"better-sqlite3":true,"@parcel/watcher":true},"dependencies":{"ws":"^8.21.3","ajv":"^8.20.0","ink":"^7.0.3","ora":"^9.4.1","tsx":"^4.23.13","zod":"^4.5.4","clsx":"^2.1.1","jose":"^6.2.10","next":"16.3.8","open":"^11.0.2","pino":"^10.3.1","uuid":"^14.0.2","yazl":"^3.3.1","axios":"^1.20.0","lowdb":"^7.0.1","react":"19.2.8","sharp":"^0.35.4","socks":"^2.8.7","fflate":"^0.8.3","marked":"^18.0.11","parse5":"^8.0.1","sql.js":"^1.14.2","undici":"^8.11.2","express":"^5.2.1","ioredis":"^5.10.1","js-yaml":"^5.4.1","kafkajs":"^2.2.4","zustand":"^5.0.15","bcryptjs":"^3.0.3","react-is":"^19.2.6","recharts":"^3.8.1","tiktoken":"^1.0.22","turndown":"7.2.4","commander":"^15.0.0","dompurify":"^3.4.14","next-intl":"^4.14.0","omniglyph":"^1.4.0","react-dom":"19.2.8","smol-toml":"1.8.0","@types/mdx":"^2.0.13","bottleneck":"^2.19.5","playwright":"1.62.1","remark-gfm":"^4.0.1","safe-regex":"^2.1.1","selfsigned":"^5.5.0","ajv-formats":"^3.0.1","cron-parser":"^5.10.0","fetch-socks":"^1.3.3","fumadocs-ui":"^16.15.4","ink-spinner":"^5.0.0","next-themes":"^0.4.6","pino-pretty":"^13.1.3","xxhash-wasm":"^1.1.0","@ngrok/ngrok":"^1.7.0","@swc/helpers":"0.5.23","jsonc-parser":"^3.3.1","lucide-react":"^1.33.0","@dnd-kit/core":"^6.3.1","@xyflow/react":"^12.11.5","csv-stringify":"^6.8.3","fumadocs-core":"^16.15.4","monaco-editor":"^0.56.0","ink-text-input":"^6.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","marked-terminal":"^7.3.0","node-machine-id":"^1.1.12","playwright-core":"1.62.1","update-notifier":"^7.3.1","material-symbols":"^0.47.0","react-reconciler":"^0.33.0","@dnd-kit/sortable":"^10.0.0","@toon-format/toon":"^4.1.1","https-proxy-agent":"^9.0.0","react18-json-view":"0.2.10","tailwind-variants":"^3.3.1","@dnd-kit/utilities":"^3.2.2","turndown-plugin-gfm":"1.0.2","@monaco-editor/react":"^4.7.0","@node-saml/node-saml":"^5.1.0","http-proxy-middleware":"^4.0.0","pino-abstract-transport":"^3.0.0","@modelcontextprotocol/sdk":"^1.30.0","@aws-sdk/client-bedrock-runtime":"^3.1120.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","bun":"1.4.2","ctrf":"^0.3.0","dpdm":"^4.3.0","glob":"^13.0.6","knip":"^6.35.1","vite":"^8.0.16","husky":"^9.1.7","jscpd":"^4.3.0","jsdom":"^30.0.1","eslint":"^10.10.0","espree":"^11.2.0","vitest":"^5.0.0","esbuild":"0.28.2","httpyac":"^6.16.7","wait-on":"^9.1.0","wtfnode":"^0.10.1","prettier":"^3.9.6","@types/ws":"^8.18.0","cross-env":"^10.1.0","promptfoo":"^0.123.0","@types/bun":"1.4.2","fast-check":"^4.10.0","size-limit":"^13.0.3","typescript":"^6.0.3","@types/node":"^26.5.1","node-loader":"^2.1.0","opencode-ai":"1.18.30","tailwindcss":"^4.3.0","@types/react":"^19.2.18","concurrently":"^10.0.5","fumadocs-mdx":"^15.4.0","junit-to-ctrf":"^0.0.14","lockfile-lint":"^5.0.1","type-coverage":"^2.30.1","@eslint/compat":"^2.1.1","@lobehub/icons":"^5.16.0","@playwright/test":"^1.63.0","@size-limit/file":"^13.0.3","@types/react-dom":"^19.2.5","@types/safe-regex":"^1.1.6","typescript-eslint":"^8.70.0","eslint-config-next":"16.3.8","@axe-core/playwright":"^4.13.0","@tailwindcss/postcss":"^4.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.0","@stryker-mutator/core":"^10.0.0","@types/better-sqlite3":"^9.6.0","eslint-plugin-sonarjs":"^4.1.0","@testing-library/react":"^16.3.3","@cyclonedx/cyclonedx-npm":"6.0.1","@testing-library/jest-dom":"^7.0.1","eslint-plugin-react-hooks":"7.1.1","@stryker-mutator/tap-runner":"^10.0.0","@testing-library/user-event":"^14.6.7","babel-plugin-react-compiler":"^1.0.0","license-checker-rseidelsohn":"^5.0.1","playwright-ctrf-json-reporter":"^0.0.29"},"optionalDependencies":{"keytar":"^7.9.0","wreq-js":"3.2.0","sqlite-vec":"^0.1.9","js-tiktoken":"^1.0.20","better-sqlite3":"^13.0.3","onnxruntime-node":"1.30.0","@atjsh/llmlingua-2":"3.0.0","@huggingface/transformers":"^4.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/red-router_0.58.3_1791030469159_0.06987926442706471"}}},"time":{"created":"2026-09-17T20:49:35.250Z","modified":"2026-10-03T12:27:50.468Z","0.1.0":"2026-09-17T20:49:35.868Z","0.2.0":"2026-09-18T00:26:37.807Z","0.3.0":"2026-09-18T00:48:12.515Z","0.4.0":"2026-09-18T02:58:59.118Z","0.5.0":"2026-09-18T03:45:37.089Z","0.5.1":"2026-09-18T11:23:25.409Z","0.5.3":"2026-09-18T11:46:29.766Z","0.6.0":"2026-09-18T12:51:17.690Z","0.7.0":"2026-09-18T13:04:37.006Z","0.7.1":"2026-09-18T13:18:45.082Z","0.7.2":"2026-09-18T16:18:32.563Z","0.8.0":"2026-09-18T21:42:39.553Z","0.8.1":"2026-09-20T05:40:39.301Z","0.9.0":"2026-09-20T21:12:04.570Z","0.9.1":"2026-09-20T22:03:09.463Z","0.10.0":"2026-09-21T19:26:15.736Z","0.11.0":"2026-09-21T20:29:21.424Z","0.11.1":"2026-09-21T21:24:15.890Z","0.11.2":"2026-09-22T01:19:27.159Z","0.11.3":"2026-09-22T01:21:59.828Z","0.11.4":"2026-09-22T01:33:32.244Z","0.11.5":"2026-09-22T02:19:08.736Z","0.11.6":"2026-09-22T02:57:22.193Z","0.11.7":"2026-09-22T05:12:32.759Z","0.11.8":"2026-09-22T13:33:02.419Z","0.11.9":"2026-09-22T13:41:33.228Z","0.11.10":"2026-09-22T14:06:55.518Z","0.12.0":"2026-09-22T15:07:49.959Z","0.12.1":"2026-09-22T15:56:18.435Z","0.13.0":"2026-09-22T18:21:56.428Z","0.14.0":"2026-09-23T01:55:41.426Z","0.15.0":"2026-09-23T03:36:32.001Z","0.16.0":"2026-09-23T05:49:53.651Z","0.16.1":"2026-09-23T06:44:45.993Z","0.17.0":"2026-09-23T14:47:11.933Z","0.18.0":"2026-09-23T16:55:53.351Z","0.19.0":"2026-09-23T17:30:27.787Z","0.20.0":"2026-09-23T17:58:03.124Z","0.21.0":"2026-09-23T19:48:48.956Z","0.21.1":"2026-09-23T20:38:27.750Z","0.22.0":"2026-09-23T21:11:44.323Z","0.23.0":"2026-09-23T21:28:50.925Z","0.24.0":"2026-09-24T02:25:17.419Z","0.24.1":"2026-09-24T10:53:34.264Z","0.24.2":"2026-09-24T18:03:07.980Z","0.24.3":"2026-09-24T20:15:17.318Z","0.24.4":"2026-09-24T21:30:24.509Z","0.24.5":"2026-09-24T21:55:00.172Z","0.24.6":"2026-09-24T22:02:28.802Z","0.24.7":"2026-09-25T10:12:26.148Z","0.25.0":"2026-09-25T10:39:27.199Z","0.25.1":"2026-09-25T10:52:40.139Z","0.25.2":"2026-09-25T11:49:32.260Z","0.25.3":"2026-09-25T12:19:48.082Z","0.26.0":"2026-09-25T13:36:40.518Z","0.27.0":"2026-09-25T14:34:45.303Z","0.28.0":"2026-09-25T14:54:18.532Z","0.29.0":"2026-09-25T15:09:30.814Z","0.29.1":"2026-09-25T16:41:32.637Z","0.30.0":"2026-09-25T17:10:59.604Z","0.31.0":"2026-09-25T17:31:36.224Z","0.32.0":"2026-09-25T17:53:53.402Z","0.32.1":"2026-09-25T18:16:06.429Z","0.33.0":"2026-09-25T18:27:41.121Z","0.34.0":"2026-09-28T05:15:02.976Z","0.34.1":"2026-09-28T16:18:58.389Z","0.34.2":"2026-09-28T20:31:49.126Z","0.34.3":"2026-09-28T21:16:27.715Z","0.34.4":"2026-09-29T03:28:18.122Z","0.35.0":"2026-09-29T04:36:02.371Z","0.35.1":"2026-09-29T12:26:06.612Z","0.37.0":"2026-09-29T14:38:49.234Z","0.38.0":"2026-09-29T16:08:15.107Z","0.39.0":"2026-09-29T17:04:18.186Z","0.39.1":"2026-09-29T17:20:37.558Z","0.39.2":"2026-09-29T17:50:56.881Z","0.39.3":"2026-09-29T18:00:23.807Z","0.40.0":"2026-09-29T18:00:48.192Z","0.40.1":"2026-09-29T18:15:49.542Z","0.41.0":"2026-09-29T18:31:36.885Z","0.41.1":"2026-09-29T18:33:42.368Z","0.41.2":"2026-09-29T18:39:16.364Z","0.41.3":"2026-09-29T19:18:10.676Z","0.41.4":"2026-09-29T19:29:50.044Z","0.41.5":"2026-09-29T19:32:21.880Z","0.42.1":"2026-09-29T20:45:34.043Z","0.43.0":"2026-09-29T21:01:26.552Z","0.44.0":"2026-09-29T21:36:32.339Z","0.46.0":"2026-09-29T22:32:52.292Z","0.47.0":"2026-09-30T01:01:08.436Z","0.48.0":"2026-09-30T01:30:40.944Z","0.49.1":"2026-09-30T03:20:52.616Z","0.50.0":"2026-09-30T04:10:54.850Z","0.50.1":"2026-09-30T05:55:50.506Z","0.51.1":"2026-09-30T11:24:34.030Z","0.52.0":"2026-09-30T13:58:28.950Z","0.54.0":"2026-09-30T14:49:19.961Z","0.55.0":"2026-09-30T16:29:28.356Z","0.55.3":"2026-09-30T18:27:53.912Z","0.55.5":"2026-09-30T18:57:32.187Z","0.56.0":"2026-09-30T20:40:35.996Z","0.56.1":"2026-09-30T20:58:58.558Z","0.56.2":"2026-09-30T21:16:43.533Z","0.56.3":"2026-10-01T05:04:24.773Z","0.57.0":"2026-10-01T14:51:28.820Z","0.57.1":"2026-10-01T19:18:19.367Z","0.57.2":"2026-10-01T20:08:21.081Z","0.57.4":"2026-10-02T02:08:35.452Z","0.57.7":"2026-10-02T02:57:13.584Z","0.57.8":"2026-10-02T11:55:45.457Z","0.57.9":"2026-10-02T12:55:59.971Z","0.58.0":"2026-10-02T18:27:22.535Z","0.58.1":"2026-10-02T19:18:10.737Z","0.58.2":"2026-10-02T21:17:22.989Z","0.58.3":"2026-10-03T12:27:50.123Z"},"bugs":{"url":"https://github.com/reddb-io/red-router/issues"},"author":{"url":"fork of OmniRoute by diegosouzapw","name":"reddb.io"},"license":"MIT","homepage":"https://github.com/reddb-io/red-router","keywords":["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],"repository":{"url":"git+https://github.com/reddb-io/red-router.git","type":"git"},"description":"Unified AI router with 377 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs. RedRouter fork of OmniRoute (MIT, diegosouzapw/OmniRoute).","maintainers":[{"name":"fforattini","email":"filipeforattini1@gmail.com"}],"readme":"# RedRouter\n\n<img src=\"docs/readme/hero.svg\" alt=\"RedRouter: the control plane for AI model traffic\" width=\"100%\">\n\n[![npm](https://img.shields.io/npm/v/%40reddb-io%2Fred-router?color=ff2056)](https://www.npmjs.com/package/@reddb-io/red-router)\n[![Publish RedRouter](https://github.com/reddb-io/red-router/actions/workflows/red-publish.yml/badge.svg)](https://github.com/reddb-io/red-router/actions/workflows/red-publish.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nRedRouter is a self-hosted control plane for AI model traffic. Coding agents,\nIDE plugins and applications connect to one gateway. RedRouter selects providers,\napplies API-key policies, handles fallback, and records usage and cost.\n\nRedRouter owns the product: its interface, workflows, configuration contracts,\ndocumentation and release channel. It incorporates and improves capabilities from\n[9router](https://github.com/decolua/9router),\n[RedRouter](https://github.com/reddb-io/red-router) and\n[LiteLLM](https://github.com/BerriAI/litellm).\n\n## Integration status\n\nThe current development tree contains a large RedRouter integration. It has **not**\nbeen established as a feature-preserving replacement for RedRouter `v0.33.0`.\nThe original RedRouter remains the product baseline. Existing upstream-derived\nmodules are implementation assets; their presence does not establish product parity.\n\nKnown gaps in preserving that baseline include the original dashboard experience,\nSAML dashboard sign-in, usage-export transports, remote-router\ncatalog behavior, and the complete legacy client-discovery contract. The\n`/v1/key`, `/v1/catalog` and `/v1/capabilities` routes are restored in the working\ntree with partial compatibility; CI validation is pending. Some features,\nincluding JEV/System One and white-label branding,\nhave implementations in the new tree but still require contract-by-contract comparison.\nLiteLLM parity has not been established.\n\nThe [inheritance inventory](config/upstream/product-inheritance.json) records the\ninitial capability families, source snapshots, local evidence and unresolved work.\nIt is not an exhaustive feature list or a percentage-complete claim.\n\n## Continuity\n\n<img src=\"docs/readme/failover.svg\" alt=\"RedRouter routes a request through a combo when providers are unavailable\" width=\"100%\">\n\nThe routing engine supports model and account fallback, circuit breakers,\nconnection cooldowns, model lockouts and quota-aware selection. Providers and\nmodels must retain their distinct authentication, entitlement and transport\ncontracts; an alias alone does not make two products equivalent.\n\nOptional JEV decision routing and the separate System One evaluation endpoint\nare implemented in the source tree. Their presence does not prove real-provider\navailability or complete compatibility with every client.\n\n## Control and visibility\n\nThe source tree includes per-key policy enforcement, budgets, usage reporting,\nprovider quotas, a live console, OIDC dashboard authentication and white-label\nconfiguration. Restoring the RedRouter product experience also requires verifying\nthese features against their earlier behavior.\n\nAdditional upstream capabilities include MCP, A2A, guardrails, caching,\ncompression, evaluations and multimodal endpoints. Each capability needs an\nexplicit RedRouter integration and behavioral validation before parity is claimed.\n\n## Install the published RedRouter\n\nThe package is `@reddb-io/red-router`; the command is `red-router`.\nCheck the [release notes](https://github.com/reddb-io/red-router/releases) for the\nversion you intend to install. A successful upload job alone does not prove npm\nregistry availability.\n\n```bash\nnpm install -g @reddb-io/red-router\nred-router\n```\n\nInstallation requirements and defaults differ between the earlier RedRouter and\nthe current integration. The current source requires Node.js\n`>=22.22.2 <23 || >=24.0.0 <27`, as declared in [package.json](package.json).\n\nThe CLI restores the RedRouter v0.33 runtime defaults: port `25050`, loopback-only\nbinding (`127.0.0.1`) and data under `~/.red/router`.\n\n```bash\nred-router serve\nred-router service install\nred-router service status\n```\n\nOn Linux, service installation also enables a separate `red-router-tray.service`\nfor the graphical session. The tray attaches to the existing server and survives\nunattended package upgrades. It reports readiness after registering with the\ndesktop, restarts after a helper failure, and keeps its diagnostics in the journal.\n`red-router service status` reports server and tray state separately, including\nwhether the tray is registered. Desktop autostart supplies the session environment;\nheadless installations wait for a desktop login. Set `RED_ROUTER_TRAY=0` when\ninstalling the service to disable the tray.\n\n```bash\nred-router tray start\njournalctl --user -u red-router-tray.service\n```\n\nRuntime diagnostics are local files, accessible even when the server cannot start.\nThe tray's **Open Diagnostic Logs** opens a text file in your desktop viewer.\n\n```bash\nred-router logs\nred-router logs --open\nred-router logs --path\nred-router logs --follow --timeout 60000\nred-router logs --source requests\n```\n\nServer and CLI output is retained in `${DATA_DIR}/server/runtime.log`, with three\nrotated files of up to 4 MiB each. Credential redaction and private file permissions\napply to these diagnostics. `logs --open` and `logs --path` write a bounded snapshot\nat `${DATA_DIR}/server/diagnostics.txt`, including the existing crash log and, on\nLinux, the local server/tray journal. The default data directory is `~/.red/router`.\nExplicit remote contexts, base URLs and request filters keep using the Router's\nrequest-log API; use `--source runtime` to explicitly read this computer's files.\nDashboard request logs remain available while the server is running.\n\nUse `--host 0.0.0.0` or `--expose` only when network access is intentional and\nthe inference API is protected. The inherited `OMNIROUTE_*` environment variables\nremain compatibility aliases; new RedRouter configuration should prefer\n`RED_ROUTER_*` names where available.\n\nIn **Settings > System & Storage > Retention**, choose an automatic SQLite history\nwindow of **7 days**, **14 days**, **28 days**, or **Off**, then save. The selection\nsurvives restarts and applies to operational logs, captured payloads and completed\ntask runs. Existing installations keep their per-category rules until a preset is\nselected. Off stops this cleanup and the legacy compliance/call-log/job pruners.\nThe separate usage-history rule and financial ledger are preserved; this is not a\nreset of credentials, provider configuration, tenants, users or monthly budgets.\nExisting call-log row/file limits also apply while cleanup is enabled and may\nremove entries before the age limit. Saving Off stops further deletion batches.\n**Run cleanup now** applies the saved window immediately. Background passes run\nsix hours apart with bounded deletion batches and existing page reclamation;\nlarge backlogs may require several passes. Full SQLite VACUUM keeps its separate\nschedule and can be run manually from the storage page.\n\n## API surfaces\n\nThese route implementations are present in the current source. Protocol and\nprovider parity must be verified separately.\n\n| Interface           | Route                                   |\n| ------------------- | --------------------------------------- |\n| OpenAI chat         | `POST /v1/chat/completions`             |\n| OpenAI Responses    | `POST /v1/responses`                    |\n| Anthropic Messages  | `POST /v1/messages`                     |\n| Model discovery     | `GET /v1/models`                        |\n| Key discovery       | `GET /v1/key`                           |\n| Grouped catalog     | `GET /v1/catalog`                       |\n| Client capabilities | `GET /v1/capabilities`                  |\n| Embeddings          | `POST /v1/embeddings`                   |\n| System One          | `POST /v1/systemone` or `/v1/decisions` |\n| MCP                 | `/v1/mcp`                               |\n| Audio translation   | `POST /v1/audio/translations`           |\n\nThe product UI and CLI are English-only. Translation APIs are separate product\nfeatures and remain in scope.\n\n### Client discovery compatibility\n\n`GET /v1/key` requires a valid persisted API key. It returns only public key\nidentity, role, configured model-ID preference, and the loopback-only legacy MCP\nendpoint metadata. Environment-only keys are not persisted MCP tenants and receive\n401 here. Bearer, `x-api-key`, and `x-goog-api-key` header credentials are accepted;\nURL credentials are not.\n\n`GET /v1/catalog` groups the existing authorized `/v1/models` data by `owned_by`,\nseparating combo and alias entries without rewriting their routable IDs. It uses\nthe same catalog access policy, but always rejects an explicitly invalid key.\n`GET /v1/capabilities` reports the same scoped System One model IDs, public routing\nstrategies and combo-scoped decision hints. Listing a System One model is not a\nlive availability check; its availability is explicitly `not_probed`.\n\n`GET /v1/models?capabilities=decision` lists decision models for the caller's\nconnection. The equivalent `GET /v1/models/systemone` and `/v1/models/decisions`\nreturn the same model kind. JEV through OpenRouter is advertised as\n`openrouter/typesafe/jev-1.13`, with `type: \"systemone\"`,\n`supported_endpoints: [\"systemone\", \"decisions\"]` and `capabilities.decision: true`.\nDecision-only models do not advertise chat tools, chat reasoning or vision.\n\nFor generation models, use `GET /v1/models?capabilities=chat`. Optional filters\n`reasoning`, `tools`, `vision` and `structured-output` match flags that are true\nin the catalog; comma-separated or repeated values require all requested\ncapabilities, for example `?capabilities=chat,tools,vision`. Filtering preserves\nAPI-key permissions and runs before `limit`/`after` pagination. Unsupported or\nempty capability values return 400. Clients should select a connection first,\nread its authorized catalog, then select an S2 generation model or an S1 decision\nmodel from that list. S1 requests use `/v1/systemone` or `/v1/decisions`.\n\nThe `/v1/catalog` and `/v1/capabilities` documents accept only the optional `for`\nclient label and `variants=expand`.\nPagination, other filters and collapsed variants return 400 instead of silently\nproducing an incomplete discovery document. Responses are private and not cached.\nTheir opaque catalog version hashes the authorized entries, excluding generated\n`created` timestamps; it is not the legacy shared `/v1/models` version header.\n\nThis is a partial restoration, not complete v0.33.0 compatibility. Recommendations,\naccount metadata, collapsed variants, per-key ID-format application to model lists,\nstable instance identity, and the old global reasoning/session discovery fields\nremain pending. `/v1/key` reports the stored ID-format preference; it does not imply\nthat `/v1/models` or `/v1/catalog` already applies that preference.\n\n### Remote router catalogs\n\nThe internal `red-router` provider connects to another RedRouter using its URL\nand API key. Public model routes use `red/` for each hop: a remote\n`openrouter/typesafe/jev-1.13` becomes `red/openrouter/typesafe/jev-1.13`, then\n`red/red/openrouter/typesafe/jev-1.13` through another router. The downstream ID\nis preserved, and dispatch removes exactly one local prefix. Existing\n`red-router/` and `redrouter/` request prefixes remain accepted.\n\nDiscovery persists chat and System One entries per connection, bound to the\nremote URL and credential. Remote capabilities remain authoritative. Decisions\nappear in `GET /v1/models?capabilities=decision` and `/v1/models/systemone`; native\n`POST /v1/systemone` or `/v1/decisions` requests retain state, questions and\nextension fields, using the selected connection's remote `/v1/systemone` endpoint.\nA connection can dispatch only decisions present in its saved catalog. API-key\nconnection restrictions, outbound URL guards, proxies and lease isolation apply.\n\nAutomatic discovery is the default; `autoFetchModels: false` and `autoSync: false`\nremain respected. Reads refresh after five minutes, and background refresh uses\nthe existing scheduler. Outages retain the same credential's saved catalog;\nconnection edits invalidate it. Catalogs exclude routes with eight or more router\nprefixes to bound growth in cyclic connection graphs. Legacy embedded cache/proxy\nmigration remains pending; unsupported legacy proxy settings fail closed.\n\n**System → Settings → Routing → Model visibility** controls transparency and\nprovider priority globally and per tenant. With transparency off, chat and\nSystem One catalogs expose bare model names, and each protocol tries the visible\nproviders in that order. Owner pins override tenant choices; tenant choices apply\nonly when delegation is enabled. Models from other protocols keep their IDs.\nFederation regressions run in CI with local HTTP fixtures; production credentials\nare needed to validate an external chain end to end.\n\n### Access management\n\nThe **Access** rail area contains **Tenants**, **Users** and **Roles**. Open\n`/access/tenants` to create a tenant, assign an existing active admin as its owner,\nrecord owner/technical/billing contacts and metadata, and review UTC monthly API\nusage per tenant and per key. `/access/users` lists users across tenants, with\nfilters, invitations, role/status changes and session revocation. Invitation links\nlet users set a password and sign in to their tenant account. Tenant sessions retain\ntheir existing API permissions; they do not enter the instance dashboard.\n\nA tenant owner has tenant-admin permissions, without instance-wide access. Transfer\nownership before demoting, disabling or removing that user. Instance ownership\ncontinues to use the instance sign-in. Role and status changes invalidate tenant\nsessions.\n\nMonthly reports aggregate retained request history and recorded costs separately.\nNew usage rows retain tenant attribution when a key moves or is deleted. Older rows\nare backfilled from surviving keys at migration; rows with unknown ownership and\nhistorical aggregates without key identity are excluded. Recorded cost is available\npriced usage, not an invoice. `/system/tenants` redirects to `/access/tenants`.\n\n## Persistence and scale\n\nSQLite is the initial local backend. Some runtime coordination has optional Redis\nimplementations. That does not make the whole gateway safe to run as a cluster.\n\nShared durable storage, atomic budgets, distributed leases, idempotent usage\naccounting and migration ownership require explicit implementation and\nmulti-replica validation. PostgreSQL/replica support is an integration objective,\nnot a claim about the current release.\n\n## Development and validation\n\n```bash\nnpm ci\nnpm run dev\nnpm run build:release\n```\n\nThe development server uses port `25050`. See\n[CONTRIBUTING.md](CONTRIBUTING.md) for the test suites.\n\nFor the current integration work, validation runs through GitHub Actions.\nCoverage percentages are not a release gate. Release validation must cover the\nRedRouter contracts as well as upstream features, the packed artifact, registry\navailability and the published installation.\n\n## Documentation and provenance\n\n- [Architecture](docs/architecture/ARCHITECTURE.md)\n- [Existing 9router/OmniRoute assessment](docs/architecture/UPSTREAM_PARITY_ASSESSMENT.md)\n- [Capability inheritance inventory](config/upstream/product-inheritance.json)\n- [Changelog](CHANGELOG.md)\n- [Third-party notices](THIRD_PARTY_NOTICES.md)\n\nUpstream attribution and applicable licenses are preserved. Reusing an upstream\nimplementation does not transfer ownership of RedRouter's product direction to\nthat upstream. LiteLLM's enterprise directory has separate licensing; functional\nrequirements must be distinguished from permission to copy an implementation.\n","readmeFilename":"README.md"}