From 69b2d7706ea826f67049e78c82716a17475095e7 Mon Sep 17 00:00:00 2001 From: JacobLinCool Date: Tue, 24 Dec 2024 03:03:16 +0800 Subject: [PATCH] feat: improve asr with mp3 and gemini (#60) * feat: improve asr with mp3 and gemini * chore: add GOOGLE_GENAI_API_KEY to env example --- .env.example | 1 + package.json | 5 + pnpm-lock.yaml | 1743 ++++++++++++++++- .../components/session/ParticipantView.svelte | 18 +- src/lib/stt/gemini.ts | 28 + src/lib/stt/{core.ts => hf-whisper.ts} | 7 +- src/lib/utils/wav2mp3.ts | 75 + src/routes/api/stt/+server.ts | 7 +- src/routes/test/stt/+page.svelte | 94 + vite.config.ts | 1 + 10 files changed, 1902 insertions(+), 77 deletions(-) create mode 100644 src/lib/stt/gemini.ts rename src/lib/stt/{core.ts => hf-whisper.ts} (80%) create mode 100644 src/lib/utils/wav2mp3.ts create mode 100644 src/routes/test/stt/+page.svelte diff --git a/.env.example b/.env.example index 7ac88f9..1123611 100644 --- a/.env.example +++ b/.env.example @@ -18,3 +18,4 @@ OPENAI_API_KEY="sk-xxx" HUGGINGFACE_TOKEN="hf_xxx" LLAMA_CLOUD_API_KEY="llx-xxx" +GOOGLE_GENAI_API_KEY="XXX" diff --git a/package.json b/package.json index 9e4acf8..f78136d 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,10 @@ }, "devDependencies": { "@aws-sdk/client-s3": "^3.699.0", + "@ffmpeg/ffmpeg": "^0.12.10", + "@ffmpeg/util": "^0.12.1", + "@genkit-ai/googleai": "^0.9.12", + "@hinagiku/ffmpeg-core": "0.12.6-pcm-mpeg-only", "@ricky0123/vad-web": "^0.0.22", "@sveltejs/adapter-auto": "^3.3.1", "@sveltejs/adapter-vercel": "^5.5.2", @@ -41,6 +45,7 @@ "firebase-admin": "^12.7.0", "flowbite": "^2.5.2", "flowbite-svelte": "^0.47.3", + "genkit": "^0.9.12", "globals": "^15.12.0", "html5-qrcode": "^2.3.8", "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b16f1c9..f16a0ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,18 @@ importers: '@aws-sdk/client-s3': specifier: ^3.699.0 version: 3.699.0 + '@ffmpeg/ffmpeg': + specifier: ^0.12.10 + version: 0.12.10 + '@ffmpeg/util': + specifier: ^0.12.1 + version: 0.12.1 + '@genkit-ai/googleai': + specifier: ^0.9.12 + version: 0.9.12(encoding@0.1.13)(genkit@0.9.12) + '@hinagiku/ffmpeg-core': + specifier: 0.12.6-pcm-mpeg-only + version: 0.12.6-pcm-mpeg-only '@ricky0123/vad-web': specifier: ^0.0.22 version: 0.0.22 @@ -76,6 +88,9 @@ importers: flowbite-svelte: specifier: ^0.47.3 version: 0.47.3(rollup@4.27.4)(svelte@5.2.7) + genkit: + specifier: ^0.9.12 + version: 0.9.12 globals: specifier: ^15.12.0 version: 15.12.0 @@ -1159,6 +1174,27 @@ packages: integrity: sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w== } + '@ffmpeg/ffmpeg@0.12.10': + resolution: + { + integrity: sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ== + } + engines: { node: '>=18.x' } + + '@ffmpeg/types@0.12.2': + resolution: + { + integrity: sha512-NJtxwPoLb60/z1Klv0ueshguWQ/7mNm106qdHkB4HL49LXszjhjCCiL+ldHJGQ9ai2Igx0s4F24ghigy//ERdA== + } + engines: { node: '>=16.x' } + + '@ffmpeg/util@0.12.1': + resolution: + { + integrity: sha512-10jjfAKWaDyb8+nAkijcsi9wgz/y26LOc1NKJradNMyCIl6usQcBbhkjX5qhALrSBcOy6TOeksunTYa+a03qNQ== + } + engines: { node: '>=18.x' } + '@firebase/analytics-compat@0.2.16': resolution: { @@ -1573,6 +1609,32 @@ packages: integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== } + '@genkit-ai/ai@0.9.12': + resolution: + { + integrity: sha512-xyVVAIGKNpj5zCkoEfWZkzwctl0/hmpX6vKZgdgMH2MiqP5LzTp7rUekBMon8c1rMDVAze97QVSjAmZIoMLSlA== + } + + '@genkit-ai/core@0.9.12': + resolution: + { + integrity: sha512-QPJZ3TL5Iq2fyeo30MpUjd3ZLcYQf97RsitDZhMbGy3vMwbgig0nhEbJ6v/qaWsOMqSfIxJE/gETY3mMts1vRg== + } + + '@genkit-ai/dotprompt@0.9.12': + resolution: + { + integrity: sha512-eEHBRzRVemiPuqCBbXiLgltNWpmCHmC+gVHBhsAnrfOYBlwmPvh2nnAPBXGYnkDH87PuN11jg8YJQmO4kQuoSw== + } + + '@genkit-ai/googleai@0.9.12': + resolution: + { + integrity: sha512-q6bX9Nq4xVpzH4vd9W+rg4xO7SVodG516K4BVM04DtxU5w0ogwLl/mRPEU0VIoISjD6FwaC4sPjPkEerTp8a4g== + } + peerDependencies: + genkit: 0.9.12 + '@google-cloud/firestore@7.10.0': resolution: { @@ -1608,6 +1670,13 @@ packages: } engines: { node: '>=14' } + '@google/generative-ai@0.21.0': + resolution: + { + integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg== + } + engines: { node: '>=18.0.0' } + '@grpc/grpc-js@1.12.2': resolution: { @@ -1630,6 +1699,13 @@ packages: engines: { node: '>=6' } hasBin: true + '@hinagiku/ffmpeg-core@0.12.6-pcm-mpeg-only': + resolution: + { + integrity: sha512-wbaxfON9t48Vp6ZdkRTaQpGStUtvo2ASopQW8p4+qPWXG12Twa2BOZ6O4MkRZ1KRIDn2r/VGi0nWcSars2GZgw== + } + engines: { node: '>=16.x' } + '@humanfs/core@0.19.1': resolution: { @@ -1747,6 +1823,13 @@ packages: } engines: { node: '>= 8' } + '@opentelemetry/api-logs@0.52.1': + resolution: + { + integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A== + } + engines: { node: '>=14' } + '@opentelemetry/api@1.9.0': resolution: { @@ -1754,6 +1837,227 @@ packages: } engines: { node: '>=8.0.0' } + '@opentelemetry/context-async-hooks@1.25.1': + resolution: + { + integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/context-async-hooks@1.30.0': + resolution: + { + integrity: sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.25.1': + resolution: + { + integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.30.0': + resolution: + { + integrity: sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1': + resolution: + { + integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-http@0.52.1': + resolution: + { + integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.52.1': + resolution: + { + integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-zipkin@1.25.1': + resolution: + { + integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation@0.52.1': + resolution: + { + integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.52.1': + resolution: + { + integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.52.1': + resolution: + { + integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.52.1': + resolution: + { + integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/propagator-b3@1.25.1': + resolution: + { + integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@1.25.1': + resolution: + { + integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.25.1': + resolution: + { + integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.30.0': + resolution: + { + integrity: sha512-5mGMjL0Uld/99t7/pcd7CuVtJbkARckLVuiOX84nO8RtLtIz0/J6EOHM2TGvPZ6F4K+XjUq13gMx14w80SVCQg== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.52.1': + resolution: + { + integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.25.1': + resolution: + { + integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.30.0': + resolution: + { + integrity: sha512-5kcj6APyRMvv6dEIP5plz2qfJAD4OMipBRT11u/pa1a68rHKI2Ln+iXVkAGKgx8o7CXbD7FdPypTUY88ZQgP4Q== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-node@0.52.1': + resolution: + { + integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.25.1': + resolution: + { + integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.0': + resolution: + { + integrity: sha512-RKQDaDIkV7PwizmHw+rE/FgfB2a6MBx+AEVVlAHXRG1YYxLiBpPX2KhmoB99R5vA4b72iJrjle68NDWnbrE9Dg== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.25.1': + resolution: + { + integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ== + } + engines: { node: '>=14' } + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.25.1': + resolution: + { + integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ== + } + engines: { node: '>=14' } + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: + { + integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== + } + engines: { node: '>=14' } + '@pkgjs/parseargs@0.11.0': resolution: { @@ -2535,6 +2839,12 @@ packages: integrity: sha512-Ay5BZuO1UkTmVHzZJNvZKw/E+iB3GQABb6kijEz89w2JrfhNA+M/ebp18pfz9Gqe9ywhMC8AA8yC01lZq48J+Q== } + '@types/node@20.17.10': + resolution: + { + integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA== + } + '@types/node@22.10.2': resolution: { @@ -2589,6 +2899,12 @@ packages: integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== } + '@types/shimmer@1.2.0': + resolution: + { + integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== + } + '@types/tough-cookie@4.0.5': resolution: { @@ -2771,6 +3087,13 @@ packages: } engines: { node: '>=6.5' } + accepts@1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + } + engines: { node: '>= 0.6' } + acorn-import-attributes@1.9.5: resolution: { @@ -2824,12 +3147,29 @@ packages: } engines: { node: '>= 8.0.0' } + ajv-formats@3.0.1: + resolution: + { + integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + } + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + ajv@8.17.1: + resolution: + { + integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + } + ansi-escapes@7.0.0: resolution: { @@ -2890,6 +3230,12 @@ packages: integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== } + argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + } + argparse@2.0.1: resolution: { @@ -2903,6 +3249,12 @@ packages: } engines: { node: '>= 0.4' } + array-flatten@1.1.1: + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + } + arrify@2.0.1: resolution: { @@ -2917,6 +3269,12 @@ packages: } engines: { node: '>=12' } + async-mutex@0.5.0: + resolution: + { + integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA== + } + async-retry@1.3.3: resolution: { @@ -2983,6 +3341,13 @@ packages: integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== } + body-parser@1.20.3: + resolution: + { + integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + bowser@2.11.0: resolution: { @@ -3022,6 +3387,13 @@ packages: integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== } + bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + } + engines: { node: '>= 0.8' } + cac@6.7.14: resolution: { @@ -3029,6 +3401,20 @@ packages: } engines: { node: '>=8' } + call-bind-apply-helpers@1.0.1: + resolution: + { + integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + } + engines: { node: '>= 0.4' } + + call-bound@1.0.3: + resolution: + { + integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + } + engines: { node: '>= 0.4' } + callsites@3.1.0: resolution: { @@ -3105,6 +3491,12 @@ packages: } engines: { node: '>=18' } + cjs-module-lexer@1.4.1: + resolution: + { + integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + } + cli-cursor@5.0.0: resolution: { @@ -3185,19 +3577,53 @@ packages: } engines: { node: ^14.18.0 || >=16.10.0 } - cookie@0.6.0: + content-disposition@0.5.4: resolution: { - integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== } engines: { node: '>= 0.6' } - cross-spawn@7.0.6: + content-type@1.0.5: resolution: { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== } - engines: { node: '>= 8' } + engines: { node: '>= 0.6' } + + cookie-signature@1.0.6: + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + } + + cookie@0.6.0: + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + } + engines: { node: '>= 0.6' } + + cookie@0.7.1: + resolution: + { + integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + } + engines: { node: '>= 0.6' } + + cors@2.8.5: + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + } + engines: { node: '>= 0.10' } + + cross-spawn@7.0.6: + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + } + engines: { node: '>= 8' } cssesc@3.0.0: resolution: @@ -3207,6 +3633,24 @@ packages: engines: { node: '>=4' } hasBin: true + data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + } + engines: { node: '>= 12' } + + debug@2.6.9: + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.3.7: resolution: { @@ -3253,6 +3697,20 @@ packages: } engines: { node: '>=0.4.0' } + depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + } + engines: { node: '>= 0.8' } + + destroy@1.2.0: + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + detect-libc@2.0.3: resolution: { @@ -3297,6 +3755,13 @@ packages: } engines: { node: '>=12' } + dunder-proto@1.0.1: + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + } + engines: { node: '>= 0.4' } + duplexify@4.1.3: resolution: { @@ -3315,6 +3780,12 @@ packages: integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== } + ee-first@1.1.1: + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + } + electron-to-chromium@1.5.64: resolution: { @@ -3339,6 +3810,20 @@ packages: integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + encodeurl@1.0.2: + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + } + engines: { node: '>= 0.8' } + + encodeurl@2.0.0: + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + } + engines: { node: '>= 0.8' } + encoding@0.1.13: resolution: { @@ -3358,12 +3843,33 @@ packages: } engines: { node: '>=18' } + es-define-property@1.0.1: + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + } + engines: { node: '>= 0.4' } + + es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + } + engines: { node: '>= 0.4' } + es-module-lexer@1.5.4: resolution: { integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== } + es-object-atoms@1.0.0: + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + } + engines: { node: '>= 0.4' } + esbuild@0.21.5: resolution: { @@ -3395,6 +3901,12 @@ packages: } engines: { node: '>=6' } + escape-html@1.0.3: + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + } + escape-string-regexp@4.0.0: resolution: { @@ -3494,6 +4006,14 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + } + engines: { node: '>=4' } + hasBin: true + esquery@1.6.0: resolution: { @@ -3540,6 +4060,13 @@ packages: } engines: { node: '>=0.10.0' } + etag@1.8.1: + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + } + engines: { node: '>= 0.6' } + event-target-shim@5.0.1: resolution: { @@ -3567,6 +4094,13 @@ packages: } engines: { node: '>=12.0.0' } + express@4.21.2: + resolution: + { + integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + } + engines: { node: '>= 0.10.0' } + extend@3.0.2: resolution: { @@ -3605,6 +4139,12 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } + fast-uri@3.0.3: + resolution: + { + integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + } + fast-xml-parser@4.4.1: resolution: { @@ -3643,6 +4183,13 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + } + engines: { node: ^12.20 || >= 14.13 } + file-entry-cache@8.0.0: resolution: { @@ -3663,6 +4210,13 @@ packages: } engines: { node: '>=8' } + finalhandler@1.3.1: + resolution: + { + integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + } + engines: { node: '>= 0.8' } + find-up@4.1.0: resolution: { @@ -3764,12 +4318,39 @@ packages: } engines: { node: '>= 12.20' } + formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + } + engines: { node: '>=12.20.0' } + + forwarded@0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + } + engines: { node: '>= 0.6' } + fraction.js@4.3.7: resolution: { integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== } + fresh@0.5.2: + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + } + engines: { node: '>= 0.6' } + + front-matter@4.0.2: + resolution: + { + integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== + } + fs-extra@11.2.0: resolution: { @@ -3817,6 +4398,12 @@ packages: } engines: { node: '>=14' } + genkit@0.9.12: + resolution: + { + integrity: sha512-m1VQE/yhuii0y1aGTnkoSesSXTNE25q1s7vv5YVgJWa/t2gOXuznZOoHTJ847f/3mKC7fgnV7xGI+t/+7wbe0g== + } + get-caller-file@2.0.5: resolution: { @@ -3831,6 +4418,20 @@ packages: } engines: { node: '>=18' } + get-intrinsic@1.2.6: + resolution: + { + integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + } + engines: { node: '>= 0.4' } + + get-port@5.1.1: + resolution: + { + integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + } + engines: { node: '>=8' } + get-stream@8.0.1: resolution: { @@ -3912,6 +4513,13 @@ packages: } engines: { node: '>=14' } + gopd@1.2.0: + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + } + engines: { node: '>= 0.4' } + graceful-fs@4.2.11: resolution: { @@ -3937,6 +4545,14 @@ packages: integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== } + handlebars@4.7.8: + resolution: + { + integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + } + engines: { node: '>=0.4.7' } + hasBin: true + has-flag@4.0.0: resolution: { @@ -3944,6 +4560,13 @@ packages: } engines: { node: '>=8' } + has-symbols@1.1.0: + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + } + engines: { node: '>= 0.4' } + hasown@2.0.2: resolution: { @@ -3963,6 +4586,13 @@ packages: integrity: sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ== } + http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + } + engines: { node: '>= 0.8' } + http-parser-js@0.5.8: resolution: { @@ -4011,6 +4641,13 @@ packages: engines: { node: '>=18' } hasBin: true + iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + } + engines: { node: '>=0.10.0' } + iconv-lite@0.4.5: resolution: { @@ -4045,6 +4682,12 @@ packages: } engines: { node: '>=6' } + import-in-the-middle@1.12.0: + resolution: + { + integrity: sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w== + } + import-meta-resolve@4.1.0: resolution: { @@ -4071,6 +4714,13 @@ packages: integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + } + engines: { node: '>= 0.10' } + is-binary-path@2.1.0: resolution: { @@ -4178,6 +4828,13 @@ packages: integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== } + js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + } + hasBin: true + js-yaml@4.1.0: resolution: { @@ -4203,12 +4860,32 @@ packages: integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + } + + json-schema@0.4.0: + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + } + json-stable-stringify-without-jsonify@1.0.1: resolution: { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + } + engines: { node: '>=6' } + hasBin: true + jsonfile@6.1.0: resolution: { @@ -4472,6 +5149,13 @@ packages: engines: { node: '>= 18' } hasBin: true + math-intrinsics@1.1.0: + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + } + engines: { node: '>= 0.4' } + mdsvex@0.11.2: resolution: { @@ -4480,6 +5164,19 @@ packages: peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 + media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + } + engines: { node: '>= 0.6' } + + merge-descriptors@1.0.3: + resolution: + { + integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + } + merge-stream@2.0.0: resolution: { @@ -4493,6 +5190,13 @@ packages: } engines: { node: '>= 8' } + methods@1.1.2: + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + } + engines: { node: '>= 0.6' } + micromatch@4.0.8: resolution: { @@ -4514,6 +5218,14 @@ packages: } engines: { node: '>= 0.6' } + mime@1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + } + engines: { node: '>=4' } + hasBin: true + mime@3.0.0: resolution: { @@ -4556,6 +5268,12 @@ packages: } engines: { node: '>=16 || 14 >=14.17' } + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + } + minipass@7.1.2: resolution: { @@ -4578,6 +5296,12 @@ packages: engines: { node: '>=10' } hasBin: true + module-details-from-path@1.0.3: + resolution: + { + integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + } + mri@1.2.0: resolution: { @@ -4592,6 +5316,12 @@ packages: } engines: { node: '>=10' } + ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + } + ms@2.1.3: resolution: { @@ -4618,6 +5348,19 @@ packages: integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + } + engines: { node: '>= 0.6' } + + neo-async@2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + } + node-domexception@1.0.0: resolution: { @@ -4637,6 +5380,13 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + node-forge@1.3.1: resolution: { @@ -4700,6 +5450,20 @@ packages: } engines: { node: '>= 6' } + object-inspect@1.13.3: + resolution: + { + integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + } + engines: { node: '>= 0.4' } + + on-finished@2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + } + engines: { node: '>= 0.8' } + once@1.4.0: resolution: { @@ -4801,9 +5565,22 @@ packages: parent-module@1.0.1: resolution: { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + } + engines: { node: '>=6' } + + parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + } + engines: { node: '>= 0.8' } + + partial-json@0.1.7: + resolution: + { + integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA== } - engines: { node: '>=6' } path-exists@4.0.0: resolution: @@ -4846,6 +5623,12 @@ packages: } engines: { node: '>=16 || 14 >=14.18' } + path-to-regexp@0.1.12: + resolution: + { + integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + } + pathe@1.1.2: resolution: { @@ -5145,6 +5928,13 @@ packages: } engines: { node: '>=12.0.0' } + proxy-addr@2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + } + engines: { node: '>= 0.10' } + punycode@2.3.1: resolution: { @@ -5160,12 +5950,33 @@ packages: engines: { node: '>=10.13.0' } hasBin: true + qs@6.13.0: + resolution: + { + integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + } + engines: { node: '>=0.6' } + queue-microtask@1.2.3: resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + } + engines: { node: '>= 0.6' } + + raw-body@2.5.2: + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + } + engines: { node: '>= 0.8' } + read-cache@1.0.0: resolution: { @@ -5200,6 +6011,20 @@ packages: } engines: { node: '>=0.10.0' } + require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + } + engines: { node: '>=0.10.0' } + + require-in-the-middle@7.4.0: + resolution: + { + integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ== + } + engines: { node: '>=8.6.0' } + require-main-filename@2.0.0: resolution: { @@ -5321,6 +6146,20 @@ packages: engines: { node: '>=10' } hasBin: true + send@0.19.0: + resolution: + { + integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + } + engines: { node: '>= 0.8.0' } + + serve-static@1.16.2: + resolution: + { + integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + } + engines: { node: '>= 0.8.0' } + set-blocking@2.0.0: resolution: { @@ -5333,6 +6172,12 @@ packages: integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== } + setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + } + shebang-command@2.0.0: resolution: { @@ -5347,6 +6192,40 @@ packages: } engines: { node: '>=8' } + shimmer@1.2.1: + resolution: + { + integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + } + + side-channel-list@1.0.0: + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + } + engines: { node: '>= 0.4' } + + side-channel-map@1.0.1: + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + } + engines: { node: '>= 0.4' } + + side-channel-weakmap@1.0.2: + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + } + engines: { node: '>= 0.4' } + + side-channel@1.1.0: + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + } + engines: { node: '>= 0.4' } + siginfo@2.0.0: resolution: { @@ -5388,12 +6267,32 @@ packages: } engines: { node: '>=0.10.0' } + source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + } + engines: { node: '>=0.10.0' } + + sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + } + stackback@0.0.2: resolution: { integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } + statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + } + engines: { node: '>= 0.8' } + std-env@3.8.0: resolution: { @@ -5680,6 +6579,13 @@ packages: } engines: { node: '>=8.0' } + toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + } + engines: { node: '>=0.6' } + totalist@3.0.1: resolution: { @@ -5729,6 +6635,13 @@ packages: } engines: { node: '>= 0.8.0' } + type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + } + engines: { node: '>= 0.6' } + typescript-eslint@8.15.0: resolution: { @@ -5750,12 +6663,26 @@ packages: engines: { node: '>=14.17' } hasBin: true + uglify-js@3.19.3: + resolution: + { + integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + } + engines: { node: '>=0.8.0' } + hasBin: true + undici-types@5.26.5: resolution: { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } + undici-types@6.19.8: + resolution: + { + integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + } + undici-types@6.20.0: resolution: { @@ -5775,6 +6702,13 @@ packages: } engines: { node: '>= 10.0.0' } + unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + } + engines: { node: '>= 0.8' } + update-browserslist-db@1.1.1: resolution: { @@ -5796,6 +6730,13 @@ packages: integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + utils-merge@1.0.1: + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + } + engines: { node: '>= 0.4.0' } + uuid@10.0.0: resolution: { @@ -5824,6 +6765,13 @@ packages: } hasBin: true + vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + } + engines: { node: '>= 0.8' } + vfile-message@2.0.4: resolution: { @@ -5920,6 +6868,13 @@ packages: jsdom: optional: true + web-streams-polyfill@3.3.3: + resolution: + { + integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + } + engines: { node: '>= 8' } + web-streams-polyfill@4.0.0-beta.3: resolution: { @@ -5982,6 +6937,12 @@ packages: } engines: { node: '>=0.10.0' } + wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + } + wrap-ansi@6.2.0: resolution: { @@ -6106,6 +7067,14 @@ packages: integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w== } + zod-to-json-schema@3.24.1: + resolution: + { + integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w== + } + peerDependencies: + zod: ^3.24.1 + zod@3.23.8: resolution: { @@ -6884,6 +7853,14 @@ snapshots: '@fastify/busboy@3.0.0': {} + '@ffmpeg/ffmpeg@0.12.10': + dependencies: + '@ffmpeg/types': 0.12.2 + + '@ffmpeg/types@0.12.2': {} + + '@ffmpeg/util@0.12.1': {} + '@firebase/analytics-compat@0.2.16(@firebase/app-compat@0.2.46)(@firebase/app@0.10.16)': dependencies: '@firebase/analytics': 0.10.10(@firebase/app@0.10.16) @@ -7255,6 +8232,60 @@ snapshots: '@floating-ui/utils@0.2.8': {} + '@genkit-ai/ai@0.9.12': + dependencies: + '@genkit-ai/core': 0.9.12 + '@opentelemetry/api': 1.9.0 + '@types/node': 20.17.10 + colorette: 2.0.20 + json5: 2.2.3 + node-fetch: 3.3.2 + partial-json: 0.1.7 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color + + '@genkit-ai/core@0.9.12': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.0(@opentelemetry/api@1.9.0) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + async-mutex: 0.5.0 + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.2 + get-port: 5.1.1 + json-schema: 0.4.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.1(zod@3.23.8) + transitivePeerDependencies: + - supports-color + + '@genkit-ai/dotprompt@0.9.12': + dependencies: + '@genkit-ai/ai': 0.9.12 + '@genkit-ai/core': 0.9.12 + front-matter: 4.0.2 + handlebars: 4.7.8 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + + '@genkit-ai/googleai@0.9.12(encoding@0.1.13)(genkit@0.9.12)': + dependencies: + '@google/generative-ai': 0.21.0 + genkit: 0.9.12 + google-auth-library: 9.15.0(encoding@0.1.13) + node-fetch: 3.3.2 + transitivePeerDependencies: + - encoding + - supports-color + '@google-cloud/firestore@7.10.0(encoding@0.1.13)': dependencies: '@opentelemetry/api': 1.9.0 @@ -7301,11 +8332,12 @@ snapshots: - supports-color optional: true + '@google/generative-ai@0.21.0': {} + '@grpc/grpc-js@1.12.2': dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 - optional: true '@grpc/grpc-js@1.9.15': dependencies: @@ -7319,6 +8351,8 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 + '@hinagiku/ffmpeg-core@0.12.6-pcm-mpeg-only': {} + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -7328,70 +8362,252 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@mapbox/node-pre-gyp@2.0.0-rc.0(encoding@0.1.13)': + dependencies: + consola: 3.3.0 + detect-libc: 2.0.3 + https-proxy-agent: 7.0.5 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 8.0.0 + semver: 7.6.3 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@opentelemetry/api-logs@0.52.1': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/context-async-hooks@1.30.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.12.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.12.0 + require-in-the-middle: 7.4.0 + semver: 7.6.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@humanwhocodes/retry@0.4.1': {} + '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.12.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@isaacs/cliui@8.0.2': + '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + protobufjs: 7.4.0 - '@isaacs/fs-minipass@4.0.1': + '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - minipass: 7.1.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@jridgewell/gen-mapping@0.3.5': + '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@jridgewell/resolve-uri@3.1.2': {} + '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 - '@jridgewell/set-array@1.2.1': {} + '@opentelemetry/resources@1.30.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@jridgewell/trace-mapping@0.3.25': + '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + lodash.merge: 4.6.2 - '@js-sdsl/ordered-map@4.4.2': - optional: true + '@opentelemetry/sdk-metrics@1.30.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0) - '@mapbox/node-pre-gyp@2.0.0-rc.0(encoding@0.1.13)': + '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)': dependencies: - consola: 3.3.0 - detect-libc: 2.0.3 - https-proxy-agent: 7.0.5 - node-fetch: 2.7.0(encoding@0.1.13) - nopt: 8.0.0 - semver: 7.6.3 - tar: 7.4.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 transitivePeerDependencies: - - encoding - supports-color - '@nodelib/fs.scandir@2.1.5': + '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 - '@nodelib/fs.stat@2.0.5': {} + '@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 - '@nodelib/fs.walk@1.2.8': + '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + semver: 7.6.3 - '@opentelemetry/api@1.9.0': - optional: true + '@opentelemetry/semantic-conventions@1.25.1': {} + + '@opentelemetry/semantic-conventions@1.28.0': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -7958,6 +9174,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.17.10': + dependencies: + undici-types: 6.19.8 + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 @@ -7993,6 +9213,8 @@ snapshots: '@types/node': 22.10.2 '@types/send': 0.17.4 + '@types/shimmer@1.2.0': {} + '@types/tough-cookie@4.0.5': optional: true @@ -8150,6 +9372,11 @@ snapshots: dependencies: event-target-shim: 5.0.1 + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -8181,6 +9408,10 @@ snapshots: dependencies: humanize-ms: 1.2.1 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -8188,6 +9419,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -8221,15 +9459,25 @@ snapshots: arg@5.0.2: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-query@5.3.2: {} + array-flatten@1.1.1: {} + arrify@2.0.1: optional: true assertion-error@2.0.1: {} + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -8253,11 +9501,9 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: - optional: true + base64-js@1.5.1: {} - bignumber.js@9.1.2: - optional: true + bignumber.js@9.1.2: {} binary-extensions@2.3.0: {} @@ -8265,6 +9511,23 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + bowser@2.11.0: {} brace-expansion@1.1.11: @@ -8289,8 +9552,20 @@ snapshots: buffer-equal-constant-time@1.0.1: {} + bytes@3.1.2: {} + cac@6.7.14: {} + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -8334,6 +9609,8 @@ snapshots: chownr@3.0.0: {} + cjs-module-lexer@1.4.1: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -8375,8 +9652,23 @@ snapshots: consola@3.3.0: {} + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + cookie@0.6.0: {} + cookie@0.7.1: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -8385,6 +9677,12 @@ snapshots: cssesc@3.0.0: {} + data-uri-to-buffer@4.0.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.3.7: dependencies: ms: 2.1.3 @@ -8399,6 +9697,10 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + + destroy@1.2.0: {} + detect-libc@2.0.3: {} devalue@5.1.1: {} @@ -8415,6 +9717,12 @@ snapshots: dotenv@16.4.5: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 @@ -8429,6 +9737,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + ee-first@1.1.1: {} + electron-to-chromium@1.5.64: {} emoji-regex@10.4.0: {} @@ -8437,6 +9747,10 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -8449,8 +9763,16 @@ snapshots: environment@1.1.0: {} + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.5.4: {} + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -8534,6 +9856,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} eslint-compat-utils@0.5.1(eslint@9.15.0(jiti@1.21.6)): @@ -8633,6 +9957,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -8656,6 +9982,8 @@ snapshots: esutils@2.0.3: {} + etag@1.8.1: {} + event-target-shim@5.0.1: {} eventemitter3@5.0.1: {} @@ -8674,8 +10002,43 @@ snapshots: expect-type@1.1.0: {} - extend@3.0.2: - optional: true + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} farmhash-modern@1.1.0: {} @@ -8693,6 +10056,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.0.3: {} + fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 @@ -8714,6 +10079,11 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -8724,6 +10094,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -8845,8 +10227,20 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + fraction.js@4.3.7: {} + fresh@0.5.2: {} + + front-matter@4.0.2: + dependencies: + js-yaml: 3.14.1 + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -8873,7 +10267,6 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true gcp-metadata@6.1.0(encoding@0.1.13): dependencies: @@ -8882,12 +10275,35 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true + + genkit@0.9.12: + dependencies: + '@genkit-ai/ai': 0.9.12 + '@genkit-ai/core': 0.9.12 + '@genkit-ai/dotprompt': 0.9.12 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color get-caller-file@2.0.5: {} get-east-asian-width@1.3.0: {} + get-intrinsic@1.2.6: + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port@5.1.1: {} + get-stream@8.0.1: {} get-tsconfig@4.8.1: @@ -8939,7 +10355,6 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true google-gax@4.4.1(encoding@0.1.13): dependencies: @@ -8960,6 +10375,8 @@ snapshots: - supports-color optional: true + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -8971,12 +10388,22 @@ snapshots: transitivePeerDependencies: - encoding - supports-color - optional: true guid-typescript@1.0.9: {} + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} + has-symbols@1.1.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -8986,6 +10413,14 @@ snapshots: html5-qrcode@2.3.8: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + http-parser-js@0.5.8: {} http-proxy-agent@5.0.0: @@ -9020,6 +10455,10 @@ snapshots: husky@9.1.7: {} + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.4.5: {} iconv-lite@0.6.3: @@ -9036,6 +10475,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.12.0: + dependencies: + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + cjs-module-lexer: 1.4.1 + module-details-from-path: 1.0.3 + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -9047,6 +10493,8 @@ snapshots: inherits@2.0.4: {} + ipaddr.js@1.9.1: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -9077,8 +10525,7 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-stream@2.0.1: - optional: true + is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -9094,6 +10541,11 @@ snapshots: jose@4.15.9: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -9101,14 +10553,19 @@ snapshots: json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 - optional: true json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -9139,7 +10596,6 @@ snapshots: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - optional: true jwks-rsa@3.1.0: dependencies: @@ -9161,7 +10617,6 @@ snapshots: dependencies: jwa: 2.0.0 safe-buffer: 5.2.1 - optional: true keyv@4.5.4: dependencies: @@ -9275,6 +10730,8 @@ snapshots: marked@15.0.4: {} + math-intrinsics@1.1.0: {} + mdsvex@0.11.2(svelte@5.2.7): dependencies: '@types/unist': 2.0.11 @@ -9283,10 +10740,16 @@ snapshots: svelte: 5.2.7 vfile-message: 2.0.4 + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} + methods@1.1.2: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9298,6 +10761,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@1.6.0: {} + mime@3.0.0: optional: true @@ -9315,6 +10780,8 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} minizlib@3.0.1: @@ -9324,10 +10791,14 @@ snapshots: mkdirp@3.0.1: {} + module-details-from-path@1.0.3: {} + mri@1.2.0: {} mrmime@2.0.0: {} + ms@2.0.0: {} + ms@2.1.3: {} mz@2.7.0: @@ -9340,6 +10811,10 @@ snapshots: natural-compare@1.4.0: {} + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + node-domexception@1.0.0: {} node-fetch@2.7.0(encoding@0.1.13): @@ -9348,6 +10823,12 @@ snapshots: optionalDependencies: encoding: 0.1.13 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-forge@1.3.1: {} node-gyp-build@4.8.4: {} @@ -9370,6 +10851,12 @@ snapshots: object-hash@3.0.0: {} + object-inspect@1.13.3: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -9444,6 +10931,10 @@ snapshots: dependencies: callsites: 3.1.0 + parseurl@1.3.3: {} + + partial-json@0.1.7: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -9459,6 +10950,8 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@0.1.12: {} + pathe@1.1.2: {} pathval@2.0.0: {} @@ -9597,6 +11090,11 @@ snapshots: '@types/node': 22.10.2 long: 5.2.3 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} qrcode@1.5.4: @@ -9605,8 +11103,21 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + queue-microtask@1.2.3: {} + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -9626,6 +11137,16 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + + require-in-the-middle@7.4.0: + dependencies: + debug: 4.3.7 + module-details-from-path: 1.0.3 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + require-main-filename@2.0.0: {} resolve-from@4.0.0: {} @@ -9704,21 +11225,79 @@ snapshots: safe-buffer@5.2.1: {} - safer-buffer@2.1.2: - optional: true + safer-buffer@2.1.2: {} semver@7.6.3: {} + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-cookie-parser@2.7.1: {} + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shimmer@1.2.1: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -9741,8 +11320,14 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + stackback@0.0.2: {} + statuses@2.0.1: {} + std-env@3.8.0: {} stream-events@1.0.5: @@ -9957,6 +11542,8 @@ snapshots: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + totalist@3.0.1: {} tr46@0.0.3: {} @@ -9980,6 +11567,11 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + typescript-eslint@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2): dependencies: '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.15.0(jiti@1.21.6))(typescript@5.7.2) @@ -9993,8 +11585,13 @@ snapshots: typescript@5.7.2: {} + uglify-js@3.19.3: + optional: true + undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici-types@6.20.0: {} unist-util-stringify-position@2.0.3: @@ -10003,6 +11600,8 @@ snapshots: universalify@2.0.1: {} + unpipe@1.0.0: {} + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -10015,6 +11614,8 @@ snapshots: util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + uuid@10.0.0: {} uuid@11.0.3: {} @@ -10024,6 +11625,8 @@ snapshots: uuid@9.0.1: {} + vary@1.1.2: {} + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.11 @@ -10103,6 +11706,8 @@ snapshots: - supports-color - terser + web-streams-polyfill@3.3.3: {} + web-streams-polyfill@4.0.0-beta.3: {} webidl-conversions@3.0.1: {} @@ -10133,6 +11738,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -10208,4 +11815,8 @@ snapshots: zimmerframe@1.1.2: {} + zod-to-json-schema@3.24.1(zod@3.23.8): + dependencies: + zod: 3.23.8 + zod@3.23.8: {} diff --git a/src/lib/components/session/ParticipantView.svelte b/src/lib/components/session/ParticipantView.svelte index b5e4868..6d5a2a4 100644 --- a/src/lib/components/session/ParticipantView.svelte +++ b/src/lib/components/session/ParticipantView.svelte @@ -12,8 +12,9 @@ import { onDestroy, onMount } from 'svelte'; import { getUser } from '$lib/utils/getUser'; import Chatroom from '$lib/components/Chatroom.svelte'; - import { MicVAD, utils } from '@ricky0123/vad-web'; + import { MicVAD } from '@ricky0123/vad-web'; import Summary from '$lib/components/session/Summary.svelte'; + import { initFFmpeg, float32ArrayToWav, wav2mp3 } from '$lib/utils/wav2mp3'; interface ChatroomConversation { name: string; @@ -34,6 +35,7 @@ let conversationDocUnsubscribe: (() => void) | null = null; onDestroy(() => conversationDocUnsubscribe?.()); + let pInitFFmpeg: Promise | null = null; onMount(() => { const groupsRef = collection(db, 'sessions', $page.params.id, 'groups'); const groupDocQuery = query(groupsRef, where('participants', 'array-contains', user.uid)); @@ -50,6 +52,8 @@ updateConversationDoc(); }); + pInitFFmpeg = initFFmpeg(); + return unsbscribe; }); @@ -147,9 +151,7 @@ } } - async function sendAudioToSTT(audio: Float32Array) { - const wavBuffer: ArrayBuffer = utils.encodeWAV(audio); - const file = new File([wavBuffer], 'audio.wav', { type: 'audio/wav' }); + async function sendAudioToSTT(file: File) { const formData = new FormData(); formData.append('file', file); console.log('Sending audio to STT...', formData); @@ -191,7 +193,13 @@ return; } - const result = await sendAudioToSTT(audio); + await pInitFFmpeg; + console.log('Audio recorded:', audio); + const wav = float32ArrayToWav(audio); + console.log('Audio converted to wav:', wav); + const mp3 = await wav2mp3(wav); + console.log('Audio converted to mp3:', mp3); + const result = await sendAudioToSTT(mp3); if (result) { try { diff --git a/src/lib/stt/gemini.ts b/src/lib/stt/gemini.ts new file mode 100644 index 0000000..9e2069e --- /dev/null +++ b/src/lib/stt/gemini.ts @@ -0,0 +1,28 @@ +import { env } from '$env/dynamic/private'; +import { gemini15Flash, googleAI } from '@genkit-ai/googleai'; +import { genkit, z } from 'genkit'; + +const ai = genkit({ + plugins: [googleAI({ apiKey: env.GOOGLE_GENAI_API_KEY })], + model: gemini15Flash +}); + +export async function transcribe(data: Buffer): Promise { + const dataurl = `data:audio/wav;base64,${data.toString('base64')}`; + const { output } = await ai.generate({ + system: '請將語音確實轉錄,使用的主要語言為正體中文(台灣),次要語言為英語。', + prompt: [{ text: '' }, { media: { url: dataurl } }], + output: { + schema: z.object({ + transcription: z.string() + }) + }, + config: { temperature: 0.1 } + }); + + if (!output) { + throw new Error('Failed to transcribe audio'); + } + + return output.transcription; +} diff --git a/src/lib/stt/core.ts b/src/lib/stt/hf-whisper.ts similarity index 80% rename from src/lib/stt/core.ts rename to src/lib/stt/hf-whisper.ts index 36075df..fbb26fa 100644 --- a/src/lib/stt/core.ts +++ b/src/lib/stt/hf-whisper.ts @@ -1,13 +1,16 @@ +import { env } from '$env/dynamic/private'; + export async function transcribe( data: Buffer, - token: string, + token = env.HUGGINGFACE_TOKEN, model = 'JacobLinCool/whisper-large-v3-turbo-common_voice_19_0-zh-TW' ): Promise { const response = await fetch(`https://api-inference.huggingface.co/models/${model}`, { headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', - 'x-wait-for-model': 'true' + 'x-wait-for-model': 'true', + 'x-use-cache': 'false' }, method: 'POST', body: data diff --git a/src/lib/utils/wav2mp3.ts b/src/lib/utils/wav2mp3.ts new file mode 100644 index 0000000..bc65b1a --- /dev/null +++ b/src/lib/utils/wav2mp3.ts @@ -0,0 +1,75 @@ +import { FFmpeg } from '@ffmpeg/ffmpeg'; +import wasmURL from '@hinagiku/ffmpeg-core/wasm?url'; +import coreURL from '@hinagiku/ffmpeg-core?url'; + +const ffmpeg = new FFmpeg(); + +ffmpeg.on('log', ({ message }) => console.log(message)); + +export async function initFFmpeg() { + await ffmpeg.load({ coreURL, wasmURL }); + await ffmpeg.exec(['-formats']); +} + +export async function wav2mp3(wav: Blob | File | ArrayBuffer): Promise { + ffmpeg.writeFile( + 'audio.wav', + new Uint8Array(wav instanceof ArrayBuffer ? wav : await wav.arrayBuffer()) + ); + await ffmpeg.exec(['-i', 'audio.wav', 'audio.mp3']); + const data = await ffmpeg.readFile('audio.mp3'); + return new File([data], 'audio.mp3', { type: 'audio/mpeg' }); +} + +export function float32ArrayToWav( + float32Array: Float32Array, + sampleRate = 16000, + numChannels = 1 +): Blob { + const bitsPerSample = 16; // 16-bit PCM + const byteRate = (sampleRate * numChannels * bitsPerSample) / 8; + const blockAlign = (numChannels * bitsPerSample) / 8; + + const buffer = new ArrayBuffer(44 + float32Array.length * 2); + const view = new DataView(buffer); + + // Write WAV header + let offset = 0; + const writeString = (str: string) => { + for (let i = 0; i < str.length; i++) { + view.setUint8(offset++, str.charCodeAt(i)); + } + }; + + writeString('RIFF'); // ChunkID + view.setUint32(offset, 36 + float32Array.length * 2, true); + offset += 4; // ChunkSize + writeString('WAVE'); // Format + writeString('fmt '); // Subchunk1ID + view.setUint32(offset, 16, true); + offset += 4; // Subchunk1Size + view.setUint16(offset, 1, true); + offset += 2; // AudioFormat (1 = PCM) + view.setUint16(offset, numChannels, true); + offset += 2; // NumChannels + view.setUint32(offset, sampleRate, true); + offset += 4; // SampleRate + view.setUint32(offset, byteRate, true); + offset += 4; // ByteRate + view.setUint16(offset, blockAlign, true); + offset += 2; // BlockAlign + view.setUint16(offset, bitsPerSample, true); + offset += 2; // BitsPerSample + writeString('data'); // Subchunk2ID + view.setUint32(offset, float32Array.length * 2, true); + offset += 4; // Subchunk2Size + + // Write PCM data + for (let i = 0; i < float32Array.length; i++, offset += 2) { + let sample = Math.max(-1, Math.min(1, float32Array[i])); // Clamp to -1..1 + sample = sample < 0 ? sample * 0x8000 : sample * 0x7fff; // Scale to 16-bit + view.setInt16(offset, sample, true); // Write sample + } + + return new Blob([buffer], { type: 'audio/wav' }); +} diff --git a/src/routes/api/stt/+server.ts b/src/routes/api/stt/+server.ts index be840c5..2b6d49b 100644 --- a/src/routes/api/stt/+server.ts +++ b/src/routes/api/stt/+server.ts @@ -1,8 +1,7 @@ import { json, type RequestHandler } from '@sveltejs/kit'; -import { env } from '$env/dynamic/private'; import { upload_object } from '$lib/server/object-storage'; -import { transcribe } from '$lib/stt/core'; +import { transcribe } from '$lib/stt/gemini'; // curl -X POST http://localhost:5173/api/stt -H "Content-Type: multipart/form-data" -H "Origin: http://localhost:5173" -F "file=@test.wav" export const POST: RequestHandler = async ({ request }) => { @@ -25,8 +24,8 @@ export const POST: RequestHandler = async ({ request }) => { return json({ status: 'error', message: 'Invalid Content-Type' }, { status: 400 }); } - const transcription = await transcribe(audio_buffer, env.HUGGINGFACE_TOKEN as string); - const url = await upload_object(audio_buffer, 'audio/wav', { transcription }); + const transcription = await transcribe(audio_buffer); + const url = await upload_object(audio_buffer, 'audio/mpeg', { transcription }); return json({ status: 'success', transcription, url }); } catch (error) { console.error('Error processing request:', error); diff --git a/src/routes/test/stt/+page.svelte b/src/routes/test/stt/+page.svelte new file mode 100644 index 0000000..2e285b0 --- /dev/null +++ b/src/routes/test/stt/+page.svelte @@ -0,0 +1,94 @@ + + +
+
+

Speech-to-Text Test

+

This is a test page for the Chatroom component.

+
+ +
+ + Convert to MP3 + + + {#if files && files.length > 0} +

Selected file: {files[0].name}

+
{JSON.stringify(sttResult, null, 2)}
+ {/if} +
+
diff --git a/vite.config.ts b/vite.config.ts index bbf8c7d..aadee01 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,5 +2,6 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; export default defineConfig({ + optimizeDeps: { exclude: ['@ffmpeg/ffmpeg'] }, plugins: [sveltekit()] });